monolish  0.16.0
MONOlithic LInear equation Solvers for Highly-parallel architecture
monolish_linearoperator.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <exception>
3 #include <functional>
4 #include <omp.h>
5 #include <stdexcept>
6 #include <string>
7 #include <vector>
8 
9 #if USE_SXAT
10 #undef _HAS_CPP17
11 #endif
12 #include <random>
13 #if USE_SXAT
14 #define _HAS_CPP17 1
15 #endif
16 
17 namespace monolish {
18 template <typename Float> class vector;
19 namespace matrix {
20 template <typename Float> class Dense;
21 template <typename Float> class COO;
22 template <typename Float> class CRS;
23 
35 template <typename Float> class LinearOperator {
36 private:
40  size_t rowN;
41 
45  size_t colN;
46 
50  mutable bool gpu_status = false;
51 
55  std::function<vector<Float>(const vector<Float> &)> matvec = nullptr;
56 
61  std::function<vector<Float>(const vector<Float> &)> rmatvec = nullptr;
62 
66  std::function<Dense<Float>(const Dense<Float> &)> matmul_dense = nullptr;
67 
72  std::function<Dense<Float>(const Dense<Float> &)> rmatmul_dense = nullptr;
73 
74 public:
76 
86  LinearOperator(const size_t M, const size_t N);
87 
99  const size_t M, const size_t N,
100  const std::function<vector<Float>(const vector<Float> &)> &MATVEC);
101 
115  const size_t M, const size_t N,
116  const std::function<vector<Float>(const vector<Float> &)> &MATVEC,
117  const std::function<vector<Float>(const vector<Float> &)> &RMATVEC);
118 
130  const size_t M, const size_t N,
131  const std::function<Dense<Float>(const Dense<Float> &)> &MATMUL);
132 
146  const size_t M, const size_t N,
147  const std::function<Dense<Float>(const Dense<Float> &)> &MATMUL,
148  const std::function<Dense<Float>(const Dense<Float> &)> &RMATMUL);
149 
157  void convert(COO<Float> &coo);
158 
168 
169  void convert(CRS<Float> &crs);
170 
172 
173  void convert(Dense<Float> &dense);
174 
175  LinearOperator(Dense<Float> &dense) { convert(dense); }
176 
177  void convert_to_Dense(Dense<Float> &dense) const;
178 
187  LinearOperator(const LinearOperator<Float> &linearoperator);
188 
196  [[nodiscard]] size_t get_row() const { return rowN; }
197 
205  [[nodiscard]] size_t get_col() const { return colN; }
206 
214  [[nodiscard]] std::function<vector<Float>(const vector<Float> &)>
215  get_matvec() const {
216  return matvec;
217  }
218 
227  [[nodiscard]] std::function<vector<Float>(const vector<Float> &)>
228  get_rmatvec() const {
229  return rmatvec;
230  }
231 
239  [[nodiscard]] std::function<
242  return matmul_dense;
243  }
244 
253  [[nodiscard]] std::function<
256  return rmatmul_dense;
257  }
258 
266  [[nodiscard]] bool get_matvec_init_flag() const {
267  return !(matvec == nullptr);
268  }
269 
277  [[nodiscard]] bool get_rmatvec_init_flag() const {
278  return !(rmatvec == nullptr);
279  }
280 
288  [[nodiscard]] bool get_matmul_dense_init_flag() const {
289  return !(matmul_dense == nullptr);
290  }
291 
299  [[nodiscard]] bool get_rmatmul_dense_init_flag() const {
300  return !(rmatmul_dense == nullptr);
301  }
302 
310  void
311  set_matvec(const std::function<vector<Float>(const vector<Float> &)> &MATVEC);
312 
321  void set_rmatvec(
322  const std::function<vector<Float>(const vector<Float> &)> &RMATVEC);
323 
331  void set_matmul_dense(
332  const std::function<matrix::Dense<Float>(const matrix::Dense<Float> &)>
333  &MATMUL);
334 
343  void set_rmatmul_dense(
344  const std::function<matrix::Dense<Float>(const matrix::Dense<Float> &)>
345  &RMATMUL);
346 
354  [[nodiscard]] std::string type() const { return "LinearOperator"; }
355 
362  void send() const {};
363 
370  void recv() const {};
371 
378  void nonfree_recv() const {};
379 
386  void device_free() const {};
387 
392  [[nodiscard]] bool get_device_mem_stat() const { return gpu_status; };
393 
394  void set_device_mem_stat(bool status) {
395  gpu_status = status;
396  return;
397  };
398 
406 
411  void diag(vector<Float> &vec) const;
412  void diag(view1D<vector<Float>, Float> &vec) const;
413  void diag(view1D<matrix::Dense<Float>, Float> &vec) const;
414 
423  void operator=(const LinearOperator<Float> &mat);
424 };
427 } // namespace matrix
428 } // namespace monolish
monolish::matrix::LinearOperator
Linear Operator imitating Matrix.
Definition: monolish_coo.hpp:30
monolish::matrix::LinearOperator::set_matvec
void set_matvec(const std::function< vector< Float >(const vector< Float > &)> &MATVEC)
set multiplication function of matrix and vector
monolish::matrix::LinearOperator::gpu_status
bool gpu_status
true: sended, false: not send
Definition: monolish_linearoperator.hpp:50
monolish::matrix::LinearOperator::type
std::string type() const
get format name "LinearOperator"
Definition: monolish_linearoperator.hpp:354
monolish::matrix::LinearOperator::matvec
std::function< vector< Float >const vector< Float > &)> matvec
pseudo multiplication function of matrix and vector
Definition: monolish_linearoperator.hpp:55
monolish::matrix::LinearOperator::LinearOperator
LinearOperator(Dense< Float > &dense)
Definition: monolish_linearoperator.hpp:175
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:299
monolish::matrix::LinearOperator::set_device_mem_stat
void set_device_mem_stat(bool status)
Definition: monolish_linearoperator.hpp:394
monolish::matrix::LinearOperator::convert_to_Dense
void convert_to_Dense(Dense< Float > &dense) const
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:241
monolish::matrix::LinearOperator::send
void send() const
send data to GPU
Definition: monolish_linearoperator.hpp:362
monolish::matrix::LinearOperator::get_device_mem_stat
bool get_device_mem_stat() const
true: sended, false: not send
Definition: monolish_linearoperator.hpp:392
monolish::matrix::LinearOperator::get_col
size_t get_col() const
get # of col
Definition: monolish_linearoperator.hpp:205
monolish::matrix::Dense
Dense format Matrix.
Definition: monolish_coo.hpp:28
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:255
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:72
monolish::matrix::LinearOperator::LinearOperator
LinearOperator()
Definition: monolish_linearoperator.hpp:75
monolish::matrix::LinearOperator::~LinearOperator
~LinearOperator()
destructor of LinearOperator, free GPU memory
Definition: monolish_linearoperator.hpp:405
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:266
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:61
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:66
monolish::matrix::LinearOperator::LinearOperator
LinearOperator(COO< Float > &coo)
Create LinearOperator from COO.
Definition: monolish_linearoperator.hpp:167
monolish
monolish namespaces
Definition: monolish_matrix_blas.hpp:5
monolish::matrix::LinearOperator::get_row
size_t get_row() const
get # of row
Definition: monolish_linearoperator.hpp:196
monolish::matrix::LinearOperator::operator=
void operator=(const LinearOperator< Float > &mat)
operator copy
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:43
monolish::matrix::LinearOperator::colN
size_t colN
# of col
Definition: monolish_linearoperator.hpp:45
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
monolish::view1D
1D view class
Definition: monolish_coo.hpp:26
monolish::matrix::LinearOperator::nonfree_recv
void nonfree_recv() const
recv. data to GPU (w/o free)
Definition: monolish_linearoperator.hpp:378
monolish::matrix::LinearOperator::LinearOperator
LinearOperator(CRS< Float > &crs)
Definition: monolish_linearoperator.hpp:171
monolish::matrix::LinearOperator::rowN
size_t rowN
# of row
Definition: monolish_linearoperator.hpp:40
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:288
monolish::vector
vector class
Definition: monolish_coo.hpp:25
monolish::matrix::LinearOperator::recv
void recv() const
recv. data to GPU, and free data on GPU
Definition: monolish_linearoperator.hpp:370
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:228
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
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
monolish::matrix::LinearOperator::device_free
void device_free() const
free data on GPU
Definition: monolish_linearoperator.hpp:386
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:215
monolish::matrix::CRS
Compressed Row Storage (CRS) format Matrix.
Definition: monolish_coo.hpp:29
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:277