34#ifndef DENSE_MATRIX_HPP
35#define DENSE_MATRIX_HPP
41#include "misc/RandomWrapper.hpp"
42#include "BLASLAPACKWrapper.hpp"
57 inline Trans c2T(
char op) {
63 std::cerr <<
"ERROR: char " << op <<
" not recognized,"
64 <<
" should be one of n/N, t/T or c/C" << std::endl;
140 using real_t =
typename RealType<scalar_t>::value_type;
143 scalar_t* data_ =
nullptr;
144 std::size_t rows_ = 0;
145 std::size_t cols_ = 0;
174 const std::function<scalar_t(std::size_t,std::size_t)>& A);
189 const scalar_t* D, std::size_t
ld);
207 std::size_t i, std::size_t j);
228 inline std::size_t
rows()
const {
return rows_; }
231 inline std::size_t
cols()
const {
return cols_; }
237 inline std::size_t
ld()
const {
return ld_; }
242 inline const scalar_t*
data()
const {
return data_; }
247 inline scalar_t*
data() {
return data_; }
253 inline scalar_t*
end() {
return data_ + ld_ * cols_; }
259 inline const scalar_t*
end()
const {
260 if (rows_ == 0 || cols_ == 0)
return data_;
261 return data_ + ld_ * cols_;
272 inline const scalar_t&
operator()(std::size_t i, std::size_t j)
const
273 { assert(i<=
rows() && j<=
cols());
return data_[i+ld_*j]; }
283 inline const scalar_t*
ptr(std::size_t i, std::size_t j)
const
284 { assert(i<=
rows() && j<=
cols());
return data_+i+ld_*j; }
295 { assert(i<=
rows() && j<=
cols());
return data_[i+ld_*j]; }
305 inline scalar_t*
ptr(std::size_t i, std::size_t j)
306 { assert(i<=
rows() && j<=
cols());
return data_+i+ld_*j; }
329 void print(std::string name,
bool all=
false,
int width=8)
const;
341 std::string filename,
int width=8)
const;
370 void fill(
const std::function<scalar_t(std::size_t,std::size_t)>& A);
394 void resize(std::size_t m, std::size_t n);
418 std::size_t i=0, std::size_t j=0);
428 void copy(
const scalar_t* B, std::size_t ldb);
448 void laswp(
const std::vector<int>& P,
bool fwd);
474 void lapmr(
const std::vector<int>& P,
bool fwd);
488 void lapmt(
const std::vector<int>& P,
bool fwd);
552 const std::vector<std::size_t>& J)
const;
625 scale_rows_real(
const std::vector<real_t>& D,
int depth=0);
648 (
const std::vector<scalar_t>& D,
int depth=0);
677 return sizeof(scalar_t) *
rows() *
cols();
702 int LU(std::vector<int>& piv,
int depth=0);
717 std::vector<int>
LU(
int depth=0);
739 std::vector<int>
LDLt(
int depth=0);
769 const std::vector<int>& piv,
int depth=0)
const;
783 const std::vector<int>& piv,
int depth=0)
const;
797 const int* piv,
int depth=0)
const;
811 const std::vector<int>& piv,
int depth=0)
const;
884 std::vector<std::size_t>& ind, real_t rel_tol,
885 real_t abs_tol,
int max_rank,
int depth);
905 std::vector<std::size_t>& ind, real_t rel_tol, real_t abs_tol,
906 int max_rank,
int depth)
const;
927 real_t rel_tol, real_t abs_tol,
int max_rank,
int depth)
const;
966 void write(
const std::string& fname)
const;
981 std::size_t zeros()
const;
985 std::vector<std::size_t>& ind, real_t rel_tol,
986 real_t abs_tol,
int max_rank,
int depth);
990 template<
typename T>
friend std::ofstream&
992 template<
typename T>
friend std::ifstream&
1017 template<
typename scalar_t>
1036 scalar_t* D, std::size_t
ld)
noexcept {
1037 this->data_ = D; this->rows_ = m; this->cols_ = n;
1038 this->ld_ = std::max(std::size_t(1),
ld);
1055 std::size_t i, std::size_t j) noexcept
1057 assert(i+m <= D.rows());
1058 assert(j+n <= D.cols());
1062 this->data_ = D.data();
1063 this->rows_ = D.rows();
1064 this->cols_ = D.cols();
1072 this->data_ = D.data();
1073 this->rows_ = D.rows();
1074 this->cols_ = D.cols();
1104 this->rows_ = 0; this->cols_ = 0;
1105 this->ld_ = 1; this->data_ =
nullptr;
1117 std::size_t
memory()
const override {
return 0; }
1148 this->data_ = D.data(); this->rows_ = D.rows();
1149 this->cols_ = D.cols(); this->ld_ = D.ld();
return *
this; }
1161 assert(a.
rows()==this->rows() && a.
cols()==this->cols());
1162 for (std::size_t j=0; j<this->
cols(); j++)
1163 for (std::size_t i=0; i<this->
rows(); i++)
1164 this->
operator()(i, j) = a(i, j);
1184 template<
typename scalar_t>
1185 std::unique_ptr<const DenseMatrixWrapper<scalar_t>>
1187 (std::size_t m, std::size_t n,
const scalar_t* D, std::size_t ld) {
1188 return std::unique_ptr<const DenseMatrixWrapper<scalar_t>>
1210 template<
typename scalar_t>
1211 std::unique_ptr<const DenseMatrixWrapper<scalar_t>>
1214 std::size_t i, std::size_t j) {
1215 return std::unique_ptr<const DenseMatrixWrapper<scalar_t>>
1237 template<
typename scalar_from_t,
typename scalar_to_t>
void
1240 std::size_t ib, std::size_t jb) {
1241 for (std::size_t j=0; j<n; j++)
1242 for (std::size_t i=0; i<m; i++)
1243 b(ib+i, jb+j) =
static_cast<scalar_to_t
>(a(ia+i, ja+j));
1256 template<
typename scalar_from_t,
typename scalar_to_t>
void
1258 std::size_t ib=0, std::size_t jb=0) {
1270 template<
typename scalar_t>
void
1272 for (std::size_t j=0; j<a.
cols(); j++)
1273 for (std::size_t i=0; i<a.
rows(); i++)
1274 b[i+j*ldb] = a(i, j);
1286 template<
typename scalar_t> DenseMatrix<scalar_t>
1303 template<
typename scalar_t> DenseMatrix<scalar_t>
1319 template<
typename scalar_t> DenseMatrix<scalar_t>
1320 eye(std::size_t m, std::size_t n) {
1345 template<
typename scalar_t>
void
1350 template<
typename scalar_t>
void
1352 const scalar_t* b,
int ldb, scalar_t beta,
1355 template<
typename scalar_t>
void
1358 scalar_t* c,
int ldc,
int depth=0);
1369 template<
typename scalar_t>
void
1387 template<
typename scalar_t>
void
1400 template<
typename scalar_t>
void
1412 template<
typename scalar_t>
void
1425 template<
typename scalar_t>
void
1427 const scalar_t* x,
int incx, scalar_t beta,
1438 template<
typename scalar_t>
void
1441 scalar_t* y,
int incy,
int depth=0);
1451 template<
typename scalar_t>
void
1453 const scalar_t* x,
int incx, scalar_t beta,
1454 scalar_t* y,
int incy,
int depth=0);
1458 template<
typename scalar_t>
long long int
1460 return (is_complex<scalar_t>() ? 4:1) *
1461 blas::getrf_flops(a.
rows(), a.
cols());
1465 template<
typename scalar_t>
long long int
1467 return (is_complex<scalar_t>() ? 4:1) *
1468 blas::getrs_flops(b.
rows(), b.
cols());
1472 template<
typename scalar_t>
long long int
1474 auto minrc = std::min(a.
rows(), a.
cols());
1475 return (is_complex<scalar_t>() ? 4:1) *
1476 (blas::gelqf_flops(a.
rows(), a.
cols()) +
1477 blas::xxglq_flops(a.
cols(), a.
cols(), minrc));
1481 template<
typename scalar_t>
long long int
1483 return (is_complex<scalar_t>() ? 4:1) *
1484 (blas::geqp3_flops(a.
cols(), a.
rows()) +
1485 blas::trsm_flops(rank, a.
cols() - rank, scalar_t(1.),
'L'));
1489 template<
typename scalar_t>
long long int
1492 return (is_complex<scalar_t>() ? 4:1) *
1493 blas::trsm_flops(b.
rows(), b.
cols(), alpha, char(s));
1497 template<
typename scalar_t>
long long int
1501 return (is_complex<scalar_t>() ? 4:1) *
1509 template<
typename scalar_t>
long long int
1513 return (is_complex<scalar_t>() ? 4:1) *
1519 template<
typename scalar_t>
long long int
1521 auto minrc = std::min(a.
rows(), a.
cols());
1522 return (is_complex<scalar_t>() ? 4:1) *
1523 (blas::geqrf_flops(a.
rows(), minrc) +
1524 blas::xxgqr_flops(a.
rows(), minrc, minrc));
1536 template<
typename scalar_t,
typename cast_t>
Like DenseMatrix, this class represents a matrix, stored in column major format, to allow direct use ...
Definition DenseMatrix.hpp:1018
DenseMatrix< scalar_t > & operator=(const DenseMatrix< scalar_t > &a) override
Definition DenseMatrix.hpp:1160
virtual ~DenseMatrixWrapper()
Definition DenseMatrix.hpp:1095
DenseMatrixWrapper()
Definition DenseMatrix.hpp:1023
DenseMatrixWrapper< scalar_t > & operator=(const DenseMatrixWrapper< scalar_t > &D)=delete
DenseMatrixWrapper(const DenseMatrix< scalar_t > &)=delete
void clear() override
Definition DenseMatrix.hpp:1103
std::size_t nonzeros() const override
Definition DenseMatrix.hpp:1128
DenseMatrixWrapper(DenseMatrixWrapper< scalar_t > &&D) noexcept
Definition DenseMatrix.hpp:1071
std::size_t memory() const override
Definition DenseMatrix.hpp:1117
DenseMatrixWrapper(std::size_t m, std::size_t n, scalar_t *D, std::size_t ld) noexcept
Definition DenseMatrix.hpp:1035
DenseMatrixWrapper(DenseMatrix< scalar_t > &&)=delete
DenseMatrixWrapper(std::size_t m, std::size_t n, DenseMatrix< scalar_t > &D, std::size_t i, std::size_t j) noexcept
Definition DenseMatrix.hpp:1054
DenseMatrixWrapper< scalar_t > & operator=(DenseMatrixWrapper< scalar_t > &&D)
Definition DenseMatrix.hpp:1147
This class represents a matrix, stored in column major format, to allow direct use of BLAS/LAPACK rou...
Definition DenseMatrix.hpp:139
void lapmt(const std::vector< int > &P, bool fwd)
DenseMatrix< scalar_t > solve(const DenseMatrix< scalar_t > &b, const std::vector< int > &piv, int depth=0) const
static DenseMatrix< scalar_t > read(const std::string &fname)
DenseMatrix(DenseMatrix< scalar_t > &&D)
void copy(const scalar_t *B, std::size_t ldb)
void solve_LDLt_in_place(DenseMatrix< scalar_t > &b, const std::vector< int > &piv, int depth=0) const
std::size_t cols() const
Definition DenseMatrix.hpp:231
DenseMatrix< scalar_t > & scale_and_add(scalar_t alpha, const DenseMatrix< scalar_t > &B, int depth=0)
void laswp(const int *P, bool fwd)
scalar_t * ptr(std::size_t i, std::size_t j)
Definition DenseMatrix.hpp:305
void fill(const std::function< scalar_t(std::size_t, std::size_t)> &A)
void conj_transpose(DenseMatrix< scalar_t > &X) const
virtual std::size_t nonzeros() const
Definition DenseMatrix.hpp:684
std::size_t subnormals() const
void random(random::RandomGeneratorBase< typename RealType< scalar_t >::value_type > &rgen)
void copy(const DenseMatrix< scalar_t > &B, std::size_t i=0, std::size_t j=0)
DenseMatrix< scalar_t > & sub(const DenseMatrix< scalar_t > &B, int depth=0)
DenseMatrix< scalar_t > & scale_rows(const scalar_t *D, int depth=0)
DenseMatrix(std::size_t m, std::size_t n, const scalar_t *D, std::size_t ld)
std::vector< scalar_t > singular_values() const
std::size_t rows() const
Definition DenseMatrix.hpp:228
std::size_t ld() const
Definition DenseMatrix.hpp:237
DenseMatrix(std::size_t m, std::size_t n, const DenseMatrix< scalar_t > &D, std::size_t i, std::size_t j)
virtual DenseMatrix< scalar_t > & operator=(DenseMatrix< scalar_t > &&D)
DenseMatrix< scalar_t > conj_transpose() const
void print(std::string name, bool all=false, int width=8) const
void laswp(const std::vector< int > &P, bool fwd)
void solve_LU_in_place(DenseMatrix< scalar_t > &b, const std::vector< int > &piv, int depth=0) const
void ID_column(DenseMatrix< scalar_t > &X, std::vector< int > &piv, std::vector< std::size_t > &ind, real_t rel_tol, real_t abs_tol, int max_rank, int depth)
const scalar_t * ptr(std::size_t i, std::size_t j) const
Definition DenseMatrix.hpp:283
scalar_t * data()
Definition DenseMatrix.hpp:247
void lapmr(const std::vector< int > &P, bool fwd)
DenseMatrix(const DenseMatrix< scalar_t > &D)
void LQ(DenseMatrix< scalar_t > &L, DenseMatrix< scalar_t > &Q, int depth) const
virtual DenseMatrix< scalar_t > & operator=(const DenseMatrix< scalar_t > &D)
void print_to_file(std::string name, std::string filename, int width=8) const
scalar_t * end()
Definition DenseMatrix.hpp:253
void extract_cols(const std::vector< std::size_t > &I, DenseMatrix< scalar_t > &B) const
DenseMatrix< scalar_t > extract_cols(const std::vector< std::size_t > &I) const
DenseMatrix< scalar_t > extract_rows(const std::vector< std::size_t > &I) const
void hconcat(const DenseMatrix< scalar_t > &b)
std::vector< int > LDLt(int depth=0)
virtual std::size_t memory() const
Definition DenseMatrix.hpp:676
void solve_LU_in_place(DenseMatrix< scalar_t > &b, const int *piv, int depth=0) const
int syev(Jobz job, UpLo ul, std::vector< scalar_t > &lambda)
DenseMatrix< scalar_t > & add(const DenseMatrix< scalar_t > &B, int depth=0)
DenseMatrix< scalar_t > & div_rows(const std::vector< scalar_t > &D, int depth=0)
DenseMatrix< scalar_t > & scale(scalar_t alpha, int depth=0)
DenseMatrix< scalar_t > & scatter_rows_add(const std::vector< std::size_t > &I, const DenseMatrix< scalar_t > &B, int depth)
scalar_t & operator()(std::size_t i, std::size_t j)
Definition DenseMatrix.hpp:294
DenseMatrix< scalar_t > extract(const std::vector< std::size_t > &I, const std::vector< std::size_t > &J) const
DenseMatrix(std::size_t m, std::size_t n)
void extract_rows(const std::vector< std::size_t > &I, DenseMatrix< scalar_t > &B) const
void orthogonalize(scalar_t &r_max, scalar_t &r_min, int depth)
int Cholesky(int depth=0)
DenseMatrix< scalar_t > & scaled_add(scalar_t alpha, const DenseMatrix< scalar_t > &B, int depth=0)
DenseMatrix< scalar_t > & scale_rows(const std::vector< scalar_t > &D, int depth=0)
int LU(std::vector< int > &piv, int depth=0)
void write(const std::string &fname) const
void print() const
Definition DenseMatrix.hpp:314
std::vector< int > LU(int depth=0)
const scalar_t * end() const
Definition DenseMatrix.hpp:259
void resize(std::size_t m, std::size_t n)
const scalar_t & operator()(std::size_t i, std::size_t j) const
Definition DenseMatrix.hpp:272
void ID_row(DenseMatrix< scalar_t > &X, std::vector< int > &piv, std::vector< std::size_t > &ind, real_t rel_tol, real_t abs_tol, int max_rank, int depth) const
const scalar_t * data() const
Definition DenseMatrix.hpp:242
DenseMatrix(std::size_t m, std::size_t n, const std::function< scalar_t(std::size_t, std::size_t)> &A)
void low_rank(DenseMatrix< scalar_t > &U, DenseMatrix< scalar_t > &V, real_t rel_tol, real_t abs_tol, int max_rank, int depth) const
void shift(scalar_t sigma)
2D block cyclicly distributed matrix, as used by ScaLAPACK.
Definition DistributedMatrix.hpp:84
class to wrap the C++11 random number generator/distribution
Definition RandomWrapper.hpp:105
Definition StrumpackOptions.hpp:44
long long int LU_flops(const DenseMatrix< scalar_t > &a)
Definition DenseMatrix.hpp:1459
long long int gemm_flops(Trans ta, Trans tb, scalar_t alpha, const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &b, scalar_t beta)
Definition DenseMatrix.hpp:1498
DenseMatrix< scalar_t > eye(std::size_t m, std::size_t n)
Definition DenseMatrix.hpp:1320
UpLo
Definition DenseMatrix.hpp:83
CSRMatrix< cast_t, integer_t > cast_matrix(const CSRMatrix< scalar_t, integer_t > &mat)
std::unique_ptr< const DenseMatrixWrapper< scalar_t > > ConstDenseMatrixWrapperPtr(std::size_t m, std::size_t n, const scalar_t *D, std::size_t ld)
Definition DenseMatrix.hpp:1187
DenseMatrix< scalar_t > vconcat(const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &b)
Definition DenseMatrix.hpp:1287
void trmm(Side s, UpLo ul, Trans ta, Diag d, scalar_t alpha, const DenseMatrix< scalar_t > &a, DenseMatrix< scalar_t > &b, int depth=0)
void trsv(UpLo ul, Trans ta, Diag d, const DenseMatrix< scalar_t > &a, DenseMatrix< scalar_t > &b, int depth=0)
DenseMatrix< scalar_t > hconcat(const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &b)
Definition DenseMatrix.hpp:1304
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)
long long int orthogonalize_flops(const DenseMatrix< scalar_t > &a)
Definition DenseMatrix.hpp:1520
long long int trsm_flops(Side s, scalar_t alpha, const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &b)
Definition DenseMatrix.hpp:1490
Side
Definition DenseMatrix.hpp:74
void copy(std::size_t m, std::size_t n, const DenseMatrix< scalar_from_t > &a, std::size_t ia, std::size_t ja, DenseMatrix< scalar_to_t > &b, std::size_t ib, std::size_t jb)
Definition DenseMatrix.hpp:1238
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)
long long int ID_row_flops(const DenseMatrix< scalar_t > &a, int rank)
Definition DenseMatrix.hpp:1482
long long int LQ_flops(const DenseMatrix< scalar_t > &a)
Definition DenseMatrix.hpp:1473
long long int solve_flops(const DenseMatrix< scalar_t > &b)
Definition DenseMatrix.hpp:1466
Diag
Definition DenseMatrix.hpp:93
Jobz
Definition DenseMatrix.hpp:102