Ginkgo  Generated from remotes/origin/develop branch based on develop. Ginkgo version 1.12.0
A numerical linear algebra library targeting many-core architectures
dense.hpp
1 // SPDX-FileCopyrightText: 2017 - 2026 The Ginkgo authors
2 //
3 // SPDX-License-Identifier: BSD-3-Clause
4 
5 #ifndef GKO_PUBLIC_CORE_MATRIX_DENSE_HPP_
6 #define GKO_PUBLIC_CORE_MATRIX_DENSE_HPP_
7 
8 
9 #include <initializer_list>
10 #include <type_traits>
11 
12 #include <ginkgo/core/base/array.hpp>
13 #include <ginkgo/core/base/exception_helpers.hpp>
14 #include <ginkgo/core/base/executor.hpp>
15 #include <ginkgo/core/base/lin_op.hpp>
16 #include <ginkgo/core/base/range_accessors.hpp>
17 #include <ginkgo/core/base/types.hpp>
18 #include <ginkgo/core/base/utils.hpp>
19 #include <ginkgo/core/matrix/device_views.hpp>
20 #include <ginkgo/core/matrix/permutation.hpp>
21 #include <ginkgo/core/matrix/scaled_permutation.hpp>
22 
23 
24 namespace gko {
25 namespace experimental {
26 namespace distributed {
27 
28 
29 template <typename ValueType>
30 class Vector;
31 
32 
33 namespace detail {
34 
35 
36 template <typename ValueType>
37 class VectorCache;
38 
39 
40 } // namespace detail
41 } // namespace distributed
42 } // namespace experimental
43 
44 
45 namespace matrix {
46 
47 
48 template <typename ValueType, typename IndexType>
49 class Coo;
50 
51 template <typename ValueType, typename IndexType>
52 class Csr;
53 
54 template <typename ValueType>
55 class Diagonal;
56 
57 template <typename ValueType, typename IndexType>
58 class Ell;
59 
60 template <typename ValueType, typename IndexType>
61 class Fbcsr;
62 
63 template <typename ValueType, typename IndexType>
64 class Hybrid;
65 
66 template <typename ValueType, typename IndexType>
67 class Sellp;
68 
69 template <typename ValueType, typename IndexType>
70 class SparsityCsr;
71 
72 
88 template <typename ValueType = default_precision>
89 class Dense
90  : public EnableLinOp<Dense<ValueType>>,
91  public ConvertibleTo<Dense<next_precision<ValueType>>>,
92 #if GINKGO_ENABLE_HALF || GINKGO_ENABLE_BFLOAT16
93  public ConvertibleTo<Dense<next_precision<ValueType, 2>>>,
94 #endif
95 #if GINKGO_ENABLE_HALF && GINKGO_ENABLE_BFLOAT16
96  public ConvertibleTo<Dense<next_precision<ValueType, 3>>>,
97 #endif
98  public ConvertibleTo<Coo<ValueType, int32>>,
99  public ConvertibleTo<Coo<ValueType, int64>>,
100  public ConvertibleTo<Csr<ValueType, int32>>,
101  public ConvertibleTo<Csr<ValueType, int64>>,
102  public ConvertibleTo<Ell<ValueType, int32>>,
103  public ConvertibleTo<Ell<ValueType, int64>>,
104  public ConvertibleTo<Fbcsr<ValueType, int32>>,
105  public ConvertibleTo<Fbcsr<ValueType, int64>>,
106  public ConvertibleTo<Hybrid<ValueType, int32>>,
107  public ConvertibleTo<Hybrid<ValueType, int64>>,
108  public ConvertibleTo<Sellp<ValueType, int32>>,
109  public ConvertibleTo<Sellp<ValueType, int64>>,
110  public ConvertibleTo<SparsityCsr<ValueType, int32>>,
111  public ConvertibleTo<SparsityCsr<ValueType, int64>>,
112  public DiagonalExtractable<ValueType>,
113  public ReadableFromMatrixData<ValueType, int32>,
114  public ReadableFromMatrixData<ValueType, int64>,
115  public WritableToMatrixData<ValueType, int32>,
116  public WritableToMatrixData<ValueType, int64>,
117  public Transposable,
118  public Permutable<int32>,
119  public Permutable<int64>,
120  public EnableAbsoluteComputation<remove_complex<Dense<ValueType>>>,
121  public ScaledIdentityAddable {
122  friend class EnablePolymorphicObject<Dense, LinOp>;
123  friend class Coo<ValueType, int32>;
124  friend class Coo<ValueType, int64>;
125  friend class Csr<ValueType, int32>;
126  friend class Csr<ValueType, int64>;
127  friend class Diagonal<ValueType>;
128  friend class Ell<ValueType, int32>;
129  friend class Ell<ValueType, int64>;
130  friend class Fbcsr<ValueType, int32>;
131  friend class Fbcsr<ValueType, int64>;
132  friend class Hybrid<ValueType, int32>;
133  friend class Hybrid<ValueType, int64>;
134  friend class Sellp<ValueType, int32>;
135  friend class Sellp<ValueType, int64>;
136  friend class SparsityCsr<ValueType, int32>;
137  friend class SparsityCsr<ValueType, int64>;
138  friend class Dense<to_complex<ValueType>>;
139  friend class experimental::distributed::Vector<ValueType>;
140  friend class experimental::distributed::detail::VectorCache<ValueType>;
141  GKO_ASSERT_SUPPORTED_VALUE_TYPE;
142 
143 public:
146  using ConvertibleTo<Dense<next_precision<ValueType>>>::convert_to;
147  using ConvertibleTo<Dense<next_precision<ValueType>>>::move_to;
148  using ConvertibleTo<Coo<ValueType, int32>>::convert_to;
149  using ConvertibleTo<Coo<ValueType, int32>>::move_to;
150  using ConvertibleTo<Coo<ValueType, int64>>::convert_to;
151  using ConvertibleTo<Coo<ValueType, int64>>::move_to;
152  using ConvertibleTo<Csr<ValueType, int32>>::convert_to;
153  using ConvertibleTo<Csr<ValueType, int32>>::move_to;
154  using ConvertibleTo<Csr<ValueType, int64>>::convert_to;
155  using ConvertibleTo<Csr<ValueType, int64>>::move_to;
156  using ConvertibleTo<Ell<ValueType, int32>>::convert_to;
157  using ConvertibleTo<Ell<ValueType, int32>>::move_to;
158  using ConvertibleTo<Ell<ValueType, int64>>::convert_to;
159  using ConvertibleTo<Ell<ValueType, int64>>::move_to;
160  using ConvertibleTo<Fbcsr<ValueType, int32>>::convert_to;
161  using ConvertibleTo<Fbcsr<ValueType, int32>>::move_to;
162  using ConvertibleTo<Fbcsr<ValueType, int64>>::convert_to;
163  using ConvertibleTo<Fbcsr<ValueType, int64>>::move_to;
164  using ConvertibleTo<Hybrid<ValueType, int32>>::convert_to;
165  using ConvertibleTo<Hybrid<ValueType, int32>>::move_to;
166  using ConvertibleTo<Hybrid<ValueType, int64>>::convert_to;
167  using ConvertibleTo<Hybrid<ValueType, int64>>::move_to;
168  using ConvertibleTo<Sellp<ValueType, int32>>::convert_to;
169  using ConvertibleTo<Sellp<ValueType, int32>>::move_to;
170  using ConvertibleTo<Sellp<ValueType, int64>>::convert_to;
171  using ConvertibleTo<Sellp<ValueType, int64>>::move_to;
172  using ConvertibleTo<SparsityCsr<ValueType, int32>>::convert_to;
173  using ConvertibleTo<SparsityCsr<ValueType, int32>>::move_to;
174  using ConvertibleTo<SparsityCsr<ValueType, int64>>::convert_to;
175  using ConvertibleTo<SparsityCsr<ValueType, int64>>::move_to;
178 
179  using value_type = ValueType;
180  using index_type = int64;
181  using transposed_type = Dense<value_type>;
182  using mat_data = matrix_data<value_type, int64>;
183  using mat_data32 = matrix_data<value_type, int32>;
184  using device_mat_data = device_matrix_data<value_type, int64>;
185  using device_mat_data32 = device_matrix_data<value_type, int32>;
186  using absolute_type = remove_complex<Dense>;
187  using real_type = absolute_type;
188  using complex_type = to_complex<Dense>;
189  using device_view = matrix::view::dense<value_type>;
190  using const_device_view = matrix::view::dense<const value_type>;
191 
192  using row_major_range = gko::range<gko::accessor::row_major<ValueType, 2>>;
193 
200  static std::unique_ptr<Dense> create_with_config_of(
202  {
203  // De-referencing `other` before calling the functions (instead of
204  // using operator `->`) is currently required to be compatible with
205  // CUDA 10.1.
206  // Otherwise, it results in a compile error.
207  return (*other).create_with_same_config();
208  }
209 
221  static std::unique_ptr<Dense> create_with_type_of(
222  ptr_param<const Dense> other, std::shared_ptr<const Executor> exec,
223  const dim<2>& size = dim<2>{})
224  {
225  // See create_with_config_of()
226  return (*other).create_with_type_of_impl(exec, size, size[1]);
227  }
228 
237  static std::unique_ptr<Dense> create_with_type_of(
238  ptr_param<const Dense> other, std::shared_ptr<const Executor> exec,
239  const dim<2>& size, size_type stride)
240  {
241  // See create_with_config_of()
242  return (*other).create_with_type_of_impl(exec, size, stride);
243  }
244 
255  static std::unique_ptr<Dense> create_with_type_of(
256  ptr_param<const Dense> other, std::shared_ptr<const Executor> exec,
257  const dim<2>& size, const dim<2>& local_size, size_type stride)
258  {
259  // See create_with_config_of()
260  return (*other).create_with_type_of_impl(exec, size, stride);
261  }
262 
271  static std::unique_ptr<Dense> create_view_of(ptr_param<Dense> other)
272  {
273  return other->create_view_of_impl();
274  }
275 
283  static std::unique_ptr<const Dense> create_const_view_of(
285  {
286  return other->create_const_view_of_impl();
287  }
288 
289  friend class Dense<previous_precision<ValueType>>;
290 
291  void convert_to(Dense<next_precision<ValueType>>* result) const override;
292 
293  void move_to(Dense<next_precision<ValueType>>* result) override;
294 
295 #if GINKGO_ENABLE_HALF || GINKGO_ENABLE_BFLOAT16
296  friend class Dense<previous_precision<ValueType, 2>>;
299 
300  void convert_to(Dense<next_precision<ValueType, 2>>* result) const override;
301 
302  void move_to(Dense<next_precision<ValueType, 2>>* result) override;
303 #endif
304 
305 #if GINKGO_ENABLE_HALF && GINKGO_ENABLE_BFLOAT16
306  friend class Dense<previous_precision<ValueType, 3>>;
309 
310  void convert_to(Dense<next_precision<ValueType, 3>>* result) const override;
311 
312  void move_to(Dense<next_precision<ValueType, 3>>* result) override;
313 #endif
314 
315  void convert_to(Coo<ValueType, int32>* result) const override;
316 
317  void move_to(Coo<ValueType, int32>* result) override;
318 
319  void convert_to(Coo<ValueType, int64>* result) const override;
320 
321  void move_to(Coo<ValueType, int64>* result) override;
322 
323  void convert_to(Csr<ValueType, int32>* result) const override;
324 
325  void move_to(Csr<ValueType, int32>* result) override;
326 
327  void convert_to(Csr<ValueType, int64>* result) const override;
328 
329  void move_to(Csr<ValueType, int64>* result) override;
330 
331  void convert_to(Ell<ValueType, int32>* result) const override;
332 
333  void move_to(Ell<ValueType, int32>* result) override;
334 
335  void convert_to(Ell<ValueType, int64>* result) const override;
336 
337  void move_to(Ell<ValueType, int64>* result) override;
338 
339  void convert_to(Fbcsr<ValueType, int32>* result) const override;
340 
341  void move_to(Fbcsr<ValueType, int32>* result) override;
342 
343  void convert_to(Fbcsr<ValueType, int64>* result) const override;
344 
345  void move_to(Fbcsr<ValueType, int64>* result) override;
346 
347  void convert_to(Hybrid<ValueType, int32>* result) const override;
348 
349  void move_to(Hybrid<ValueType, int32>* result) override;
350 
351  void convert_to(Hybrid<ValueType, int64>* result) const override;
352 
353  void move_to(Hybrid<ValueType, int64>* result) override;
354 
355  void convert_to(Sellp<ValueType, int32>* result) const override;
356 
357  void move_to(Sellp<ValueType, int32>* result) override;
358 
359  void convert_to(Sellp<ValueType, int64>* result) const override;
360 
361  void move_to(Sellp<ValueType, int64>* result) override;
362 
363  void convert_to(SparsityCsr<ValueType, int32>* result) const override;
364 
365  void move_to(SparsityCsr<ValueType, int32>* result) override;
366 
367  void convert_to(SparsityCsr<ValueType, int64>* result) const override;
368 
369  void move_to(SparsityCsr<ValueType, int64>* result) override;
370 
371  void read(const mat_data& data) override;
372 
373  void read(const mat_data32& data) override;
374 
375  void read(const device_mat_data& data) override;
376 
377  void read(const device_mat_data32& data) override;
378 
379  void read(device_mat_data&& data) override;
380 
381  void read(device_mat_data32&& data) override;
382 
383  void write(mat_data& data) const override;
384 
385  void write(mat_data32& data) const override;
386 
387  std::unique_ptr<LinOp> transpose() const override;
388 
389  std::unique_ptr<LinOp> conj_transpose() const override;
390 
397  void transpose(ptr_param<Dense> output) const;
398 
405  void conj_transpose(ptr_param<Dense> output) const;
406 
412  void fill(const ValueType value);
413 
428  std::unique_ptr<Dense> permute(
429  ptr_param<const Permutation<int32>> permutation,
431 
435  std::unique_ptr<Dense> permute(
436  ptr_param<const Permutation<int64>> permutation,
438 
444  void permute(ptr_param<const Permutation<int32>> permutation,
445  ptr_param<Dense> output, permute_mode mode) const;
446 
451  void permute(ptr_param<const Permutation<int64>> permutation,
452  ptr_param<Dense> output, permute_mode mode) const;
453 
467  std::unique_ptr<Dense> permute(
468  ptr_param<const Permutation<int32>> row_permutation,
469  ptr_param<const Permutation<int32>> column_permutation,
470  bool invert = false) const;
471 
476  std::unique_ptr<Dense> permute(
477  ptr_param<const Permutation<int64>> row_permutation,
478  ptr_param<const Permutation<int64>> column_permutation,
479  bool invert = false) const;
480 
487  void permute(ptr_param<const Permutation<int32>> row_permutation,
488  ptr_param<const Permutation<int32>> column_permutation,
489  ptr_param<Dense> output, bool invert = false) const;
490 
495  void permute(ptr_param<const Permutation<int64>> row_permutation,
496  ptr_param<const Permutation<int64>> column_permutation,
497  ptr_param<Dense> output, bool invert = false) const;
498 
508  std::unique_ptr<Dense> scale_permute(
511 
516  std::unique_ptr<Dense> scale_permute(
519 
526  void scale_permute(
528  ptr_param<Dense> output, permute_mode mode) const;
529 
534  void scale_permute(
536  ptr_param<Dense> output, permute_mode mode) const;
537 
550  std::unique_ptr<Dense> scale_permute(
551  ptr_param<const ScaledPermutation<value_type, int32>> row_permutation,
553  column_permutation,
554  bool invert = false) const;
555 
560  std::unique_ptr<Dense> scale_permute(
561  ptr_param<const ScaledPermutation<value_type, int64>> row_permutation,
563  column_permutation,
564  bool invert = false) const;
565 
572  void scale_permute(
573  ptr_param<const ScaledPermutation<value_type, int32>> row_permutation,
575  column_permutation,
576  ptr_param<Dense> output, bool invert = false) const;
577 
583  void scale_permute(
584  ptr_param<const ScaledPermutation<value_type, int64>> row_permutation,
586  column_permutation,
587  ptr_param<Dense> output, bool invert = false) const;
588 
589  std::unique_ptr<LinOp> permute(
590  const array<int32>* permutation_indices) const override;
591 
592  std::unique_ptr<LinOp> permute(
593  const array<int64>* permutation_indices) const override;
594 
604  void permute(const array<int32>* permutation_indices,
605  ptr_param<Dense> output) const;
606 
610  void permute(const array<int64>* permutation_indices,
611  ptr_param<Dense> output) const;
612 
613  std::unique_ptr<LinOp> inverse_permute(
614  const array<int32>* permutation_indices) const override;
615 
616  std::unique_ptr<LinOp> inverse_permute(
617  const array<int64>* permutation_indices) const override;
618 
629  void inverse_permute(const array<int32>* permutation_indices,
630  ptr_param<Dense> output) const;
631 
635  void inverse_permute(const array<int64>* permutation_indices,
636  ptr_param<Dense> output) const;
637 
638  std::unique_ptr<LinOp> row_permute(
639  const array<int32>* permutation_indices) const override;
640 
641  std::unique_ptr<LinOp> row_permute(
642  const array<int64>* permutation_indices) const override;
643 
653  void row_permute(const array<int32>* permutation_indices,
654  ptr_param<Dense> output) const;
655 
659  void row_permute(const array<int64>* permutation_indices,
660  ptr_param<Dense> output) const;
661 
672  std::unique_ptr<Dense> row_gather(const array<int32>* gather_indices) const;
673 
677  std::unique_ptr<Dense> row_gather(const array<int64>* gather_indices) const;
678 
691  void row_gather(const array<int32>* gather_indices,
692  ptr_param<LinOp> row_collection) const;
693 
697  void row_gather(const array<int64>* gather_indices,
698  ptr_param<LinOp> row_collection) const;
699 
714  const array<int32>* gather_indices,
716  ptr_param<LinOp> row_collection) const;
717 
723  const array<int64>* gather_indices,
725  ptr_param<LinOp> row_collection) const;
726 
727  std::unique_ptr<LinOp> column_permute(
728  const array<int32>* permutation_indices) const override;
729 
730  std::unique_ptr<LinOp> column_permute(
731  const array<int64>* permutation_indices) const override;
732 
742  void column_permute(const array<int32>* permutation_indices,
743  ptr_param<Dense> output) const;
744 
748  void column_permute(const array<int64>* permutation_indices,
749  ptr_param<Dense> output) const;
750 
751  std::unique_ptr<LinOp> inverse_row_permute(
752  const array<int32>* permutation_indices) const override;
753 
754  std::unique_ptr<LinOp> inverse_row_permute(
755  const array<int64>* permutation_indices) const override;
756 
766  void inverse_row_permute(const array<int32>* permutation_indices,
767  ptr_param<Dense> output) const;
768 
772  void inverse_row_permute(const array<int64>* permutation_indices,
773  ptr_param<Dense> output) const;
774 
775  std::unique_ptr<LinOp> inverse_column_permute(
776  const array<int32>* permutation_indices) const override;
777 
778  std::unique_ptr<LinOp> inverse_column_permute(
779  const array<int64>* permutation_indices) const override;
780 
790  void inverse_column_permute(const array<int32>* permutation_indices,
791  ptr_param<Dense> output) const;
792 
796  void inverse_column_permute(const array<int64>* permutation_indices,
797  ptr_param<Dense> output) const;
798 
799  std::unique_ptr<Diagonal<ValueType>> extract_diagonal() const override;
800 
808  void extract_diagonal(ptr_param<Diagonal<ValueType>> output) const;
809 
810  std::unique_ptr<absolute_type> compute_absolute() const override;
811 
819  void compute_absolute(ptr_param<absolute_type> output) const;
820 
821  void compute_absolute_inplace() override;
822 
827  std::unique_ptr<complex_type> make_complex() const;
828 
834  void make_complex(ptr_param<complex_type> result) const;
835 
840  std::unique_ptr<real_type> get_real() const;
841 
845  void get_real(ptr_param<real_type> result) const;
846 
851  std::unique_ptr<real_type> get_imag() const;
852 
857  void get_imag(ptr_param<real_type> result) const;
858 
864  value_type* get_values() noexcept { return values_.get_data(); }
865 
873  const value_type* get_const_values() const noexcept
874  {
875  return values_.get_const_data();
876  }
877 
883  size_type get_stride() const noexcept { return stride_; }
884 
891  {
892  return values_.get_size();
893  }
894 
895  device_view get_device_view();
896 
897  const_device_view get_const_device_view() const;
898 
909  value_type& at(size_type row, size_type col) noexcept
910  {
911  return values_.get_data()[linearize_index(row, col)];
912  }
913 
917  value_type at(size_type row, size_type col) const noexcept
918  {
919  return values_.get_const_data()[linearize_index(row, col)];
920  }
921 
936  ValueType& at(size_type idx) noexcept
937  {
938  return values_.get_data()[linearize_index(idx)];
939  }
940 
944  ValueType at(size_type idx) const noexcept
945  {
946  return values_.get_const_data()[linearize_index(idx)];
947  }
948 
958  void scale(ptr_param<const LinOp> alpha);
959 
969  void inv_scale(ptr_param<const LinOp> alpha);
970 
982 
994 
1003  void compute_dot(ptr_param<const LinOp> b, ptr_param<LinOp> result) const;
1004 
1017  array<char>& tmp) const;
1018 
1028  ptr_param<LinOp> result) const;
1029 
1042  array<char>& tmp) const;
1043 
1051  void compute_norm2(ptr_param<LinOp> result) const;
1052 
1063  void compute_norm2(ptr_param<LinOp> result, array<char>& tmp) const;
1064 
1072  void compute_norm1(ptr_param<LinOp> result) const;
1073 
1084  void compute_norm1(ptr_param<LinOp> result, array<char>& tmp) const;
1085 
1094  void compute_squared_norm2(ptr_param<LinOp> result) const;
1095 
1107  void compute_squared_norm2(ptr_param<LinOp> result, array<char>& tmp) const;
1108 
1116  void compute_mean(ptr_param<LinOp> result) const;
1117 
1128  void compute_mean(ptr_param<LinOp> result, array<char>& tmp) const;
1129 
1140  std::unique_ptr<Dense> create_submatrix(const span& rows,
1141  const span& columns,
1142  const size_type stride)
1143  {
1144  return this->create_submatrix_impl(rows, columns, stride);
1145  }
1146 
1153  std::unique_ptr<Dense> create_submatrix(const span& rows,
1154  const span& columns)
1155  {
1156  return create_submatrix(rows, columns, this->get_stride());
1157  }
1158 
1159 
1168  std::unique_ptr<Dense> create_submatrix(const local_span& rows,
1169  const local_span& columns,
1170  dim<2> size)
1171  {
1172  dim<2> deduced_size{rows.length(), columns.length()};
1173  GKO_ASSERT_EQUAL_DIMENSIONS(deduced_size, size);
1174  return create_submatrix(rows, columns, this->get_stride());
1175  }
1176 
1184  std::unique_ptr<real_type> create_real_view();
1185 
1189  std::unique_ptr<const real_type> create_real_view() const;
1190 
1203  static std::unique_ptr<Dense> create(std::shared_ptr<const Executor> exec,
1204  const dim<2>& size = {},
1205  size_type stride = 0);
1206 
1223  static std::unique_ptr<Dense> create(std::shared_ptr<const Executor> exec,
1224  const dim<2>& size,
1225  array<value_type> values,
1226  size_type stride);
1227 
1232  template <typename InputValueType>
1233  GKO_DEPRECATED(
1234  "explicitly construct the gko::array argument instead of passing an"
1235  "initializer list")
1236  static std::unique_ptr<Dense> create(
1237  std::shared_ptr<const Executor> exec, const dim<2>& size,
1238  std::initializer_list<InputValueType> values, size_type stride)
1239  {
1240  return create(exec, size, array<value_type>{exec, std::move(values)},
1241  stride);
1242  }
1243 
1255  static std::unique_ptr<const Dense> create_const(
1256  std::shared_ptr<const Executor> exec, const dim<2>& size,
1257  gko::detail::const_array_view<ValueType>&& values, size_type stride);
1258 
1264  Dense& operator=(const Dense&);
1265 
1271  Dense& operator=(Dense&&);
1272 
1277  Dense(const Dense&);
1278 
1283  Dense(Dense&&);
1284 
1285 protected:
1286  Dense(std::shared_ptr<const Executor> exec, const dim<2>& size = {},
1287  size_type stride = 0);
1288 
1289  Dense(std::shared_ptr<const Executor> exec, const dim<2>& size,
1290  array<value_type> values, size_type stride);
1291 
1298  virtual std::unique_ptr<Dense> create_with_same_config() const
1299  {
1300  return Dense::create(this->get_executor(), this->get_size(),
1301  this->get_stride());
1302  }
1303 
1311  virtual std::unique_ptr<Dense> create_with_type_of_impl(
1312  std::shared_ptr<const Executor> exec, const dim<2>& size,
1313  size_type stride) const
1314  {
1315  return Dense::create(exec, size, stride);
1316  }
1317 
1324  virtual std::unique_ptr<Dense> create_view_of_impl()
1325  {
1326  auto exec = this->get_executor();
1327  return Dense::create(
1328  exec, this->get_size(),
1330  this->get_values()),
1331  this->get_stride());
1332  }
1333 
1340  virtual std::unique_ptr<const Dense> create_const_view_of_impl() const
1341  {
1342  auto exec = this->get_executor();
1343  return Dense::create_const(
1344  exec, this->get_size(),
1346  this->get_const_values()),
1347  this->get_stride());
1348  }
1349 
1350  template <typename IndexType>
1351  void convert_impl(Coo<ValueType, IndexType>* result) const;
1352 
1353  template <typename IndexType>
1354  void convert_impl(Csr<ValueType, IndexType>* result) const;
1355 
1356  template <typename IndexType>
1357  void convert_impl(Ell<ValueType, IndexType>* result) const;
1358 
1359  template <typename IndexType>
1360  void convert_impl(Fbcsr<ValueType, IndexType>* result) const;
1361 
1362  template <typename IndexType>
1363  void convert_impl(Hybrid<ValueType, IndexType>* result) const;
1364 
1365  template <typename IndexType>
1366  void convert_impl(Sellp<ValueType, IndexType>* result) const;
1367 
1368  template <typename IndexType>
1369  void convert_impl(SparsityCsr<ValueType, IndexType>* result) const;
1370 
1377  virtual void scale_impl(const LinOp* alpha);
1378 
1385  virtual void inv_scale_impl(const LinOp* alpha);
1386 
1393  virtual void add_scaled_impl(const LinOp* alpha, const LinOp* b);
1394 
1401  virtual void sub_scaled_impl(const LinOp* alpha, const LinOp* b);
1402 
1409  virtual void compute_dot_impl(const LinOp* b, LinOp* result) const;
1410 
1417  virtual void compute_conj_dot_impl(const LinOp* b, LinOp* result) const;
1418 
1425  virtual void compute_norm2_impl(LinOp* result) const;
1426 
1433  virtual void compute_norm1_impl(LinOp* result) const;
1434 
1441  virtual void compute_squared_norm2_impl(LinOp* result) const;
1442 
1446  virtual void compute_mean_impl(LinOp* result) const;
1447 
1456  void resize(gko::dim<2> new_size);
1457 
1465  virtual std::unique_ptr<Dense> create_submatrix_impl(
1466  const span& rows, const span& columns, const size_type stride);
1467 
1468  void apply_impl(const LinOp* b, LinOp* x) const override;
1469 
1470  void apply_impl(const LinOp* alpha, const LinOp* b, const LinOp* beta,
1471  LinOp* x) const override;
1472 
1473  size_type linearize_index(size_type row, size_type col) const noexcept
1474  {
1475  return row * stride_ + col;
1476  }
1477 
1478  size_type linearize_index(size_type idx) const noexcept
1479  {
1480  return linearize_index(idx / this->get_size()[1],
1481  idx % this->get_size()[1]);
1482  }
1483 
1484  template <typename IndexType>
1485  void permute_impl(const Permutation<IndexType>* permutation,
1486  permute_mode mode, Dense* output) const;
1487 
1488  template <typename IndexType>
1489  void permute_impl(const Permutation<IndexType>* row_permutation,
1490  const Permutation<IndexType>* col_permutation,
1491  bool invert, Dense* output) const;
1492 
1493  template <typename IndexType>
1494  void scale_permute_impl(
1495  const ScaledPermutation<ValueType, IndexType>* permutation,
1496  permute_mode mode, Dense* output) const;
1497 
1498  template <typename IndexType>
1499  void scale_permute_impl(
1500  const ScaledPermutation<ValueType, IndexType>* row_permutation,
1501  const ScaledPermutation<ValueType, IndexType>* column_permutation,
1502  bool invert, Dense* output) const;
1503 
1504  template <typename OutputType, typename IndexType>
1505  void row_gather_impl(const array<IndexType>* row_idxs,
1506  Dense<OutputType>* row_collection) const;
1507 
1508  template <typename OutputType, typename IndexType>
1509  void row_gather_impl(const Dense<ValueType>* alpha,
1510  const array<IndexType>* row_idxs,
1511  const Dense<ValueType>* beta,
1512  Dense<OutputType>* row_collection) const;
1513 
1514 private:
1515  size_type stride_;
1516  array<value_type> values_;
1517 
1518  void add_scaled_identity_impl(const LinOp* a, const LinOp* b) override;
1519 };
1520 
1521 
1522 } // namespace matrix
1523 
1524 
1525 namespace detail {
1526 
1527 
1528 template <typename ValueType>
1529 struct temporary_clone_helper<matrix::Dense<ValueType>> {
1530  static std::unique_ptr<matrix::Dense<ValueType>> create(
1531  std::shared_ptr<const Executor> exec, matrix::Dense<ValueType>* ptr,
1532  bool copy_data)
1533  {
1534  if (copy_data) {
1535  return gko::clone(std::move(exec), ptr);
1536  } else {
1537  return matrix::Dense<ValueType>::create(exec, ptr->get_size());
1538  }
1539  }
1540 };
1541 
1542 
1543 } // namespace detail
1544 
1545 
1553 template <typename VecPtr>
1554 std::unique_ptr<matrix::Dense<typename detail::pointee<VecPtr>::value_type>>
1555 make_dense_view(VecPtr&& vector)
1556 {
1557  using value_type = typename detail::pointee<VecPtr>::value_type;
1559 }
1560 
1561 
1569 template <typename VecPtr>
1570 std::unique_ptr<
1571  const matrix::Dense<typename detail::pointee<VecPtr>::value_type>>
1572 make_const_dense_view(VecPtr&& vector)
1573 {
1574  using value_type = typename detail::pointee<VecPtr>::value_type;
1576 }
1577 
1578 
1599 template <typename Matrix, typename... TArgs>
1600 std::unique_ptr<Matrix> initialize(
1601  size_type stride, std::initializer_list<typename Matrix::value_type> vals,
1602  std::shared_ptr<const Executor> exec, TArgs&&... create_args)
1603 {
1605  size_type num_rows = vals.size();
1606  auto tmp = dense::create(exec->get_master(), dim<2>{num_rows, 1}, stride);
1607  size_type idx = 0;
1608  for (const auto& elem : vals) {
1609  tmp->at(idx) = elem;
1610  ++idx;
1611  }
1612  auto mtx = Matrix::create(exec, std::forward<TArgs>(create_args)...);
1613  tmp->move_to(mtx);
1614  return mtx;
1615 }
1616 
1637 template <typename Matrix, typename... TArgs>
1638 std::unique_ptr<Matrix> initialize(
1639  std::initializer_list<typename Matrix::value_type> vals,
1640  std::shared_ptr<const Executor> exec, TArgs&&... create_args)
1641 {
1642  return initialize<Matrix>(1, vals, std::move(exec),
1643  std::forward<TArgs>(create_args)...);
1644 }
1645 
1646 
1667 template <typename Matrix, typename... TArgs>
1668 std::unique_ptr<Matrix> initialize(
1669  size_type stride,
1670  std::initializer_list<std::initializer_list<typename Matrix::value_type>>
1671  vals,
1672  std::shared_ptr<const Executor> exec, TArgs&&... create_args)
1673 {
1675  size_type num_rows = vals.size();
1676  size_type num_cols = num_rows > 0 ? begin(vals)->size() : 1;
1677  auto tmp =
1678  dense::create(exec->get_master(), dim<2>{num_rows, num_cols}, stride);
1679  size_type ridx = 0;
1680  for (const auto& row : vals) {
1681  size_type cidx = 0;
1682  for (const auto& elem : row) {
1683  tmp->at(ridx, cidx) = elem;
1684  ++cidx;
1685  }
1686  ++ridx;
1687  }
1688  auto mtx = Matrix::create(exec, std::forward<TArgs>(create_args)...);
1689  tmp->move_to(mtx);
1690  return mtx;
1691 }
1692 
1693 
1715 template <typename Matrix, typename... TArgs>
1716 std::unique_ptr<Matrix> initialize(
1717  std::initializer_list<std::initializer_list<typename Matrix::value_type>>
1718  vals,
1719  std::shared_ptr<const Executor> exec, TArgs&&... create_args)
1720 {
1721  return initialize<Matrix>(vals.size() > 0 ? begin(vals)->size() : 0, vals,
1722  std::move(exec),
1723  std::forward<TArgs>(create_args)...);
1724 }
1725 
1726 
1727 } // namespace gko
1728 
1729 
1730 #endif // GKO_PUBLIC_CORE_MATRIX_DENSE_HPP_
gko::matrix::Dense::permute
std::unique_ptr< Dense > permute(ptr_param< const Permutation< int32 >> permutation, permute_mode mode=permute_mode::symmetric) const
Creates a permuted copy of this matrix with the given permutation .
gko::matrix::Dense::inverse_column_permute
std::unique_ptr< LinOp > inverse_column_permute(const array< int32 > *permutation_indices) const override
Returns a LinOp representing the row permutation of the inverse permuted object.
gko::matrix::Dense::add_scaled
void add_scaled(ptr_param< const LinOp > alpha, ptr_param< const LinOp > b)
Adds b scaled by alpha to the matrix (aka: BLAS axpy).
gko::matrix::Fbcsr
Fixed-block compressed sparse row storage matrix format.
Definition: csr.hpp:46
gko::EnablePolymorphicAssignment< ConcreteLinOp >::move_to
void move_to(result_type *result) override
Definition: polymorphic_object.hpp:751
gko::EnablePolymorphicAssignment< ConcreteLinOp >::convert_to
void convert_to(result_type *result) const override
Definition: polymorphic_object.hpp:749
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::permute_mode::rows
The rows will be permuted.
gko::matrix::Dense::transpose
std::unique_ptr< LinOp > transpose() const override
Returns a LinOp representing the transpose of the Transposable object.
gko::matrix::permute_mode::columns
The columns will be permuted.
gko::ReadableFromMatrixData< ValueType, int32 >::read
virtual void read(const matrix_data< ValueType, int32 > &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::SparsityCsr
SparsityCsr is a matrix format which stores only the sparsity pattern of a sparse matrix by compressi...
Definition: csr.hpp:40
gko::matrix::Dense::at
ValueType at(size_type idx) const noexcept
Returns a single element of the matrix.
Definition: dense.hpp:944
gko::matrix::Dense::row_gather
std::unique_ptr< Dense > row_gather(const array< int32 > *gather_indices) const
Create a Dense matrix consisting of the given rows from this matrix.
gko::matrix::Dense::make_complex
std::unique_ptr< complex_type > make_complex() const
Creates a complex copy of the original matrix.
gko::matrix::Dense::create
static std::unique_ptr< Dense > create(std::shared_ptr< const Executor > exec, const dim< 2 > &size={}, size_type stride=0)
Creates an uninitialized Dense matrix of the specified size.
gko::matrix::Dense::create_with_type_of
static std::unique_ptr< Dense > create_with_type_of(ptr_param< const Dense > other, std::shared_ptr< const Executor > exec, const dim< 2 > &size, size_type stride)
Definition: dense.hpp:237
gko::matrix::Dense::scale
void scale(ptr_param< const LinOp > alpha)
Scales the matrix with a scalar (aka: BLAS scal).
gko::matrix::ScaledPermutation
ScaledPermutation is a matrix combining a permutation with scaling factors.
Definition: scaled_permutation.hpp:36
gko::size_type
std::size_t size_type
Integral type used for allocation quantities.
Definition: types.hpp:90
gko::matrix::Dense::get_real
std::unique_ptr< real_type > get_real() const
Creates a new real matrix and extracts the real part of the original matrix into that.
gko::matrix::Dense::inv_scale
void inv_scale(ptr_param< const LinOp > alpha)
Scales the matrix with the inverse of a scalar.
gko::matrix::Permutation
Permutation is a matrix format that represents a permutation matrix, i.e.
Definition: csr.hpp:52
gko::matrix::Dense::fill
void fill(const ValueType value)
Fill the dense matrix with a given value.
gko::make_const_array_view
detail::const_array_view< ValueType > make_const_array_view(std::shared_ptr< const Executor > exec, size_type size, const ValueType *data)
Helper function to create a const array view deducing the value type.
Definition: array.hpp:820
gko::matrix::Dense::compute_dot
void compute_dot(ptr_param< const LinOp > b, ptr_param< LinOp > result) const
Computes the column-wise dot product of this matrix and b.
gko::matrix::Dense::create_submatrix
std::unique_ptr< Dense > create_submatrix(const span &rows, const span &columns, const size_type stride)
Create a submatrix from the original matrix.
Definition: dense.hpp:1140
gko::matrix::Dense::create_with_config_of
static std::unique_ptr< Dense > create_with_config_of(ptr_param< const Dense > other)
Creates a Dense matrix with the same size and stride as another Dense matrix.
Definition: dense.hpp:200
gko::initialize
std::unique_ptr< Matrix > initialize(size_type stride, std::initializer_list< typename Matrix::value_type > vals, std::shared_ptr< const Executor > exec, TArgs &&... create_args)
Creates and initializes a column-vector.
Definition: dense.hpp:1600
gko::matrix::Dense::at
value_type & at(size_type row, size_type col) noexcept
Returns a single element of the matrix.
Definition: dense.hpp:909
gko::clone
detail::cloned_type< Pointer > clone(const Pointer &p)
Creates a unique clone of the object pointed to by p.
Definition: utils_helper.hpp:173
gko::matrix::Dense::get_stride
size_type get_stride() const noexcept
Returns the stride of the matrix.
Definition: dense.hpp:883
gko::matrix::Dense::create_view_of
static std::unique_ptr< Dense > create_view_of(ptr_param< Dense > other)
Creates a Dense matrix, where the underlying array is a view of another Dense matrix' array.
Definition: dense.hpp:271
gko::range
A range is a multidimensional view of the memory.
Definition: range.hpp:304
gko
The Ginkgo namespace.
Definition: abstract_factory.hpp:20
gko::matrix::Dense::get_num_stored_elements
size_type get_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the matrix.
Definition: dense.hpp:890
gko::matrix::Dense::sub_scaled
void sub_scaled(ptr_param< const LinOp > alpha, ptr_param< const LinOp > b)
Subtracts b scaled by alpha from the matrix (aka: BLAS axpy).
gko::matrix::Dense::get_values
value_type * get_values() noexcept
Returns a pointer to the array of values of the matrix.
Definition: dense.hpp:864
gko::array
An array is a container which encapsulates fixed-sized arrays, stored on the Executor tied to the arr...
Definition: array.hpp:26
gko::matrix::Dense::compute_norm2
void compute_norm2(ptr_param< LinOp > result) const
Computes the column-wise Euclidean (L^2) norm of this matrix.
gko::matrix::Dense::row_permute
std::unique_ptr< LinOp > row_permute(const array< int32 > *permutation_indices) const override
Returns a LinOp representing the row permutation of the Permutable object.
gko::matrix::Dense::create_with_type_of
static std::unique_ptr< Dense > create_with_type_of(ptr_param< const Dense > other, std::shared_ptr< const Executor > exec, const dim< 2 > &size=dim< 2 >{})
Creates a Dense matrix with the same type as another Dense matrix but on a different executor and wit...
Definition: dense.hpp:221
gko::span
A span is a lightweight structure used to create sub-ranges from other ranges.
Definition: range.hpp:46
gko::dim< 2 >
gko::matrix::Diagonal
This class is a utility which efficiently implements the diagonal matrix (a linear operator which sca...
Definition: lin_op.hpp:31
gko::matrix::Dense::create_const
static std::unique_ptr< const Dense > create_const(std::shared_ptr< const Executor > exec, const dim< 2 > &size, gko::detail::const_array_view< ValueType > &&values, size_type stride)
Creates a constant (immutable) Dense matrix from a constant array.
gko::ptr_param
This class is used for function parameters in the place of raw pointers.
Definition: utils_helper.hpp:41
gko::matrix::Dense::at
value_type at(size_type row, size_type col) const noexcept
Returns a single element of the matrix.
Definition: dense.hpp:917
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:687
gko::matrix::Dense::compute_mean
void compute_mean(ptr_param< LinOp > result) const
Computes the column-wise arithmetic mean of this matrix.
gko::matrix::Dense::inverse_row_permute
std::unique_ptr< LinOp > inverse_row_permute(const array< int32 > *permutation_indices) const override
Returns a LinOp representing the row permutation of the inverse permuted object.
gko::matrix::permute_mode::symmetric
The rows and columns will be permuted.
gko::matrix::Dense::get_imag
std::unique_ptr< real_type > get_imag() const
Creates a new real matrix and extracts the imaginary part of the original matrix into that.
gko::matrix::Dense::compute_squared_norm2
void compute_squared_norm2(ptr_param< LinOp > result) const
Computes the square of the column-wise Euclidean (L^2) norm of this matrix.
gko::matrix::Dense::operator=
Dense & operator=(const Dense &)
Copy-assigns a Dense matrix.
gko::matrix::Dense::inverse_permute
std::unique_ptr< LinOp > inverse_permute(const array< int32 > *permutation_indices) const override
Returns a LinOp representing the symmetric inverse row and column permutation of the Permutable objec...
gko::matrix::Dense::create_with_type_of
static std::unique_ptr< Dense > create_with_type_of(ptr_param< const Dense > other, std::shared_ptr< const Executor > exec, const dim< 2 > &size, const dim< 2 > &local_size, size_type stride)
Definition: dense.hpp:255
gko::stop::mode
mode
The mode for the residual norm criterion.
Definition: residual_norm.hpp:37
gko::matrix::Dense::scale_permute
std::unique_ptr< Dense > scale_permute(ptr_param< const ScaledPermutation< value_type, int32 >> permutation, permute_mode mode=permute_mode::symmetric) const
Creates a scaled and permuted copy of this matrix.
gko::matrix::Dense::compute_norm1
void compute_norm1(ptr_param< LinOp > result) const
Computes the column-wise (L^1) norm of this matrix.
gko::matrix::Dense::get_const_values
const value_type * get_const_values() const noexcept
Returns a pointer to the array of values of the matrix.
Definition: dense.hpp:873
gko::make_array_view
array< ValueType > make_array_view(std::shared_ptr< const Executor > exec, size_type size, ValueType *data)
Helper function to create an array view deducing the value type.
Definition: array.hpp:801
gko::matrix::Dense::extract_diagonal
std::unique_ptr< Diagonal< ValueType > > extract_diagonal() const override
Extracts the diagonal entries of the matrix into a vector.
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:466
gko::matrix::Dense::compute_absolute_inplace
void compute_absolute_inplace() override
Compute absolute inplace on each element.
gko::matrix::Dense::column_permute
std::unique_ptr< LinOp > column_permute(const array< int32 > *permutation_indices) const override
Returns a LinOp representing the column permutation of the Permutable object.
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:473
gko::matrix::Dense::create_const_view_of
static std::unique_ptr< const Dense > create_const_view_of(ptr_param< const Dense > other)
Creates a immutable Dense matrix, where the underlying array is a view of another Dense matrix' array...
Definition: dense.hpp:283
gko::matrix::Dense::at
ValueType & at(size_type idx) noexcept
Returns a single element of the matrix.
Definition: dense.hpp:936
gko::matrix::Dense::conj_transpose
std::unique_ptr< LinOp > conj_transpose() const override
Returns a LinOp representing the conjugate transpose of the Transposable object.
gko::int64
std::int64_t int64
64-bit signed integral type.
Definition: types.hpp:113
gko::matrix::Dense::compute_conj_dot
void compute_conj_dot(ptr_param< const LinOp > b, ptr_param< LinOp > result) const
Computes the column-wise dot product of conj(this matrix) and b.
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:31
gko::ConvertibleTo
ConvertibleTo interface is used to mark that the implementer can be converted to the object of Result...
Definition: polymorphic_object.hpp:479
gko::matrix::Dense::create_submatrix
std::unique_ptr< Dense > create_submatrix(const span &rows, const span &columns)
Create a submatrix from the original matrix.
Definition: dense.hpp:1153
gko::int32
std::int32_t int32
32-bit signed integral type.
Definition: types.hpp:107
gko::matrix::Dense::compute_absolute
std::unique_ptr< absolute_type > compute_absolute() const override
Gets the AbsoluteLinOp.
gko::make_dense_view
std::unique_ptr< matrix::Dense< typename detail::pointee< VecPtr >::value_type > > make_dense_view(VecPtr &&vector)
Creates a view of a given Dense vector.
Definition: dense.hpp:1555
gko::Executor
The first step in using the Ginkgo library consists of creating an executor.
Definition: executor.hpp:615
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:696
gko::matrix::permute_mode
permute_mode
Specifies how a permutation will be applied to a matrix.
Definition: permutation.hpp:42
gko::matrix::Dense::Dense
Dense(const Dense &)
Copy-constructs a Dense matrix.
gko::matrix::Sellp
SELL-P is a matrix format similar to ELL format.
Definition: csr.hpp:37
gko::make_const_dense_view
std::unique_ptr< const matrix::Dense< typename detail::pointee< VecPtr >::value_type > > make_const_dense_view(VecPtr &&vector)
Creates a view of a given Dense vector.
Definition: dense.hpp:1572
gko::PolymorphicObject::get_executor
std::shared_ptr< const Executor > get_executor() const noexcept
Returns the Executor of the object.
Definition: polymorphic_object.hpp:243
gko::array::get_size
size_type get_size() const noexcept
Returns the number of elements in the array.
Definition: array.hpp:670
gko::LinOp::get_size
const dim< 2 > & get_size() const noexcept
Returns the size of the operator.
Definition: lin_op.hpp:210
gko::local_span
A span that is used exclusively for local numbering.
Definition: range.hpp:138
gko::matrix::Dense::create_submatrix
std::unique_ptr< Dense > create_submatrix(const local_span &rows, const local_span &columns, dim< 2 > size)
Create a submatrix from the original matrix.
Definition: dense.hpp:1168
gko::matrix::Dense::create_real_view
std::unique_ptr< real_type > create_real_view()
Create a real view of the (potentially) complex original matrix.
gko::LinOp::LinOp
LinOp(const LinOp &)=default
Copy-constructs a LinOp.
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:283
gko::matrix::Coo
COO stores a matrix in the coordinate matrix format.
Definition: coo.hpp:50