10 std::vector<real> vals,
11 std::vector<idx> col_idx,
12 std::vector<idx> row_ptr)
15 , vals_(std::move(vals))
16 , col_idx_(std::move(col_idx))
17 , row_ptr_(std::move(row_ptr)) {
18 if (row_ptr_.size() != n_rows_ + 1)
19 throw std::invalid_argument(
20 "SparseMatrix: row_ptr must have length n_rows+1");
21 if (col_idx_.size() != vals_.size())
22 throw std::invalid_argument(
23 "SparseMatrix: col_idx and vals must have equal length");
28 const std::vector<idx>& rows,
29 const std::vector<idx>& cols,
30 const std::vector<real>& vals) {
31 if (rows.size() != cols.size() || rows.size() != vals.size())
32 throw std::invalid_argument(
33 "SparseMatrix::from_triplets: inconsistent input sizes");
36 std::vector<idx> row_count(
n_rows, 0);
37 for (
idx k = 0; k < rows.size(); ++k) {
39 throw std::out_of_range(
40 "SparseMatrix::from_triplets: index out of range");
50 std::vector<real> out_vals(
nnz, 0.0);
51 std::vector<idx> out_col(
nnz);
54 std::vector<idx> fill_pos =
row_ptr;
55 for (
idx k = 0; k < rows.size(); ++k) {
56 idx pos = fill_pos[rows[k]]++;
57 out_col[pos] = cols[k];
58 out_vals[pos] = vals[k];
65 std::vector<idx> order(end - start);
66 std::iota(order.begin(), order.end(), 0);
67 std::sort(order.begin(), order.end(), [&](
idx a,
idx b) {
68 return out_col[start + a] < out_col[start + b];
71 std::vector<real> sv(end - start);
72 std::vector<idx> sc(end - start);
73 for (
idx k = 0; k < order.size(); ++k) {
74 sv[k] = out_vals[start + order[k]];
75 sc[k] = out_col[start + order[k]];
77 for (
idx k = 0; k < order.size(); ++k) {
78 out_vals[start + k] = sv[k];
79 out_col[start + k] = sc[k];
84 for (
idx k = start; k < end;) {
85 idx cur_col = out_col[k];
87 while (k < end && out_col[k] == cur_col)
89 out_col[write] = cur_col;
90 out_vals[write++] = sum;
96 for (
idx k = end; k <
nnz; ++k) {
97 out_vals[write + (k - end)] = out_vals[k];
98 out_col[write + (k - end)] = out_col[k];
100 nnz -= (end - write);
101 out_vals.resize(
nnz);
104 idx delta = end - write;
SparseMatrix(idx n_rows, idx n_cols, std::vector< real > vals, std::vector< idx > col_idx, std::vector< idx > row_ptr)
Construct from raw CSR arrays (takes ownership)
static SparseMatrix from_triplets(idx n_rows, idx n_cols, const std::vector< idx > &rows, const std::vector< idx > &cols, const std::vector< real > &vals)
Build from coordinate (COO / triplet) lists.