monolish  0.14.2
MONOlithic LIner equation Solvers for Highly-parallel architecture
monolish_linearoperator.hpp
Go to the documentation of this file.
1 
8 #pragma once
9 #include <exception>
10 #include <functional>
11 #include <omp.h>
12 #include <stdexcept>
13 #include <string>
14 #include <vector>
15 
16 #if USE_SXAT
17 #undef _HAS_CPP17
18 #endif
19 #include <random>
20 #if USE_SXAT
21 #define _HAS_CPP17 1
22 #endif
23 
24 namespace monolish {
25 template <typename Float> class vector;
26 namespace matrix {
27 template <typename Float> class Dense;
28 template <typename Float> class COO;
29 template <typename Float> class CRS;
30 
37 template <typename Float> class LinearOperator {
38 private:
42  size_t rowN;
43 
47  size_t colN;
48 
52  mutable bool gpu_status = false;
53 
57  std::function<vector<Float>(const vector<Float> &)> matvec = nullptr;
58 
63  std::function<vector<Float>(const vector<Float> &)> rmatvec = nullptr;
64 
68  std::function<Dense<Float>(const Dense<Float> &)> matmul_dense = nullptr;
69 
74  std::function<Dense<Float>(const Dense<Float> &)> rmatmul_dense = nullptr;
75 
76 public:
78 
88  LinearOperator(const size_t M, const size_t N);
89 
101  const size_t M, const size_t N,
102  const std::function<vector<Float>(const vector<Float> &)> &MATVEC);
103 
117  const size_t M, const size_t N,
118  const std::function<vector<Float>(const vector<Float> &)> &MATVEC,
119  const std::function<vector<Float>(const vector<Float> &)> &RMATVEC);
120 
132  const size_t M, const size_t N,
133  const std::function<Dense<Float>(const Dense<Float> &)> &MATMUL);
134 
148  const size_t M, const size_t N,
149  const std::function<Dense<Float>(const Dense<Float> &)> &MATMUL,
150  const std::function<Dense<Float>(const Dense<Float> &)> &RMATMUL);
151 
159  void convert(COO<Float> &coo);
160 
170 
171  void convert(CRS<Float> &crs);
172 
174 
175  void convert(Dense<Float> &dense);
176 
177  LinearOperator(Dense<Float> &dense) { convert(dense); }
178 
179  void convert_to_Dense(Dense<Float> &dense) const;
180 
189  LinearOperator(const LinearOperator<Float> &linearoperator);
190 
198  [[nodiscard]] size_t get_row() const { return rowN; }
199 
207  [[nodiscard]] size_t get_col() const { return colN; }
208 
216  [[nodiscard]] std::function<vector<Float>(const vector<Float> &)>
217  get_matvec() const {
218  return matvec;
219  }
220 
229  [[nodiscard]] std::function<vector<Float>(const vector<Float> &)>
230  get_rmatvec() const {
231  return rmatvec;
232  }
233 
241  [[nodiscard]] std::function<
244  return matmul_dense;
245  }
246 
255  [[nodiscard]] std::function<
258  return rmatmul_dense;
259  }
260 
268  [[nodiscard]] bool get_matvec_init_flag() const {
269  return !(matvec == nullptr);
270  }
271 
279  [[nodiscard]] bool get_rmatvec_init_flag() const {
280  return !(rmatvec == nullptr);
281  }
282 
290  [[nodiscard]] bool get_matmul_dense_init_flag() const {
291  return !(matmul_dense == nullptr);
292  }
293 
301  [[nodiscard]] bool get_rmatmul_dense_init_flag() const {
302  return !(rmatmul_dense == nullptr);
303  }
304 
312  void
313  set_matvec(const std::function<vector<Float>(const vector<Float> &)> &MATVEC);
314 
323  void set_rmatvec(
324  const std::function<vector<Float>(const vector<Float> &)> &RMATVEC);
325 
333  void set_matmul_dense(
334  const std::function<matrix::Dense<Float>(const matrix::Dense<Float> &)>
335  &MATMUL);
336 
345  void set_rmatmul_dense(
346  const std::function<matrix::Dense<Float>(const matrix::Dense<Float> &)>
347  &RMATMUL);
348 
356  [[nodiscard]] std::string type() const { return "LinearOperator"; }
357 
364  void send() const {};
365 
372  void recv() const {};
373 
380  void nonfree_recv() const {};
381 
388  void device_free() const {};
389 
394  [[nodiscard]] bool get_device_mem_stat() const { return gpu_status; };
395 
396  void set_device_mem_stat(bool status) {
397  gpu_status = status;
398  return;
399  };
400 
408 
413  void diag(vector<Float> &vec) const;
414  void diag(view1D<vector<Float>, Float> &vec) const;
415  void diag(view1D<matrix::Dense<Float>, Float> &vec) const;
416 
425  void operator=(const LinearOperator<Float> &mat);
426 };
427 } // namespace matrix
428 } // namespace monolish
monolish::matrix::LinearOperator::set_rmatvec
void set_rmatvec(const std::function< vector< Float >(const vector< Float > &)> &RMATVEC)
set multiplication function of (Hermitian) transposed matrix and vector
Definition: linearoperator_constructor.cpp:148
monolish::matrix::LinearOperator
Linear Operator imitating Matrix.
Definition: monolish_coo.hpp:37
monolish::matrix::LinearOperator::gpu_status
bool gpu_status
true: sended, false: not send
Definition: monolish_linearoperator.hpp:52
monolish::matrix::LinearOperator::type
std::string type() const
get format name "LinearOperator"
Definition: monolish_linearoperator.hpp:356
monolish::matrix::LinearOperator::matvec
std::function< vector< Float >const vector< Float > &)> matvec
pseudo multiplication function of matrix and vector
Definition: monolish_linearoperator.hpp:57
monolish::matrix::LinearOperator::LinearOperator
LinearOperator(Dense< Float > &dense)
Definition: monolish_linearoperator.hpp:177
monolish::matrix::LinearOperator::get_rmatmul_dense_init_flag
bool get_rmatmul_dense_init_flag() const
get flag that shows rmatmul_dense is defined or not
Definition: monolish_linearoperator.hpp:301
monolish::matrix::LinearOperator::set_device_mem_stat
void set_device_mem_stat(bool status)
Definition: monolish_linearoperator.hpp:396
monolish::matrix::LinearOperator::operator=
void operator=(const LinearOperator< Float > &mat)
operator copy
Definition: copy_linearoperator.cpp:9
monolish::matrix::LinearOperator::get_matmul_dense
std::function< matrix::Dense< Float >const matrix::Dense< Float > &)> get_matmul_dense() const
get multiplication function of matrix and matrix dense
Definition: monolish_linearoperator.hpp:243
monolish::matrix::LinearOperator::send
void send() const
send data to GPU
Definition: monolish_linearoperator.hpp:364
monolish::matrix::LinearOperator::get_device_mem_stat
bool get_device_mem_stat() const
true: sended, false: not send
Definition: monolish_linearoperator.hpp:394
monolish::matrix::LinearOperator::convert_to_Dense
void convert_to_Dense(Dense< Float > &dense) const
Definition: convert_linearoperator.cpp:121
monolish::matrix::LinearOperator::get_col
size_t get_col() const
get # of col
Definition: monolish_linearoperator.hpp:207
monolish::matrix::Dense
Dense format Matrix.
Definition: monolish_coo.hpp:35
monolish::matrix::LinearOperator::get_rmatmul_dense
std::function< matrix::Dense< Float >const matrix::Dense< Float > &)> get_rmatmul_dense() const
get multiplication function of (Hermitian) transposed matrix and matrix dense;
Definition: monolish_linearoperator.hpp:257
monolish::matrix::LinearOperator::rmatmul_dense
std::function< Dense< Float >const Dense< Float > &)> rmatmul_dense
pseudo multiplication function of (Hermitian) transposed matrix and dense matrix
Definition: monolish_linearoperator.hpp:74
monolish::matrix::LinearOperator::LinearOperator
LinearOperator()
Definition: monolish_linearoperator.hpp:77
monolish::matrix::LinearOperator::~LinearOperator
~LinearOperator()
destructor of LinearOperator, free GPU memory
Definition: monolish_linearoperator.hpp:407
monolish::matrix::LinearOperator::get_matvec_init_flag
bool get_matvec_init_flag() const
get flag that shows matvec is defined or not
Definition: monolish_linearoperator.hpp:268
monolish::matrix::LinearOperator::rmatvec
std::function< vector< Float >const vector< Float > &)> rmatvec
pseudo multiplication function of (Hermitian) transposed matrix and vector
Definition: monolish_linearoperator.hpp:63
monolish::matrix::LinearOperator::diag
void diag(vector< Float > &vec) const
get diag. vector
monolish::matrix::LinearOperator::matmul_dense
std::function< Dense< Float >const Dense< Float > &)> matmul_dense
pseudo multiplication function of matrix and dense matrix
Definition: monolish_linearoperator.hpp:68
monolish::matrix::LinearOperator::LinearOperator
LinearOperator(COO< Float > &coo)
Create LinearOperator from COO.
Definition: monolish_linearoperator.hpp:169
monolish
Definition: monolish_matrix_blas.hpp:10
monolish::matrix::LinearOperator::get_row
size_t get_row() const
get # of row
Definition: monolish_linearoperator.hpp:198
monolish::matrix::LinearOperator::convert
void convert(COO< Float > &coo)
Convert LinearOperator from COO.
monolish::matrix::COO
Coodinate (COO) format Matrix (need to sort)
Definition: monolish_coo.hpp:45
monolish::matrix::LinearOperator::colN
size_t colN
# of col
Definition: monolish_linearoperator.hpp:47
monolish::view1D
1D view class
Definition: monolish_coo.hpp:33
monolish::matrix::LinearOperator::set_matmul_dense
void set_matmul_dense(const std::function< matrix::Dense< Float >(const matrix::Dense< Float > &)> &MATMUL)
set multiplication function of matrix and matrix dense
Definition: linearoperator_constructor.cpp:159
monolish::matrix::LinearOperator::nonfree_recv
void nonfree_recv() const
recv. data to GPU (w/o free)
Definition: monolish_linearoperator.hpp:380
monolish::matrix::LinearOperator::LinearOperator
LinearOperator(CRS< Float > &crs)
Definition: monolish_linearoperator.hpp:173
monolish::matrix::LinearOperator::rowN
size_t rowN
# of row
Definition: monolish_linearoperator.hpp:42
monolish::matrix::LinearOperator::get_matmul_dense_init_flag
bool get_matmul_dense_init_flag() const
get flag that shows matmul_dense is defined or not
Definition: monolish_linearoperator.hpp:290
monolish::vector
vector class
Definition: monolish_coo.hpp:32
monolish::matrix::LinearOperator::recv
void recv() const
recv. data to GPU, and free data on GPU
Definition: monolish_linearoperator.hpp:372
monolish::matrix::LinearOperator::get_rmatvec
std::function< vector< Float >const vector< Float > &)> get_rmatvec() const
get multiplication function of (Hermitian) transposed matrix and vector C = A;
Definition: monolish_linearoperator.hpp:230
monolish::matrix::LinearOperator::set_matvec
void set_matvec(const std::function< vector< Float >(const vector< Float > &)> &MATVEC)
set multiplication function of matrix and vector
Definition: linearoperator_constructor.cpp:137
monolish::matrix::LinearOperator::device_free
void device_free() const
free data on GPU
Definition: monolish_linearoperator.hpp:388
monolish::matrix::LinearOperator::get_matvec
std::function< vector< Float >const vector< Float > &)> get_matvec() const
get multiplication function of matrix and vector
Definition: monolish_linearoperator.hpp:217
monolish::matrix::CRS
Compressed Row Storage (CRS) format Matrix.
Definition: monolish_coo.hpp:36
monolish::matrix::LinearOperator::get_rmatvec_init_flag
bool get_rmatvec_init_flag() const
get flag that shows rmatvec is defined or not
Definition: monolish_linearoperator.hpp:279
monolish::matrix::LinearOperator::set_rmatmul_dense
void set_rmatmul_dense(const std::function< matrix::Dense< Float >(const matrix::Dense< Float > &)> &RMATMUL)
set multiplication function of (Hermitian) transposed matrix and matrix dense
Definition: linearoperator_constructor.cpp:170