monolish  0.14.2
MONOlithic LIner equation Solvers for Highly-parallel architecture
monolish_coo.hpp
Go to the documentation of this file.
1 
8 #pragma once
9 #include <exception>
10 #include <omp.h>
11 #include <stdexcept>
12 #include <string>
13 #include <vector>
14 
15 #if USE_SXAT
16 #undef _HAS_CPP17
17 #endif
18 #include <random>
19 #if USE_SXAT
20 #define _HAS_CPP17 1
21 #endif
22 
23 #define MM_BANNER "%%MatrixMarket"
24 #define MM_MAT "matrix"
25 #define MM_VEC "vector"
26 #define MM_FMT "coordinate"
27 #define MM_TYPE_REAL "real"
28 #define MM_TYPE_GENERAL "general"
29 #define MM_TYPE_SYMM "symmetric"
30 
31 namespace monolish {
32 template <typename Float> class vector;
33 template <typename TYPE, typename Float> class view1D;
34 namespace matrix {
35 template <typename Float> class Dense;
36 template <typename Float> class CRS;
37 template <typename Float> class LinearOperator;
38 
45 template <typename Float> class COO {
46 private:
50  size_t rowN;
51 
55  size_t colN;
56 
60  size_t nnz;
61 
65  mutable bool gpu_status = false;
66 
67 public:
72  std::vector<int> row_index;
73 
78  std::vector<int> col_index;
79 
84  std::vector<Float> val;
85 
86  COO()
87  : rowN(0), colN(0), nnz(0), gpu_status(false), row_index(), col_index(),
88  val() {}
89 
99  COO(const size_t M, const size_t N)
100  : rowN(M), colN(N), nnz(0), gpu_status(false), row_index(), col_index(),
101  val() {}
102 
118  COO(const size_t M, const size_t N, const size_t NNZ, const int *row,
119  const int *col, const Float *value);
120 
136  COO(const size_t M, const size_t N, const size_t NNZ,
137  const std::vector<int> &row, const std::vector<int> &col,
138  const std::vector<Float> &value) {
139  this = COO(M, N, NNZ, row.data(), col.data(), value.data());
140  }
141 
159  COO(const size_t M, const size_t N, const size_t NNZ,
160  const std::vector<int> &row, const std::vector<int> &col,
161  const vector<Float> &value) {
162  assert(value.get_device_mem_stat() == false);
163  this = COO(M, N, NNZ, row.data(), col.data(), value.data());
164  }
165 
183  COO(const size_t M, const size_t N, const size_t NNZ, const int *row,
184  const int *col, const Float *value, const size_t origin);
185 
203  COO(const size_t M, const size_t N, const size_t NNZ,
204  const std::vector<int> &row, const std::vector<int> &col,
205  const std::vector<Float> &value, const size_t origin) {
206  this = COO(M, N, NNZ, row.data(), col.data(), value.data(), origin);
207  }
208 
217  COO(const matrix::COO<Float> &coo);
218 
227  void convert(const matrix::CRS<Float> &crs);
228 
237  COO(const matrix::CRS<Float> &crs) { convert(crs); }
238 
247  void convert(const matrix::Dense<Float> &dense);
248 
257  COO(const matrix::Dense<Float> &dense) { convert(dense); }
258 
259  void convert(const matrix::LinearOperator<Float> &linearoperator);
260 
261  COO(const matrix::LinearOperator<Float> &linearoperator) {
262  convert(linearoperator);
263  }
264 
273  void set_row(const size_t M) { rowN = M; };
274 
283  void set_col(const size_t N) { colN = N; };
284 
293  void set_nnz(const size_t NNZ) { nnz = NNZ; };
294 
295  // communication
296  // ///////////////////////////////////////////////////////////////////////////
302  void send() const {
303  throw std::runtime_error("error, GPU util of COO format is not impl. ");
304  };
305 
311  void recv() const {
312  throw std::runtime_error("error, GPU util of COO format is not impl. ");
313  };
314 
320  void device_free() const {};
321 
328  [[nodiscard]] bool get_device_mem_stat() const { return gpu_status; }
329 
335  ~COO() {
336  if (get_device_mem_stat()) {
337  device_free();
338  }
339  }
340 
341  // I/O
342  // ///////////////////////////////////////////////////////////////////////////
343 
352  void input_mm(const std::string filename);
353 
362  COO(const std::string filename) { input_mm(filename); }
363 
372  void output_mm(const std::string filename) const;
373 
382  void print_all(bool force_cpu = false) const;
383 
392  void print_all(const std::string filename) const;
393 
401  [[nodiscard]] Float at(const size_t i, const size_t j) const;
402 
410  [[nodiscard]] Float at(const size_t i, const size_t j) {
411  return static_cast<const COO *>(this)->at(i, j);
412  };
413 
426  void set_ptr(const size_t rN, const size_t cN, const std::vector<int> &r,
427  const std::vector<int> &c, const std::vector<Float> &v);
428 
436  [[nodiscard]] size_t get_row() const { return rowN; }
437 
445  [[nodiscard]] size_t get_col() const { return colN; }
446 
454  [[nodiscard]] size_t get_nnz() const { return nnz; }
455 
464  void fill(Float value);
465 
474  [[nodiscard]] std::vector<int> &get_row_ptr() { return row_index; }
475 
484  [[nodiscard]] std::vector<int> &get_col_ind() { return col_index; }
485 
494  [[nodiscard]] std::vector<Float> &get_val_ptr() { return val; }
495 
504  [[nodiscard]] const std::vector<int> &get_row_ptr() const {
505  return row_index;
506  }
507 
516  [[nodiscard]] const std::vector<int> &get_col_ind() const {
517  return col_index;
518  }
519 
528  [[nodiscard]] const std::vector<Float> &get_val_ptr() const { return val; }
529 
530  // Utility
531  // ///////////////////////////////////////////////////////////////////////////
532 
541  [[nodiscard]] COO &transpose();
542 
551  void transpose(COO &B) const;
552 
560  double get_data_size() const {
561  return 3 * get_nnz() * sizeof(Float) / 1.0e+9;
562  }
563 
571  [[nodiscard]] std::string type() const { return "COO"; }
572 
581  void diag(vector<Float> &vec) const;
582  void diag(view1D<vector<Float>, Float> &vec) const;
583  void diag(view1D<matrix::Dense<Float>, Float> &vec) const;
584 
594  void row(const size_t r, vector<Float> &vec) const;
595  void row(const size_t r, view1D<vector<Float>, Float> &vec) const;
596  void row(const size_t r, view1D<matrix::Dense<Float>, Float> &vec) const;
597 
607  void col(const size_t c, vector<Float> &vec) const;
608  void col(const size_t c, view1D<vector<Float>, Float> &vec) const;
609  void col(const size_t c, view1D<matrix::Dense<Float>, Float> &vec) const;
610 
612 
623  void operator=(const COO<Float> &mat);
624 
635  [[nodiscard]] bool equal(const COO<Float> &mat,
636  bool compare_cpu_and_device = false) const;
637 
647  [[nodiscard]] bool operator==(const COO<Float> &mat) const;
648 
658  [[nodiscard]] bool operator!=(const COO<Float> &mat) const;
659 
675  void insert(const size_t m, const size_t n, const Float val);
676 
677 private:
678  void _q_sort(int lo, int hi);
679 
680 public:
689  void sort(bool merge);
690 };
691 
692 } // namespace matrix
693 } // namespace monolish
monolish::matrix::COO::row_index
std::vector< int > row_index
Coodinate format row index, which stores row numbers of the non-zero elements (size nnz)
Definition: monolish_coo.hpp:72
monolish::matrix::COO::set_col
void set_col(const size_t N)
Set col number.
Definition: monolish_coo.hpp:283
monolish::matrix::LinearOperator
Linear Operator imitating Matrix.
Definition: monolish_coo.hpp:37
monolish::matrix::COO::COO
COO(const size_t M, const size_t N, const size_t NNZ, const std::vector< int > &row, const std::vector< int > &col, const std::vector< Float > &value, const size_t origin)
Create COO matrix from n-origin array.
Definition: monolish_coo.hpp:203
monolish::matrix::COO::device_free
void device_free() const
free data on GPU
Definition: monolish_coo.hpp:320
monolish::matrix::COO::set_row
void set_row(const size_t M)
Set row number.
Definition: monolish_coo.hpp:273
monolish::matrix::COO::output_mm
void output_mm(const std::string filename) const
output matrix elements in MatrixMarket format (MatrixMarket format: https://math.nist....
Definition: IO_coo.cpp:48
monolish::matrix::COO::set_ptr
void set_ptr(const size_t rN, const size_t cN, const std::vector< int > &r, const std::vector< int > &c, const std::vector< Float > &v)
Set COO array from std::vector.
Definition: copy_coo.cpp:26
monolish::matrix::COO::operator==
bool operator==(const COO< Float > &mat) const
Comparing matricies (A == mat)
Definition: compare_coo.cpp:71
monolish::matrix::COO::get_row
size_t get_row() const
get # of row
Definition: monolish_coo.hpp:436
monolish::matrix::COO::operator=
void operator=(const COO< Float > &mat)
matrix copy
Definition: copy_coo.cpp:10
monolish::matrix::COO::nnz
size_t nnz
# of non-zero element
Definition: monolish_coo.hpp:60
monolish::matrix::COO::COO
COO(const matrix::CRS< Float > &crs)
Create COO matrix from CRS matrix.
Definition: monolish_coo.hpp:237
monolish::matrix::Dense
Dense format Matrix.
Definition: monolish_coo.hpp:35
monolish::matrix::COO::insert
void insert(const size_t m, const size_t n, const Float val)
insert element to (m, n)
Definition: at_insert_sort_coo.cpp:30
monolish::matrix::COO::get_row_ptr
std::vector< int > & get_row_ptr()
get row index
Definition: monolish_coo.hpp:474
monolish::matrix::COO::COO
COO(const matrix::Dense< Float > &dense)
Create COO matrix from Dense matrix.
Definition: monolish_coo.hpp:257
monolish::matrix::COO::operator!=
bool operator!=(const COO< Float > &mat) const
Comparing matricies (A != mat)
Definition: compare_coo.cpp:83
monolish::vector::data
const Float * data() const
returns a direct pointer to the vector
Definition: monolish_vector.hpp:236
monolish::matrix::COO::input_mm
void input_mm(const std::string filename)
Create COO matrix from MatrixMatrket format file (only real general) (MatrixMarket format: https://ma...
Definition: IO_coo.cpp:68
monolish::matrix::COO::val
std::vector< Float > val
Coodinate format value array, which stores values of the non-zero elements (size nnz)
Definition: monolish_coo.hpp:84
monolish::matrix::COO::sort
void sort(bool merge)
sort COO matrix elements (and merge elements)
Definition: at_insert_sort_coo.cpp:108
monolish::matrix::COO::type
std::string type() const
get format name "COO"
Definition: monolish_coo.hpp:571
monolish::matrix::COO::get_val_ptr
std::vector< Float > & get_val_ptr()
get value
Definition: monolish_coo.hpp:494
monolish::matrix::COO::COO
COO(const matrix::LinearOperator< Float > &linearoperator)
Definition: monolish_coo.hpp:261
monolish::matrix::COO::print_all
void print_all(bool force_cpu=false) const
print all elements to standard I/O
Definition: IO_coo.cpp:17
monolish::matrix::COO::fill
void fill(Float value)
fill matrix elements with a scalar value
Definition: fill_coo.cpp:9
monolish::matrix::COO::COO
COO(const size_t M, const size_t N)
Initialize M x N COO matrix.
Definition: monolish_coo.hpp:99
monolish::matrix::COO::~COO
~COO()
; free gpu mem.
Definition: monolish_coo.hpp:335
monolish::matrix::COO::diag
void diag(vector< Float > &vec) const
get diag. vector
monolish::matrix::COO::get_row_ptr
const std::vector< int > & get_row_ptr() const
get row index
Definition: monolish_coo.hpp:504
monolish::matrix::COO::get_nnz
size_t get_nnz() const
get # of non-zeros
Definition: monolish_coo.hpp:454
monolish::matrix::COO::row
void row(const size_t r, vector< Float > &vec) const
get row vector
monolish
Definition: monolish_matrix_blas.hpp:10
monolish::matrix::COO::get_col_ind
std::vector< int > & get_col_ind()
get column index
Definition: monolish_coo.hpp:484
monolish::vector::get_device_mem_stat
bool get_device_mem_stat() const
true: sended, false: not send
Definition: monolish_vector.hpp:210
monolish::matrix::COO::at
Float at(const size_t i, const size_t j) const
Get matrix element (A(i,j))
Definition: at_insert_sort_coo.cpp:9
monolish::matrix::COO::get_device_mem_stat
bool get_device_mem_stat() const
false; // true: sended, false: not send
Definition: monolish_coo.hpp:328
monolish::matrix::COO
Coodinate (COO) format Matrix (need to sort)
Definition: monolish_coo.hpp:45
monolish::matrix::COO::send
void send() const
send data to GPU
Definition: monolish_coo.hpp:302
monolish::view1D
1D view class
Definition: monolish_coo.hpp:33
monolish::matrix::COO::set_nnz
void set_nnz(const size_t NNZ)
Set # of non-zero elements.
Definition: monolish_coo.hpp:293
monolish::matrix::COO::convert
void convert(const matrix::CRS< Float > &crs)
Create COO matrix from CRS matrix.
monolish::matrix::COO::at
Float at(const size_t i, const size_t j)
Get matrix element (A(i,j))
Definition: monolish_coo.hpp:410
monolish::matrix::COO::COO
COO()
Definition: monolish_coo.hpp:86
monolish::matrix::COO::get_data_size
double get_data_size() const
Memory data space required by the matrix.
Definition: monolish_coo.hpp:560
monolish::matrix::COO::COO
COO(const size_t M, const size_t N, const size_t NNZ, const std::vector< int > &row, const std::vector< int > &col, const vector< Float > &value)
Create COO matrix from monolish::vector.
Definition: monolish_coo.hpp:159
monolish::vector
vector class
Definition: monolish_coo.hpp:32
monolish::matrix::COO::colN
size_t colN
# of col
Definition: monolish_coo.hpp:55
monolish::matrix::COO::COO
COO(const std::string filename)
Create COO matrix from MatrixMatrket format file (only real general) (MatrixMarket format: https://ma...
Definition: monolish_coo.hpp:362
monolish::matrix::COO::transpose
COO & transpose()
get transposed matrix (A^T)
Definition: transpose_coo.cpp:9
monolish::matrix::COO::COO
COO(const size_t M, const size_t N, const size_t NNZ, const std::vector< int > &row, const std::vector< int > &col, const std::vector< Float > &value)
Create COO matrix from std::vector.
Definition: monolish_coo.hpp:136
monolish::matrix::COO::gpu_status
bool gpu_status
true: sended, false: not send
Definition: monolish_coo.hpp:65
monolish::matrix::COO::recv
void recv() const
recv data from GPU
Definition: monolish_coo.hpp:311
monolish::matrix::COO::equal
bool equal(const COO< Float > &mat, bool compare_cpu_and_device=false) const
Comparing matricies (A == mat)
Definition: compare_coo.cpp:10
monolish::matrix::COO::rowN
size_t rowN
# of row
Definition: monolish_coo.hpp:50
monolish::matrix::COO::_q_sort
void _q_sort(int lo, int hi)
Definition: at_insert_sort_coo.cpp:48
monolish::matrix::COO::get_col
size_t get_col() const
get # of col
Definition: monolish_coo.hpp:445
monolish::matrix::COO::get_val_ptr
const std::vector< Float > & get_val_ptr() const
get value
Definition: monolish_coo.hpp:528
monolish::matrix::COO::get_col_ind
const std::vector< int > & get_col_ind() const
get column index
Definition: monolish_coo.hpp:516
monolish::matrix::COO::col_index
std::vector< int > col_index
Coodinate format column index, which stores column numbers of the non-zero elements (size nnz)
Definition: monolish_coo.hpp:78
monolish::matrix::CRS
Compressed Row Storage (CRS) format Matrix.
Definition: monolish_coo.hpp:36
monolish::matrix::COO::col
void col(const size_t c, vector< Float > &vec) const
get column vector