Ginkgo  Generated from pipelines/2969282958 branch based on develop. Ginkgo version 2.0.0
A numerical linear algebra library targeting many-core architectures
hybrid.hpp
1 // SPDX-FileCopyrightText: 2017 - 2026 The Ginkgo authors
2 //
3 // SPDX-License-Identifier: BSD-3-Clause
4 
5 #ifndef GKO_PUBLIC_CORE_MATRIX_HYBRID_HPP_
6 #define GKO_PUBLIC_CORE_MATRIX_HYBRID_HPP_
7 
8 
9 #include <algorithm>
10 
11 #include <ginkgo/core/base/array.hpp>
12 #include <ginkgo/core/base/lin_op.hpp>
13 #include <ginkgo/core/matrix/coo.hpp>
14 #include <ginkgo/core/matrix/csr.hpp>
15 #include <ginkgo/core/matrix/ell.hpp>
16 
17 
18 namespace gko {
19 namespace matrix {
20 
21 
22 template <typename ValueType>
23 class Dense;
24 
25 template <typename ValueType, typename IndexType>
26 class Csr;
27 
28 
40 template <typename ValueType = default_precision, typename IndexType = int32>
41 class Hybrid
42  : public LinOp,
43  public EnableCloneable<Hybrid<ValueType, IndexType>>,
44  public ConvertibleTo<Hybrid<next_precision<ValueType>, IndexType>>,
45 #if GINKGO_ENABLE_HALF || GINKGO_ENABLE_BFLOAT16
46  public ConvertibleTo<Hybrid<next_precision<ValueType, 2>, IndexType>>,
47 #endif
48 #if GINKGO_ENABLE_HALF && GINKGO_ENABLE_BFLOAT16
49  public ConvertibleTo<Hybrid<next_precision<ValueType, 3>, IndexType>>,
50 #endif
51  public ConvertibleTo<Dense<ValueType>>,
52  public ConvertibleTo<Csr<ValueType, IndexType>>,
53  public DiagonalExtractable<ValueType>,
54  public ReadableFromMatrixData<ValueType, IndexType>,
55  public WritableToMatrixData<ValueType, IndexType>,
56  public EnableAbsoluteComputation<
57  remove_complex<Hybrid<ValueType, IndexType>>> {
58  friend class EnableCloneable<Hybrid>;
59  friend class Dense<ValueType>;
60  friend class Csr<ValueType, IndexType>;
61  friend class Hybrid<to_complex<ValueType>, IndexType>;
62  GKO_ASSERT_SUPPORTED_VALUE_AND_INDEX_TYPE;
63 
64 public:
67  using ConvertibleTo<
68  Hybrid<next_precision<ValueType>, IndexType>>::convert_to;
69  using ConvertibleTo<Hybrid<next_precision<ValueType>, IndexType>>::move_to;
70  using ConvertibleTo<Dense<ValueType>>::convert_to;
71  using ConvertibleTo<Dense<ValueType>>::move_to;
72  using ConvertibleTo<Csr<ValueType, IndexType>>::convert_to;
73  using ConvertibleTo<Csr<ValueType, IndexType>>::move_to;
75 
76  using value_type = ValueType;
77  using index_type = IndexType;
78  using mat_data = matrix_data<ValueType, IndexType>;
79  using device_mat_data = device_matrix_data<ValueType, IndexType>;
80  using device_view = view::hybrid<value_type, index_type>;
81  using const_device_view = view::hybrid<const value_type, const index_type>;
82  using coo_type = Coo<ValueType, IndexType>;
83  using ell_type = Ell<ValueType, IndexType>;
84  using absolute_type = remove_complex<Hybrid>;
85 
86 
96  class strategy_type {
97  public:
98  virtual ~strategy_type() = default;
99 
104  : ell_num_stored_elements_per_row_(zero<size_type>()),
105  coo_nnz_(zero<size_type>())
106  {}
107 
121  size_type* ell_num_stored_elements_per_row,
122  size_type* coo_nnz)
123  {
124  array<size_type> ref_row_nnz(row_nnz.get_executor()->get_master(),
125  row_nnz.get_size());
126  ref_row_nnz = row_nnz;
127  ell_num_stored_elements_per_row_ =
128  this->compute_ell_num_stored_elements_per_row(&ref_row_nnz);
129  coo_nnz_ = this->compute_coo_nnz(ref_row_nnz);
130  *ell_num_stored_elements_per_row = ell_num_stored_elements_per_row_;
131  *coo_nnz = coo_nnz_;
132  }
133 
140  {
141  return ell_num_stored_elements_per_row_;
142  }
143 
149  size_type get_coo_nnz() const noexcept { return coo_nnz_; }
150 
159  array<size_type>* row_nnz) const = 0;
160 
161  protected:
170  size_type compute_coo_nnz(const array<size_type>& row_nnz) const
171  {
172  size_type coo_nnz = 0;
173  auto row_nnz_val = row_nnz.get_const_data();
174  for (size_type i = 0; i < row_nnz.get_size(); i++) {
175  if (row_nnz_val[i] > ell_num_stored_elements_per_row_) {
176  coo_nnz +=
177  row_nnz_val[i] - ell_num_stored_elements_per_row_;
178  }
179  }
180  return coo_nnz;
181  }
182 
183  private:
184  size_type ell_num_stored_elements_per_row_;
185  size_type coo_nnz_;
186  };
187 
192  class column_limit : public strategy_type {
193  public:
199  explicit column_limit(size_type num_column = 0)
200  : num_columns_(num_column)
201  {}
202 
204  array<size_type>* row_nnz) const override
205  {
206  return num_columns_;
207  }
208 
214  auto get_num_columns() const { return num_columns_; }
215 
216  private:
217  size_type num_columns_;
218  };
219 
228  public:
235  explicit imbalance_limit(double percent = 0.8) : percent_(percent)
236  {
237  percent_ = std::min(percent_, 1.0);
238  percent_ = std::max(percent_, 0.0);
239  }
240 
242  array<size_type>* row_nnz) const override
243  {
244  auto row_nnz_val = row_nnz->get_data();
245  auto num_rows = row_nnz->get_size();
246  if (num_rows == 0) {
247  return 0;
248  }
249  std::sort(row_nnz_val, row_nnz_val + num_rows);
250  if (percent_ < 1) {
251  auto percent_pos = static_cast<size_type>(num_rows * percent_);
252  return row_nnz_val[percent_pos];
253  } else {
254  return row_nnz_val[num_rows - 1];
255  }
256  }
257 
263  auto get_percentage() const { return percent_; }
264 
265  private:
266  double percent_;
267  };
268 
275  public:
279  imbalance_bounded_limit(double percent = 0.8, double ratio = 0.0001)
280  : strategy_(imbalance_limit(percent)), ratio_(ratio)
281  {}
282 
284  array<size_type>* row_nnz) const override
285  {
286  auto num_rows = row_nnz->get_size();
287  auto ell_cols =
288  strategy_.compute_ell_num_stored_elements_per_row(row_nnz);
289  return std::min(ell_cols,
290  static_cast<size_type>(num_rows * ratio_));
291  }
292 
298  auto get_percentage() const { return strategy_.get_percentage(); }
299 
305  auto get_ratio() const { return ratio_; }
306 
307  private:
308  imbalance_limit strategy_;
309  double ratio_;
310  };
311 
312 
319  public:
324  : strategy_(
325  imbalance_limit(static_cast<double>(sizeof(IndexType)) /
326  (sizeof(ValueType) + 2 * sizeof(IndexType))))
327  {}
328 
330  array<size_type>* row_nnz) const override
331  {
332  return strategy_.compute_ell_num_stored_elements_per_row(row_nnz);
333  }
334 
340  auto get_percentage() const { return strategy_.get_percentage(); }
341 
342  private:
343  imbalance_limit strategy_;
344  };
345 
346 
351  class automatic : public strategy_type {
352  public:
356  automatic() : strategy_(imbalance_bounded_limit(1.0 / 3.0, 0.001)) {}
357 
359  array<size_type>* row_nnz) const override
360  {
361  return strategy_.compute_ell_num_stored_elements_per_row(row_nnz);
362  }
363 
364  private:
365  imbalance_bounded_limit strategy_;
366  };
367 
368  friend class Hybrid<previous_precision<ValueType>, IndexType>;
369 
370  void convert_to(
371  Hybrid<next_precision<ValueType>, IndexType>* result) const override;
372 
373  void move_to(Hybrid<next_precision<ValueType>, IndexType>* result) override;
374 
375 #if GINKGO_ENABLE_HALF || GINKGO_ENABLE_BFLOAT16
376  friend class Hybrid<previous_precision<ValueType, 2>, IndexType>;
377  using ConvertibleTo<
378  Hybrid<next_precision<ValueType, 2>, IndexType>>::convert_to;
379  using ConvertibleTo<
380  Hybrid<next_precision<ValueType, 2>, IndexType>>::move_to;
381 
382  void convert_to(
383  Hybrid<next_precision<ValueType, 2>, IndexType>* result) const override;
384 
385  void move_to(
386  Hybrid<next_precision<ValueType, 2>, IndexType>* result) override;
387 #endif
388 
389 #if GINKGO_ENABLE_HALF && GINKGO_ENABLE_BFLOAT16
390  friend class Hybrid<previous_precision<ValueType, 3>, IndexType>;
391  using ConvertibleTo<
392  Hybrid<next_precision<ValueType, 3>, IndexType>>::convert_to;
393  using ConvertibleTo<
394  Hybrid<next_precision<ValueType, 3>, IndexType>>::move_to;
395 
396  void convert_to(
397  Hybrid<next_precision<ValueType, 3>, IndexType>* result) const override;
398 
399  void move_to(
400  Hybrid<next_precision<ValueType, 3>, IndexType>* result) override;
401 #endif
402 
403  void convert_to(Dense<ValueType>* other) const override;
404 
405  void move_to(Dense<ValueType>* other) override;
406 
407  void convert_to(Csr<ValueType, IndexType>* other) const override;
408 
409  void move_to(Csr<ValueType, IndexType>* other) override;
410 
411  void read(const mat_data& data) override;
412 
413  void read(const device_mat_data& data) override;
414 
415  void read(device_mat_data&& data) override;
416 
418 
419  void write(mat_data& data) const override;
420 
421  std::unique_ptr<Diagonal<ValueType>> extract_diagonal() const override;
422 
423  std::unique_ptr<absolute_type> compute_absolute() const override;
424 
425  void compute_absolute_inplace() override;
426 
432  value_type* get_ell_values() noexcept { return ell_->get_values(); }
433 
441  const value_type* get_const_ell_values() const noexcept
442  {
443  return ell_->get_const_values();
444  }
445 
451  index_type* get_ell_col_idxs() noexcept { return ell_->get_col_idxs(); }
452 
460  const index_type* get_const_ell_col_idxs() const noexcept
461  {
462  return ell_->get_const_col_idxs();
463  }
464 
471  {
472  return ell_->get_num_stored_elements_per_row();
473  }
474 
480  size_type get_ell_stride() const noexcept { return ell_->get_stride(); }
481 
488  {
489  return ell_->get_num_stored_elements();
490  }
491 
503  value_type& ell_val_at(size_type row, size_type idx) noexcept
504  {
505  return ell_->val_at(row, idx);
506  }
507 
511  value_type ell_val_at(size_type row, size_type idx) const noexcept
512  {
513  return ell_->val_at(row, idx);
514  }
515 
526  index_type& ell_col_at(size_type row, size_type idx) noexcept
527  {
528  return ell_->col_at(row, idx);
529  }
530 
534  index_type ell_col_at(size_type row, size_type idx) const noexcept
535  {
536  return ell_->col_at(row, idx);
537  }
538 
544  const ell_type* get_ell() const noexcept { return ell_.get(); }
545 
551  value_type* get_coo_values() noexcept { return coo_->get_values(); }
552 
560  const value_type* get_const_coo_values() const noexcept
561  {
562  return coo_->get_const_values();
563  }
564 
570  index_type* get_coo_col_idxs() noexcept { return coo_->get_col_idxs(); }
571 
579  const index_type* get_const_coo_col_idxs() const noexcept
580  {
581  return coo_->get_const_col_idxs();
582  }
583 
589  index_type* get_coo_row_idxs() noexcept { return coo_->get_row_idxs(); }
590 
598  const index_type* get_const_coo_row_idxs() const noexcept
599  {
600  return coo_->get_const_row_idxs();
601  }
602 
609  {
610  return coo_->get_num_stored_elements();
611  }
612 
618  const coo_type* get_coo() const noexcept { return coo_.get(); }
619 
626  {
627  return coo_->get_num_stored_elements() +
628  ell_->get_num_stored_elements();
629  }
630 
636  std::shared_ptr<strategy_type> get_strategy() const noexcept
637  {
638  return strategy_;
639  }
640 
648  template <typename HybType>
649  std::shared_ptr<typename HybType::strategy_type> get_strategy() const;
650 
656  device_view get_device_view();
657 
663  const_device_view get_const_device_view() const;
664 
675  static std::unique_ptr<Hybrid> create(
676  std::shared_ptr<const Executor> exec,
677  std::shared_ptr<strategy_type> strategy =
678  std::make_shared<automatic>());
679 
691  static std::unique_ptr<Hybrid> create(
692  std::shared_ptr<const Executor> exec, const dim<2>& size,
693  std::shared_ptr<strategy_type> strategy =
694  std::make_shared<automatic>());
695 
708  static std::unique_ptr<Hybrid> create(
709  std::shared_ptr<const Executor> exec, const dim<2>& size,
710  size_type num_stored_elements_per_row,
711  std::shared_ptr<strategy_type> strategy =
712  std::make_shared<automatic>());
713 
726  static std::unique_ptr<Hybrid> create(
727  std::shared_ptr<const Executor> exec, const dim<2>& size,
728  size_type num_stored_elements_per_row, size_type stride,
729  std::shared_ptr<strategy_type> strategy);
730 
744  static std::unique_ptr<Hybrid> create(
745  std::shared_ptr<const Executor> exec, const dim<2>& size,
746  size_type num_stored_elements_per_row, size_type stride,
747  size_type num_nonzeros = {},
748  std::shared_ptr<strategy_type> strategy =
749  std::make_shared<automatic>());
750 
755  Hybrid& operator=(const Hybrid&);
756 
762  Hybrid& operator=(Hybrid&&);
763 
768  Hybrid(const Hybrid&);
769 
775  Hybrid(Hybrid&&);
776 
777 protected:
778  Hybrid(std::shared_ptr<const Executor> exec, const dim<2>& size = {},
779  size_type num_stored_elements_per_row = 0, size_type stride = 0,
780  size_type num_nonzeros = 0,
781  std::shared_ptr<strategy_type> strategy =
782  std::make_shared<automatic>());
783 
794  void resize(dim<2> new_size, size_type ell_row_nnz, size_type coo_nnz);
795 
796  void apply_impl(const LinOp* b, LinOp* x) const override;
797 
798  void apply_impl(const LinOp* alpha, const LinOp* b, const LinOp* beta,
799  LinOp* x) const override;
800 
801 private:
802  std::unique_ptr<ell_type> ell_;
803  std::unique_ptr<coo_type> coo_;
804  std::shared_ptr<strategy_type> strategy_;
805 };
806 
807 
808 template <typename ValueType, typename IndexType>
809 template <typename HybType>
810 std::shared_ptr<typename HybType::strategy_type>
812 {
813  static_assert(
814  std::is_same<HybType, Hybrid<typename HybType::value_type,
815  typename HybType::index_type>>::value,
816  "The given `HybType` type must be of type `matrix::Hybrid`!");
817 
818  std::shared_ptr<typename HybType::strategy_type> strategy;
819  if (std::dynamic_pointer_cast<automatic>(strategy_)) {
820  strategy = std::make_shared<typename HybType::automatic>();
821  } else if (auto temp = std::dynamic_pointer_cast<minimal_storage_limit>(
822  strategy_)) {
823  // minimal_storage_limit is related to ValueType and IndexType size.
824  if (sizeof(value_type) == sizeof(typename HybType::value_type) &&
825  sizeof(index_type) == sizeof(typename HybType::index_type)) {
826  strategy =
827  std::make_shared<typename HybType::minimal_storage_limit>();
828  } else {
829  strategy = std::make_shared<typename HybType::imbalance_limit>(
830  temp->get_percentage());
831  }
832  } else if (auto temp = std::dynamic_pointer_cast<imbalance_bounded_limit>(
833  strategy_)) {
834  strategy = std::make_shared<typename HybType::imbalance_bounded_limit>(
835  temp->get_percentage(), temp->get_ratio());
836  } else if (auto temp =
837  std::dynamic_pointer_cast<imbalance_limit>(strategy_)) {
838  strategy = std::make_shared<typename HybType::imbalance_limit>(
839  temp->get_percentage());
840  } else if (auto temp = std::dynamic_pointer_cast<column_limit>(strategy_)) {
841  strategy = std::make_shared<typename HybType::column_limit>(
842  temp->get_num_columns());
843  } else {
844  GKO_NOT_SUPPORTED(strategy_);
845  }
846  return strategy;
847 }
848 
849 
850 } // namespace matrix
851 } // namespace gko
852 
853 
854 #endif // GKO_PUBLIC_CORE_MATRIX_HYBRID_HPP_
gko::matrix::Hybrid::get_const_coo_values
const value_type * get_const_coo_values() const noexcept
Returns the values of the coo part.
Definition: hybrid.hpp:560
gko::matrix::Hybrid::ell_col_at
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:534
gko::matrix::Hybrid::get_ell_num_stored_elements_per_row
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:470
gko::matrix::Hybrid::get_const_coo_row_idxs
const index_type * get_const_coo_row_idxs() const noexcept
Returns the row indexes of the coo part.
Definition: hybrid.hpp:598
gko::matrix::Hybrid::minimal_storage_limit::minimal_storage_limit
minimal_storage_limit()
Creates a minimal_storage_limit strategy.
Definition: hybrid.hpp:323
gko::matrix::Csr
CSR is a matrix format which stores only the nonzero coefficients by compressing each row of the matr...
Definition: matrix.hpp:30
gko::matrix::Hybrid::imbalance_bounded_limit::imbalance_bounded_limit
imbalance_bounded_limit(double percent=0.8, double ratio=0.0001)
Creates a imbalance_bounded_limit strategy.
Definition: hybrid.hpp:279
gko::matrix::Hybrid::column_limit
column_limit is a strategy_type which decides the number of stored elements per row of the ell part b...
Definition: hybrid.hpp:192
gko::matrix::Hybrid::automatic::compute_ell_num_stored_elements_per_row
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:358
gko::matrix::Hybrid::imbalance_limit::get_percentage
auto get_percentage() const
Get the percent setting.
Definition: hybrid.hpp:263
gko::ReadableFromMatrixData::read
virtual void read(const matrix_data< ValueType, IndexType > &data)=0
Reads a matrix from a matrix_data structure.
gko::matrix::Dense
Dense is a matrix format which explicitly stores all values of the matrix.
Definition: dense_cache.hpp:28
gko::matrix::Hybrid::strategy_type
strategy_type is to decide how to set the hybrid config.
Definition: hybrid.hpp:96
gko::matrix::Hybrid::strategy_type::compute_hybrid_config
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:120
gko::matrix::Hybrid::ell_col_at
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:526
gko::matrix::Hybrid::get_ell
const ell_type * get_ell() const noexcept
Returns the matrix of the ell part.
Definition: hybrid.hpp:544
gko::matrix::Hybrid::get_coo_values
value_type * get_coo_values() noexcept
Returns the values of the coo part.
Definition: hybrid.hpp:551
gko::matrix::Hybrid::get_ell_col_idxs
index_type * get_ell_col_idxs() noexcept
Returns the column indexes of the ell part.
Definition: hybrid.hpp:451
gko::matrix::Hybrid::strategy_type::get_ell_num_stored_elements_per_row
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:139
gko::matrix::Hybrid::column_limit::compute_ell_num_stored_elements_per_row
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:203
gko::matrix::Hybrid::get_ell_values
value_type * get_ell_values() noexcept
Returns the values of the ell part.
Definition: hybrid.hpp:432
gko::matrix::Hybrid::automatic
automatic is a strategy_type which decides the number of stored elements per row of the ell part auto...
Definition: hybrid.hpp:351
gko::matrix::Hybrid::get_coo_num_stored_elements
size_type get_coo_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the coo part.
Definition: hybrid.hpp:608
gko::size_type
std::size_t size_type
Integral type used for allocation quantities.
Definition: types.hpp:101
gko::matrix::Hybrid::read
void read(const mat_data &data) override
Reads a matrix from a matrix_data structure.
gko::matrix::Hybrid::get_coo_row_idxs
index_type * get_coo_row_idxs() noexcept
Returns the row indexes of the coo part.
Definition: hybrid.hpp:589
gko::matrix::Hybrid::minimal_storage_limit::get_percentage
auto get_percentage() const
Get the percent setting.
Definition: hybrid.hpp:340
gko::matrix::Hybrid::get_ell_stride
size_type get_ell_stride() const noexcept
Returns the stride of the ell part.
Definition: hybrid.hpp:480
gko::matrix::Hybrid::get_const_ell_values
const value_type * get_const_ell_values() const noexcept
Returns the values of the ell part.
Definition: hybrid.hpp:441
gko
The Ginkgo namespace.
Definition: abstract_factory.hpp:19
gko::matrix::Hybrid::get_const_device_view
const_device_view get_const_device_view() const
Returns a non-owning const device view of this matrix.
gko::matrix::Hybrid::minimal_storage_limit::compute_ell_num_stored_elements_per_row
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:329
gko::matrix::Hybrid::get_num_stored_elements
size_type get_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the matrix.
Definition: hybrid.hpp:625
gko::array< size_type >
gko::dim< 2 >
gko::matrix::Hybrid::get_coo_col_idxs
index_type * get_coo_col_idxs() noexcept
Returns the column indexes of the coo part.
Definition: hybrid.hpp:570
gko::matrix::Hybrid::get_const_coo_col_idxs
const index_type * get_const_coo_col_idxs() const noexcept
Returns the column indexes of the coo part.
Definition: hybrid.hpp:579
gko::matrix::Hybrid::strategy_type::compute_ell_num_stored_elements_per_row
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.
gko::matrix::Hybrid::strategy_type::get_coo_nnz
size_type get_coo_nnz() const noexcept
Returns the number of nonzeros of the coo part.
Definition: hybrid.hpp:149
gko::matrix::Hybrid::imbalance_limit::compute_ell_num_stored_elements_per_row
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:241
gko::matrix::Hybrid::imbalance_bounded_limit
imbalance_bounded_limit is a strategy_type which decides the number of stored elements per row of the...
Definition: hybrid.hpp:274
gko::matrix::Hybrid::get_device_view
device_view get_device_view()
Returns a non-owning device view of this matrix.
gko::array::get_data
value_type * get_data() noexcept
Returns a pointer to the block of memory used to store the elements of the array.
Definition: array.hpp:686
gko::WritableToMatrixData
A LinOp implementing this interface can write its data to a matrix_data structure.
Definition: lin_op.hpp:719
gko::matrix::Hybrid::get_strategy
std::shared_ptr< strategy_type > get_strategy() const noexcept
Returns the strategy.
Definition: hybrid.hpp:636
gko::matrix::Hybrid::create
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.
gko::matrix::Hybrid::strategy_type::strategy_type
strategy_type()
Creates a strategy_type.
Definition: hybrid.hpp:103
gko::matrix::Hybrid::automatic::automatic
automatic()
Creates an automatic strategy.
Definition: hybrid.hpp:356
gko::array::get_executor
std::shared_ptr< const Executor > get_executor() const noexcept
Returns the Executor associated with the array.
Definition: array.hpp:702
gko::matrix::Hybrid::get_const_ell_col_idxs
const index_type * get_const_ell_col_idxs() const noexcept
Returns the column indexes of the ell part.
Definition: hybrid.hpp:460
gko::next_precision
typename detail::find_precision_impl< T, step >::type next_precision
Obtains the next move type of T in the singly-linked precision corresponding bfloat16/half.
Definition: math.hpp:465
gko::matrix::Hybrid::compute_absolute_inplace
void compute_absolute_inplace() override
Compute absolute inplace on each element.
gko::EnableCloneable::convert_to
void convert_to(result_type *result) const override
Converts the implementer to an object of type result_type.
Definition: polymorphic_object.hpp:411
gko::previous_precision
typename detail::find_precision_impl< T, -step >::type previous_precision
Obtains the previous move type of T in the singly-linked precision corresponding bfloat16/half.
Definition: math.hpp:472
gko::matrix::Hybrid::column_limit::get_num_columns
auto get_num_columns() const
Get the number of columns limit.
Definition: hybrid.hpp:214
gko::matrix::Hybrid::compute_absolute
std::unique_ptr< absolute_type > compute_absolute() const override
Gets the AbsoluteLinOp.
gko::matrix::Hybrid::column_limit::column_limit
column_limit(size_type num_column=0)
Creates a column_limit strategy.
Definition: hybrid.hpp:199
gko::matrix::Hybrid::ell_val_at
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:503
gko::matrix::Hybrid::write
void write(mat_data &data) const override
Writes a matrix to a matrix_data structure.
gko::matrix::Hybrid::imbalance_limit
imbalance_limit is a strategy_type which decides the number of stored elements per row of the ell par...
Definition: hybrid.hpp:227
gko::matrix::Ell
ELL is a matrix format where stride with explicit zeros is used such that all rows have the same numb...
Definition: csr.hpp:32
gko::ConvertibleTo
ConvertibleTo interface is used to mark that the implementer can be converted to the object of Result...
Definition: polymorphic_object.hpp:147
gko::matrix::Hybrid::Hybrid
Hybrid(const Hybrid &)
Copy-assigns a Hybrid matrix.
gko::matrix::Hybrid::ell_val_at
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:511
gko::matrix::Hybrid
HYBRID is a matrix format which splits the matrix into ELLPACK and COO format.
Definition: coo.hpp:32
gko::array::get_const_data
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:695
gko::matrix::Hybrid::get_ell_num_stored_elements
size_type get_ell_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the ell part.
Definition: hybrid.hpp:487
gko::matrix::Hybrid::extract_diagonal
std::unique_ptr< Diagonal< ValueType > > extract_diagonal() const override
Extracts the diagonal entries of the matrix into a vector.
gko::EnableCloneable::move_to
void move_to(result_type *result) override
Converts the implementer to an object of type result_type by moving data from this object.
Definition: polymorphic_object.hpp:413
gko::array::get_size
size_type get_size() const noexcept
Returns the number of elements in the array.
Definition: array.hpp:669
gko::matrix::Hybrid::get_coo
const coo_type * get_coo() const noexcept
Returns the matrix of the coo part.
Definition: hybrid.hpp:618
gko::matrix::Hybrid::imbalance_limit::imbalance_limit
imbalance_limit(double percent=0.8)
Creates a imbalance_limit strategy.
Definition: hybrid.hpp:235
gko::matrix::Hybrid::imbalance_bounded_limit::get_percentage
auto get_percentage() const
Get the percent setting.
Definition: hybrid.hpp:298
gko::matrix::Hybrid::minimal_storage_limit
minimal_storage_limit is a strategy_type which decides the number of stored elements per row of the e...
Definition: hybrid.hpp:318
gko::matrix::Hybrid::imbalance_bounded_limit::compute_ell_num_stored_elements_per_row
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:283
gko::matrix::Hybrid::imbalance_bounded_limit::get_ratio
auto get_ratio() const
Get the ratio setting.
Definition: hybrid.hpp:305
gko::LinOp::LinOp
LinOp(const LinOp &)=default
Copy-constructs a LinOp.
gko::matrix::Hybrid::operator=
Hybrid & operator=(const Hybrid &)
Copy-assigns a Hybrid matrix.
gko::zero
constexpr T zero()
Returns the additive identity for T.
Definition: math.hpp:625
gko::to_complex
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:282
gko::matrix::Coo
COO stores a matrix in the coordinate matrix format.
Definition: coo.hpp:49