34 #ifndef COMPRESSED_SPARSE_MATRIX_HPP
35 #define COMPRESSED_SPARSE_MATRIX_HPP
41 #include "misc/Tools.hpp"
42 #include "misc/Triplet.hpp"
48 typedef long long int int_t;
61 int_t strumpack_mc64id_(int_t*);
62 int_t strumpack_mc64ad_
63 (int_t*, int_t*, int_t*, int_t*, int_t*,
double*, int_t*,
64 int_t*, int_t*, int_t*, int_t*,
double*, int_t*, int_t*);
67 template<
typename scalar_t,
typename integer_t,
68 typename real_t =
typename RealType<scalar_t>::value_type>
82 std::vector<integer_t> Q;
83 std::vector<real_t> R, C;
85 int_t mc64_work_int(std::size_t n, std::size_t nnz)
const {
96 int_t mc64_work_double(std::size_t n, std::size_t nnz)
const {
103 default:
return 3*n + nnz;
break;
108 template<
typename scalar_t,
109 typename real_t =
typename RealType<scalar_t>::value_type>
116 Equilibration(std::size_t rows, std::size_t cols) : R(rows), C(cols) {}
119 EquilibrationType type = EquilibrationType::NONE;
120 real_t rcond = 1, ccond = 1, Amax = 0;
121 std::vector<real_t> R, C;
124 const real_t thres = 0.1;
125 const real_t small = blas::lamch<real_t>(
'S') / blas::lamch<real_t>(
'P');
126 const real_t large = 1. / small;
127 if (rcond >= thres && Amax >= small && Amax <= large) {
129 if (ccond >= thres) {
130 type = EquilibrationType::NONE;
132 }
else type = EquilibrationType::COLUMN;
134 if (ccond >= thres) {
135 type = EquilibrationType::ROW;
137 }
else type = EquilibrationType::BOTH;
162 template<
typename scalar_t,
typename integer_t>
165 using real_t =
typename RealType<scalar_t>::value_type;
166 #if defined(STRUMPACK_USE_MPI)
183 integer_t
size()
const {
return n_; }
190 integer_t
nnz()
const {
return nnz_; }
201 const integer_t*
ptr()
const {
return ptr_.data(); }
210 const integer_t*
ind()
const {
return ind_.data(); }
219 const scalar_t*
val()
const {
return val_.data(); }
229 integer_t*
ptr() {
return ptr_.data(); }
238 integer_t*
ind() {
return ind_.data(); }
246 scalar_t*
val() {
return val_.data(); }
253 const integer_t&
ptr(integer_t i)
const { assert(i >= 0 && i <=
size());
return ptr_[i]; }
261 const integer_t&
ind(integer_t i)
const { assert(i >= 0 && i <
nnz());
return ind_[i]; }
268 const scalar_t&
val(integer_t i)
const { assert(i >= 0 && i <
nnz());
return val_[i]; }
275 integer_t&
ptr(integer_t i) { assert(i <=
size());
return ptr_[i]; }
283 integer_t&
ind(integer_t i) { assert(i <
nnz());
return ind_[i]; }
290 scalar_t&
val(integer_t i) { assert(i <
nnz());
return val_[i]; }
321 virtual void spmv(
const DenseM_t& x, DenseM_t& y)
const = 0;
336 virtual void spmv(
const scalar_t* x, scalar_t* y)
const = 0;
342 virtual void permute(
const integer_t* iorder,
const integer_t* order);
344 virtual void permute(
const std::vector<integer_t>& iorder,
345 const std::vector<integer_t>& order) {
346 permute(iorder.data(), order.data());
349 virtual void permute_columns(
const std::vector<integer_t>& perm) = 0;
351 virtual Equil_t equilibration()
const {
return Equil_t(this->
size()); }
353 virtual void equilibrate(
const Equil_t&) {}
355 virtual Match_t matching(
MatchingJob,
bool apply=
true);
357 virtual void apply_matching(
const Match_t&);
359 virtual void symmetrize_sparsity();
361 virtual void print()
const;
362 virtual void print_dense(
const std::string& name)
const {
363 std::cerr <<
"print_dense not implemented for this matrix type"
366 virtual void print_matrix_market(
const std::string& filename)
const {
367 std::cerr <<
"print_matrix_market not implemented for this matrix type"
371 virtual int read_matrix_market(
const std::string& filename) = 0;
373 virtual real_t max_scaled_residual
374 (
const scalar_t* x,
const scalar_t* b)
const = 0;
375 virtual real_t max_scaled_residual
376 (
const DenseM_t& x,
const DenseM_t& b)
const = 0;
379 #ifndef DOXYGEN_SHOULD_SKIP_THIS
380 virtual CSRGraph<integer_t> extract_graph
381 (
int ordering_level, integer_t lo, integer_t hi)
const = 0;
382 virtual CSRGraph<integer_t> extract_graph_sep_CB
383 (
int ordering_level, integer_t lo, integer_t hi,
384 const std::vector<integer_t>& upd)
const = 0;
385 virtual CSRGraph<integer_t> extract_graph_CB_sep
386 (
int ordering_level, integer_t lo, integer_t hi,
387 const std::vector<integer_t>& upd)
const = 0;
388 virtual CSRGraph<integer_t> extract_graph_CB
389 (
int ordering_level,
const std::vector<integer_t>& upd)
const = 0;
391 virtual void extract_separator
392 (integer_t sep_end,
const std::vector<std::size_t>& I,
393 const std::vector<std::size_t>& J, DenseM_t& B,
int depth)
const = 0;
394 virtual void extract_front
395 (DenseM_t& F11, DenseM_t& F12, DenseM_t& F21,
396 integer_t slo, integer_t shi,
const std::vector<integer_t>& upd,
397 int depth)
const = 0;
398 virtual void push_front_elements
399 (integer_t, integer_t,
const std::vector<integer_t>&,
400 std::vector<Triplet<scalar_t>>&, std::vector<Triplet<scalar_t>>&,
401 std::vector<Triplet<scalar_t>>&)
const = 0;
403 virtual void front_multiply
404 (integer_t slo, integer_t shi,
const std::vector<integer_t>& upd,
405 const DenseM_t& R, DenseM_t& Sr, DenseM_t& Sc,
int depth)
const = 0;
407 virtual void front_multiply_F11
408 (
Trans op, integer_t slo, integer_t shi,
409 const DenseM_t& R, DenseM_t& S,
int depth)
const = 0;
410 virtual void front_multiply_F12
411 (
Trans op, integer_t slo, integer_t shi,
const std::vector<integer_t>& upd,
412 const DenseM_t& R, DenseM_t& S,
int depth)
const = 0;
413 virtual void front_multiply_F21
414 (
Trans op, integer_t slo, integer_t shi,
const std::vector<integer_t>& upd,
415 const DenseM_t& R, DenseM_t& S,
int depth)
const = 0;
417 #if defined(STRUMPACK_USE_MPI)
418 virtual void extract_F11_block
419 (scalar_t* F, integer_t ldF, integer_t row, integer_t nr_rows,
420 integer_t col, integer_t nr_cols)
const = 0;
421 virtual void extract_F12_block
422 (scalar_t* F, integer_t ldF, integer_t row,
423 integer_t nr_rows, integer_t col, integer_t nr_cols,
424 const integer_t* upd)
const = 0;
425 virtual void extract_F21_block
426 (scalar_t* F, integer_t ldF, integer_t row,
427 integer_t nr_rows, integer_t col, integer_t nr_cols,
428 const integer_t* upd)
const = 0;
429 virtual void extract_separator_2d
430 (integer_t sep_end,
const std::vector<std::size_t>& I,
431 const std::vector<std::size_t>& J, DistM_t& B)
const = 0;
432 virtual void front_multiply_2d
433 (integer_t sep_begin, integer_t sep_end,
434 const std::vector<integer_t>& upd,
const DistM_t& R,
435 DistM_t& Srow, DistM_t& Scol,
int depth)
const = 0;
436 virtual void front_multiply_2d
437 (
Trans op, integer_t sep_begin, integer_t sep_end,
438 const std::vector<integer_t>& upd,
const DistM_t& R,
439 DistM_t& S,
int depth)
const = 0;
440 #endif //STRUMPACK_USE_MPI
441 #endif //DOXYGEN_SHOULD_SKIP_THIS
445 std::vector<integer_t> ptr_, ind_;
446 std::vector<scalar_t> val_;
449 enum MMsym {GENERAL, SYMMETRIC, SKEWSYMMETRIC, HERMITIAN};
451 CompressedSparseMatrix();
452 CompressedSparseMatrix
454 CompressedSparseMatrix
455 (integer_t n,
const integer_t* row_ptr,
const integer_t* col_ind,
456 const scalar_t* values,
bool symm_sparsity);
458 std::vector<std::tuple<integer_t,integer_t,scalar_t>>
459 read_matrix_market_entries(
const std::string& filename);
461 virtual int strumpack_mc64(
MatchingJob, Match_t&) {
return 0; }
463 virtual void scale(
const std::vector<scalar_t>&,
464 const std::vector<scalar_t>&) = 0;
465 virtual void scale_real(
const std::vector<real_t>&,
466 const std::vector<real_t>&) = 0;
468 long long spmv_flops()
const;
469 long long spmv_bytes()
const;
474 #endif // COMPRESSED_SPARSE_MATRIX_HPP