32 #ifndef BLR_MATRIX_HPP
33 #define BLR_MATRIX_HPP
41 #include "BLRTileBLAS.hpp"
54 std::function<void(
const std::vector<std::size_t>&,
55 const std::vector<std::size_t>&,
83 const std::vector<std::size_t>& rowtiles,
84 const std::vector<std::size_t>& coltiles,
90 BLRMatrix(std::size_t m,
const std::vector<std::size_t>& rowtiles,
91 std::size_t n,
const std::vector<std::size_t>& coltiles);
93 std::size_t
rows()
const override {
return m_; }
94 std::size_t
cols()
const override {
return n_; }
98 std::size_t
rank()
const override;
103 void draw(std::ostream& of, std::size_t roff, std::size_t coff)
const;
105 void print(
const std::string& name)
const;
115 const std::vector<int>& piv()
const {
return piv_; }
130 std::size_t rg2t(std::size_t i)
const;
131 std::size_t cg2t(std::size_t j)
const;
133 scalar_t operator()(std::size_t i, std::size_t j)
const;
134 scalar_t& operator()(std::size_t i, std::size_t j);
135 DenseM_t extract(
const std::vector<std::size_t>& I,
136 const std::vector<std::size_t>& J)
const;
139 void decompress_local_columns(
int c_min,
int c_max);
140 void remove_tiles_before_local_column(
int c_min,
int c_max);
142 std::size_t rowblocks()
const {
return nbrows_; }
143 std::size_t colblocks()
const {
return nbcols_; }
144 std::size_t tilerows(std::size_t i)
const {
return roff_[i+1] - roff_[i]; }
145 std::size_t tilecols(std::size_t j)
const {
return coff_[j+1] - coff_[j]; }
146 std::size_t tileroff(std::size_t i)
const {
return roff_[i]; }
147 std::size_t tilecoff(std::size_t j)
const {
return coff_[j]; }
149 BLRTile<scalar_t>& tile(std::size_t i, std::size_t j);
150 const BLRTile<scalar_t>& tile(std::size_t i, std::size_t j)
const;
151 std::unique_ptr<BLRTile<scalar_t>>& block(std::size_t i, std::size_t j);
152 DenseMW_t tile(DenseM_t& A, std::size_t i, std::size_t j)
const;
153 DenseTile<scalar_t>& tile_dense(std::size_t i, std::size_t j);
154 const DenseTile<scalar_t>& tile_dense(std::size_t i, std::size_t j)
const;
156 void compress_tile(std::size_t i, std::size_t j,
const Opts_t& opts);
157 void fill(scalar_t v);
158 void fill_col(scalar_t v, std::size_t k, std::size_t CP);
161 construct_and_partial_factor(DenseM_t& A11, DenseM_t& A12,
162 DenseM_t& A21, DenseM_t& A22,
163 BLRMatrix<scalar_t>& B11,
164 BLRMatrix<scalar_t>& B12,
165 BLRMatrix<scalar_t>& B21,
166 const std::vector<std::size_t>& tiles1,
167 const std::vector<std::size_t>& tiles2,
168 const adm_t& admissible,
172 construct_and_partial_factor(BLRMatrix<scalar_t>& B11,
173 BLRMatrix<scalar_t>& B12,
174 BLRMatrix<scalar_t>& B21,
175 BLRMatrix<scalar_t>& B22,
176 const std::vector<std::size_t>& tiles1,
177 const std::vector<std::size_t>& tiles2,
178 const adm_t& admissible,
182 construct_and_partial_factor_col(BLRMatrix<scalar_t>& B11,
183 BLRMatrix<scalar_t>& B12,
184 BLRMatrix<scalar_t>& B21,
185 BLRMatrix<scalar_t>& B22,
186 const std::vector<std::size_t>& tiles1,
187 const std::vector<std::size_t>& tiles2,
188 const adm_t& admissible,
190 const std::function<
void
191 (
int,
bool, std::size_t)>& blockcol);
194 construct_and_partial_factor(std::size_t n1, std::size_t n2,
195 const extract_t<scalar_t>& A11,
196 const extract_t<scalar_t>& A12,
197 const extract_t<scalar_t>& A21,
198 const extract_t<scalar_t>& A22,
199 BLRMatrix<scalar_t>& B11,
200 BLRMatrix<scalar_t>& B12,
201 BLRMatrix<scalar_t>& B21,
202 BLRMatrix<scalar_t>& B22,
203 const std::vector<std::size_t>& tiles1,
204 const std::vector<std::size_t>& tiles2,
205 const adm_t& admissible,
206 const BLROptions<scalar_t>& opts);
209 trsmLNU_gemm(
const BLRMatrix<scalar_t>& F1,
210 const BLRMatrix<scalar_t>& F2,
211 DenseM_t& B1, DenseM_t& B2,
int task_depth);
214 gemm_trsmUNN(
const BLRMatrix<scalar_t>& F1,
215 const BLRMatrix<scalar_t>& F2,
216 DenseM_t& B1, DenseM_t& B2,
int task_depth);
219 std::size_t m_ = 0, n_ = 0, nbrows_ = 0, nbcols_ = 0;
220 std::vector<std::size_t> roff_, coff_, cl2l_, rl2l_;
221 std::vector<std::unique_ptr<BLRTile<scalar_t>>> blocks_;
222 std::vector<int> piv_;
224 void create_dense_tile(std::size_t i, std::size_t j, DenseM_t& A);
225 void create_dense_tile(std::size_t i, std::size_t j,
226 const extract_t<scalar_t>& Aelem);
227 void create_dense_tile_left_looking(std::size_t i, std::size_t j,
228 const extract_t<scalar_t>& Aelem);
229 void create_dense_tile_left_looking(std::size_t i, std::size_t j,
231 const extract_t<scalar_t>& Aelem,
232 const BLRMatrix<scalar_t>& B21,
233 const BLRMatrix<scalar_t>& B12);
234 void create_LR_tile(std::size_t i, std::size_t j,
235 DenseM_t& A,
const Opts_t& opts);
236 void create_LR_tile_left_looking(std::size_t i, std::size_t j,
237 const extract_t<scalar_t>& Aelem,
240 void create_LR_tile_left_looking(std::size_t i, std::size_t j,
242 const extract_t<scalar_t>& Aelem,
243 const BLRMatrix<scalar_t>& B21,
244 const BLRMatrix<scalar_t>& B12,
247 void LUAR_B11(std::size_t i, std::size_t j, std::size_t kmax,
248 DenseM_t& A11,
const Opts_t& opts,
int* B);
249 void LUAR_B12(std::size_t i, std::size_t j, std::size_t kmax,
250 BLRMatrix<scalar_t>& B11, DenseM_t& A12,
251 const Opts_t& opts,
int* B);
252 void LUAR_B21(std::size_t i, std::size_t j, std::size_t kmax,
253 BLRMatrix<scalar_t>& B11, DenseM_t& A21,
254 const Opts_t& opts,
int* B);
256 template<
typename T>
friend
257 void draw(
const BLRMatrix<T>& H,
const std::string& name);
258 template<
typename T,
typename I>
friend class BLRExtendAdd;
261 template<
typename scalar_t>
void
262 LUAR(
const std::vector<BLRTile<scalar_t>*>& Ti,
263 const std::vector<BLRTile<scalar_t>*>& Tj,
264 DenseMatrixWrapper<scalar_t>& tij,
265 const BLROptions<scalar_t>& opts,
int* B);
267 template<
typename scalar_t>
void
268 LUAR_B22(std::size_t i, std::size_t j, std::size_t kmax,
269 BLRMatrix<scalar_t>& B12, BLRMatrix<scalar_t>& B21,
270 DenseMatrix<scalar_t>& A22,
271 const BLROptions<scalar_t>& opts,
int* B);
273 template<
typename scalar_t>
void
275 const BLRMatrix<scalar_t>& a, DenseMatrix<scalar_t>& b,
278 template<
typename scalar_t>
void
280 DenseMatrix<scalar_t>& b,
int task_depth);
282 template<
typename scalar_t>
void
283 gemv(
Trans ta, scalar_t alpha,
const BLRMatrix<scalar_t>& a,
284 const DenseMatrix<scalar_t>& x, scalar_t beta,
285 DenseMatrix<scalar_t>& y,
int task_depth);
287 template<
typename scalar_t>
void
288 gemm(
Trans ta,
Trans tb, scalar_t alpha,
const BLRMatrix<scalar_t>& a,
289 const BLRMatrix<scalar_t>& b, scalar_t beta,
290 DenseMatrix<scalar_t>& c,
int task_depth);
292 template<
typename scalar_t>
void
293 gemm(
Trans ta,
Trans tb, scalar_t alpha,
const BLRMatrix<scalar_t>& A,
294 const DenseMatrix<scalar_t>& B, scalar_t beta,
295 DenseMatrix<scalar_t>& C,
int task_depth);
297 template<
typename scalar_t>
298 void draw(
const BLRMatrix<scalar_t>& B,
const std::string& name) {
299 std::ofstream of(
"plot" + name +
".gnuplot");
300 of <<
"set terminal pdf enhanced color size 5,4" << std::endl;
301 of <<
"set output '" << name <<
".pdf'" << std::endl;
303 of <<
"set xrange [0:" << B.cols() <<
"]" << std::endl;
304 of <<
"set yrange [" << B.rows() <<
":0]" << std::endl;
305 of <<
"plot x lt -1 notitle" << std::endl;
Contains class holding BLROptions.
Contains the structured matrix interfaces.
Definition: BLRMatrix.hpp:49
Class to represent a block low-rank matrix.
Definition: BLRMatrix.hpp:74
std::size_t rows() const override
Definition: BLRMatrix.hpp:93
std::size_t cols() const override
Definition: BLRMatrix.hpp:94
std::size_t nonzeros() const override
std::size_t memory() const override
std::size_t rank() const override
void solve(DenseM_t &x) const override
Definition: BLRMatrix.hpp:109
void mult(Trans op, const DenseM_t &x, DenseM_t &y) const override
Class containing several options for the BLR code and data-structures.
Definition: BLROptions.hpp:82
Definition: BLRMatrix.hpp:48
Like DenseMatrix, this class represents a matrix, stored in column major format, to allow direct use ...
Definition: DenseMatrix.hpp:1015
This class represents a matrix, stored in column major format, to allow direct use of BLAS/LAPACK rou...
Definition: DenseMatrix.hpp:138
void laswp(const std::vector< int > &P, bool fwd)
Class to represent a structured matrix. This is the abstract base class for several types of structur...
Definition: StructuredMatrix.hpp:209
Definition: StrumpackOptions.hpp:43
UpLo
Definition: DenseMatrix.hpp:83
void trsv(UpLo ul, Trans ta, Diag d, const DenseMatrix< scalar_t > &a, DenseMatrix< scalar_t > &b, int depth=0)
void gemv(Trans ta, scalar_t alpha, const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &x, scalar_t beta, DenseMatrix< scalar_t > &y, int depth=0)
Trans
Definition: DenseMatrix.hpp:51
void trsm(Side s, UpLo ul, Trans ta, Diag d, scalar_t alpha, const DenseMatrix< scalar_t > &a, DenseMatrix< scalar_t > &b, int depth=0)
Side
Definition: DenseMatrix.hpp:74
void gemm(Trans ta, Trans tb, scalar_t alpha, const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &b, scalar_t beta, DenseMatrix< scalar_t > &c, int depth=0)
Diag
Definition: DenseMatrix.hpp:92