Go to the documentation of this file.
34 #ifndef DENSE_MATRIX_HPP
35 #define DENSE_MATRIX_HPP
40 #include "misc/RandomWrapper.hpp"
41 #include "BLASLAPACKWrapper.hpp"
56 inline Trans c2T(
char op) {
62 std::cerr <<
"ERROR: char " << op <<
" not recognized,"
63 <<
" should be one of n/N, t/T or c/C" << std::endl;
137 template<
typename scalar_t>
class DenseMatrix {
138 using real_t =
typename RealType<scalar_t>::value_type;
141 scalar_t* data_ =
nullptr;
142 std::size_t rows_ = 0;
143 std::size_t cols_ = 0;
176 (std::size_t m, std::size_t n,
const scalar_t* D, std::size_t
ld);
194 (std::size_t m, std::size_t n,
const DenseMatrix<scalar_t>& D,
195 std::size_t i, std::size_t j);
207 virtual DenseMatrix<scalar_t>&
operator=(
const DenseMatrix<scalar_t>& D);
213 virtual DenseMatrix<scalar_t>&
operator=(DenseMatrix<scalar_t>&& D);
216 inline std::size_t
rows()
const {
return rows_; }
219 inline std::size_t
cols()
const {
return cols_; }
225 inline std::size_t
ld()
const {
return ld_; }
230 inline const scalar_t*
data()
const {
return data_; }
235 inline scalar_t*
data() {
return data_; }
241 inline scalar_t*
end() {
return data_ + ld_ * cols_; }
247 inline const scalar_t*
end()
const {
return data_ + ld_ * cols_; }
257 inline const scalar_t&
operator()(std::size_t i, std::size_t j)
const
258 { assert(i<=
rows() && j<=
cols());
return data_[i+ld_*j]; }
268 inline const scalar_t*
ptr(std::size_t i, std::size_t j)
const
269 { assert(i<=
rows() && j<=
cols());
return data_+i+ld_*j; }
280 { assert(i<=
rows() && j<=
cols());
return data_[i+ld_*j]; }
290 inline scalar_t*
ptr(std::size_t i, std::size_t j)
291 { assert(i<=
rows() && j<=
cols());
return data_+i+ld_*j; }
314 void print(std::string name,
bool all=
false,
int width=8)
const;
326 (std::string name, std::string filename,
int width=8)
const;
344 void fill(scalar_t v);
358 virtual void clear();
368 void resize(std::size_t m, std::size_t n);
402 void copy(
const scalar_t* B, std::size_t ldb);
422 void laswp(
const std::vector<int>& P,
bool fwd);
434 void laswp(
const int* P,
bool fwd);
448 void lapmr(
const std::vector<int>& P,
bool fwd);
462 void lapmt(
const std::vector<int>& P,
bool fwd);
487 (
const std::vector<std::size_t>& I)
const;
512 (
const std::vector<std::size_t>& I)
const;
525 (
const std::vector<std::size_t>& I,
526 const std::vector<std::size_t>& J)
const;
539 (
const std::vector<std::size_t>& I,
596 scale_rows(
const std::vector<scalar_t>& D,
int depth=0);
599 scale_rows_real(
const std::vector<real_t>& D,
int depth=0);
622 (
const std::vector<scalar_t>& D,
int depth=0);
633 real_t
normF()
const;
638 real_t
norm1()
const;
643 real_t
normI()
const;
651 return sizeof(scalar_t) *
rows() *
cols();
676 int LU(std::vector<int>& piv,
int depth=0);
691 std::vector<int>
LU(
int depth=0);
713 std::vector<int>
LDLt(
int depth=0);
744 const std::vector<int>& piv,
int depth=0)
const;
833 void orthogonalize(scalar_t& r_max, scalar_t& r_min,
int depth);
860 std::vector<std::size_t>& ind, real_t rel_tol,
861 real_t abs_tol,
int max_rank,
int depth);
882 std::vector<std::size_t>& ind, real_t rel_tol, real_t abs_tol,
883 int max_rank,
int depth)
const;
905 real_t rel_tol, real_t abs_tol,
int max_rank,
int depth)
const;
919 void shift(scalar_t sigma);
936 int syev(
Jobz job,
UpLo ul, std::vector<scalar_t>& lambda);
944 void write(
const std::string& fname)
const;
957 std::vector<std::size_t>& ind, real_t rel_tol,
958 real_t abs_tol,
int max_rank,
int depth);
962 template<
typename T>
friend std::ofstream&
964 template<
typename T>
friend std::ifstream&
989 template<
typename scalar_t>
1008 (std::size_t m, std::size_t n, scalar_t* D, std::size_t
ld) {
1009 this->data_ = D; this->rows_ = m; this->cols_ = n;
1010 this->ld_ = std::max(std::size_t(1),
ld);
1028 std::size_t i, std::size_t j)
1030 assert(i+m <= D.
rows());
1031 assert(j+n <= D.
cols());
1048 this->rows_ = 0; this->cols_ = 0;
1049 this->ld_ = 1; this->data_ =
nullptr;
1061 std::size_t
memory()
const override {
return 0; }
1119 this->data_ = D.
data(); this->rows_ = D.
rows();
1120 this->cols_ = D.
cols(); this->ld_ = D.
ld();
return *
this; }
1132 assert(a.
rows()==this->rows() && a.
cols()==this->cols());
1133 for (std::size_t j=0; j<this->
cols(); j++)
1134 for (std::size_t i=0; i<this->
rows(); i++)
1135 this->
operator()(i, j) = a(i, j);
1153 template<
typename scalar_t>
1154 std::unique_ptr<const DenseMatrixWrapper<scalar_t>>
1156 (std::size_t m, std::size_t n,
const scalar_t* D, std::size_t ld) {
1157 return std::unique_ptr<const DenseMatrixWrapper<scalar_t>>
1179 template<
typename scalar_t>
1180 std::unique_ptr<const DenseMatrixWrapper<scalar_t>>
1183 std::size_t i, std::size_t j) {
1184 return std::unique_ptr<const DenseMatrixWrapper<scalar_t>>
1206 template<
typename scalar_t>
void
1209 std::size_t ib, std::size_t jb) {
1210 for (std::size_t j=0; j<n; j++)
1211 for (std::size_t i=0; i<m; i++)
1212 b(ib+i, jb+j) = a(ia+i, ja+j);
1225 template<
typename scalar_t>
void
1227 std::size_t ib, std::size_t jb) {
1239 template<
typename scalar_t>
void
1241 for (std::size_t j=0; j<a.
cols(); j++)
1242 for (std::size_t i=0; i<a.
rows(); i++)
1243 b[i+j*ldb] = a(i, j);
1255 template<
typename scalar_t> DenseMatrix<scalar_t>
1272 template<
typename scalar_t> DenseMatrix<scalar_t>
1288 template<
typename scalar_t> DenseMatrix<scalar_t>
1289 eye(std::size_t m, std::size_t n) {
1314 template<
typename scalar_t>
void
1315 gemm(
Trans ta,
Trans tb, scalar_t alpha,
const DenseMatrix<scalar_t>& a,
1316 const DenseMatrix<scalar_t>& b, scalar_t beta,
1317 DenseMatrix<scalar_t>& c,
int depth=0);
1319 template<
typename scalar_t>
void
1320 gemm(
Trans ta,
Trans tb, scalar_t alpha,
const DenseMatrix<scalar_t>& a,
1321 const scalar_t* b,
int ldb, scalar_t beta,
1322 DenseMatrix<scalar_t>& c,
int depth=0);
1324 template<
typename scalar_t>
void
1325 gemm(
Trans ta,
Trans tb, scalar_t alpha,
const DenseMatrix<scalar_t>& a,
1326 const DenseMatrix<scalar_t>& b, scalar_t beta,
1327 scalar_t* c,
int ldc,
int depth=0);
1338 template<
typename scalar_t>
void
1340 const DenseMatrix<scalar_t>& a, DenseMatrix<scalar_t>& b,
1356 template<
typename scalar_t>
void
1358 const DenseMatrix<scalar_t>& a, DenseMatrix<scalar_t>& b,
1369 template<
typename scalar_t>
void
1371 DenseMatrix<scalar_t>& b,
int depth=0);
1381 template<
typename scalar_t>
void
1382 gemv(
Trans ta, scalar_t alpha,
const DenseMatrix<scalar_t>& a,
1383 const DenseMatrix<scalar_t>& x, scalar_t beta,
1384 DenseMatrix<scalar_t>& y,
int depth=0);
1394 template<
typename scalar_t>
void
1395 gemv(
Trans ta, scalar_t alpha,
const DenseMatrix<scalar_t>& a,
1396 const scalar_t* x,
int incx, scalar_t beta,
1397 DenseMatrix<scalar_t>& y,
int depth=0);
1407 template<
typename scalar_t>
void
1408 gemv(
Trans ta, scalar_t alpha,
const DenseMatrix<scalar_t>& a,
1409 const DenseMatrix<scalar_t>& x, scalar_t beta,
1410 scalar_t* y,
int incy,
int depth=0);
1420 template<
typename scalar_t>
void
1421 gemv(
Trans ta, scalar_t alpha,
const DenseMatrix<scalar_t>& a,
1422 const scalar_t* x,
int incx, scalar_t beta,
1423 scalar_t* y,
int incy,
int depth=0);
1427 template<
typename scalar_t>
long long int
1429 return (is_complex<scalar_t>() ? 4:1) *
1430 blas::getrf_flops(a.
rows(), a.
cols());
1434 template<
typename scalar_t>
long long int
1436 return (is_complex<scalar_t>() ? 4:1) *
1437 blas::getrs_flops(b.
rows(), b.
cols());
1441 template<
typename scalar_t>
long long int
1443 auto minrc = std::min(a.
rows(), a.
cols());
1444 return (is_complex<scalar_t>() ? 4:1) *
1445 (blas::gelqf_flops(a.
rows(), a.
cols()) +
1446 blas::xxglq_flops(a.
cols(), a.
cols(), minrc));
1450 template<
typename scalar_t>
long long int
1452 return (is_complex<scalar_t>() ? 4:1) *
1453 (blas::geqp3_flops(a.
cols(), a.
rows()) +
1458 template<
typename scalar_t>
long long int
1461 return (is_complex<scalar_t>() ? 4:1) *
1466 template<
typename scalar_t>
long long int
1470 return (is_complex<scalar_t>() ? 4:1) *
1478 template<
typename scalar_t>
long long int
1482 return (is_complex<scalar_t>() ? 4:1) *
1488 template<
typename scalar_t>
long long int
1490 auto minrc = std::min(a.
rows(), a.
cols());
1491 return (is_complex<scalar_t>() ? 4:1) *
1492 (blas::geqrf_flops(a.
rows(), minrc) +
1493 blas::xxgqr_flops(a.
rows(), minrc, minrc));
1498 #endif // DENSE_MATRIX_HPP
void shift(scalar_t sigma)
int LU(std::vector< int > &piv, int depth=0)
DenseMatrix< scalar_t > & operator=(const DenseMatrix< scalar_t > &a) override
Definition: DenseMatrix.hpp:1131
long long int ID_row_flops(const DenseMatrix< scalar_t > &a, int rank)
Definition: DenseMatrix.hpp:1451
DenseMatrix< scalar_t > & scale_and_add(scalar_t alpha, const DenseMatrix< scalar_t > &B, int depth=0)
void extract_cols(const std::vector< std::size_t > &I, DenseMatrix< scalar_t > &B) const
const scalar_t & operator()(std::size_t i, std::size_t j) const
Definition: DenseMatrix.hpp:257
long long int gemm_flops(Trans ta, Trans tb, scalar_t alpha, const DenseMatrix< scalar_t > &a, scalar_t beta, const DenseMatrix< scalar_t > &c)
Definition: DenseMatrix.hpp:1479
DenseMatrix< scalar_t > vconcat(const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &b)
Definition: DenseMatrix.hpp:1256
std::size_t cols() const
Definition: DenseMatrix.hpp:219
void lapmt(const std::vector< int > &P, bool fwd)
long long int trsm_flops(Side s, scalar_t alpha, const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &b)
Definition: DenseMatrix.hpp:1459
long long int LQ_flops(const DenseMatrix< scalar_t > &a)
Definition: DenseMatrix.hpp:1442
const scalar_t * data() const
Definition: DenseMatrix.hpp:230
DenseMatrix< scalar_t > & sub(const DenseMatrix< scalar_t > &B, int depth=0)
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:1156
void extract_rows(const std::vector< std::size_t > &I, DenseMatrix< scalar_t > &B) const
virtual ~DenseMatrixWrapper()
Definition: DenseMatrix.hpp:1039
Jobz
Definition: DenseMatrix.hpp:100
virtual std::size_t nonzeros() const
Definition: DenseMatrix.hpp:658
void lapmr(const std::vector< int > &P, bool fwd)
class to wrap the C++11 random number generator/distribution
Definition: RandomWrapper.hpp:105
DenseMatrixWrapper< scalar_t > & operator=(DenseMatrixWrapper< scalar_t > &&D)
Definition: DenseMatrix.hpp:1118
Definition: StrumpackOptions.hpp:42
std::ostream & operator<<(std::ostream &os, const BLACSGrid *g)
Definition: BLACSGrid.hpp:351
void trsv(UpLo ul, Trans ta, Diag d, const DenseMatrix< scalar_t > &a, DenseMatrix< scalar_t > &b, int depth=0)
Definition: CompressedSparseMatrix.hpp:58
std::size_t rows() const
Definition: DenseMatrix.hpp:216
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:1467
int Cholesky(int depth=0)
std::vector< int > LDLt(int depth=0)
Like DenseMatrix, this class represents a matrix, stored in column major format, to allow direct use ...
Definition: DenseMatrix.hpp:990
std::size_t nonzeros() const override
Definition: DenseMatrix.hpp:1072
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)
void copy(const DenseMatrix< scalar_t > &B, std::size_t i=0, std::size_t j=0)
void LQ(DenseMatrix< scalar_t > &L, DenseMatrix< scalar_t > &Q, int depth) const
DenseMatrix< scalar_t > transpose() const
DenseMatrix< scalar_t > hconcat(const DenseMatrix< scalar_t > &a, const DenseMatrix< scalar_t > &b)
Definition: DenseMatrix.hpp:1273
virtual DenseMatrix< scalar_t > & operator=(const DenseMatrix< scalar_t > &D)
std::size_t ld() const
Definition: DenseMatrix.hpp:225
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:268
scalar_t * ptr(std::size_t i, std::size_t j)
Definition: DenseMatrix.hpp:290
DenseMatrix< scalar_t > & scaled_add(scalar_t alpha, const DenseMatrix< scalar_t > &B, int depth=0)
void copy(std::size_t m, std::size_t n, const DenseMatrix< scalar_t > &a, std::size_t ia, std::size_t ja, DenseMatrix< scalar_t > &b, std::size_t ib, std::size_t jb)
Definition: DenseMatrix.hpp:1207
long long int orthogonalize_flops(const DenseMatrix< scalar_t > &a)
Definition: DenseMatrix.hpp:1489
void hconcat(const DenseMatrix< scalar_t > &b)
UpLo
Definition: DenseMatrix.hpp:82
static DenseMatrix< scalar_t > read(const std::string &fname)
void print() const
Definition: DenseMatrix.hpp:299
const scalar_t * end() const
Definition: DenseMatrix.hpp:247
scalar_t * data()
Definition: DenseMatrix.hpp:235
DenseMatrix< scalar_t > & add(const DenseMatrix< scalar_t > &B, int depth=0)
void laswp(const std::vector< int > &P, bool fwd)
DenseMatrix< scalar_t > extract(const std::vector< std::size_t > &I, const std::vector< std::size_t > &J) const
scalar_t * end()
Definition: DenseMatrix.hpp:241
DenseMatrix< scalar_t > & scatter_rows_add(const std::vector< std::size_t > &I, const DenseMatrix< scalar_t > &B, int depth)
virtual std::size_t memory() const
Definition: DenseMatrix.hpp:650
void clear() override
Definition: DenseMatrix.hpp:1047
void solve_LU_in_place(DenseMatrix< scalar_t > &b, const std::vector< int > &piv, int depth=0) const
void orthogonalize(scalar_t &r_max, scalar_t &r_min, int depth)
scalar_t & operator()(std::size_t i, std::size_t j)
Definition: DenseMatrix.hpp:279
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)
DenseMatrix< scalar_t > eye(std::size_t m, std::size_t n)
Definition: DenseMatrix.hpp:1289
void resize(std::size_t m, std::size_t n)
void write(const std::string &fname) const
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)
int syev(Jobz job, UpLo ul, std::vector< scalar_t > &lambda)
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
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)
DenseMatrix< scalar_t > & scale(scalar_t alpha, int depth=0)
Side
Definition: DenseMatrix.hpp:73
std::vector< scalar_t > singular_values() const
long long int LU_flops(const DenseMatrix< scalar_t > &a)
Definition: DenseMatrix.hpp:1428
DenseMatrix< scalar_t > & scale_rows(const std::vector< scalar_t > &D, int depth=0)
DenseMatrix< scalar_t > & div_rows(const std::vector< scalar_t > &D, int depth=0)
Diag
Definition: DenseMatrix.hpp:91
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
DenseMatrixWrapper()
Definition: DenseMatrix.hpp:995
long long int solve_flops(const DenseMatrix< scalar_t > &b)
Definition: DenseMatrix.hpp:1435
DenseMatrix< scalar_t > solve(const DenseMatrix< scalar_t > &b, const std::vector< int > &piv, int depth=0) const
void solve_LDLt_in_place(DenseMatrix< scalar_t > &b, const std::vector< int > &piv, int depth=0) const
Trans
Definition: DenseMatrix.hpp:50
void print_to_file(std::string name, std::string filename, int width=8) const
std::size_t memory() const override
Definition: DenseMatrix.hpp:1061