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};
61 #endif // DOXYGEN_SHOULD_SKIP_THIS
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;
148 #endif // DOXYGEN_SHOULD_SKIP_THIS
172 std::size_t mem =
sizeof(*this) + _L.
memory() + _Vt0.
memory()
174 +
sizeof(int)*_piv.size();
175 for (
auto& c : _ch) mem += c.memory();
188 for (
auto& c : _ch) nnz += c.nonzeros();
202 std::vector<HSSFactors<scalar_t>> _ch;
215 std::vector<int> _piv;
216 template<
typename T>
friend class HSSMatrix;
220 #ifndef DOXYGEN_SHOULD_SKIP_THIS
221 template<
typename scalar_t>
class WorkSolve {
223 std::vector<WorkSolve<scalar_t>> c;
233 std::pair<std::size_t,std::size_t> offset;
235 #endif // DOXYGEN_SHOULD_SKIP_THIS
238 #ifndef DOXYGEN_SHOULD_SKIP_THIS
239 template<
typename scalar_t>
class AFunctor {
240 using DenseM_t = DenseMatrix<scalar_t>;
242 AFunctor(
const DenseM_t& A) : _A(A) {}
245 (DenseM_t& Rr, DenseM_t& Rc, DenseM_t& Sr, DenseM_t& Sc) {
249 void operator()(
const std::vector<size_t>& I,
250 const std::vector<size_t>& J, DenseM_t& B) {
251 assert(I.size() == B.rows() && J.size() == B.cols());
252 for (std::size_t j=0; j<J.size(); j++)
253 for (std::size_t i=0; i<I.size(); i++) {
254 assert(I[i] >= 0 && I[i] < _A.rows() &&
255 J[j] >= 0 && J[j] < _A.cols());
256 B(i,j) = _A(I[i], J[j]);
260 #endif // DOXYGEN_SHOULD_SKIP_THIS
263 #ifndef DOXYGEN_SHOULD_SKIP_THIS
264 template<
typename scalar_t>
class WorkDense {
266 std::pair<std::size_t,std::size_t> offset;
267 std::vector<WorkDense<scalar_t>> c;
268 DenseMatrix<scalar_t> tmpU, tmpV;
270 #endif // DOXYGEN_SHOULD_SKIP_THIS
275 #endif // HSS_EXTRA_HPP