monolish  0.15.1
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 
30 template <typename Float> class LinearOperator {
31 private:
35  size_t rowN;
36 
40  size_t colN;
41 
45  mutable bool gpu_status = false;
46 
50  std::function<vector<Float>(const vector<Float> &)> matvec = nullptr;
51 
56  std::function<vector<Float>(const vector<Float> &)> rmatvec = nullptr;
57 
61  std::function<Dense<Float>(const Dense<Float> &)> matmul_dense = nullptr;
62 
67  std::function<Dense<Float>(const Dense<Float> &)> rmatmul_dense = nullptr;
68 
69 public:
71 
81  LinearOperator(const size_t M, const size_t N);
82 
94  const size_t M, const size_t N,
95  const std::function<vector<Float>(const vector<Float> &)> &MATVEC);
96 
110  const size_t M, const size_t N,
111  const std::function<vector<Float>(const vector<Float> &)> &MATVEC,
112  const std::function<vector<Float>(const vector<Float> &)> &RMATVEC);
113 
125  const size_t M, const size_t N,
126  const std::function<Dense<Float>(const Dense<Float> &)> &MATMUL);
127 
141  const size_t M, const size_t N,
142  const std::function<Dense<Float>(const Dense<Float> &)> &MATMUL,
143  const std::function<Dense<Float>(const Dense<Float> &)> &RMATMUL);
144 
152  void convert(COO<Float> &coo);
153 
163 
164  void convert(CRS<Float> &crs);
165 
167 
168  void convert(Dense<Float> &dense);
169 
170  LinearOperator(Dense<Float> &dense) { convert(dense); }
171 
172  void convert_to_Dense(Dense<Float> &dense) const;
173 
182  LinearOperator(const LinearOperator<Float> &linearoperator);
183 
191  [[nodiscard]] size_t get_row() const { return rowN; }
192 
200  [[nodiscard]] size_t get_col() const { return colN; }
201 
209  [[nodiscard]] std::function<vector<Float>(const vector<Float> &)>
210  get_matvec() const {
211  return matvec;
212  }
213 
222  [[nodiscard]] std::function<vector<Float>(const vector<Float> &)>
223  get_rmatvec() const {
224  return rmatvec;
225  }
226 
234  [[nodiscard]] std::function<
237  return matmul_dense;
238  }
239 
248  [[nodiscard]] std::function<
251  return rmatmul_dense;
252  }
253 
261  [[nodiscard]] bool get_matvec_init_flag() const {
262  return !(matvec == nullptr);
263  }
264 
272  [[nodiscard]] bool get_rmatvec_init_flag() const {
273  return !(rmatvec == nullptr);
274  }
275 
283  [[nodiscard]] bool get_matmul_dense_init_flag() const {
284  return !(matmul_dense == nullptr);
285  }
286 
294  [[nodiscard]] bool get_rmatmul_dense_init_flag() const {
295  return !(rmatmul_dense == nullptr);
296  }
297 
305  void
306  set_matvec(const std::function<vector<Float>(const vector<Float> &)> &MATVEC);
307 
316  void set_rmatvec(
317  const std::function<vector<Float>(const vector<Float> &)> &RMATVEC);
318 
326  void set_matmul_dense(
327  const std::function<matrix::Dense<Float>(const matrix::Dense<Float> &)>
328  &MATMUL);
329 
338  void set_rmatmul_dense(
339  const std::function<matrix::Dense<Float>(const matrix::Dense<Float> &)>
340  &RMATMUL);
341 
349  [[nodiscard]] std::string type() const { return "LinearOperator"; }
350 
357  void send() const {};
358 
365  void recv() const {};
366 
373  void nonfree_recv() const {};
374 
381  void device_free() const {};
382 
387  [[nodiscard]] bool get_device_mem_stat() const { return gpu_status; };
388 
389  void set_device_mem_stat(bool status) {
390  gpu_status = status;
391  return;
392  };
393 
401 
406  void diag(vector<Float> &vec) const;
407  void diag(view1D<vector<Float>, Float> &vec) const;
408  void diag(view1D<matrix::Dense<Float>, Float> &vec) const;
409 
418  void operator=(const LinearOperator<Float> &mat);
419 };
420 } // namespace matrix
421 } // 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:45
monolish::matrix::LinearOperator::type
std::string type() const
get format name "LinearOperator"
Definition: monolish_linearoperator.hpp:349
monolish::matrix::LinearOperator::matvec
std::function< vector< Float >const vector< Float > &)> matvec
pseudo multiplication function of matrix and vector
Definition: monolish_linearoperator.hpp:50
monolish::matrix::LinearOperator::LinearOperator
LinearOperator(Dense< Float > &dense)
Definition: monolish_linearoperator.hpp:170
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:294
monolish::matrix::LinearOperator::set_device_mem_stat
void set_device_mem_stat(bool status)
Definition: monolish_linearoperator.hpp:389
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:236
monolish::matrix::LinearOperator::send
void send() const
send data to GPU
Definition: monolish_linearoperator.hpp:357
monolish::matrix::LinearOperator::get_device_mem_stat
bool get_device_mem_stat() const
true: sended, false: not send
Definition: monolish_linearoperator.hpp:387
monolish::matrix::LinearOperator::get_col
size_t get_col() const
get # of col
Definition: monolish_linearoperator.hpp:200
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:250
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:67
monolish::matrix::LinearOperator::LinearOperator
LinearOperator()
Definition: monolish_linearoperator.hpp:70
monolish::matrix::LinearOperator::~LinearOperator
~LinearOperator()
destructor of LinearOperator, free GPU memory
Definition: monolish_linearoperator.hpp:400
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:261
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:56
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:61
monolish::matrix::LinearOperator::LinearOperator
LinearOperator(COO< Float > &coo)
Create LinearOperator from COO.
Definition: monolish_linearoperator.hpp:162
monolish
Definition: monolish_matrix_blas.hpp:10
monolish::matrix::LinearOperator::get_row
size_t get_row() const
get # of row
Definition: monolish_linearoperator.hpp:191
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:38
monolish::matrix::LinearOperator::colN
size_t colN
# of col
Definition: monolish_linearoperator.hpp:40
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:373
monolish::matrix::LinearOperator::LinearOperator
LinearOperator(CRS< Float > &crs)
Definition: monolish_linearoperator.hpp:166
monolish::matrix::LinearOperator::rowN
size_t rowN
# of row
Definition: monolish_linearoperator.hpp:35
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:283
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:365
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:223
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:381
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:210
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:272