47 #ifndef MUI_MATRIX_MANIPULATION_H_
48 #define MUI_MATRIX_MANIPULATION_H_
61 template<
typename ITYPE,
typename VTYPE>
63 assert(((this->non_zero_elements_count()) == 0) &&
64 "MUI Error [matrix_manipulation.h]: resize function only works for all-zero matrix");
68 if (matrix_format_ == format::CSR) {
69 matrix_csr.row_ptrs_.clear();
70 matrix_csr.row_ptrs_.resize((r+1), 0);
71 }
else if (matrix_format_ == format::CSC) {
72 matrix_csc.col_ptrs_.clear();
73 matrix_csc.col_ptrs_.resize((c+1), 0);
78 template<
typename ITYPE,
typename VTYPE>
82 assert(this->empty() &&
83 "MUI Error [matrix_manipulation.h]: copy function only works for empty (all zero elements) matrix");
84 assert((((rows_ == exist_mat.rows_) && (cols_ == exist_mat.cols_)) || ((rows_ == 0) && (cols_ == 0))) &&
85 "MUI Error [matrix_manipulation.h]: matrix size mismatch in copy function ");
89 std::string format_store = this->get_format();
91 if (exist_mat.nnz_>0) {
93 if ((rows_ == 0) && (cols_ == 0))
94 this->resize(exist_mat.rows_, exist_mat.cols_);
96 nnz_ = exist_mat.nnz_;
98 if (exist_mat.matrix_format_ == format::COO) {
100 matrix_coo.values_.reserve(exist_mat.matrix_coo.values_.size());
101 matrix_coo.row_indices_.reserve(exist_mat.matrix_coo.row_indices_.size());
102 matrix_coo.col_indices_.reserve(exist_mat.matrix_coo.col_indices_.size());
104 matrix_coo.values_ = std::vector<VTYPE>(exist_mat.matrix_coo.values_.begin(), exist_mat.matrix_coo.values_.end());
105 matrix_coo.row_indices_ = std::vector<ITYPE>(exist_mat.matrix_coo.row_indices_.begin(), exist_mat.matrix_coo.row_indices_.end());
106 matrix_coo.col_indices_ = std::vector<ITYPE>(exist_mat.matrix_coo.col_indices_.begin(), exist_mat.matrix_coo.col_indices_.end());
108 matrix_format_ = exist_mat.matrix_format_;
110 }
else if (exist_mat.matrix_format_ == format::CSR) {
112 matrix_csr.values_.reserve(exist_mat.matrix_csr.values_.size());
113 matrix_csr.row_ptrs_.reserve(exist_mat.matrix_csr.row_ptrs_.size());
114 matrix_csr.col_indices_.reserve(exist_mat.matrix_csr.col_indices_.size());
116 matrix_csr.values_ = std::vector<VTYPE>(exist_mat.matrix_csr.values_.begin(), exist_mat.matrix_csr.values_.end());
117 matrix_csr.row_ptrs_ = std::vector<ITYPE>(exist_mat.matrix_csr.row_ptrs_.begin(), exist_mat.matrix_csr.row_ptrs_.end());
118 matrix_csr.col_indices_ = std::vector<ITYPE>(exist_mat.matrix_csr.col_indices_.begin(), exist_mat.matrix_csr.col_indices_.end());
120 matrix_format_ = exist_mat.matrix_format_;
122 }
else if (exist_mat.matrix_format_ == format::CSC) {
124 matrix_csc.values_.reserve(exist_mat.matrix_csc.values_.size());
125 matrix_csc.row_indices_.reserve(exist_mat.matrix_csc.row_indices_.size());
126 matrix_csc.col_ptrs_.reserve(exist_mat.matrix_csc.col_ptrs_.size());
128 matrix_csc.values_ = std::vector<VTYPE>(exist_mat.matrix_csc.values_.begin(), exist_mat.matrix_csc.values_.end());
129 matrix_csc.row_indices_ = std::vector<ITYPE>(exist_mat.matrix_csc.row_indices_.begin(), exist_mat.matrix_csc.row_indices_.end());
130 matrix_csc.col_ptrs_ = std::vector<ITYPE>(exist_mat.matrix_csc.col_ptrs_.begin(), exist_mat.matrix_csc.col_ptrs_.end());
132 matrix_format_ = exist_mat.matrix_format_;
135 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised exist_mat format" << std::endl;
136 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
137 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
138 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
139 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
144 if (this->get_format() != format_store)
145 this->format_conversion(format_store,
true,
true,
"overwrite");
147 this->assert_valid_vector_size(
"matrix_manipulation.h",
"copy()");
152 template<
typename ITYPE,
typename VTYPE>
155 assert((r_end >= r_start) &&
156 "MUI Error [matrix_manipulation.h]: segment function r_end has to be larger or equals to r_start");
157 assert((c_end >= c_start) &&
158 "MUI Error [matrix_manipulation.h]: segment function c_end has to be larger or equals to c_start");
159 assert(((r_end < rows_) && (r_start >= 0) && (c_end < cols_) && (c_start >= 0)) &&
160 "MUI Error [matrix_manipulation.h]: Matrix index out of range in segment function");
162 if (performSortAndUniqueCheck) {
163 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"segment()"))){
164 if(matrix_format_ == format::COO) {
165 this->sort_coo(
true,
true,
"overwrite");
166 }
else if (matrix_format_ == format::CSR) {
167 this->sort_csr(
true,
"overwrite");
168 }
else if (matrix_format_ == format::CSC) {
169 this->sort_csc(
true,
"overwrite");
171 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
172 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
173 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
174 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
175 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
183 if(matrix_format_ == format::COO) {
186 for (ITYPE i = 0; i < nnz_; ++i) {
187 ITYPE row = matrix_coo.row_indices_[i];
188 ITYPE col = matrix_coo.col_indices_[i];
191 if (row >= r_start && row <= r_end && col >= c_start && col <= c_end) {
193 ITYPE subRow = row - r_start;
194 ITYPE subCol = col - c_start;
196 res.matrix_coo.values_.reserve(res.matrix_coo.values_.size()+1);
197 res.matrix_coo.row_indices_.reserve(res.matrix_coo.row_indices_.size()+1);
198 res.matrix_coo.col_indices_.reserve(res.matrix_coo.col_indices_.size()+1);
201 res.matrix_coo.values_.emplace_back(matrix_coo.values_[i]);
202 res.matrix_coo.row_indices_.emplace_back(subRow);
203 res.matrix_coo.col_indices_.emplace_back(subCol);
209 }
else if (matrix_format_ == format::CSR) {
211 res.matrix_csr.row_ptrs_.reserve(r_end-r_start+2);
214 for (ITYPE row = r_start; row <= r_end; ++row) {
216 ITYPE start = matrix_csr.row_ptrs_[row];
217 ITYPE end = matrix_csr.row_ptrs_[row + 1];
220 for (ITYPE j = start; j < end; ++j) {
222 ITYPE col = matrix_csr.col_indices_[j];
225 if (col >= c_start && col <= c_end) {
227 ITYPE subCol = col - c_start;
229 res.matrix_csr.values_.reserve(res.matrix_csr.values_.size()+1);
230 res.matrix_csr.col_indices_.reserve(res.matrix_csr.col_indices_.size()+1);
233 res.matrix_csr.values_.emplace_back(matrix_csr.values_[j]);
234 res.matrix_csr.col_indices_.emplace_back(subCol);
239 res.matrix_csr.row_ptrs_[row - r_start + 1] = res.matrix_csr.col_indices_.size();
242 }
else if (matrix_format_ == format::CSC) {
244 res.matrix_csc.col_ptrs_.reserve(c_end-c_start+2);
247 for (ITYPE col = c_start; col <= c_end; ++col) {
249 ITYPE start = matrix_csc.col_ptrs_[col];
250 ITYPE end = matrix_csc.col_ptrs_[col + 1];
253 for (ITYPE j = start; j < end; ++j) {
255 ITYPE row = matrix_csc.row_indices_[j];
258 if (row >= r_start && row <= r_end) {
260 ITYPE subRow = row - r_start;
262 res.matrix_csc.values_.reserve(res.matrix_csc.values_.size()+1);
263 res.matrix_csc.row_indices_.reserve(res.matrix_csc.row_indices_.size()+1);
266 res.matrix_csc.values_.emplace_back(matrix_csc.values_[j]);
267 res.matrix_csc.row_indices_.emplace_back(subRow);
273 res.matrix_csc.col_ptrs_[col - c_start + 1] = res.matrix_csc.row_indices_.size();
277 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
278 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
279 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
280 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
281 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
291 template<
typename ITYPE,
typename VTYPE>
293 assert(((r < rows_) && (r >= 0) && (c < cols_) && (c >= 0)) &&
294 "MUI Error [matrix_manipulation.h]: Matrix index out of range in set_value function");
296 if (performSortAndUniqueCheck) {
297 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"set_value()"))){
298 if(matrix_format_ == format::COO) {
299 this->sort_coo(
true,
true,
"overwrite");
300 }
else if (matrix_format_ == format::CSR) {
301 this->sort_csr(
true,
"overwrite");
302 }
else if (matrix_format_ == format::CSC) {
303 this->sort_csc(
true,
"overwrite");
305 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
306 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
307 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
308 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
309 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
315 if(matrix_format_ == format::COO) {
317 if (performSortAndUniqueCheck) {
318 this->coo_element_operation(r, c, val,
"overwrite",
"matrix_manipulation.h",
"set_value()");
320 this->coo_element_operation(r, c, val,
"nonsort",
"matrix_manipulation.h",
"set_value()");
323 }
else if (matrix_format_ == format::CSR) {
325 this->csr_element_operation(r, c, val,
"overwrite",
"matrix_manipulation.h",
"set_value()");
327 }
else if (matrix_format_ == format::CSC) {
329 this->csc_element_operation(r, c, val,
"overwrite",
"matrix_manipulation.h",
"set_value()");
332 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
333 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
334 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
335 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
336 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
342 template<
typename ITYPE,
typename VTYPE>
349 if(matrix_format_ == format::COO) {
351 matrix_coo.values_.reserve(rows_*cols_);
352 matrix_coo.row_indices_.reserve(rows_*cols_);
353 matrix_coo.col_indices_.reserve(rows_*cols_);
354 matrix_coo.values_.resize(rows_*cols_);
355 matrix_coo.row_indices_.resize(rows_*cols_);
356 matrix_coo.col_indices_.resize(rows_*cols_);
358 for (ITYPE i = 0; i < rows_; ++i) {
359 std::fill(matrix_coo.row_indices_.begin()+(i*cols_), matrix_coo.row_indices_.end()+((i+1)*cols_), i);
360 std::iota(matrix_coo.col_indices_.begin()+(i*cols_), matrix_coo.col_indices_.end()+((i+1)*cols_), 0);
361 std::fill(matrix_coo.values_.begin()+(i*cols_), matrix_coo.values_.end()+((i+1)*cols_), val);
363 }
else if (matrix_format_ == format::CSR) {
365 matrix_csr.values_.reserve(rows_*cols_);
366 matrix_csr.row_ptrs_.reserve(rows_+1);
367 matrix_csr.col_indices_.reserve(rows_*cols_);
368 matrix_csr.values_.resize(rows_*cols_);
369 matrix_csr.row_ptrs_.resize(rows_+1);
370 matrix_csr.col_indices_.resize(rows_*cols_);
372 matrix_csr.row_ptrs_[0] = 0;
373 for (ITYPE i = 0; i < rows_; ++i) {
374 std::iota(matrix_csr.col_indices_.begin()+(i*cols_), matrix_csr.col_indices_.end()+((i+1)*cols_), 0);
375 std::fill(matrix_csr.values_.begin()+(i*cols_), matrix_csr.values_.end()+((i+1)*cols_), val);
376 matrix_csr.row_ptrs_[i + 1] = (i+1)*cols_;
378 }
else if (matrix_format_ == format::CSC) {
380 matrix_csc.values_.reserve(rows_*cols_);
381 matrix_csc.row_indices_.reserve(rows_*cols_);
382 matrix_csc.col_ptrs_.reserve(cols_+1);
383 matrix_csc.values_.resize(rows_*cols_);
384 matrix_csc.row_indices_.resize(rows_*cols_);
385 matrix_csc.col_ptrs_.resize(cols_+1);
387 matrix_csc.col_ptrs_[0] = 0;
388 for (ITYPE i = 0; i < cols_; ++i) {
389 std::iota(matrix_csc.row_indices_.begin()+(i*rows_), matrix_csc.row_indices_.end()+((i+1)*rows_), 0);
390 std::fill(matrix_csc.values_.begin()+(i*rows_), matrix_csc.values_.end()+((i+1)*rows_), val);
391 matrix_csc.col_ptrs_[i + 1] = (i+1)*rows_;
394 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
395 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
396 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
397 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
398 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
406 template<
typename ITYPE,
typename VTYPE>
408 assert(((r1 < rows_) && (r1 >= 0) && (c1 < cols_) && (c1 >= 0) &&
409 (r2 < rows_) && (r2 >= 0) && (c2 < cols_) && (c2 >= 0)) &&
410 "MUI Error [matrix_manipulation.h]: Matrix index out of range in swap_elements function");
411 VTYPE temp = this->get_value(r1, c1);
412 this->set_value(r1, c1, this->get_value(r2, c2));
413 this->set_value(r2, c2, temp);
417 template<
typename ITYPE,
typename VTYPE>
420 if(matrix_format_ == format::COO) {
421 matrix_coo.values_.clear();
422 matrix_coo.row_indices_.clear();
423 matrix_coo.col_indices_.clear();
424 }
else if (matrix_format_ == format::CSR) {
425 matrix_csr.values_.clear();
426 matrix_csr.row_ptrs_.clear();
427 matrix_csr.col_indices_.clear();
428 matrix_csr.row_ptrs_.resize((rows_+1), 0);
429 }
else if (matrix_format_ == format::CSC) {
430 matrix_csc.values_.clear();
431 matrix_csc.row_indices_.clear();
432 matrix_csc.col_ptrs_.clear();
433 matrix_csc.col_ptrs_.resize((cols_+1), 0);
435 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
436 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
437 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
438 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
439 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
446 template<
typename ITYPE,
typename VTYPE>
448 assert(((r < rows_) && (r >= 0) && (c < cols_) && (c >= 0)) &&
449 "MUI Error [matrix_manipulation.h]: Matrix index out of range in add_scalar function");
451 if (performSortAndUniqueCheck) {
452 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"add_scalar()"))){
453 if(matrix_format_ == format::COO) {
454 this->sort_coo(
true,
true,
"overwrite");
455 }
else if (matrix_format_ == format::CSR) {
456 this->sort_csr(
true,
"overwrite");
457 }
else if (matrix_format_ == format::CSC) {
458 this->sort_csc(
true,
"overwrite");
460 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
461 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
462 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
463 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
464 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
470 if(matrix_format_ == format::COO) {
472 this->coo_element_operation(r, c, val,
"plus",
"matrix_manipulation.h",
"add_scalar()");
474 }
else if (matrix_format_ == format::CSR) {
476 this->csr_element_operation(r, c, val,
"plus",
"matrix_manipulation.h",
"add_scalar()");
478 }
else if (matrix_format_ == format::CSC) {
480 this->csc_element_operation(r, c, val,
"plus",
"matrix_manipulation.h",
"add_scalar()");
483 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
484 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
485 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
486 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
487 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
493 template<
typename ITYPE,
typename VTYPE>
495 assert(((r < rows_) && (r >= 0) && (c < cols_) && (c >= 0)) &&
496 "MUI Error [matrix_manipulation.h]: Matrix index out of range in subtract_scalar function");
497 if (performSortAndUniqueCheck) {
498 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"subtract_scalar()"))){
499 if(matrix_format_ == format::COO) {
500 this->sort_coo(
true,
true,
"overwrite");
501 }
else if (matrix_format_ == format::CSR) {
502 this->sort_csr(
true,
"overwrite");
503 }
else if (matrix_format_ == format::CSC) {
504 this->sort_csc(
true,
"overwrite");
506 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
507 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
508 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
509 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
510 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
516 if(matrix_format_ == format::COO) {
518 this->coo_element_operation(r, c, val,
"minus",
"matrix_manipulation.h",
"subtract_scalar()");
520 }
else if (matrix_format_ == format::CSR) {
522 this->csr_element_operation(r, c, val,
"minus",
"matrix_manipulation.h",
"subtract_scalar()");
524 }
else if (matrix_format_ == format::CSC) {
526 this->csc_element_operation(r, c, val,
"minus",
"matrix_manipulation.h",
"subtract_scalar()");
529 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
530 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
531 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
532 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
533 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
539 template<
typename ITYPE,
typename VTYPE>
541 assert(((r < rows_) && (r >= 0) && (c < cols_) && (c >= 0)) &&
542 "MUI Error [matrix_manipulation.h]: Matrix index out of range in multiply_scalar function");
544 if (performSortAndUniqueCheck) {
545 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"multiply_scalar()"))){
546 if(matrix_format_ == format::COO) {
547 this->sort_coo(
true,
true,
"overwrite");
548 }
else if (matrix_format_ == format::CSR) {
549 this->sort_csr(
true,
"overwrite");
550 }
else if (matrix_format_ == format::CSC) {
551 this->sort_csc(
true,
"overwrite");
553 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
554 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
555 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
556 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
557 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
563 if(matrix_format_ == format::COO) {
565 this->coo_element_operation(r, c, val,
"multiply",
"matrix_manipulation.h",
"multiply_scalar()");
567 }
else if (matrix_format_ == format::CSR) {
569 this->csr_element_operation(r, c, val,
"multiply",
"matrix_manipulation.h",
"multiply_scalar()");
571 }
else if (matrix_format_ == format::CSC) {
573 this->csc_element_operation(r, c, val,
"multiply",
"matrix_manipulation.h",
"multiply_scalar()");
576 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
577 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
578 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
579 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
580 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
586 template <
typename ITYPE,
typename VTYPE>
588 if (
this != &exist_mat) {
590 assert(this->empty() &&
591 "MUI Error [matrix_manipulation.h]: assignment operator '=' only works for empty (all zero elements) matrix");
593 if((rows_ == 0) && (cols_ == 0)){
594 rows_ = exist_mat.rows_;
595 cols_ = exist_mat.cols_;
598 assert(((rows_ == exist_mat.rows_) && (cols_ == exist_mat.cols_)) &&
599 "MUI Error [matrix_manipulation.h]: matrix size mismatch in assignment operator '='");
601 std::string format_store = this->get_format();
602 if (this->get_format() != exist_mat.
get_format()) {
603 this->format_conversion(exist_mat.
get_format(),
true,
true,
"overwrite");
607 if (matrix_format_ == format::COO) {
608 matrix_coo.values_ = std::vector<VTYPE>(exist_mat.matrix_coo.values_.begin(), exist_mat.matrix_coo.values_.end());
609 matrix_coo.row_indices_ = std::vector<ITYPE>(exist_mat.matrix_coo.row_indices_.begin(), exist_mat.matrix_coo.row_indices_.end());
610 matrix_coo.col_indices_ = std::vector<ITYPE>(exist_mat.matrix_coo.col_indices_.begin(), exist_mat.matrix_coo.col_indices_.end());
611 }
else if (matrix_format_ == format::CSR) {
612 matrix_csr.values_ = std::vector<VTYPE>(exist_mat.matrix_csr.values_.begin(), exist_mat.matrix_csr.values_.end());
613 matrix_csr.row_ptrs_ = std::vector<ITYPE>(exist_mat.matrix_csr.row_ptrs_.begin(), exist_mat.matrix_csr.row_ptrs_.end());
614 matrix_csr.col_indices_ = std::vector<ITYPE>(exist_mat.matrix_csr.col_indices_.begin(), exist_mat.matrix_csr.col_indices_.end());
615 }
else if (matrix_format_ == format::CSC) {
616 matrix_csc.values_ = std::vector<VTYPE>(exist_mat.matrix_csc.values_.begin(), exist_mat.matrix_csc.values_.end());
617 matrix_csc.row_indices_ = std::vector<ITYPE>(exist_mat.matrix_csc.row_indices_.begin(), exist_mat.matrix_csc.row_indices_.end());
618 matrix_csc.col_ptrs_ = std::vector<ITYPE>(exist_mat.matrix_csc.col_ptrs_.begin(), exist_mat.matrix_csc.col_ptrs_.end());
620 std::cerr <<
"MUI Error [matrix_ctor_dtor.h]: Unrecognised matrix format for matrix constructor" << std::endl;
621 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
622 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
623 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
624 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
628 nnz_ = exist_mat.nnz_;
630 if (this->get_format() != format_store) {
631 this->format_conversion(format_store,
true,
true,
"overwrite");
638 template<
typename ITYPE,
typename VTYPE>
643 if (matrix_format_ == format::COO) {
645 if (matrix_format ==
"COO") {
647 std::cout <<
"MUI [matrix_manipulation.h]: Convert matrix format from COO to COO (do nothing)." << std::endl;
649 }
else if (matrix_format ==
"CSR") {
651 if (performSortAndUniqueCheck) {
652 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"format_conversion()"))){
659 }
else if (matrix_format ==
"CSC") {
667 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised format type: " << format <<
" for matrix format conversion" << std::endl;
668 std::cerr <<
" Please set the format string as:" << std::endl;
669 std::cerr <<
" 'COO': COOrdinate format" << std::endl;
670 std::cerr <<
" 'CSR' (default): Compressed Sparse Row format" << std::endl;
671 std::cerr <<
" 'CSC': Compressed Sparse Column format" << std::endl;
676 }
else if (matrix_format_ == format::CSR) {
678 if (matrix_format ==
"COO") {
680 if (performSortAndUniqueCheck) {
681 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"format_conversion()"))){
688 }
else if (matrix_format ==
"CSR") {
690 std::cout <<
"MUI [matrix_manipulation.h]: Convert matrix format from CSR to CSR (do nothing)." << std::endl;
692 }
else if (matrix_format ==
"CSC") {
694 if (performSortAndUniqueCheck) {
695 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"format_conversion()"))){
704 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised format type: " << format <<
" for matrix format conversion" << std::endl;
705 std::cerr <<
" Please set the format string as:" << std::endl;
706 std::cerr <<
" 'COO': COOrdinate format" << std::endl;
707 std::cerr <<
" 'CSR' (default): Compressed Sparse Row format" << std::endl;
708 std::cerr <<
" 'CSC': Compressed Sparse Column format" << std::endl;
713 }
else if (matrix_format_ == format::CSC) {
715 if (matrix_format ==
"COO") {
717 if (performSortAndUniqueCheck) {
718 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"format_conversion()"))){
725 }
else if (matrix_format ==
"CSR") {
727 if (performSortAndUniqueCheck) {
728 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"format_conversion()"))){
735 }
else if (matrix_format ==
"CSC") {
737 std::cout <<
"MUI [matrix_manipulation.h]: Convert matrix format from CSC to CSC (do nothing)." << std::endl;
741 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised format type: " << format <<
" for matrix format conversion" << std::endl;
742 std::cerr <<
" Please set the format string as:" << std::endl;
743 std::cerr <<
" 'COO': COOrdinate format" << std::endl;
744 std::cerr <<
" 'CSR' (default): Compressed Sparse Row format" << std::endl;
745 std::cerr <<
" 'CSC': Compressed Sparse Column format" << std::endl;
752 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format for matrix format conversion" << std::endl;
753 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
754 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
755 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
756 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
763 template<
typename ITYPE,
typename VTYPE>
766 if (check_sorted_unique) {
767 if (!(this->is_sorted_unique(
"matrix_manipulation.h",
"sort_deduplication()"))){
768 if(matrix_format_ == format::COO) {
769 this->sort_coo(is_row_major, deduplication, deduplication_mode);
770 }
else if (matrix_format_ == format::CSR) {
771 this->sort_csr(deduplication, deduplication_mode);
772 }
else if (matrix_format_ == format::CSC) {
773 this->sort_csc(deduplication, deduplication_mode);
775 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
776 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
777 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
778 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
779 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
784 if(matrix_format_ == format::COO) {
785 this->sort_coo(is_row_major, deduplication, deduplication_mode);
786 }
else if (matrix_format_ == format::CSR) {
787 this->sort_csr(deduplication, deduplication_mode);
788 }
else if (matrix_format_ == format::CSC) {
789 this->sort_csc(deduplication, deduplication_mode);
791 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised matrix format" << std::endl;
792 std::cerr <<
" Please set the matrix_format_ as:" << std::endl;
793 std::cerr <<
" format::COO: COOrdinate format" << std::endl;
794 std::cerr <<
" format::CSR (default): Compressed Sparse Row format" << std::endl;
795 std::cerr <<
" format::CSC: Compressed Sparse Column format" << std::endl;
807 template<
typename ITYPE,
typename VTYPE>
810 assert((matrix_format_ == format::COO) &&
811 "MUI Error [matrix_manipulation.h]: sort_coo() can only applied to sparse matrix with COO format. Please consider to convert the format into COO before use this function.");
813 if (matrix_coo.values_.size() <= 1)
return;
817 if ((deduplication_mode_trim !=
"plus") && (deduplication_mode_trim !=
"minus") && (deduplication_mode_trim !=
"multiply") && (deduplication_mode_trim !=
"overwrite")) {
818 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised deduplication mode: " << deduplication_mode <<
" for sort_coo() function" << std::endl;
819 std::cerr <<
" Please set the deduplication mode as:" << std::endl;
820 std::cerr <<
" 'plus': Sum up values for all duplicated elements" << std::endl;
821 std::cerr <<
" 'minus': Take the difference among duplicated elements according to their position (former element minus later element)" << std::endl;
822 std::cerr <<
" 'multiply': Take the product among all duplicated elements" << std::endl;
823 std::cerr <<
" 'overwrite' (default): Keeps only the value of the last duplicated element" << std::endl;
828 std::vector<ITYPE> sorted_indices(matrix_coo.row_indices_.size());
829 std::iota(sorted_indices.begin(), sorted_indices.end(), 0);
833 std::sort(sorted_indices.begin(), sorted_indices.end(),
834 [&](ITYPE i, ITYPE j) {
835 return (matrix_coo.row_indices_[i] == matrix_coo.row_indices_[j])
836 ? matrix_coo.col_indices_[i] < matrix_coo.col_indices_[j]
837 : matrix_coo.row_indices_[i] < matrix_coo.row_indices_[j];
840 std::sort(sorted_indices.begin(), sorted_indices.end(),
841 [&](ITYPE i, ITYPE j) {
842 return (matrix_coo.col_indices_[i] == matrix_coo.col_indices_[j])
843 ? matrix_coo.row_indices_[i] < matrix_coo.row_indices_[j]
844 : matrix_coo.col_indices_[i] < matrix_coo.col_indices_[j];
849 std::vector<VTYPE> sorted_values;
850 std::vector<ITYPE> sorted_row_indices;
851 std::vector<ITYPE> sorted_column_indices;
853 sorted_values.reserve(sorted_indices.size());
854 sorted_row_indices.reserve(sorted_indices.size());
855 sorted_column_indices.reserve(sorted_indices.size());
857 for (ITYPE i = 0; i < static_cast<ITYPE>(sorted_indices.size()); ++i) {
859 sorted_values.emplace_back(matrix_coo.values_[sorted_indices[i]]);
860 sorted_row_indices.emplace_back(matrix_coo.row_indices_[sorted_indices[i]]);
861 sorted_column_indices.emplace_back(matrix_coo.col_indices_[sorted_indices[i]]);
868 std::vector<VTYPE> deduplicated_values;
869 std::vector<ITYPE> deduplicated_row_indices;
870 std::vector<ITYPE> deduplicated_column_indices;
872 deduplicated_values.reserve(sorted_indices.size());
873 deduplicated_row_indices.reserve(sorted_indices.size());
874 deduplicated_column_indices.reserve(sorted_indices.size());
876 ITYPE prev_row = sorted_row_indices[0];
877 ITYPE prev_col = sorted_column_indices[0];
878 VTYPE sum_value = sorted_values[0];
879 VTYPE difference_value = sorted_values[0];
880 VTYPE product_value = sorted_values[0];
881 VTYPE last_value = sorted_values[0];
882 bool is_multiply_by_zero =
true;
884 for (ITYPE i = 1; i < static_cast<ITYPE>(sorted_indices.size()); ++i) {
885 ITYPE curr_row = sorted_row_indices[i];
886 ITYPE curr_col = sorted_column_indices[i];
888 if (i !=
static_cast<ITYPE
>((sorted_indices.size()-1))) {
890 if ((curr_row == prev_row) && (curr_col == prev_col)) {
892 sum_value += sorted_values[i];
893 difference_value -= sorted_values[i];
894 product_value *= sorted_values[i];
895 last_value = sorted_values[i];
896 is_multiply_by_zero =
false;
900 deduplicated_values.emplace_back(sorted_values[0]);
901 deduplicated_row_indices.emplace_back(prev_row);
902 deduplicated_column_indices.emplace_back(prev_col);
907 sum_value = sorted_values[i];
908 difference_value = sorted_values[i];
909 product_value = sorted_values[i];
910 last_value = sorted_values[i];
911 is_multiply_by_zero =
true;
915 if ((curr_row == prev_row) && (curr_col == prev_col)) {
917 sum_value += sorted_values[i];
918 difference_value -= sorted_values[i];
919 product_value *= sorted_values[i];
920 last_value = sorted_values[i];
921 is_multiply_by_zero =
false;
926 deduplicated_values.emplace_back(sum_value);
927 deduplicated_row_indices.emplace_back(prev_row);
928 deduplicated_column_indices.emplace_back(prev_col);
930 deduplicated_values.emplace_back(difference_value);
931 deduplicated_row_indices.emplace_back(prev_row);
932 deduplicated_column_indices.emplace_back(prev_col);
934 deduplicated_values.emplace_back(product_value);
935 deduplicated_row_indices.emplace_back(prev_row);
936 deduplicated_column_indices.emplace_back(prev_col);
938 deduplicated_values.emplace_back(last_value);
939 deduplicated_row_indices.emplace_back(prev_row);
940 deduplicated_column_indices.emplace_back(prev_col);
945 sum_value = sorted_values[i];
946 difference_value = sorted_values[i];
947 product_value = sorted_values[i];
948 last_value = sorted_values[i];
949 is_multiply_by_zero =
true;
954 if ((curr_row == prev_row) && (curr_col == prev_col)) {
956 sum_value += sorted_values[i];
957 difference_value -= sorted_values[i];
958 product_value *= sorted_values[i];
959 last_value = sorted_values[i];
960 is_multiply_by_zero =
false;
963 deduplicated_values.emplace_back(sum_value);
964 deduplicated_row_indices.emplace_back(prev_row);
965 deduplicated_column_indices.emplace_back(prev_col);
967 deduplicated_values.emplace_back(difference_value);
968 deduplicated_row_indices.emplace_back(prev_row);
969 deduplicated_column_indices.emplace_back(prev_col);
971 deduplicated_values.emplace_back(product_value);
972 deduplicated_row_indices.emplace_back(prev_row);
973 deduplicated_column_indices.emplace_back(prev_col);
975 deduplicated_values.emplace_back(last_value);
976 deduplicated_row_indices.emplace_back(prev_row);
977 deduplicated_column_indices.emplace_back(prev_col);
983 deduplicated_values.emplace_back(sum_value);
984 deduplicated_row_indices.emplace_back(prev_row);
985 deduplicated_column_indices.emplace_back(prev_col);
986 deduplicated_values.emplace_back(sorted_values[i]);
987 deduplicated_row_indices.emplace_back(curr_row);
988 deduplicated_column_indices.emplace_back(curr_col);
990 deduplicated_values.emplace_back(difference_value);
991 deduplicated_row_indices.emplace_back(prev_row);
992 deduplicated_column_indices.emplace_back(prev_col);
993 deduplicated_values.emplace_back(sorted_values[i]);
994 deduplicated_row_indices.emplace_back(curr_row);
995 deduplicated_column_indices.emplace_back(curr_col);
997 deduplicated_values.emplace_back(product_value);
998 deduplicated_row_indices.emplace_back(prev_row);
999 deduplicated_column_indices.emplace_back(prev_col);
1000 deduplicated_values.emplace_back(sorted_values[i]);
1001 deduplicated_row_indices.emplace_back(curr_row);
1002 deduplicated_column_indices.emplace_back(curr_col);
1004 deduplicated_values.emplace_back(last_value);
1005 deduplicated_row_indices.emplace_back(prev_row);
1006 deduplicated_column_indices.emplace_back(prev_col);
1007 deduplicated_values.emplace_back(sorted_values[i]);
1008 deduplicated_row_indices.emplace_back(curr_row);
1009 deduplicated_column_indices.emplace_back(curr_col);
1017 std::swap(matrix_coo.values_, deduplicated_values);
1018 std::swap(matrix_coo.row_indices_, deduplicated_row_indices);
1019 std::swap(matrix_coo.col_indices_, deduplicated_column_indices);
1021 nnz_ = matrix_coo.values_.size();
1026 std::swap(matrix_coo.values_, sorted_values);
1027 std::swap(matrix_coo.row_indices_, sorted_row_indices);
1028 std::swap(matrix_coo.col_indices_, sorted_column_indices);
1030 nnz_ = matrix_coo.values_.size();
1036 template<
typename ITYPE,
typename VTYPE>
1039 assert((matrix_format_ == format::CSR) &&
1040 "MUI Error [matrix_manipulation.h]: sort_csr() can only applied to sparse matrix with CSR format. Please consider to convert the format into CSR before use this function.");
1042 if (matrix_csr.values_.size() <= 1)
return;
1046 if ((deduplication_mode_trim !=
"plus") && (deduplication_mode_trim !=
"minus") && (deduplication_mode_trim !=
"multiply") && (deduplication_mode_trim !=
"overwrite")) {
1047 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised deduplication mode: " << deduplication_mode <<
" for sort_csr() function" << std::endl;
1048 std::cerr <<
" Please set the deduplication mode as:" << std::endl;
1049 std::cerr <<
" 'plus': Sum up values for all duplicated elements" << std::endl;
1050 std::cerr <<
" 'minus': Take the difference among duplicated elements according to their position (former element minus later element)" << std::endl;
1051 std::cerr <<
" 'multiply': Take the product among all duplicated elements" << std::endl;
1052 std::cerr <<
" 'overwrite' (default): Keeps only the value of the last duplicated element" << std::endl;
1057 std::vector<ITYPE> sorted_col_indices;
1058 std::vector<VTYPE> sorted_values;
1061 for (ITYPE row = 0; row < rows_; ++row) {
1063 assert((matrix_csr.row_ptrs_[row] <= matrix_csr.row_ptrs_[row+1]) &&
1064 "MUI Error [matrix_manipulation.h]: sort_csr() unable to sort and deduplication the sparse matrix with CSR format as the row_ptrs_ vector is not in correct order.");
1067 std::vector<std::pair<ITYPE,VTYPE>> sorted_indices_pair;
1068 sorted_indices_pair.reserve(matrix_csr.row_ptrs_[row+1] - matrix_csr.row_ptrs_[row]);
1070 for(ITYPE j = matrix_csr.row_ptrs_[row]; j < matrix_csr.row_ptrs_[row+1]; ++j){
1071 sorted_indices_pair.emplace_back(std::make_pair(matrix_csr.col_indices_[j],matrix_csr.values_[j]));
1074 std::sort(sorted_indices_pair.begin(),sorted_indices_pair.end(),[](
const std::pair<ITYPE,VTYPE>& x,
const std::pair<ITYPE,VTYPE>& y) {
1075 return x.first <= y.first;
1078 for(ITYPE j = matrix_csr.row_ptrs_[row], n = 0; j < matrix_csr.row_ptrs_[row+1]; ++j, ++n){
1079 matrix_csr.col_indices_[j] = sorted_indices_pair[n].first;
1080 matrix_csr.values_[j] = sorted_indices_pair[n].second;
1084 sorted_indices_pair.clear();
1086 if (deduplication) {
1088 std::vector<ITYPE> uniqueColumns;
1089 uniqueColumns.reserve(matrix_csr.row_ptrs_[row + 1]-matrix_csr.row_ptrs_[row]);
1092 std::vector<VTYPE> uniqueValues;
1093 uniqueValues.reserve(matrix_csr.row_ptrs_[row + 1]-matrix_csr.row_ptrs_[row]);
1096 for (ITYPE i = matrix_csr.row_ptrs_[row]; i < matrix_csr.row_ptrs_[row + 1]; ++i) {
1097 ITYPE col = matrix_csr.col_indices_[i];
1098 VTYPE val = matrix_csr.values_[i];
1101 auto it = std::lower_bound(uniqueColumns.begin(), uniqueColumns.end(), col);
1102 ITYPE index = std::distance(uniqueColumns.begin(), it);
1103 if (it != uniqueColumns.end() && *it == col) {
1105 VTYPE sum_value = uniqueValues[index] + val;
1106 VTYPE difference_value = uniqueValues[index] - val;
1107 VTYPE product_value = uniqueValues[index] * val;
1108 VTYPE last_value = val;
1110 uniqueValues[index] = sum_value;
1112 uniqueValues[index] = difference_value;
1114 uniqueValues[index] = product_value;
1116 uniqueValues[index] = last_value;
1120 VTYPE sum_value = val;
1121 VTYPE difference_value = val;
1122 VTYPE product_value = val;
1123 VTYPE last_value = val;
1125 uniqueColumns.emplace_back(col);
1126 uniqueValues.emplace_back(sum_value);
1128 uniqueColumns.emplace_back(col);
1129 uniqueValues.emplace_back(difference_value);
1131 uniqueColumns.emplace_back(col);
1132 uniqueValues.emplace_back(product_value);
1134 uniqueColumns.emplace_back(col);
1135 uniqueValues.emplace_back(last_value);
1141 sorted_col_indices.insert(sorted_col_indices.end(), uniqueColumns.begin(), uniqueColumns.end());
1142 sorted_values.insert(sorted_values.end(), uniqueValues.begin(), uniqueValues.end());
1145 matrix_csr.row_ptrs_[row + 1] = matrix_csr.row_ptrs_[row] + uniqueColumns.size();
1149 if (deduplication) {
1151 matrix_csr.col_indices_.clear();
1152 matrix_csr.col_indices_.shrink_to_fit();
1153 matrix_csr.col_indices_.swap(sorted_col_indices);
1154 matrix_csr.values_.clear();
1155 matrix_csr.values_.shrink_to_fit();
1156 matrix_csr.values_.swap(sorted_values);
1157 nnz_ = matrix_csr.values_.size();
1161 sorted_col_indices.clear();
1162 sorted_values.clear();
1167 template<
typename ITYPE,
typename VTYPE>
1170 assert((matrix_format_ == format::CSC) &&
1171 "MUI Error [matrix_manipulation.h]: sort_csc() can only applied to sparse matrix with CSC format. Please consider to convert the format into CSC before use this function.");
1173 if (matrix_csc.values_.size() <= 1)
return;
1177 if ((deduplication_mode_trim !=
"plus") && (deduplication_mode_trim !=
"minus") && (deduplication_mode_trim !=
"multiply") && (deduplication_mode_trim !=
"overwrite")) {
1178 std::cerr <<
"MUI Error [matrix_manipulation.h]: Unrecognised deduplication mode: " << deduplication_mode <<
" for sort_csc() function" << std::endl;
1179 std::cerr <<
" Please set the deduplication mode as:" << std::endl;
1180 std::cerr <<
" 'plus': Sum up values for all duplicated elements" << std::endl;
1181 std::cerr <<
" 'minus': Take the difference among duplicated elements according to their position (former element minus later element)" << std::endl;
1182 std::cerr <<
" 'multiply': Take the product among all duplicated elements" << std::endl;
1183 std::cerr <<
" 'overwrite' (default): Keeps only the value of the last duplicated element" << std::endl;
1188 std::vector<ITYPE> sorted_row_indices;
1189 std::vector<VTYPE> sorted_values;
1192 for (ITYPE col = 0; col < cols_; ++col) {
1194 assert((matrix_csc.col_ptrs_[col] <= matrix_csc.col_ptrs_[col+1]) &&
1195 "MUI Error [matrix_manipulation.h]: sort_csc() unable to sort and deduplication the sparse matrix with CSC format as the col_ptrs_ vector is not in correct order.");
1198 std::vector<std::pair<ITYPE,VTYPE>> sorted_indices_pair;
1199 sorted_indices_pair.reserve(matrix_csc.col_ptrs_[col+1] - matrix_csc.col_ptrs_[col]);
1201 for(ITYPE j = matrix_csc.col_ptrs_[col]; j < matrix_csc.col_ptrs_[col+1]; ++j){
1202 sorted_indices_pair.emplace_back(std::make_pair(matrix_csc.row_indices_[j],matrix_csc.values_[j]));
1205 std::sort(sorted_indices_pair.begin(),sorted_indices_pair.end(),[](
const std::pair<ITYPE,VTYPE>& x,
const std::pair<ITYPE,VTYPE>& y) {
1206 return x.first <= y.first;
1209 for(ITYPE j = matrix_csc.col_ptrs_[col], n = 0; j < matrix_csc.col_ptrs_[col+1]; ++j, ++n){
1210 matrix_csc.row_indices_[j] = sorted_indices_pair[n].first;
1211 matrix_csc.values_[j] = sorted_indices_pair[n].second;
1215 sorted_indices_pair.clear();
1217 if (deduplication) {
1219 std::vector<ITYPE> uniqueRows;
1220 uniqueRows.reserve(matrix_csc.col_ptrs_[col + 1]-matrix_csc.col_ptrs_[col]);
1223 std::vector<VTYPE> uniqueValues;
1224 uniqueValues.reserve(matrix_csc.col_ptrs_[col + 1]-matrix_csc.col_ptrs_[col]);
1227 for (ITYPE i = matrix_csc.col_ptrs_[col]; i < matrix_csc.col_ptrs_[col + 1]; ++i) {
1228 ITYPE row = matrix_csc.row_indices_[i];
1229 VTYPE val = matrix_csc.values_[i];
1232 auto it = std::lower_bound(uniqueRows.begin(), uniqueRows.end(), row);
1233 ITYPE index = std::distance(uniqueRows.begin(), it);
1234 if (it != uniqueRows.end() && *it == row) {
1236 VTYPE sum_value = uniqueValues[index] + val;
1237 VTYPE difference_value = uniqueValues[index] - val;
1238 VTYPE product_value = uniqueValues[index] * val;
1239 VTYPE last_value = val;
1241 uniqueValues[index] = sum_value;
1243 uniqueValues[index] = difference_value;
1245 uniqueValues[index] = product_value;
1247 uniqueValues[index] = last_value;
1251 VTYPE sum_value = val;
1252 VTYPE difference_value = val;
1253 VTYPE product_value = val;
1254 VTYPE last_value = val;
1256 uniqueRows.emplace_back(row);
1257 uniqueValues.emplace_back(sum_value);
1259 uniqueRows.emplace_back(row);
1260 uniqueValues.emplace_back(difference_value);
1262 uniqueRows.emplace_back(row);
1263 uniqueValues.emplace_back(product_value);
1265 uniqueRows.emplace_back(row);
1266 uniqueValues.emplace_back(last_value);
1272 sorted_row_indices.insert(sorted_row_indices.end(), uniqueRows.begin(), uniqueRows.end());
1273 sorted_values.insert(sorted_values.end(), uniqueValues.begin(), uniqueValues.end());
1276 matrix_csc.col_ptrs_[col + 1] = matrix_csc.col_ptrs_[col] + uniqueRows.size();
1280 if (deduplication) {
1282 matrix_csc.row_indices_.clear();
1283 matrix_csc.row_indices_.shrink_to_fit();
1284 matrix_csc.row_indices_.swap(sorted_row_indices);
1285 matrix_csc.values_.clear();
1286 matrix_csc.values_.shrink_to_fit();
1287 matrix_csc.values_.swap(sorted_values);
1288 nnz_ = matrix_csc.values_.size();
1292 sorted_row_indices.clear();
1293 sorted_values.clear();
1298 template<
typename ITYPE,
typename VTYPE>
1303 std::string file_name;
1304 std::string function_name;
1306 if (file_name_input.empty()) {
1307 file_name =
"matrix_manipulation.h";
1309 file_name = file_name_input;
1312 if (function_name_input.empty()) {
1313 function_name =
"coo_element_operation()";
1315 function_name = function_name_input;
1318 if ((operation_mode_trim !=
"plus") and (operation_mode_trim !=
"minus") and (operation_mode_trim !=
"multiply") and (operation_mode_trim !=
"overwrite") and (operation_mode_trim !=
"nonsort")) {
1319 std::cerr <<
"MUI Error [" << file_name <<
"]: Unrecognised COO element operation mode: " << operation_mode_trim <<
" for " << function_name <<
" function" << std::endl;
1320 std::cerr <<
" Please set the COO element operation mode as:" << std::endl;
1321 std::cerr <<
" 'plus': Sum up elemental values" << std::endl;
1322 std::cerr <<
" 'minus': Take the difference among elemental values" << std::endl;
1323 std::cerr <<
" 'multiply': Take the product among elemental values" << std::endl;
1324 std::cerr <<
" 'overwrite' (default): Keeps only the last elemental value" << std::endl;
1325 std::cerr <<
" 'nonsort': Append the element value without sort or deduplication" << std::endl;
1329 if (operation_mode_trim ==
"nonsort") {
1331 matrix_coo.values_.reserve(matrix_coo.values_.size()+1);
1332 matrix_coo.row_indices_.reserve(matrix_coo.row_indices_.size()+1);
1333 matrix_coo.col_indices_.reserve(matrix_coo.col_indices_.size()+1);
1334 matrix_coo.values_.emplace_back(val);
1335 matrix_coo.row_indices_.emplace_back(r);
1336 matrix_coo.col_indices_.emplace_back(c);
1342 bool isElementAdded =
false;
1345 auto lower = std::lower_bound(matrix_coo.row_indices_.begin(), matrix_coo.row_indices_.end(), r);
1346 auto upper = std::upper_bound(matrix_coo.row_indices_.begin(), matrix_coo.row_indices_.end(), r);
1348 ITYPE insert_position = std::distance(matrix_coo.row_indices_.begin(), lower);
1351 for (
auto it = lower; it != upper; ++it) {
1352 insert_position = std::distance(matrix_coo.row_indices_.begin(), it);
1353 if (matrix_coo.col_indices_[insert_position] < c) {
1355 }
else if (matrix_coo.col_indices_[insert_position] == c) {
1357 if (operation_mode_trim ==
"plus") {
1360 matrix_coo.values_[insert_position] += val;
1362 matrix_coo.row_indices_.erase(matrix_coo.row_indices_.begin() + insert_position);
1363 matrix_coo.col_indices_.erase(matrix_coo.col_indices_.begin() + insert_position);
1364 matrix_coo.values_.erase(matrix_coo.values_.begin() + insert_position);
1367 isElementAdded =
true;
1369 }
else if (operation_mode_trim ==
"minus") {
1372 matrix_coo.values_[insert_position] -= val;
1374 matrix_coo.row_indices_.erase(matrix_coo.row_indices_.begin() + insert_position);
1375 matrix_coo.col_indices_.erase(matrix_coo.col_indices_.begin() + insert_position);
1376 matrix_coo.values_.erase(matrix_coo.values_.begin() + insert_position);
1379 isElementAdded =
true;
1381 }
else if (operation_mode_trim ==
"multiply") {
1384 matrix_coo.values_[insert_position] *= val;
1386 matrix_coo.row_indices_.erase(matrix_coo.row_indices_.begin() + insert_position);
1387 matrix_coo.col_indices_.erase(matrix_coo.col_indices_.begin() + insert_position);
1388 matrix_coo.values_.erase(matrix_coo.values_.begin() + insert_position);
1391 isElementAdded =
true;
1396 matrix_coo.values_[insert_position] = val;
1398 matrix_coo.row_indices_.erase(matrix_coo.row_indices_.begin() + insert_position);
1399 matrix_coo.col_indices_.erase(matrix_coo.col_indices_.begin() + insert_position);
1400 matrix_coo.values_.erase(matrix_coo.values_.begin() + insert_position);
1403 isElementAdded =
true;
1407 if (operation_mode_trim !=
"multiply") {
1410 matrix_coo.values_.reserve(matrix_coo.values_.size()+1);
1411 matrix_coo.row_indices_.reserve(matrix_coo.row_indices_.size()+1);
1412 matrix_coo.col_indices_.reserve(matrix_coo.col_indices_.size()+1);
1414 matrix_coo.row_indices_.insert(matrix_coo.row_indices_.begin() + insert_position, r);
1415 matrix_coo.col_indices_.insert(matrix_coo.col_indices_.begin() + insert_position, c);
1416 if (operation_mode_trim ==
"minus") {
1417 matrix_coo.values_.insert(matrix_coo.values_.begin() + insert_position, -val);
1419 matrix_coo.values_.insert(matrix_coo.values_.begin() + insert_position, val);
1424 isElementAdded =
true;
1429 if (operation_mode_trim !=
"multiply") {
1431 insert_position = std::distance(matrix_coo.row_indices_.begin(), upper);
1433 matrix_coo.values_.reserve(matrix_coo.values_.size()+1);
1434 matrix_coo.row_indices_.reserve(matrix_coo.row_indices_.size()+1);
1435 matrix_coo.col_indices_.reserve(matrix_coo.col_indices_.size()+1);
1437 matrix_coo.row_indices_.insert(matrix_coo.row_indices_.begin() + insert_position, r);
1438 matrix_coo.col_indices_.insert(matrix_coo.col_indices_.begin() + insert_position, c);
1439 if (operation_mode_trim ==
"minus") {
1440 matrix_coo.values_.insert(matrix_coo.values_.begin() + insert_position, -val);
1442 matrix_coo.values_.insert(matrix_coo.values_.begin() + insert_position, val);
1450 template<
typename ITYPE,
typename VTYPE>
1455 std::string file_name;
1456 std::string function_name;
1458 if (file_name_input.empty()) {
1459 file_name =
"matrix_manipulation.h";
1461 file_name = file_name_input;
1464 if (function_name_input.empty()) {
1465 function_name =
"csr_element_operation()";
1467 function_name = function_name_input;
1470 if ((operation_mode_trim !=
"plus") and (operation_mode_trim !=
"minus") and (operation_mode_trim !=
"multiply") and (operation_mode_trim !=
"overwrite")) {
1471 std::cerr <<
"MUI Error [" << file_name <<
"]: Unrecognised CSR element operation mode: " << operation_mode_trim <<
" for " << function_name <<
" function" << std::endl;
1472 std::cerr <<
" Please set the CSR element operation mode as:" << std::endl;
1473 std::cerr <<
" 'plus': Sum up elemental values" << std::endl;
1474 std::cerr <<
" 'minus': Take the difference among elemental values" << std::endl;
1475 std::cerr <<
" 'multiply': Take the product among elemental values" << std::endl;
1476 std::cerr <<
" 'overwrite' (default): Keeps only the last elemental value" << std::endl;
1481 ITYPE start = matrix_csr.row_ptrs_[r];
1482 ITYPE end = matrix_csr.row_ptrs_[r + 1];
1485 auto it = std::lower_bound(matrix_csr.col_indices_.begin()+start, matrix_csr.col_indices_.begin()+end, c);
1488 if (it != matrix_csr.col_indices_.begin()+end && *it == c) {
1490 ITYPE insert_position = std::distance(matrix_csr.col_indices_.begin(), it);
1491 if (operation_mode_trim ==
"plus") {
1495 matrix_csr.values_[insert_position] += val;
1498 matrix_csr.col_indices_.erase(matrix_csr.col_indices_.begin()+insert_position);
1499 matrix_csr.values_.erase(matrix_csr.values_.begin()+insert_position);
1502 for (ITYPE i = r + 1; i < static_cast<ITYPE>(matrix_csr.row_ptrs_.size()); ++i) {
1503 matrix_csr.row_ptrs_[i]--;
1507 }
else if (operation_mode_trim ==
"minus") {
1511 matrix_csr.values_[insert_position] -= val;
1514 matrix_csr.col_indices_.erase(matrix_csr.col_indices_.begin()+insert_position);
1515 matrix_csr.values_.erase(matrix_csr.values_.begin()+insert_position);
1518 for (ITYPE i = r + 1; i < static_cast<ITYPE>(matrix_csr.row_ptrs_.size()); ++i) {
1519 matrix_csr.row_ptrs_[i]--;
1523 }
else if (operation_mode_trim ==
"multiply") {
1527 matrix_csr.values_[insert_position] *= val;
1530 matrix_csr.col_indices_.erase(matrix_csr.col_indices_.begin()+insert_position);
1531 matrix_csr.values_.erase(matrix_csr.values_.begin()+insert_position);
1534 for (ITYPE i = r + 1; i < static_cast<ITYPE>(matrix_csr.row_ptrs_.size()); ++i) {
1535 matrix_csr.row_ptrs_[i]--;
1543 matrix_csr.values_[insert_position] = val;
1546 matrix_csr.col_indices_.erase(matrix_csr.col_indices_.begin()+insert_position);
1547 matrix_csr.values_.erase(matrix_csr.values_.begin()+insert_position);
1550 for (ITYPE i = r + 1; i < static_cast<ITYPE>(matrix_csr.row_ptrs_.size()); ++i) {
1551 matrix_csr.row_ptrs_[i]--;
1557 if (operation_mode_trim !=
"multiply") {
1561 ITYPE insert_position = std::distance(matrix_csr.col_indices_.begin(), it);
1562 matrix_csr.col_indices_.reserve(matrix_csr.col_indices_.size()+1);
1563 matrix_csr.values_.reserve(matrix_csr.values_.size()+1);
1564 matrix_csr.col_indices_.insert(matrix_csr.col_indices_.begin()+insert_position, c);
1565 if (operation_mode_trim ==
"minus") {
1566 matrix_csr.values_.insert(matrix_csr.values_.begin()+insert_position, -val);
1568 matrix_csr.values_.insert(matrix_csr.values_.begin()+insert_position, val);
1572 for (ITYPE i = r + 1; i < static_cast<ITYPE>(matrix_csr.row_ptrs_.size()); ++i) {
1573 matrix_csr.row_ptrs_[i]++;
1584 template<
typename ITYPE,
typename VTYPE>
1589 std::string file_name;
1590 std::string function_name;
1592 if (file_name_input.empty()) {
1593 file_name =
"matrix_manipulation.h";
1595 file_name = file_name_input;
1598 if (function_name_input.empty()) {
1599 function_name =
"csc_element_operation()";
1601 function_name = function_name_input;
1604 if ((operation_mode_trim !=
"plus") and (operation_mode_trim !=
"minus") and (operation_mode_trim !=
"multiply") and (operation_mode_trim !=
"overwrite")) {
1605 std::cerr <<
"MUI Error [" << file_name <<
"]: Unrecognised CSC element operation mode: " << operation_mode_trim <<
" for " << function_name <<
" function" << std::endl;
1606 std::cerr <<
" Please set the CSC element operation mode as:" << std::endl;
1607 std::cerr <<
" 'plus': Sum up elemental values" << std::endl;
1608 std::cerr <<
" 'minus': Take the difference among elemental values" << std::endl;
1609 std::cerr <<
" 'multiply': Take the product among elemental values" << std::endl;
1610 std::cerr <<
" 'overwrite' (default): Keeps only the last elemental value" << std::endl;
1616 ITYPE start = matrix_csc.col_ptrs_[c];
1617 ITYPE end = matrix_csc.col_ptrs_[c + 1];
1620 auto it = std::lower_bound(matrix_csc.row_indices_.begin()+start, matrix_csc.row_indices_.begin()+end, r);
1623 if (it != matrix_csc.row_indices_.begin()+end && *it == r) {
1625 ITYPE insert_position = std::distance(matrix_csc.row_indices_.begin(), it);
1626 if (operation_mode_trim ==
"plus") {
1630 matrix_csc.values_[insert_position] += val;
1633 matrix_csc.row_indices_.erase(matrix_csc.row_indices_.begin()+insert_position);
1634 matrix_csc.values_.erase(matrix_csc.values_.begin()+insert_position);
1637 for (ITYPE i = c + 1; i < static_cast<ITYPE>(matrix_csc.col_ptrs_.size()); ++i) {
1638 matrix_csc.col_ptrs_[i]--;
1642 }
else if (operation_mode_trim ==
"minus") {
1646 matrix_csc.values_[insert_position] -= val;
1649 matrix_csc.row_indices_.erase(matrix_csc.row_indices_.begin()+insert_position);
1650 matrix_csc.values_.erase(matrix_csc.values_.begin()+insert_position);
1653 for (ITYPE i = c + 1; i < static_cast<ITYPE>(matrix_csc.col_ptrs_.size()); ++i) {
1654 matrix_csc.col_ptrs_[i]--;
1658 }
else if (operation_mode_trim ==
"multiply") {
1662 matrix_csc.values_[insert_position] *= val;
1665 matrix_csc.row_indices_.erase(matrix_csc.row_indices_.begin()+insert_position);
1666 matrix_csc.values_.erase(matrix_csc.values_.begin()+insert_position);
1669 for (ITYPE i = c + 1; i < static_cast<ITYPE>(matrix_csc.col_ptrs_.size()); ++i) {
1670 matrix_csc.col_ptrs_[i]--;
1678 matrix_csc.values_[insert_position] = val;
1681 matrix_csc.row_indices_.erase(matrix_csc.row_indices_.begin()+insert_position);
1682 matrix_csc.values_.erase(matrix_csc.values_.begin()+insert_position);
1685 for (ITYPE i = c + 1; i < static_cast<ITYPE>(matrix_csc.col_ptrs_.size()); ++i) {
1686 matrix_csc.col_ptrs_[i]--;
1692 if (operation_mode_trim !=
"multiply") {
1696 ITYPE insert_position = std::distance(matrix_csc.row_indices_.begin(), it);
1697 matrix_csc.row_indices_.reserve(matrix_csc.row_indices_.size()+1);
1698 matrix_csc.values_.reserve(matrix_csc.values_.size()+1);
1699 matrix_csc.row_indices_.insert(matrix_csc.row_indices_.begin()+insert_position, r);
1700 if (operation_mode_trim ==
"minus") {
1701 matrix_csc.values_.insert(matrix_csc.values_.begin()+insert_position, -val);
1703 matrix_csc.values_.insert(matrix_csc.values_.begin()+insert_position, val);
1706 for (ITYPE i = c + 1; i < static_cast<ITYPE>(matrix_csc.col_ptrs_.size()); ++i) {
1707 matrix_csc.col_ptrs_[i]++;
1719 template<
typename ITYPE,
typename VTYPE>
1722 assert((matrix_format_ == format::COO) &&
1723 "MUI Error [matrix_manipulation.h]: coo_to_csr() can only applied to sparse matrix with COO format.");
1725 if (matrix_coo.values_.size() == 0) {
1726 matrix_format_ = format::CSR;
1727 matrix_csr.row_ptrs_.resize((rows_+1), 0);
1732 std::vector<ITYPE> rowPtr(rows_+1, 0);
1734 for (ITYPE i = 0; i < static_cast<ITYPE>(matrix_coo.row_indices_.size()); ++i) {
1735 if (matrix_coo.row_indices_[i] >= (rows_+1)) {
1736 std::cerr <<
"MUI Error [matrix_manipulation.h]: row index: " << matrix_coo.row_indices_[i] <<
" at the " << i <<
"th matrix_coo.row_indices_ is out of range (" << (rows_+1) <<
") in coo_to_csr()" << std::endl;
1739 rowPtr[matrix_coo.row_indices_[i]]++;
1744 for(ITYPE i = 0, accumulator = 0; i < rows_; ++i){
1745 ITYPE temp = rowPtr[i];
1746 rowPtr[i] = accumulator;
1747 accumulator += temp;
1749 rowPtr[rows_] = nnz_;
1752 matrix_csr.row_ptrs_.reserve(rows_+1);
1753 matrix_csr.values_.reserve(nnz_);
1754 matrix_csr.col_indices_.reserve(nnz_);
1756 std::swap(matrix_csr.values_, matrix_coo.values_);
1757 std::swap(matrix_csr.row_ptrs_, rowPtr);
1758 std::swap(matrix_csr.col_indices_, matrix_coo.col_indices_);
1761 matrix_coo.values_.clear();
1762 matrix_coo.row_indices_.clear();
1763 matrix_coo.col_indices_.clear();
1767 matrix_format_ = format::CSR;
1771 template<
typename ITYPE,
typename VTYPE>
1774 assert((matrix_format_ == format::COO) &&
1775 "MUI Error [matrix_manipulation.h]: coo_to_csc() can only applied to sparse matrix with COO format.");
1777 if (matrix_coo.values_.size() == 0) {
1778 matrix_format_ = format::CSC;
1779 matrix_csc.col_ptrs_.resize((cols_+1), 0);
1784 std::vector<ITYPE> colPtr(cols_+1, 0);
1786 for (ITYPE i = 0; i < static_cast<ITYPE>(matrix_coo.col_indices_.size()); ++i) {
1787 colPtr[matrix_coo.col_indices_[i]]++;
1790 for(ITYPE i = 0, accumulator = 0; i < cols_; ++i){
1791 ITYPE temp = colPtr[i];
1792 colPtr[i] = accumulator;
1793 accumulator += temp;
1795 colPtr[cols_] = nnz_;
1798 matrix_csc.values_.reserve(nnz_);
1799 matrix_csc.row_indices_.reserve(nnz_);
1800 matrix_csc.col_ptrs_.reserve(cols_+1);
1802 std::swap(matrix_csc.values_, matrix_coo.values_);
1803 std::swap(matrix_csc.row_indices_, matrix_coo.row_indices_);
1804 std::swap(matrix_csc.col_ptrs_, colPtr);
1807 matrix_coo.values_.clear();
1808 matrix_coo.row_indices_.clear();
1809 matrix_coo.col_indices_.clear();
1813 matrix_format_ = format::CSC;
1817 template<
typename ITYPE,
typename VTYPE>
1820 assert((matrix_format_ == format::CSR) &&
1821 "MUI Error [matrix_manipulation.h]: csr_to_coo() can only applied to sparse matrix with CSR format.");
1823 if (matrix_csr.values_.size() == 0) {
1824 matrix_format_ = format::COO;
1828 matrix_coo.values_.reserve(nnz_);
1829 matrix_coo.row_indices_.reserve(nnz_);
1830 matrix_coo.col_indices_.reserve(nnz_);
1833 for (ITYPE row = 0; row < rows_; ++row) {
1834 for (ITYPE row_nnz = matrix_csr.row_ptrs_[row]; row_nnz < matrix_csr.row_ptrs_[row + 1]; ++row_nnz) {
1835 matrix_coo.values_.emplace_back(matrix_csr.values_[row_nnz]);
1836 matrix_coo.row_indices_.emplace_back(row);
1837 matrix_coo.col_indices_.emplace_back(matrix_csr.col_indices_[row_nnz]);
1842 matrix_csr.values_.clear();
1843 matrix_csr.row_ptrs_.clear();
1844 matrix_csr.col_indices_.clear();
1847 matrix_format_ = format::COO;
1851 template<
typename ITYPE,
typename VTYPE>
1854 assert((matrix_format_ == format::CSR) &&
1855 "MUI Error [matrix_manipulation.h]: csr_to_csc() can only applied to sparse matrix with CSR format.");
1857 if (matrix_csr.values_.size() == 0) {
1858 matrix_format_ = format::CSC;
1859 matrix_csc.col_ptrs_.resize((cols_+1), 0);
1863 matrix_csc.col_ptrs_.resize((cols_+1), 0);
1864 matrix_csc.values_.resize(nnz_, 0);
1865 matrix_csc.row_indices_.resize(nnz_, 0);
1868 for (ITYPE i = 0; i < cols_; ++i) {
1869 for (ITYPE j = 0; j < static_cast<ITYPE>(matrix_csr.col_indices_.size()); ++j) {
1870 if (matrix_csr.col_indices_[j] == i) {
1871 ++matrix_csc.col_ptrs_[i];
1876 for(ITYPE i = 0, accumulator = 0; i < cols_; ++i){
1877 ITYPE temp = matrix_csc.col_ptrs_[i];
1878 matrix_csc.col_ptrs_[i] = accumulator;
1879 accumulator += temp;
1882 matrix_csc.col_ptrs_[cols_] = nnz_;
1884 for (ITYPE row = 0; row < rows_; ++row) {
1885 for (ITYPE row_nnz = matrix_csr.row_ptrs_[row]; row_nnz < matrix_csr.row_ptrs_[row + 1]; ++row_nnz) {
1886 ITYPE col = matrix_csr.col_indices_[row_nnz];
1887 ITYPE dest = matrix_csc.col_ptrs_[col];
1888 matrix_csc.row_indices_[dest] = row;
1889 matrix_csc.values_[dest] = matrix_csr.values_[row_nnz];
1890 matrix_csc.col_ptrs_[col]++;
1894 for (ITYPE col = 0, last = 0; col <= cols_; ++col) {
1895 ITYPE temp = matrix_csc.col_ptrs_[col];
1896 matrix_csc.col_ptrs_[col] = last;
1901 matrix_csr.values_.clear();
1902 matrix_csr.row_ptrs_.clear();
1903 matrix_csr.col_indices_.clear();
1906 matrix_format_ = format::CSC;
1911 template<
typename ITYPE,
typename VTYPE>
1914 assert((matrix_format_ == format::CSC) &&
1915 "MUI Error [matrix_manipulation.h]: csc_to_coo() can only applied to sparse matrix with CSC format.");
1917 if (matrix_csc.values_.size() == 0) {
1918 matrix_format_ = format::COO;
1922 matrix_coo.values_.reserve(nnz_);
1923 matrix_coo.row_indices_.reserve(nnz_);
1924 matrix_coo.col_indices_.reserve(nnz_);
1927 for (ITYPE col = 0; col < cols_; ++col) {
1928 for (ITYPE col_nnz = matrix_csc.col_ptrs_[col]; col_nnz < matrix_csc.col_ptrs_[col + 1]; ++col_nnz) {
1929 matrix_coo.values_.emplace_back(matrix_csc.values_[col_nnz]);
1930 matrix_coo.row_indices_.emplace_back(matrix_csc.row_indices_[col_nnz]);
1931 matrix_coo.col_indices_.emplace_back(col);
1936 matrix_csc.values_.clear();
1937 matrix_csc.row_indices_.clear();
1938 matrix_csc.col_ptrs_.clear();
1941 matrix_format_ = format::COO;
1945 template<
typename ITYPE,
typename VTYPE>
1948 assert((matrix_format_ == format::CSC) &&
1949 "MUI Error [matrix_manipulation.h]: csc_to_csr() can only applied to sparse matrix with CSC format.");
1951 if (matrix_csc.values_.size() == 0) {
1952 matrix_format_ = format::CSR;
1953 matrix_csr.row_ptrs_.resize((rows_+1), 0);
1957 matrix_csr.values_.resize(nnz_, 0);
1958 matrix_csr.row_ptrs_.resize((rows_+1), 0);
1959 matrix_csr.col_indices_.resize(nnz_, 0);
1962 for (ITYPE i = 0; i < static_cast<ITYPE>(matrix_csc.row_indices_.size()); ++i) {
1963 matrix_csr.row_ptrs_[matrix_csc.row_indices_[i]]++;
1966 for(ITYPE i = 0, accumulator = 0; i < rows_; ++i){
1967 ITYPE temp = matrix_csr.row_ptrs_[i];
1968 matrix_csr.row_ptrs_[i] = accumulator;
1969 accumulator += temp;
1972 matrix_csr.row_ptrs_[rows_] = nnz_;
1974 for (ITYPE col = 0; col < cols_; ++col) {
1975 for (ITYPE col_nnz = matrix_csc.col_ptrs_[col]; col_nnz < matrix_csc.col_ptrs_[col + 1]; ++col_nnz) {
1976 ITYPE row = matrix_csc.row_indices_[col_nnz];
1977 ITYPE dest = matrix_csr.row_ptrs_[row];
1978 matrix_csr.col_indices_[dest] = col;
1979 matrix_csr.values_[dest] = matrix_csc.values_[col_nnz];
1980 matrix_csr.row_ptrs_[row]++;
1984 for (ITYPE row = 0, last = 0; row <= rows_; ++row) {
1985 ITYPE temp = matrix_csr.row_ptrs_[row];
1986 matrix_csr.row_ptrs_[row] = last;
1991 matrix_csc.values_.clear();
1992 matrix_csc.row_indices_.clear();
1993 matrix_csc.col_ptrs_.clear();
1996 matrix_format_ = format::CSR;
2001 template<
typename ITYPE,
typename VTYPE>
2004 matrix_coo.values_.clear();
2005 matrix_coo.row_indices_.clear();
2006 matrix_coo.col_indices_.clear();
2007 matrix_csr.values_.clear();
2008 matrix_csr.row_ptrs_.clear();
2009 matrix_csr.col_indices_.clear();
2010 matrix_csc.values_.clear();
2011 matrix_csc.row_indices_.clear();
2012 matrix_csc.col_ptrs_.clear();
void clear_vectors()
Definition: matrix_manipulation.h:2002
void sort_deduplication(bool=true, bool=true, const std::string &="overwrite", bool=true)
Definition: matrix_manipulation.h:764
void csr_to_csc()
Definition: matrix_manipulation.h:1852
void csc_element_operation(ITYPE, ITYPE, VTYPE, const std::string &, const std::string &={}, const std::string &={})
Definition: matrix_manipulation.h:1585
void coo_element_operation(ITYPE, ITYPE, VTYPE, const std::string &, const std::string &={}, const std::string &={})
Definition: matrix_manipulation.h:1299
void sort_csr(bool=false, const std::string &="overwrite")
Definition: matrix_manipulation.h:1037
void set_zero()
Definition: matrix_manipulation.h:418
void set_value(ITYPE, ITYPE, VTYPE, bool=true)
Definition: matrix_manipulation.h:292
sparse_matrix< ITYPE, VTYPE > & operator=(const sparse_matrix< ITYPE, VTYPE > &)
Definition: matrix_manipulation.h:587
sparse_matrix< ITYPE, VTYPE > segment(ITYPE, ITYPE, ITYPE, ITYPE, bool=true)
Definition: matrix_manipulation.h:153
void csc_to_coo()
Definition: matrix_manipulation.h:1912
std::string get_format() const
Definition: matrix_io_info.h:681
void coo_to_csc()
Definition: matrix_manipulation.h:1772
void assert_valid_vector_size(const std::string &={}, const std::string &={}) const
Definition: matrix_asserts.h:61
void resize(ITYPE, ITYPE)
Definition: matrix_manipulation.h:62
void add_scalar(ITYPE, ITYPE, VTYPE, bool=true)
Definition: matrix_manipulation.h:447
void swap_elements(ITYPE, ITYPE, ITYPE, ITYPE)
Definition: matrix_manipulation.h:407
void multiply_scalar(ITYPE, ITYPE, VTYPE, bool=true)
Definition: matrix_manipulation.h:540
void csr_element_operation(ITYPE, ITYPE, VTYPE, const std::string &, const std::string &={}, const std::string &={})
Definition: matrix_manipulation.h:1451
void copy(const sparse_matrix< ITYPE, VTYPE > &)
Definition: matrix_manipulation.h:79
void coo_to_csr()
Definition: matrix_manipulation.h:1720
void sort_coo(bool=true, bool=false, const std::string &="overwrite")
Definition: matrix_manipulation.h:808
void format_conversion(const std::string &="COO", bool=true, bool=false, const std::string &="overwrite")
Definition: matrix_manipulation.h:639
void csc_to_csr()
Definition: matrix_manipulation.h:1946
void csr_to_coo()
Definition: matrix_manipulation.h:1818
void subtract_scalar(ITYPE, ITYPE, VTYPE, bool=true)
Definition: matrix_manipulation.h:494
void sort_csc(bool=false, const std::string &="overwrite")
Definition: matrix_manipulation.h:1168
u u u u u u min
Definition: dim.h:289
std::string string_to_lower(const std::string &s)
Definition: linalg_util.h:78
std::string trim(const std::string &s)
Definition: linalg_util.h:73
std::string string_to_upper(const std::string &s)
Definition: linalg_util.h:85
void swap(storage< Args... > &lhs, storage< Args... > &rhs)
Definition: dynstorage.h:234