56#ifndef DOXYGEN_SHOULD_SKIP_THIS
57 template<
typename T> std::pair<T,T>
58 operator+(
const std::pair<T,T>& l,
const std::pair<T,T>& r) {
59 return {l.first+r.first, l.second+r.second};
64#ifndef DOXYGEN_SHOULD_SKIP_THIS
65 template<
typename scalar_t>
class WorkCompressBase {
68 virtual ~WorkCompressBase() {}
69 virtual void split(
const std::pair<std::size_t,std::size_t>& dim) = 0;
71 std::vector<std::size_t> Ir, Ic, Jr, Jc;
72 std::pair<std::size_t,std::size_t> offset;
74 scalar_t U_r_max, V_r_max;
77 template<
typename scalar_t>
class WorkCompress :
78 public WorkCompressBase<scalar_t> {
80 std::vector<WorkCompress<scalar_t>> c;
82 DenseMatrix<scalar_t> Qr, Qc;
83 void split(
const std::pair<std::size_t,std::size_t>& dim) {
86 c[0].offset = this->offset;
87 c[1].offset = this->offset + dim;
88 c[0].lvl = c[1].lvl = this->lvl + 1;
94 template<
typename scalar_t,
95 typename real_t=
typename RealType<scalar_t>::value_type>
96 class WorkCompressANN :
97 public WorkCompressBase<scalar_t> {
99 std::vector<WorkCompressANN<scalar_t>> c;
100 DenseMatrix<scalar_t> S;
101 std::vector<std::pair<std::size_t,real_t>> ids_scores;
102 void split(
const std::pair<std::size_t,std::size_t>& dim) {
105 c[0].offset = this->offset;
106 c[1].offset = this->offset + dim;
107 c[0].lvl = c[1].lvl = this->lvl + 1;
112 template<
typename scalar_t>
class WorkApply {
114 std::pair<std::size_t,std::size_t> offset;
115 std::vector<WorkApply<scalar_t>> c;
116 DenseMatrix<scalar_t> tmp1, tmp2;
119 template<
typename scalar_t>
class WorkExtract {
121 std::vector<WorkExtract<scalar_t>> c;
122 DenseMatrix<scalar_t> y, z;
123 std::vector<std::size_t> I, J, rl2g, cl2g, ycols, zcols;
124 void split_extraction_sets
125 (
const std::pair<std::size_t,std::size_t>& dim) {
128 c[0].I.reserve(I.size());
129 c[1].I.reserve(I.size());
131 if (i < dim.first) c[0].I.push_back(i);
132 else c[1].I.push_back(i - dim.first);
133 c[0].J.reserve(J.size());
134 c[1].J.reserve(J.size());
136 if (j < dim.second) c[0].J.push_back(j);
137 else c[1].J.push_back(j - dim.second);
142 template<
typename scalar_t>
class WorkFactor {
144 std::vector<WorkFactor<scalar_t>> c;
145 DenseMatrix<scalar_t> Dt;
146 DenseMatrix<scalar_t> Vt1;
172 return sizeof(*this) + L_.memory() + Vt0_.memory()
173 + W1_.memory() + Q_.memory() + D_.memory()
174 +
sizeof(int)*piv_.size();
184 return L_.nonzeros() + Vt0_.nonzeros() + W1_.nonzeros()
185 + Q_.nonzeros() + D_.nonzeros();
210 std::vector<int> piv_;
211 template<
typename T>
friend class HSSMatrix;
215#ifndef DOXYGEN_SHOULD_SKIP_THIS
216 template<
typename scalar_t>
class WorkSolve {
218 std::vector<WorkSolve<scalar_t>> c;
225 std::pair<std::size_t,std::size_t> offset;
230#ifndef DOXYGEN_SHOULD_SKIP_THIS
231 template<
typename scalar_t>
class AFunctor {
232 using DenseM_t = DenseMatrix<scalar_t>;
234 AFunctor(
const DenseM_t& A) : _A(A) {}
237 (DenseM_t& Rr, DenseM_t& Rc, DenseM_t& Sr, DenseM_t& Sc) {
241 void operator()(
const std::vector<size_t>& I,
242 const std::vector<size_t>& J, DenseM_t& B) {
243 assert(I.size() == B.rows() && J.size() == B.cols());
244 for (std::size_t j=0; j<J.size(); j++)
245 for (std::size_t i=0; i<I.size(); i++) {
246 assert(I[i] >= 0 && I[i] < _A.rows() &&
247 J[j] >= 0 && J[j] < _A.cols());
248 B(i,j) = _A(I[i], J[j]);
255#ifndef DOXYGEN_SHOULD_SKIP_THIS
256 template<
typename scalar_t>
class WorkDense {
258 std::pair<std::size_t,std::size_t> offset;
259 std::vector<WorkDense<scalar_t>> c;
260 DenseMatrix<scalar_t> tmpU, tmpV;
Contains the DenseMatrix and DenseMatrixWrapper classes, simple wrappers around BLAS/LAPACK style den...
This class represents a matrix, stored in column major format, to allow direct use of BLAS/LAPACK rou...
Definition: DenseMatrix.hpp:138
Contains data related to ULV factorization of an HSS matrix.
Definition: HSSExtra.hpp:161
DenseMatrix< scalar_t > & Vhat()
Definition: HSSExtra.hpp:195
std::size_t memory()
Definition: HSSExtra.hpp:171
std::size_t nonzeros() const
Definition: HSSExtra.hpp:183
const DenseMatrix< scalar_t > & Vhat() const
Definition: HSSExtra.hpp:191
Abstract base class for Hierarchically Semi-Separable (HSS) matrices.
Definition: HSSMatrixBase.hpp:83
Class to represent a sequential/threaded Hierarchically Semi-Separable matrix.
Definition: HSSMatrix.hpp:80
State
Definition: HSSExtra.hpp:46
Definition: StrumpackOptions.hpp:43
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)