  | 
  
    Ginkgo
    Generated from pipelines/1330831941 branch based on master. Ginkgo version 1.8.0
    
   A numerical linear algebra library targeting many-core architectures 
   | 
 
 
 
 
    5 #ifndef GKO_PUBLIC_CORE_MATRIX_HYBRID_HPP_ 
    6 #define GKO_PUBLIC_CORE_MATRIX_HYBRID_HPP_ 
   12 #include <ginkgo/core/base/array.hpp> 
   13 #include <ginkgo/core/base/lin_op.hpp> 
   14 #include <ginkgo/core/matrix/coo.hpp> 
   15 #include <ginkgo/core/matrix/csr.hpp> 
   16 #include <ginkgo/core/matrix/ell.hpp> 
   23 template <
typename ValueType>
 
   26 template <
typename ValueType, 
typename IndexType>
 
   42 template <
typename ValueType = default_precision, 
typename IndexType = 
int32>
 
   44     : 
public EnableLinOp<Hybrid<ValueType, IndexType>>,
 
   45       public ConvertibleTo<Hybrid<next_precision<ValueType>, IndexType>>,
 
   46       public ConvertibleTo<Dense<ValueType>>,
 
   47       public ConvertibleTo<Csr<ValueType, IndexType>>,
 
   48       public DiagonalExtractable<ValueType>,
 
   49       public ReadableFromMatrixData<ValueType, IndexType>,
 
   50       public WritableToMatrixData<ValueType, IndexType>,
 
   51       public EnableAbsoluteComputation<
 
   52           remove_complex<Hybrid<ValueType, IndexType>>> {
 
   53     friend class EnablePolymorphicObject<
Hybrid, 
LinOp>;
 
   54     friend class Dense<ValueType>;
 
   55     friend class Csr<ValueType, IndexType>;
 
   63         Hybrid<next_precision<ValueType>, IndexType>>::convert_to;
 
   64     using ConvertibleTo<Hybrid<next_precision<ValueType>, IndexType>>::move_to;
 
   65     using ConvertibleTo<Dense<ValueType>>::convert_to;
 
   66     using ConvertibleTo<Dense<ValueType>>::move_to;
 
   67     using ConvertibleTo<Csr<ValueType, IndexType>>::convert_to;
 
   68     using ConvertibleTo<Csr<ValueType, IndexType>>::move_to;
 
   71     using value_type = ValueType;
 
   72     using index_type = IndexType;
 
   73     using mat_data = matrix_data<ValueType, IndexType>;
 
   74     using device_mat_data = device_matrix_data<ValueType, IndexType>;
 
   75     using coo_type = Coo<ValueType, IndexType>;
 
   76     using ell_type = Ell<ValueType, IndexType>;
 
   77     using absolute_type = remove_complex<Hybrid>;
 
  112                                    size_type* ell_num_stored_elements_per_row,
 
  117             ref_row_nnz = row_nnz;
 
  118             ell_num_stored_elements_per_row_ =
 
  120             coo_nnz_ = this->compute_coo_nnz(ref_row_nnz);
 
  121             *ell_num_stored_elements_per_row = ell_num_stored_elements_per_row_;
 
  132             return ell_num_stored_elements_per_row_;
 
  166                 if (row_nnz_val[i] > ell_num_stored_elements_per_row_) {
 
  168                         row_nnz_val[i] - ell_num_stored_elements_per_row_;
 
  175         size_type ell_num_stored_elements_per_row_;
 
  191             : num_columns_(num_column)
 
  228             percent_ = std::min(percent_, 1.0);
 
  229             percent_ = std::max(percent_, 0.0);
 
  235             auto row_nnz_val = row_nnz->
get_data();
 
  236             auto num_rows = row_nnz->
get_size();
 
  240             std::sort(row_nnz_val, row_nnz_val + num_rows);
 
  242                 auto percent_pos = static_cast<size_type>(num_rows * percent_);
 
  243                 return row_nnz_val[percent_pos];
 
  245                 return row_nnz_val[num_rows - 1];
 
  277             auto num_rows = row_nnz->
get_size();
 
  280             return std::min(ell_cols,
 
  281                             static_cast<size_type>(num_rows * ratio_));
 
  317                                   (sizeof(ValueType) + 2 * sizeof(IndexType))))
 
  374     void read(
const mat_data& data) 
override;
 
  376     void read(
const device_mat_data& data) 
override;
 
  378     void read(device_mat_data&& data) 
override;
 
  380     void write(mat_data& data) 
const override;
 
  404         return ell_->get_const_values();
 
  423         return ell_->get_const_col_idxs();
 
  433         return ell_->get_num_stored_elements_per_row();
 
  450         return ell_->get_num_stored_elements();
 
  466         return ell_->val_at(row, idx);
 
  474         return ell_->val_at(row, idx);
 
  489         return ell_->col_at(row, idx);
 
  497         return ell_->col_at(row, idx);
 
  523         return coo_->get_const_values();
 
  542         return coo_->get_const_col_idxs();
 
  561         return coo_->get_const_row_idxs();
 
  571         return coo_->get_num_stored_elements();
 
  588         return coo_->get_num_stored_elements() +
 
  589                ell_->get_num_stored_elements();
 
  609     template <
typename HybType>
 
  610     std::shared_ptr<typename HybType::strategy_type> 
get_strategy() 
const;
 
  622     static std::unique_ptr<Hybrid> 
create(
 
  623         std::shared_ptr<const Executor> exec,
 
  624         std::shared_ptr<strategy_type> strategy =
 
  625             std::make_shared<automatic>());
 
  638     static std::unique_ptr<Hybrid> 
create(
 
  639         std::shared_ptr<const Executor> exec, 
const dim<2>& size,
 
  640         std::shared_ptr<strategy_type> strategy =
 
  641             std::make_shared<automatic>());
 
  655     static std::unique_ptr<Hybrid> 
create(
 
  656         std::shared_ptr<const Executor> exec, 
const dim<2>& size,
 
  658         std::shared_ptr<strategy_type> strategy =
 
  659             std::make_shared<automatic>());
 
  673     static std::unique_ptr<Hybrid> 
create(
 
  674         std::shared_ptr<const Executor> exec, 
const dim<2>& size,
 
  676         std::shared_ptr<strategy_type> strategy);
 
  691     static std::unique_ptr<Hybrid> 
create(
 
  692         std::shared_ptr<const Executor> exec, 
const dim<2>& size,
 
  695         std::shared_ptr<strategy_type> strategy =
 
  696             std::make_shared<automatic>());
 
  725     Hybrid(std::shared_ptr<const Executor> exec, 
const dim<2>& size = {},
 
  728            std::shared_ptr<strategy_type> strategy =
 
  729                std::make_shared<automatic>());
 
  743     void apply_impl(
const LinOp* b, 
LinOp* x) 
const override;
 
  746                     LinOp* x) 
const override;
 
  749     std::unique_ptr<ell_type> ell_;
 
  750     std::unique_ptr<coo_type> coo_;
 
  751     std::shared_ptr<strategy_type> strategy_;
 
  755 template <
typename ValueType, 
typename IndexType>
 
  756 template <
typename HybType>
 
  757 std::shared_ptr<typename HybType::strategy_type>
 
  761         std::is_same<HybType, Hybrid<
typename HybType::value_type,
 
  762                                      typename HybType::index_type>>::value,
 
  763         "The given `HybType` type must be of type `matrix::Hybrid`!");
 
  765     std::shared_ptr<typename HybType::strategy_type> strategy;
 
  766     if (std::dynamic_pointer_cast<automatic>(strategy_)) {
 
  767         strategy = std::make_shared<typename HybType::automatic>();
 
  768     } 
else if (
auto temp = std::dynamic_pointer_cast<minimal_storage_limit>(
 
  771         if (
sizeof(value_type) == 
sizeof(
typename HybType::value_type) &&
 
  772             sizeof(index_type) == 
sizeof(
typename HybType::index_type)) {
 
  774                 std::make_shared<typename HybType::minimal_storage_limit>();
 
  776             strategy = std::make_shared<typename HybType::imbalance_limit>(
 
  777                 temp->get_percentage());
 
  779     } 
else if (
auto temp = std::dynamic_pointer_cast<imbalance_bounded_limit>(
 
  781         strategy = std::make_shared<typename HybType::imbalance_bounded_limit>(
 
  782             temp->get_percentage(), temp->get_ratio());
 
  783     } 
else if (
auto temp =
 
  784                    std::dynamic_pointer_cast<imbalance_limit>(strategy_)) {
 
  785         strategy = std::make_shared<typename HybType::imbalance_limit>(
 
  786             temp->get_percentage());
 
  787     } 
else if (
auto temp = std::dynamic_pointer_cast<column_limit>(strategy_)) {
 
  788         strategy = std::make_shared<typename HybType::column_limit>(
 
  789             temp->get_num_columns());
 
  791         GKO_NOT_SUPPORTED(strategy_);
 
  801 #endif  // GKO_PUBLIC_CORE_MATRIX_HYBRID_HPP_ 
  
const value_type * get_const_coo_values() const noexcept
Returns the values of the coo part.
Definition: hybrid.hpp:521
 
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:495
 
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:431
 
const index_type * get_const_coo_row_idxs() const noexcept
Returns the row indexes of the coo part.
Definition: hybrid.hpp:559
 
minimal_storage_limit()
Creates a minimal_storage_limit strategy.
Definition: hybrid.hpp:314
 
void move_to(result_type *result) override
Definition: polymorphic_object.hpp:732
 
void convert_to(result_type *result) const override
Definition: polymorphic_object.hpp:730
 
CSR is a matrix format which stores only the nonzero coefficients by compressing each row of the matr...
Definition: matrix.hpp:27
 
imbalance_bounded_limit(double percent=0.8, double ratio=0.0001)
Creates a imbalance_bounded_limit strategy.
Definition: hybrid.hpp:270
 
column_limit is a strategy_type which decides the number of stored elements per row of the ell part b...
Definition: hybrid.hpp:183
 
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:349
 
auto get_percentage() const
Get the percent setting.
Definition: hybrid.hpp:254
 
virtual void read(const matrix_data< ValueType, IndexType > &data)=0
Reads a matrix from a matrix_data structure.
 
Dense is a matrix format which explicitly stores all values of the matrix.
Definition: dense_cache.hpp:20
 
strategy_type is to decide how to set the hybrid config.
Definition: hybrid.hpp:89
 
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:111
 
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:487
 
const ell_type * get_ell() const noexcept
Returns the matrix of the ell part.
Definition: hybrid.hpp:505
 
value_type * get_coo_values() noexcept
Returns the values of the coo part.
Definition: hybrid.hpp:512
 
index_type * get_ell_col_idxs() noexcept
Returns the column indexes of the ell part.
Definition: hybrid.hpp:412
 
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:130
 
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:194
 
value_type * get_ell_values() noexcept
Returns the values of the ell part.
Definition: hybrid.hpp:393
 
automatic is a strategy_type which decides the number of stored elements per row of the ell part auto...
Definition: hybrid.hpp:342
 
size_type get_coo_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the coo part.
Definition: hybrid.hpp:569
 
std::size_t size_type
Integral type used for allocation quantities.
Definition: types.hpp:108
 
void read(const mat_data &data) override
Reads a matrix from a matrix_data structure.
 
index_type * get_coo_row_idxs() noexcept
Returns the row indexes of the coo part.
Definition: hybrid.hpp:550
 
auto get_percentage() const
Get the percent setting.
Definition: hybrid.hpp:331
 
size_type get_ell_stride() const noexcept
Returns the stride of the ell part.
Definition: hybrid.hpp:441
 
const value_type * get_const_ell_values() const noexcept
Returns the values of the ell part.
Definition: hybrid.hpp:402
 
The Ginkgo namespace.
Definition: abstract_factory.hpp:20
 
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:320
 
size_type get_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the matrix.
Definition: hybrid.hpp:586
 
index_type * get_coo_col_idxs() noexcept
Returns the column indexes of the coo part.
Definition: hybrid.hpp:531
 
const index_type * get_const_coo_col_idxs() const noexcept
Returns the column indexes of the coo part.
Definition: hybrid.hpp:540
 
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.
 
size_type get_coo_nnz() const noexcept
Returns the number of nonzeros of the coo part.
Definition: hybrid.hpp:140
 
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:232
 
imbalance_bounded_limit is a strategy_type which decides the number of stored elements per row of the...
Definition: hybrid.hpp:265
 
typename detail::next_precision_impl< T >::type next_precision
Obtains the next type in the singly-linked precision list.
Definition: math.hpp:462
 
value_type * get_data() noexcept
Returns a pointer to the block of memory used to store the elements of the array.
Definition: array.hpp:674
 
std::shared_ptr< strategy_type > get_strategy() const noexcept
Returns the strategy.
Definition: hybrid.hpp:597
 
static std::unique_ptr< Hybrid > create(std::shared_ptr< const Executor > exec, std::shared_ptr< strategy_type > strategy=std::make_shared< automatic >())
Creates an uninitialized Hybrid matrix of specified method.
 
strategy_type()
Creates a strategy_type.
Definition: hybrid.hpp:94
 
automatic()
Creates an automatic strategy.
Definition: hybrid.hpp:347
 
std::shared_ptr< const Executor > get_executor() const noexcept
Returns the Executor associated with the array.
Definition: array.hpp:690
 
const index_type * get_const_ell_col_idxs() const noexcept
Returns the column indexes of the ell part.
Definition: hybrid.hpp:421
 
void compute_absolute_inplace() override
Compute absolute inplace on each element.
 
auto get_num_columns() const
Get the number of columns limit.
Definition: hybrid.hpp:205
 
std::unique_ptr< absolute_type > compute_absolute() const override
Gets the AbsoluteLinOp.
 
column_limit(size_type num_column=0)
Creates a column_limit strategy.
Definition: hybrid.hpp:190
 
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:464
 
void write(mat_data &data) const override
Writes a matrix to a matrix_data structure.
 
imbalance_limit is a strategy_type which decides the number of stored elements per row of the ell par...
Definition: hybrid.hpp:218
 
ELL is a matrix format where stride with explicit zeros is used such that all rows have the same numb...
Definition: csr.hpp:31
 
Hybrid(const Hybrid &)
Copy-assigns a Hybrid matrix.
 
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:472
 
HYBRID is a matrix format which splits the matrix into ELLPACK and COO format.
Definition: coo.hpp:32
 
const value_type * get_const_data() const noexcept
Returns a constant pointer to the block of memory used to store the elements of the array.
Definition: array.hpp:683
 
size_type get_ell_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the ell part.
Definition: hybrid.hpp:448
 
std::unique_ptr< Diagonal< ValueType > > extract_diagonal() const override
Extracts the diagonal entries of the matrix into a vector.
 
size_type get_size() const noexcept
Returns the number of elements in the array.
Definition: array.hpp:657
 
const coo_type * get_coo() const noexcept
Returns the matrix of the coo part.
Definition: hybrid.hpp:579
 
imbalance_limit(double percent=0.8)
Creates a imbalance_limit strategy.
Definition: hybrid.hpp:226
 
auto get_percentage() const
Get the percent setting.
Definition: hybrid.hpp:289
 
minimal_storage_limit is a strategy_type which decides the number of stored elements per row of the e...
Definition: hybrid.hpp:309
 
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:274
 
auto get_ratio() const
Get the ratio setting.
Definition: hybrid.hpp:296
 
LinOp(const LinOp &)=default
Copy-constructs a LinOp.
 
Hybrid & operator=(const Hybrid &)
Copy-assigns a Hybrid matrix.
 
constexpr T zero()
Returns the additive identity for T.
Definition: math.hpp:747
 
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:345
 
COO stores a matrix in the coordinate matrix format.
Definition: coo.hpp:50