33#ifndef GKO_PUBLIC_CORE_MATRIX_HYBRID_HPP_
34#define GKO_PUBLIC_CORE_MATRIX_HYBRID_HPP_
40#include <ginkgo/core/base/array.hpp>
41#include <ginkgo/core/base/lin_op.hpp>
42#include <ginkgo/core/matrix/coo.hpp>
43#include <ginkgo/core/matrix/csr.hpp>
44#include <ginkgo/core/matrix/ell.hpp>
51template <
typename ValueType>
54template <
typename ValueType,
typename IndexType>
70template <
typename ValueType = default_precision,
typename IndexType =
int32>
74 public ConvertibleTo<Hybrid<next_precision<ValueType>, IndexType>>,
81 remove_complex<Hybrid<ValueType, IndexType>>> {
84 friend class Dense<ValueType>;
85 friend class Csr<ValueType, IndexType>;
101 using value_type = ValueType;
102 using index_type = IndexType;
148 ell_num_stored_elements_per_row_ =
162 return ell_num_stored_elements_per_row_;
196 if (
row_nnz_val[
i] > ell_num_stored_elements_per_row_) {
205 size_type ell_num_stored_elements_per_row_;
258 percent_ = std::min(percent_, 1.0);
259 percent_ = std::max(percent_, 0.0);
434 return ell_->get_const_values();
453 return ell_->get_const_col_idxs();
463 return ell_->get_num_stored_elements_per_row();
480 return ell_->get_num_stored_elements();
496 return ell_->val_at(row,
idx);
504 return ell_->val_at(row,
idx);
519 return ell_->col_at(row,
idx);
527 return ell_->col_at(row,
idx);
553 return coo_->get_const_values();
572 return coo_->get_const_col_idxs();
591 return coo_->get_const_row_idxs();
601 return coo_->get_num_stored_elements();
618 return coo_->get_num_stored_elements() +
619 ell_->get_num_stored_elements();
639 template <
typename HybType>
640 std::shared_ptr<typename HybType::strategy_type>
get_strategy()
const;
678 std::shared_ptr<const Executor> exec,
679 std::shared_ptr<strategy_type> strategy = std::make_shared<automatic>())
693 std::shared_ptr<const Executor> exec,
const dim<2>& size,
694 std::shared_ptr<strategy_type> strategy = std::make_shared<automatic>())
709 std::shared_ptr<const Executor> exec,
const dim<2>& size,
711 std::shared_ptr<strategy_type> strategy = std::make_shared<automatic>())
713 {}, std::move(strategy))
726 Hybrid(std::shared_ptr<const Executor> exec,
const dim<2>& size,
728 std::shared_ptr<strategy_type> strategy)
745 std::shared_ptr<const Executor> exec,
const dim<2>& size,
748 std::shared_ptr<strategy_type> strategy = std::make_shared<automatic>())
749 : EnableLinOp<
Hybrid>(exec, size),
753 strategy_(std::
move(strategy))
768 void apply_impl(
const LinOp* b, LinOp* x)
const override;
770 void apply_impl(
const LinOp* alpha,
const LinOp* b,
const LinOp* beta,
771 LinOp* x)
const override;
774 std::unique_ptr<ell_type> ell_;
775 std::unique_ptr<coo_type> coo_;
776 std::shared_ptr<strategy_type> strategy_;
780template <
typename ValueType,
typename IndexType>
781template <
typename HybType>
782std::shared_ptr<typename HybType::strategy_type>
787 typename HybType::index_type>>::value,
788 "The given `HybType` type must be of type `matrix::Hybrid`!");
790 std::shared_ptr<typename HybType::strategy_type> strategy;
791 if (std::dynamic_pointer_cast<automatic>(strategy_)) {
792 strategy = std::make_shared<typename HybType::automatic>();
793 }
else if (
auto temp = std::dynamic_pointer_cast<minimal_storage_limit>(
796 if (
sizeof(value_type) ==
sizeof(
typename HybType::value_type) &&
797 sizeof(index_type) ==
sizeof(
typename HybType::index_type)) {
799 std::make_shared<typename HybType::minimal_storage_limit>();
801 strategy = std::make_shared<typename HybType::imbalance_limit>(
802 temp->get_percentage());
804 }
else if (
auto temp = std::dynamic_pointer_cast<imbalance_bounded_limit>(
806 strategy = std::make_shared<typename HybType::imbalance_bounded_limit>(
807 temp->get_percentage(),
temp->get_ratio());
808 }
else if (
auto temp =
809 std::dynamic_pointer_cast<imbalance_limit>(strategy_)) {
810 strategy = std::make_shared<typename HybType::imbalance_limit>(
811 temp->get_percentage());
812 }
else if (
auto temp = std::dynamic_pointer_cast<column_limit>(strategy_)) {
813 strategy = std::make_shared<typename HybType::column_limit>(
814 temp->get_num_columns());
816 GKO_NOT_SUPPORTED(strategy_);
ConvertibleTo interface is used to mark that the implementer can be converted to the object of Result...
Definition polymorphic_object.hpp:499
The EnableAbsoluteComputation mixin provides the default implementations of compute_absolute_linop an...
Definition lin_op.hpp:823
This mixin implements a static create() method on ConcreteType that dynamically allocates the memory,...
Definition polymorphic_object.hpp:776
The EnableLinOp mixin can be used to provide sensible default implementations of the majority of the ...
Definition lin_op.hpp:908
This mixin inherits from (a subclass of) PolymorphicObject and provides a base implementation of a ne...
Definition polymorphic_object.hpp:691
Definition lin_op.hpp:146
A LinOp implementing this interface can read its data from a matrix_data structure.
Definition lin_op.hpp:634
A LinOp implementing this interface can write its data to a matrix_data structure.
Definition lin_op.hpp:689
An array is a container which encapsulates fixed-sized arrays, stored on the Executor tied to the arr...
Definition array.hpp:187
This type is a device-side equivalent to matrix_data.
Definition device_matrix_data.hpp:63
COO stores a matrix in the coordinate matrix format.
Definition coo.hpp:87
CSR is a matrix format which stores only the nonzero coefficients by compressing each row of the matr...
Definition csr.hpp:146
Dense is a matrix format which explicitly stores all values of the matrix.
Definition dense.hpp:136
ELL is a matrix format where stride with explicit zeros is used such that all rows have the same numb...
Definition ell.hpp:89
automatic is a strategy_type which decides the number of stored elements per row of the ell part auto...
Definition hybrid.hpp:372
size_type compute_ell_num_stored_elements_per_row(array< size_type > *row_nnz) const override
Computes the number of stored elements per row of the ell part.
Definition hybrid.hpp:379
automatic()
Creates an automatic strategy.
Definition hybrid.hpp:377
column_limit is a strategy_type which decides the number of stored elements per row of the ell part b...
Definition hybrid.hpp:213
size_type compute_ell_num_stored_elements_per_row(array< size_type > *row_nnz) const override
Computes the number of stored elements per row of the ell part.
Definition hybrid.hpp:224
column_limit(size_type num_column=0)
Creates a column_limit strategy.
Definition hybrid.hpp:220
auto get_num_columns() const
Get the number of columns limit.
Definition hybrid.hpp:235
imbalance_bounded_limit is a strategy_type which decides the number of stored elements per row of the...
Definition hybrid.hpp:295
auto get_percentage() const
Get the percent setting.
Definition hybrid.hpp:319
size_type compute_ell_num_stored_elements_per_row(array< size_type > *row_nnz) const override
Computes the number of stored elements per row of the ell part.
Definition hybrid.hpp:304
imbalance_bounded_limit(double percent=0.8, double ratio=0.0001)
Creates a imbalance_bounded_limit strategy.
Definition hybrid.hpp:300
auto get_ratio() const
Get the ratio setting.
Definition hybrid.hpp:326
imbalance_limit is a strategy_type which decides the number of stored elements per row of the ell par...
Definition hybrid.hpp:248
size_type compute_ell_num_stored_elements_per_row(array< size_type > *row_nnz) const override
Computes the number of stored elements per row of the ell part.
Definition hybrid.hpp:262
auto get_percentage() const
Get the percent setting.
Definition hybrid.hpp:284
imbalance_limit(double percent=0.8)
Creates a imbalance_limit strategy.
Definition hybrid.hpp:256
minimal_storage_limit is a strategy_type which decides the number of stored elements per row of the e...
Definition hybrid.hpp:339
size_type compute_ell_num_stored_elements_per_row(array< size_type > *row_nnz) const override
Computes the number of stored elements per row of the ell part.
Definition hybrid.hpp:350
auto get_percentage() const
Get the percent setting.
Definition hybrid.hpp:361
minimal_storage_limit()
Creates a minimal_storage_limit strategy.
Definition hybrid.hpp:344
strategy_type is to decide how to set the hybrid config.
Definition hybrid.hpp:119
virtual size_type compute_ell_num_stored_elements_per_row(array< size_type > *row_nnz) const =0
Computes the number of stored elements per row of the ell part.
strategy_type()
Creates a strategy_type.
Definition hybrid.hpp:124
size_type get_ell_num_stored_elements_per_row() const noexcept
Returns the number of stored elements per row of the ell part.
Definition hybrid.hpp:160
void compute_hybrid_config(const array< size_type > &row_nnz, size_type *ell_num_stored_elements_per_row, size_type *coo_nnz)
Computes the config of the Hybrid matrix (ell_num_stored_elements_per_row and coo_nnz).
Definition hybrid.hpp:141
size_type get_coo_nnz() const noexcept
Returns the number of nonzeros of the coo part.
Definition hybrid.hpp:170
HYBRID is a matrix format which splits the matrix into ELLPACK and COO format.
Definition hybrid.hpp:81
size_type get_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the matrix.
Definition hybrid.hpp:616
index_type * get_coo_row_idxs() noexcept
Returns the row indexes of the coo part.
Definition hybrid.hpp:580
value_type & ell_val_at(size_type row, size_type idx) noexcept
Returns the idx-th non-zero element of the row-th row in the ell part.
Definition hybrid.hpp:494
size_type get_ell_stride() const noexcept
Returns the stride of the ell part.
Definition hybrid.hpp:471
size_type get_coo_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the coo part.
Definition hybrid.hpp:599
std::unique_ptr< absolute_type > compute_absolute() const override
Gets the AbsoluteLinOp.
index_type ell_col_at(size_type row, size_type idx) const noexcept
Returns the idx-th column index of the row-th row in the ell part.
Definition hybrid.hpp:525
index_type * get_coo_col_idxs() noexcept
Returns the column indexes of the coo part.
Definition hybrid.hpp:561
value_type ell_val_at(size_type row, size_type idx) const noexcept
Returns the idx-th non-zero element of the row-th row in the ell part.
Definition hybrid.hpp:502
const index_type * get_const_coo_row_idxs() const noexcept
Returns the row indexes of the coo part.
Definition hybrid.hpp:589
Hybrid(Hybrid &&)
Move-assigns a Hybrid matrix.
void write(mat_data &data) const override
Writes a matrix to a matrix_data structure.
const value_type * get_const_ell_values() const noexcept
Returns the values of the ell part.
Definition hybrid.hpp:432
const ell_type * get_ell() const noexcept
Returns the matrix of the ell part.
Definition hybrid.hpp:535
std::unique_ptr< Diagonal< ValueType > > extract_diagonal() const override
Extracts the diagonal entries of the matrix into a vector.
value_type * get_ell_values() noexcept
Returns the values of the ell part.
Definition hybrid.hpp:423
void read(const mat_data &data) override
Reads a matrix from a matrix_data structure.
size_type get_ell_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the ell part.
Definition hybrid.hpp:478
size_type get_ell_num_stored_elements_per_row() const noexcept
Returns the number of stored elements per row of ell part.
Definition hybrid.hpp:461
const index_type * get_const_coo_col_idxs() const noexcept
Returns the column indexes of the coo part.
Definition hybrid.hpp:570
Hybrid(const Hybrid &)
Copy-assigns a Hybrid matrix.
void read(const device_mat_data &data) override
Reads a matrix from a device_matrix_data structure.
index_type * get_ell_col_idxs() noexcept
Returns the column indexes of the ell part.
Definition hybrid.hpp:442
void compute_absolute_inplace() override
Compute absolute inplace on each element.
const index_type * get_const_ell_col_idxs() const noexcept
Returns the column indexes of the ell part.
Definition hybrid.hpp:451
std::shared_ptr< strategy_type > get_strategy() const noexcept
Returns the strategy.
Definition hybrid.hpp:627
const coo_type * get_coo() const noexcept
Returns the matrix of the coo part.
Definition hybrid.hpp:609
value_type * get_coo_values() noexcept
Returns the values of the coo part.
Definition hybrid.hpp:542
Hybrid & operator=(const Hybrid &)
Copy-assigns a Hybrid matrix.
index_type & ell_col_at(size_type row, size_type idx) noexcept
Returns the idx-th column index of the row-th row in the ell part.
Definition hybrid.hpp:517
const value_type * get_const_coo_values() const noexcept
Returns the values of the coo part.
Definition hybrid.hpp:551
void read(device_mat_data &&data) override
Reads a matrix from a device_matrix_data structure.
Hybrid & operator=(Hybrid &&)
Move-assigns a Hybrid matrix.
The Ginkgo namespace.
Definition abstract_factory.hpp:48
constexpr T one()
Returns the multiplicative identity for T.
Definition math.hpp:803
typename detail::remove_complex_s< T >::type remove_complex
Obtain the type which removed the complex of complex/scalar type or the template parameter of class b...
Definition math.hpp:354
typename detail::next_precision_impl< T >::type next_precision
Obtains the next type in the singly-linked precision list.
Definition math.hpp:490
typename detail::to_complex_s< T >::type to_complex
Obtain the type which adds the complex of complex/scalar type or the template parameter of class by a...
Definition math.hpp:373
constexpr T zero()
Returns the additive identity for T.
Definition math.hpp:775
std::size_t size_type
Integral type used for allocation quantities.
Definition types.hpp:120
A type representing the dimensions of a multidimensional object.
Definition dim.hpp:55
This structure is used as an intermediate data type to store a sparse matrix.
Definition matrix_data.hpp:155