Sparse Matrix Operations#

template<typename T>
void raft::sparse::op::coo_remove_scalar(const int *rows, const int *cols, const T *vals, int nnz, int *crows, int *ccols, T *cvals, int *cnnz, int *cur_cnnz, T scalar, int n, cudaStream_t stream)#

Removes the values matching a particular scalar from a COO formatted sparse matrix.

Parameters:
  • rows – input array of rows (size n)

  • cols – input array of cols (size n)

  • vals – input array of vals (size n)

  • nnz – size of current rows/cols/vals arrays

  • crows – compressed array of rows

  • ccols – compressed array of cols

  • cvals – compressed array of vals

  • cnnz – array of non-zero counts per row

  • cur_cnnz – array of counts per row

  • scalar – scalar to remove from arrays

  • n – number of rows in dense matrix

  • stream – cuda stream to use

template<typename T>
void raft::sparse::op::coo_remove_scalar(COO<T> *in, COO<T> *out, T scalar, cudaStream_t stream)#

Removes the values matching a particular scalar from a COO formatted sparse matrix.

Parameters:
  • in – input COO matrix

  • out – output COO matrix

  • scalar – scalar to remove from arrays

  • stream – cuda stream to use

template<typename T>
void raft::sparse::op::coo_remove_zeros(COO<T> *in, COO<T> *out, cudaStream_t stream)#

Removes zeros from a COO formatted sparse matrix.

Parameters:
  • in – input COO matrix

  • out – output COO matrix

  • stream – cuda stream to use

template<typename value_idx>
void raft::sparse::op::compute_duplicates_mask(value_idx *mask, const value_idx *rows, const value_idx *cols, size_t nnz, cudaStream_t stream)#

Computes a mask from a sorted COO matrix where 0’s denote duplicate values and 1’s denote new values. This mask can be useful for computing an exclusive scan to pre-build offsets for reducing duplicates, such as when symmetrizing or taking the min of each duplicated value.

Note that this function always marks the first value as 0 so that a cumulative sum can be performed as a follow-on. However, even if the mask is used directly, any duplicates should always have a 1 when first encountered so it can be assumed that the first element is always a 1 otherwise.

Template Parameters:

value_idx

Parameters:
  • mask[out] output mask, size nnz

  • rows[in] COO rows array, size nnz

  • cols[in] COO cols array, size nnz

  • nnz[in] number of nonzeros in input arrays

  • stream[in] cuda ops will be ordered wrt this stream

template<typename value_idx, typename value_t>
void raft::sparse::op::max_duplicates(raft::resources const &handle, raft::sparse::COO<value_t, value_idx> &out, const value_idx *rows, const value_idx *cols, const value_t *vals, size_t nnz, size_t m, size_t n)#

Performs a COO reduce of duplicate columns per row, taking the max weight for duplicate columns in each row. This function assumes the input COO has been sorted by both row and column but makes no assumption on the sorting of values.

Template Parameters:
  • value_idx

  • value_t

Parameters:
  • handle[in]

  • out[out] output COO, the nnz will be computed allocate() will be called in this function.

  • rows[in] COO rows array, size nnz

  • cols[in] COO cols array, size nnz

  • vals[in] COO vals array, size nnz

  • nnz[in] number of nonzeros in COO input arrays

  • m[in] number of rows in COO input matrix

  • n[in] number of columns in COO input matrix

template<typename Index_> void void raft::sparse::op::csr_row_op (const Index_ *row_ind, Index_ n_rows, Index_ nnz, Lambda op, cudaStream_t stream)

Perform a custom row operation on a CSR matrix in batches.

Template Parameters:
  • T – numerical type of row_ind array

  • TPB_X – number of threads per block to use for underlying kernel

  • Lambda – type of custom operation function

Parameters:
  • row_ind – the CSR row_ind array to perform parallel operations over

  • n_rows – total number vertices in graph

  • nnz – number of non-zeros

  • op – custom row operation functor accepting the row and beginning index.

  • stream – cuda stream to use

template<typename value_idx>
void raft::sparse::op::csr_row_slice_indptr(value_idx start_row, value_idx stop_row, const value_idx *indptr, value_idx *indptr_out, value_idx *start_offset, value_idx *stop_offset, cudaStream_t stream)#

Slice consecutive rows from a CSR array and populate newly sliced indptr array

Template Parameters:

value_idx

Parameters:
  • start_row[in] : beginning row to slice

  • stop_row[in] : ending row to slice

  • indptr[in] : indptr of input CSR to slice

  • indptr_out[out] : output sliced indptr to populate

  • start_offset[in] : beginning column offset of input indptr

  • stop_offset[in] : ending column offset of input indptr

  • stream[in] : cuda stream for ordering events

template<typename value_idx, typename value_t>
void raft::sparse::op::csr_row_slice_populate(value_idx start_offset, value_idx stop_offset, const value_idx *indices, const value_t *data, value_idx *indices_out, value_t *data_out, cudaStream_t stream)#

Slice rows from a CSR, populate column and data arrays

Template Parameters:
  • value_idx – : data type of CSR index arrays

  • value_t – : data type of CSR data array

Parameters:
  • start_offset[in] : beginning column offset to slice

  • stop_offset[in] : ending column offset to slice

  • indices[in] : column indices array from input CSR

  • data[in] : data array from input CSR

  • indices_out[out] : output column indices array

  • data_out[out] : output data array

  • stream[in] : cuda stream for ordering events

template<typename T>
void raft::sparse::op::coo_sort(int m, int n, int nnz, int *rows, int *cols, T *vals, cudaStream_t stream)#

Sorts the arrays that comprise the coo matrix by row and then by column.

Parameters:
  • m – number of rows in coo matrix

  • n – number of cols in coo matrix

  • nnz – number of non-zeros

  • rows – rows array from coo matrix

  • cols – cols array from coo matrix

  • vals – vals array from coo matrix

  • stream – cuda stream to use

template<typename T>
void raft::sparse::op::coo_sort(COO<T> *const in, cudaStream_t stream)#

Sort the underlying COO arrays by row.

Template Parameters:

T – the type name of the underlying value array

Parameters:
  • in – COO to sort by row

  • stream – the cuda stream to use

template<typename value_idx, typename value_t>
void raft::sparse::op::coo_sort_by_weight(value_idx *rows, value_idx *cols, value_t *data, value_idx nnz, cudaStream_t stream)#

Sorts a COO by its weight

Template Parameters:
  • value_idx

  • value_t

Parameters:
  • rows[inout] source edges

  • cols[inout] dest edges

  • data[inout] edge weights

  • nnz[in] number of edges in edge list

  • stream[in] cuda stream for which to order cuda operations