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(
"SparseMatrix: row_ptr must have length n_rows+1");
20 if (col_idx_.size() != vals_.size())
21 throw std::invalid_argument(
22 "SparseMatrix: col_idx and vals must have equal length");
27 const std::vector<idx>& rows,
28 const std::vector<idx>& cols,
29 const std::vector<real>& vals) {
30 if (rows.size() != cols.size() || rows.size() != vals.size())
31 throw std::invalid_argument(
32 "SparseMatrix::from_triplets: inconsistent input sizes");
35 std::vector<idx> row_count(
n_rows, 0);
36 for (
idx k = 0; k < rows.size(); ++k) {
38 throw std::out_of_range(
"SparseMatrix::from_triplets: index out of range");
48 std::vector<real> out_vals(
nnz, 0.0);
49 std::vector<idx> out_col(
nnz);
52 std::vector<idx> fill_pos =
row_ptr;
53 for (
idx k = 0; k < rows.size(); ++k) {
54 idx pos = fill_pos[rows[k]]++;
55 out_col[pos] = cols[k];
56 out_vals[pos] = vals[k];
63 std::vector<idx> order(end - start);
64 std::iota(order.begin(), order.end(), 0);
65 std::sort(order.begin(), order.end(), [&](
idx a,
idx b) {
66 return out_col[start + a] < out_col[start + b];
69 std::vector<real> sv(end - start);
70 std::vector<idx> sc(end - start);
71 for (
idx k = 0; k < order.size(); ++k) {
72 sv[k] = out_vals[start + order[k]];
73 sc[k] = out_col[start + order[k]];
75 for (
idx k = 0; k < order.size(); ++k) {
76 out_vals[start + k] = sv[k];
77 out_col[start + k] = sc[k];
82 for (
idx k = start; k < end;) {
83 idx cur_col = out_col[k];
85 while (k < end && out_col[k] == cur_col)
87 out_col[write] = cur_col;
88 out_vals[write++] = sum;
94 for (
idx k = end; k <
nnz; ++k) {
95 out_vals[write + (k - end)] = out_vals[k];
96 out_col[write + (k - end)] = out_col[k];
102 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.