ginkgo/core/matrix/dense.hpp Source File

ginkgo/core/matrix/dense.hpp Source File#

Reference API: ginkgo/core/matrix/dense.hpp Source File
Reference API
dense.hpp
1// SPDX-FileCopyrightText: 2017 - 2025 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/permutation.hpp>
20#include <ginkgo/core/matrix/scaled_permutation.hpp>
21
22
23namespace gko {
24namespace experimental {
25namespace distributed {
26
27
28template <typename ValueType>
29class Vector;
30
31
32namespace detail {
33
34
35template <typename ValueType>
36class VectorCache;
37
38
39} // namespace detail
40} // namespace distributed
41} // namespace experimental
42
43
44namespace matrix {
45
46
47template <typename ValueType, typename IndexType>
48class Coo;
49
50template <typename ValueType, typename IndexType>
51class Csr;
52
53template <typename ValueType>
54class Diagonal;
55
56template <typename ValueType, typename IndexType>
57class Ell;
58
59template <typename ValueType, typename IndexType>
60class Fbcsr;
61
62template <typename ValueType, typename IndexType>
63class Hybrid;
64
65template <typename ValueType, typename IndexType>
66class Sellp;
67
68template <typename ValueType, typename IndexType>
69class SparsityCsr;
70
71
86template <typename ValueType = default_precision>
87class Dense
88 : public EnableLinOp<Dense<ValueType>>,
89 public ConvertibleTo<Dense<next_precision<ValueType>>>,
90#if GINKGO_ENABLE_HALF
91 public ConvertibleTo<Dense<next_precision<next_precision<ValueType>>>>,
92#endif
93 public ConvertibleTo<Coo<ValueType, int32>>,
94 public ConvertibleTo<Coo<ValueType, int64>>,
95 public ConvertibleTo<Csr<ValueType, int32>>,
96 public ConvertibleTo<Csr<ValueType, int64>>,
97 public ConvertibleTo<Ell<ValueType, int32>>,
98 public ConvertibleTo<Ell<ValueType, int64>>,
99 public ConvertibleTo<Fbcsr<ValueType, int32>>,
100 public ConvertibleTo<Fbcsr<ValueType, int64>>,
101 public ConvertibleTo<Hybrid<ValueType, int32>>,
102 public ConvertibleTo<Hybrid<ValueType, int64>>,
103 public ConvertibleTo<Sellp<ValueType, int32>>,
104 public ConvertibleTo<Sellp<ValueType, int64>>,
105 public ConvertibleTo<SparsityCsr<ValueType, int32>>,
106 public ConvertibleTo<SparsityCsr<ValueType, int64>>,
107 public DiagonalExtractable<ValueType>,
108 public ReadableFromMatrixData<ValueType, int32>,
109 public ReadableFromMatrixData<ValueType, int64>,
110 public WritableToMatrixData<ValueType, int32>,
111 public WritableToMatrixData<ValueType, int64>,
112 public Transposable,
113 public Permutable<int32>,
114 public Permutable<int64>,
115 public EnableAbsoluteComputation<remove_complex<Dense<ValueType>>>,
116 public ScaledIdentityAddable {
117 friend class EnablePolymorphicObject<Dense, LinOp>;
118 friend class Coo<ValueType, int32>;
119 friend class Coo<ValueType, int64>;
120 friend class Csr<ValueType, int32>;
121 friend class Csr<ValueType, int64>;
122 friend class Diagonal<ValueType>;
123 friend class Ell<ValueType, int32>;
124 friend class Ell<ValueType, int64>;
125 friend class Fbcsr<ValueType, int32>;
126 friend class Fbcsr<ValueType, int64>;
127 friend class Hybrid<ValueType, int32>;
128 friend class Hybrid<ValueType, int64>;
129 friend class Sellp<ValueType, int32>;
130 friend class Sellp<ValueType, int64>;
131 friend class SparsityCsr<ValueType, int32>;
132 friend class SparsityCsr<ValueType, int64>;
133 friend class Dense<to_complex<ValueType>>;
134 friend class experimental::distributed::Vector<ValueType>;
135 friend class experimental::distributed::detail::VectorCache<ValueType>;
136
137public:
138 using EnableLinOp<Dense>::convert_to;
139 using EnableLinOp<Dense>::move_to;
142 using ConvertibleTo<Coo<ValueType, int32>>::convert_to;
143 using ConvertibleTo<Coo<ValueType, int32>>::move_to;
144 using ConvertibleTo<Coo<ValueType, int64>>::convert_to;
145 using ConvertibleTo<Coo<ValueType, int64>>::move_to;
146 using ConvertibleTo<Csr<ValueType, int32>>::convert_to;
147 using ConvertibleTo<Csr<ValueType, int32>>::move_to;
148 using ConvertibleTo<Csr<ValueType, int64>>::convert_to;
149 using ConvertibleTo<Csr<ValueType, int64>>::move_to;
150 using ConvertibleTo<Ell<ValueType, int32>>::convert_to;
151 using ConvertibleTo<Ell<ValueType, int32>>::move_to;
152 using ConvertibleTo<Ell<ValueType, int64>>::convert_to;
153 using ConvertibleTo<Ell<ValueType, int64>>::move_to;
154 using ConvertibleTo<Fbcsr<ValueType, int32>>::convert_to;
156 using ConvertibleTo<Fbcsr<ValueType, int64>>::convert_to;
158 using ConvertibleTo<Hybrid<ValueType, int32>>::convert_to;
160 using ConvertibleTo<Hybrid<ValueType, int64>>::convert_to;
162 using ConvertibleTo<Sellp<ValueType, int32>>::convert_to;
164 using ConvertibleTo<Sellp<ValueType, int64>>::convert_to;
170 using ReadableFromMatrixData<ValueType, int32>::read;
171 using ReadableFromMatrixData<ValueType, int64>::read;
172
173 using value_type = ValueType;
174 using index_type = int64;
180 using absolute_type = remove_complex<Dense>;
181 using real_type = absolute_type;
182 using complex_type = to_complex<Dense>;
183
185
192 static std::unique_ptr<Dense> create_with_config_of(
194 {
195 // De-referencing `other` before calling the functions (instead of
196 // using operator `->`) is currently required to be compatible with
197 // CUDA 10.1.
198 // Otherwise, it results in a compile error.
199 return (*other).create_with_same_config();
200 }
201
213 static std::unique_ptr<Dense> create_with_type_of(
214 ptr_param<const Dense> other, std::shared_ptr<const Executor> exec,
215 const dim<2>& size = dim<2>{})
216 {
217 // See create_with_config_of()
218 return (*other).create_with_type_of_impl(exec, size, size[1]);
219 }
220
229 static std::unique_ptr<Dense> create_with_type_of(
230 ptr_param<const Dense> other, std::shared_ptr<const Executor> exec,
231 const dim<2>& size, size_type stride)
232 {
233 // See create_with_config_of()
234 return (*other).create_with_type_of_impl(exec, size, stride);
235 }
236
247 static std::unique_ptr<Dense> create_with_type_of(
248 ptr_param<const Dense> other, std::shared_ptr<const Executor> exec,
249 const dim<2>& size, const dim<2>& local_size, size_type stride)
250 {
251 // See create_with_config_of()
252 return (*other).create_with_type_of_impl(exec, size, stride);
253 }
254
263 static std::unique_ptr<Dense> create_view_of(ptr_param<Dense> other)
264 {
265 return other->create_view_of_impl();
266 }
267
275 static std::unique_ptr<const Dense> create_const_view_of(
277 {
278 return other->create_const_view_of_impl();
279 }
280
281 friend class Dense<previous_precision<ValueType>>;
282
283 void convert_to(Dense<next_precision<ValueType>>* result) const override;
284
285 void move_to(Dense<next_precision<ValueType>>* result) override;
286
287#if GINKGO_ENABLE_HALF
288 friend class Dense<previous_precision<previous_precision<ValueType>>>;
289 using ConvertibleTo<
291 using ConvertibleTo<
293
294 void convert_to(Dense<next_precision<next_precision<ValueType>>>* result)
295 const override;
296
297 void move_to(
299#endif
300
301 void convert_to(Coo<ValueType, int32>* result) const override;
302
303 void move_to(Coo<ValueType, int32>* result) override;
304
305 void convert_to(Coo<ValueType, int64>* result) const override;
306
307 void move_to(Coo<ValueType, int64>* result) override;
308
309 void convert_to(Csr<ValueType, int32>* result) const override;
310
311 void move_to(Csr<ValueType, int32>* result) override;
312
313 void convert_to(Csr<ValueType, int64>* result) const override;
314
315 void move_to(Csr<ValueType, int64>* result) override;
316
317 void convert_to(Ell<ValueType, int32>* result) const override;
318
319 void move_to(Ell<ValueType, int32>* result) override;
320
321 void convert_to(Ell<ValueType, int64>* result) const override;
322
323 void move_to(Ell<ValueType, int64>* result) override;
324
325 void convert_to(Fbcsr<ValueType, int32>* result) const override;
326
327 void move_to(Fbcsr<ValueType, int32>* result) override;
328
329 void convert_to(Fbcsr<ValueType, int64>* result) const override;
330
331 void move_to(Fbcsr<ValueType, int64>* result) override;
332
333 void convert_to(Hybrid<ValueType, int32>* result) const override;
334
335 void move_to(Hybrid<ValueType, int32>* result) override;
336
337 void convert_to(Hybrid<ValueType, int64>* result) const override;
338
339 void move_to(Hybrid<ValueType, int64>* result) override;
340
341 void convert_to(Sellp<ValueType, int32>* result) const override;
342
343 void move_to(Sellp<ValueType, int32>* result) override;
344
345 void convert_to(Sellp<ValueType, int64>* result) const override;
346
347 void move_to(Sellp<ValueType, int64>* result) override;
348
349 void convert_to(SparsityCsr<ValueType, int32>* result) const override;
350
351 void move_to(SparsityCsr<ValueType, int32>* result) override;
352
353 void convert_to(SparsityCsr<ValueType, int64>* result) const override;
354
355 void move_to(SparsityCsr<ValueType, int64>* result) override;
356
357 void read(const mat_data& data) override;
358
359 void read(const mat_data32& data) override;
360
361 void read(const device_mat_data& data) override;
362
363 void read(const device_mat_data32& data) override;
364
365 void read(device_mat_data&& data) override;
366
367 void read(device_mat_data32&& data) override;
368
369 void write(mat_data& data) const override;
370
371 void write(mat_data32& data) const override;
372
373 std::unique_ptr<LinOp> transpose() const override;
374
375 std::unique_ptr<LinOp> conj_transpose() const override;
376
383 void transpose(ptr_param<Dense> output) const;
384
392
398 void fill(const ValueType value);
399
414 std::unique_ptr<Dense> permute(
415 ptr_param<const Permutation<int32>> permutation,
417
421 std::unique_ptr<Dense> permute(
422 ptr_param<const Permutation<int64>> permutation,
424
430 void permute(ptr_param<const Permutation<int32>> permutation,
431 ptr_param<Dense> output, permute_mode mode) const;
432
437 void permute(ptr_param<const Permutation<int64>> permutation,
438 ptr_param<Dense> output, permute_mode mode) const;
439
453 std::unique_ptr<Dense> permute(
454 ptr_param<const Permutation<int32>> row_permutation,
455 ptr_param<const Permutation<int32>> column_permutation,
456 bool invert = false) const;
457
462 std::unique_ptr<Dense> permute(
463 ptr_param<const Permutation<int64>> row_permutation,
464 ptr_param<const Permutation<int64>> column_permutation,
465 bool invert = false) const;
466
473 void permute(ptr_param<const Permutation<int32>> row_permutation,
474 ptr_param<const Permutation<int32>> column_permutation,
475 ptr_param<Dense> output, bool invert = false) const;
476
481 void permute(ptr_param<const Permutation<int64>> row_permutation,
482 ptr_param<const Permutation<int64>> column_permutation,
483 ptr_param<Dense> output, bool invert = false) const;
484
494 std::unique_ptr<Dense> scale_permute(
497
502 std::unique_ptr<Dense> scale_permute(
505
514 ptr_param<Dense> output, permute_mode mode) const;
515
522 ptr_param<Dense> output, permute_mode mode) const;
523
536 std::unique_ptr<Dense> scale_permute(
537 ptr_param<const ScaledPermutation<value_type, int32>> row_permutation,
539 column_permutation,
540 bool invert = false) const;
541
546 std::unique_ptr<Dense> scale_permute(
547 ptr_param<const ScaledPermutation<value_type, int64>> row_permutation,
549 column_permutation,
550 bool invert = false) const;
551
559 ptr_param<const ScaledPermutation<value_type, int32>> row_permutation,
561 column_permutation,
562 ptr_param<Dense> output, bool invert = false) const;
563
570 ptr_param<const ScaledPermutation<value_type, int64>> row_permutation,
572 column_permutation,
573 ptr_param<Dense> output, bool invert = false) const;
574
575 std::unique_ptr<LinOp> permute(
576 const array<int32>* permutation_indices) const override;
577
578 std::unique_ptr<LinOp> permute(
579 const array<int64>* permutation_indices) const override;
580
590 void permute(const array<int32>* permutation_indices,
591 ptr_param<Dense> output) const;
592
596 void permute(const array<int64>* permutation_indices,
597 ptr_param<Dense> output) const;
598
599 std::unique_ptr<LinOp> inverse_permute(
600 const array<int32>* permutation_indices) const override;
601
602 std::unique_ptr<LinOp> inverse_permute(
603 const array<int64>* permutation_indices) const override;
604
615 void inverse_permute(const array<int32>* permutation_indices,
616 ptr_param<Dense> output) const;
617
621 void inverse_permute(const array<int64>* permutation_indices,
622 ptr_param<Dense> output) const;
623
624 std::unique_ptr<LinOp> row_permute(
625 const array<int32>* permutation_indices) const override;
626
627 std::unique_ptr<LinOp> row_permute(
628 const array<int64>* permutation_indices) const override;
629
639 void row_permute(const array<int32>* permutation_indices,
640 ptr_param<Dense> output) const;
641
645 void row_permute(const array<int64>* permutation_indices,
646 ptr_param<Dense> output) const;
647
658 std::unique_ptr<Dense> row_gather(const array<int32>* gather_indices) const;
659
663 std::unique_ptr<Dense> row_gather(const array<int64>* gather_indices) const;
664
677 void row_gather(const array<int32>* gather_indices,
678 ptr_param<LinOp> row_collection) const;
679
683 void row_gather(const array<int64>* gather_indices,
684 ptr_param<LinOp> row_collection) const;
685
700 const array<int32>* gather_indices,
702 ptr_param<LinOp> row_collection) const;
703
709 const array<int64>* gather_indices,
711 ptr_param<LinOp> row_collection) const;
712
713 std::unique_ptr<LinOp> column_permute(
714 const array<int32>* permutation_indices) const override;
715
716 std::unique_ptr<LinOp> column_permute(
717 const array<int64>* permutation_indices) const override;
718
728 void column_permute(const array<int32>* permutation_indices,
729 ptr_param<Dense> output) const;
730
734 void column_permute(const array<int64>* permutation_indices,
735 ptr_param<Dense> output) const;
736
737 std::unique_ptr<LinOp> inverse_row_permute(
738 const array<int32>* permutation_indices) const override;
739
740 std::unique_ptr<LinOp> inverse_row_permute(
741 const array<int64>* permutation_indices) const override;
742
752 void inverse_row_permute(const array<int32>* permutation_indices,
753 ptr_param<Dense> output) const;
754
758 void inverse_row_permute(const array<int64>* permutation_indices,
759 ptr_param<Dense> output) const;
760
761 std::unique_ptr<LinOp> inverse_column_permute(
762 const array<int32>* permutation_indices) const override;
763
764 std::unique_ptr<LinOp> inverse_column_permute(
765 const array<int64>* permutation_indices) const override;
766
776 void inverse_column_permute(const array<int32>* permutation_indices,
777 ptr_param<Dense> output) const;
778
782 void inverse_column_permute(const array<int64>* permutation_indices,
783 ptr_param<Dense> output) const;
784
785 std::unique_ptr<Diagonal<ValueType>> extract_diagonal() const override;
786
795
796 std::unique_ptr<absolute_type> compute_absolute() const override;
797
806
808
813 std::unique_ptr<complex_type> make_complex() const;
814
821
826 std::unique_ptr<real_type> get_real() const;
827
831 void get_real(ptr_param<real_type> result) const;
832
837 std::unique_ptr<real_type> get_imag() const;
838
843 void get_imag(ptr_param<real_type> result) const;
844
850 value_type* get_values() noexcept { return values_.get_data(); }
851
859 const value_type* get_const_values() const noexcept
860 {
861 return values_.get_const_data();
862 }
863
869 size_type get_stride() const noexcept { return stride_; }
870
877 {
878 return values_.get_size();
879 }
880
891 value_type& at(size_type row, size_type col) noexcept
892 {
893 return values_.get_data()[linearize_index(row, col)];
894 }
895
899 value_type at(size_type row, size_type col) const noexcept
900 {
901 return values_.get_const_data()[linearize_index(row, col)];
902 }
903
918 ValueType& at(size_type idx) noexcept
919 {
920 return values_.get_data()[linearize_index(idx)];
921 }
922
926 ValueType at(size_type idx) const noexcept
927 {
928 return values_.get_const_data()[linearize_index(idx)];
929 }
930
941
952
964
976
986
999 array<char>& tmp) const;
1000
1010 ptr_param<LinOp> result) const;
1011
1024 array<char>& tmp) const;
1025
1034
1046
1055
1067
1077
1090
1098 void compute_mean(ptr_param<LinOp> result) const;
1099
1111
1122 std::unique_ptr<Dense> create_submatrix(const span& rows,
1123 const span& columns,
1124 const size_type stride)
1125 {
1126 return this->create_submatrix_impl(rows, columns, stride);
1127 }
1128
1135 std::unique_ptr<Dense> create_submatrix(const span& rows,
1136 const span& columns)
1137 {
1138 return create_submatrix(rows, columns, this->get_stride());
1139 }
1140
1148 std::unique_ptr<real_type> create_real_view();
1149
1153 std::unique_ptr<const real_type> create_real_view() const;
1154
1167 static std::unique_ptr<Dense> create(std::shared_ptr<const Executor> exec,
1168 const dim<2>& size = {},
1169 size_type stride = 0);
1170
1187 static std::unique_ptr<Dense> create(std::shared_ptr<const Executor> exec,
1188 const dim<2>& size,
1189 array<value_type> values,
1190 size_type stride);
1191
1196 template <typename InputValueType>
1197 GKO_DEPRECATED(
1198 "explicitly construct the gko::array argument instead of passing an"
1199 "initializer list")
1200 static std::unique_ptr<Dense> create(
1201 std::shared_ptr<const Executor> exec, const dim<2>& size,
1202 std::initializer_list<InputValueType> values, size_type stride)
1203 {
1204 return create(exec, size, array<value_type>{exec, std::move(values)},
1205 stride);
1206 }
1207
1219 static std::unique_ptr<const Dense> create_const(
1220 std::shared_ptr<const Executor> exec, const dim<2>& size,
1221 gko::detail::const_array_view<ValueType>&& values, size_type stride);
1222
1229
1236
1241 Dense(const Dense&);
1242
1248
1249protected:
1250 Dense(std::shared_ptr<const Executor> exec, const dim<2>& size = {},
1251 size_type stride = 0);
1252
1253 Dense(std::shared_ptr<const Executor> exec, const dim<2>& size,
1254 array<value_type> values, size_type stride);
1255
1262 virtual std::unique_ptr<Dense> create_with_same_config() const
1263 {
1264 return Dense::create(this->get_executor(), this->get_size(),
1265 this->get_stride());
1266 }
1267
1275 virtual std::unique_ptr<Dense> create_with_type_of_impl(
1276 std::shared_ptr<const Executor> exec, const dim<2>& size,
1277 size_type stride) const
1278 {
1279 return Dense::create(exec, size, stride);
1280 }
1281
1288 virtual std::unique_ptr<Dense> create_view_of_impl()
1289 {
1290 auto exec = this->get_executor();
1291 return Dense::create(
1292 exec, this->get_size(),
1294 this->get_values()),
1295 this->get_stride());
1296 }
1297
1304 virtual std::unique_ptr<const Dense> create_const_view_of_impl() const
1305 {
1306 auto exec = this->get_executor();
1307 return Dense::create_const(
1308 exec, this->get_size(),
1310 this->get_const_values()),
1311 this->get_stride());
1312 }
1313
1314 template <typename IndexType>
1315 void convert_impl(Coo<ValueType, IndexType>* result) const;
1316
1317 template <typename IndexType>
1318 void convert_impl(Csr<ValueType, IndexType>* result) const;
1319
1320 template <typename IndexType>
1321 void convert_impl(Ell<ValueType, IndexType>* result) const;
1322
1323 template <typename IndexType>
1324 void convert_impl(Fbcsr<ValueType, IndexType>* result) const;
1325
1326 template <typename IndexType>
1327 void convert_impl(Hybrid<ValueType, IndexType>* result) const;
1328
1329 template <typename IndexType>
1330 void convert_impl(Sellp<ValueType, IndexType>* result) const;
1331
1332 template <typename IndexType>
1333 void convert_impl(SparsityCsr<ValueType, IndexType>* result) const;
1334
1341 virtual void scale_impl(const LinOp* alpha);
1342
1349 virtual void inv_scale_impl(const LinOp* alpha);
1350
1357 virtual void add_scaled_impl(const LinOp* alpha, const LinOp* b);
1358
1365 virtual void sub_scaled_impl(const LinOp* alpha, const LinOp* b);
1366
1373 virtual void compute_dot_impl(const LinOp* b, LinOp* result) const;
1374
1381 virtual void compute_conj_dot_impl(const LinOp* b, LinOp* result) const;
1382
1389 virtual void compute_norm2_impl(LinOp* result) const;
1390
1397 virtual void compute_norm1_impl(LinOp* result) const;
1398
1405 virtual void compute_squared_norm2_impl(LinOp* result) const;
1406
1410 virtual void compute_mean_impl(LinOp* result) const;
1411
1420 void resize(gko::dim<2> new_size);
1421
1429 virtual std::unique_ptr<Dense> create_submatrix_impl(
1430 const span& rows, const span& columns, const size_type stride);
1431
1432 void apply_impl(const LinOp* b, LinOp* x) const override;
1433
1434 void apply_impl(const LinOp* alpha, const LinOp* b, const LinOp* beta,
1435 LinOp* x) const override;
1436
1437 size_type linearize_index(size_type row, size_type col) const noexcept
1438 {
1439 return row * stride_ + col;
1440 }
1441
1442 size_type linearize_index(size_type idx) const noexcept
1443 {
1444 return linearize_index(idx / this->get_size()[1],
1445 idx % this->get_size()[1]);
1446 }
1447
1448 template <typename IndexType>
1449 void permute_impl(const Permutation<IndexType>* permutation,
1450 permute_mode mode, Dense* output) const;
1451
1452 template <typename IndexType>
1453 void permute_impl(const Permutation<IndexType>* row_permutation,
1454 const Permutation<IndexType>* col_permutation,
1455 bool invert, Dense* output) const;
1456
1457 template <typename IndexType>
1458 void scale_permute_impl(
1459 const ScaledPermutation<ValueType, IndexType>* permutation,
1460 permute_mode mode, Dense* output) const;
1461
1462 template <typename IndexType>
1463 void scale_permute_impl(
1464 const ScaledPermutation<ValueType, IndexType>* row_permutation,
1465 const ScaledPermutation<ValueType, IndexType>* column_permutation,
1466 bool invert, Dense* output) const;
1467
1468 template <typename OutputType, typename IndexType>
1469 void row_gather_impl(const array<IndexType>* row_idxs,
1470 Dense<OutputType>* row_collection) const;
1471
1472 template <typename OutputType, typename IndexType>
1473 void row_gather_impl(const Dense<ValueType>* alpha,
1474 const array<IndexType>* row_idxs,
1475 const Dense<ValueType>* beta,
1476 Dense<OutputType>* row_collection) const;
1477
1478private:
1479 size_type stride_;
1480 array<value_type> values_;
1481
1482 void add_scaled_identity_impl(const LinOp* a, const LinOp* b) override;
1483};
1484
1485
1486} // namespace matrix
1487
1488
1489namespace detail {
1490
1491
1492template <typename ValueType>
1493struct temporary_clone_helper<matrix::Dense<ValueType>> {
1494 static std::unique_ptr<matrix::Dense<ValueType>> create(
1495 std::shared_ptr<const Executor> exec, matrix::Dense<ValueType>* ptr,
1496 bool copy_data)
1497 {
1498 if (copy_data) {
1499 return gko::clone(std::move(exec), ptr);
1500 } else {
1501 return matrix::Dense<ValueType>::create(exec, ptr->get_size());
1502 }
1503 }
1504};
1505
1506
1507} // namespace detail
1508
1509
1517template <typename VecPtr>
1518std::unique_ptr<matrix::Dense<typename detail::pointee<VecPtr>::value_type>>
1519make_dense_view(VecPtr&& vector)
1520{
1521 using value_type = typename detail::pointee<VecPtr>::value_type;
1523}
1524
1525
1533template <typename VecPtr>
1534std::unique_ptr<
1535 const matrix::Dense<typename detail::pointee<VecPtr>::value_type>>
1537{
1538 using value_type = typename detail::pointee<VecPtr>::value_type;
1540}
1541
1542
1563template <typename Matrix, typename... TArgs>
1564std::unique_ptr<Matrix> initialize(
1565 size_type stride, std::initializer_list<typename Matrix::value_type> vals,
1566 std::shared_ptr<const Executor> exec, TArgs&&... create_args)
1567{
1569 size_type num_rows = vals.size();
1570 auto tmp = dense::create(exec->get_master(), dim<2>{num_rows, 1}, stride);
1571 size_type idx = 0;
1572 for (const auto& elem : vals) {
1573 tmp->at(idx) = elem;
1574 ++idx;
1575 }
1576 auto mtx = Matrix::create(exec, std::forward<TArgs>(create_args)...);
1577 tmp->move_to(mtx);
1578 return mtx;
1579}
1580
1601template <typename Matrix, typename... TArgs>
1602std::unique_ptr<Matrix> initialize(
1603 std::initializer_list<typename Matrix::value_type> vals,
1604 std::shared_ptr<const Executor> exec, TArgs&&... create_args)
1605{
1606 return initialize<Matrix>(1, vals, std::move(exec),
1607 std::forward<TArgs>(create_args)...);
1608}
1609
1610
1631template <typename Matrix, typename... TArgs>
1632std::unique_ptr<Matrix> initialize(
1633 size_type stride,
1634 std::initializer_list<std::initializer_list<typename Matrix::value_type>>
1635 vals,
1636 std::shared_ptr<const Executor> exec, TArgs&&... create_args)
1637{
1639 size_type num_rows = vals.size();
1640 size_type num_cols = num_rows > 0 ? begin(vals)->size() : 1;
1641 auto tmp =
1642 dense::create(exec->get_master(), dim<2>{num_rows, num_cols}, stride);
1643 size_type ridx = 0;
1644 for (const auto& row : vals) {
1645 size_type cidx = 0;
1646 for (const auto& elem : row) {
1647 tmp->at(ridx, cidx) = elem;
1648 ++cidx;
1649 }
1650 ++ridx;
1651 }
1652 auto mtx = Matrix::create(exec, std::forward<TArgs>(create_args)...);
1653 tmp->move_to(mtx);
1654 return mtx;
1655}
1656
1657
1679template <typename Matrix, typename... TArgs>
1680std::unique_ptr<Matrix> initialize(
1681 std::initializer_list<std::initializer_list<typename Matrix::value_type>>
1682 vals,
1683 std::shared_ptr<const Executor> exec, TArgs&&... create_args)
1684{
1685 return initialize<Matrix>(vals.size() > 0 ? begin(vals)->size() : 0, vals,
1686 std::move(exec),
1687 std::forward<TArgs>(create_args)...);
1688}
1689
1690
1691} // namespace gko
1692
1693
1694#endif // GKO_PUBLIC_CORE_MATRIX_DENSE_HPP_
Definition polymorphic_object.hpp:479
Definition lin_op.hpp:742
Definition lin_op.hpp:793
Definition lin_op.hpp:878
Definition polymorphic_object.hpp:668
Definition executor.hpp:615
Definition lin_op.hpp:117
Definition lin_op.hpp:484
std::shared_ptr< const Executor > get_executor() const noexcept
Definition polymorphic_object.hpp:243
Definition lin_op.hpp:605
Definition lin_op.hpp:817
Definition lin_op.hpp:433
Definition lin_op.hpp:660
Definition array.hpp:166
value_type * get_data() noexcept
Definition array.hpp:673
const value_type * get_const_data() const noexcept
Definition array.hpp:682
size_type get_size() const noexcept
Definition array.hpp:656
Definition device_matrix_data.hpp:36
Definition coo.hpp:61
Definition csr.hpp:123
Definition dense.hpp:116
std::unique_ptr< Dense > scale_permute(ptr_param< const ScaledPermutation< value_type, int64 > > row_permutation, ptr_param< const ScaledPermutation< value_type, int64 > > column_permutation, bool invert=false) const
value_type & at(size_type row, size_type col) noexcept
Definition dense.hpp:891
void compute_norm1(ptr_param< LinOp > result) const
void compute_absolute(ptr_param< absolute_type > output) const
virtual void scale_impl(const LinOp *alpha)
void compute_norm2(ptr_param< LinOp > result, array< char > &tmp) const
std::unique_ptr< LinOp > row_permute(const array< int64 > *permutation_indices) const override
static std::unique_ptr< Dense > create_with_config_of(ptr_param< const Dense > other)
Definition dense.hpp:192
std::unique_ptr< Dense > permute(ptr_param< const Permutation< int64 > > row_permutation, ptr_param< const Permutation< int64 > > column_permutation, bool invert=false) const
Dense & operator=(const Dense &)
void get_imag(ptr_param< real_type > result) const
void row_permute(const array< int32 > *permutation_indices, ptr_param< Dense > output) const
void get_real(ptr_param< real_type > result) const
virtual std::unique_ptr< Dense > create_with_same_config() const
Definition dense.hpp:1262
std::unique_ptr< LinOp > column_permute(const array< int64 > *permutation_indices) const override
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:247
void compute_dot(ptr_param< const LinOp > b, ptr_param< LinOp > result) const
void sub_scaled(ptr_param< const LinOp > alpha, ptr_param< const LinOp > b)
std::unique_ptr< Dense > permute(ptr_param< const Permutation< int64 > > permutation, permute_mode mode=permute_mode::symmetric) const
std::unique_ptr< LinOp > permute(const array< int64 > *permutation_indices) const override
ValueType at(size_type idx) const noexcept
Definition dense.hpp:926
std::unique_ptr< Dense > row_gather(const array< int64 > *gather_indices) const
std::unique_ptr< LinOp > inverse_permute(const array< int64 > *permutation_indices) const override
virtual void add_scaled_impl(const LinOp *alpha, const LinOp *b)
std::unique_ptr< Dense > permute(ptr_param< const Permutation< int32 > > row_permutation, ptr_param< const Permutation< int32 > > column_permutation, bool invert=false) const
void row_gather(const array< int32 > *gather_indices, ptr_param< LinOp > row_collection) const
void column_permute(const array< int32 > *permutation_indices, ptr_param< Dense > output) const
std::unique_ptr< LinOp > inverse_row_permute(const array< int32 > *permutation_indices) const override
Dense(const Dense &)
std::unique_ptr< Dense > permute(ptr_param< const Permutation< int32 > > permutation, permute_mode mode=permute_mode::symmetric) const
void inverse_permute(const array< int64 > *permutation_indices, ptr_param< Dense > output) const
virtual void sub_scaled_impl(const LinOp *alpha, const LinOp *b)
void compute_squared_norm2(ptr_param< LinOp > result, array< char > &tmp) const
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 >{})
Definition dense.hpp:213
virtual std::unique_ptr< Dense > create_view_of_impl()
Definition dense.hpp:1288
void permute(const array< int64 > *permutation_indices, ptr_param< Dense > output) const
void scale(ptr_param< const LinOp > alpha)
std::unique_ptr< LinOp > inverse_column_permute(const array< int32 > *permutation_indices) const override
void conj_transpose(ptr_param< Dense > output) const
std::unique_ptr< Dense > create_submatrix(const span &rows, const span &columns)
Definition dense.hpp:1135
void row_permute(const array< int64 > *permutation_indices, ptr_param< Dense > output) const
std::unique_ptr< LinOp > permute(const array< int32 > *permutation_indices) const override
std::unique_ptr< Dense > create_submatrix(const span &rows, const span &columns, const size_type stride)
Definition dense.hpp:1122
virtual std::unique_ptr< const Dense > create_const_view_of_impl() const
Definition dense.hpp:1304
void compute_squared_norm2(ptr_param< LinOp > result) const
std::unique_ptr< LinOp > row_permute(const array< int32 > *permutation_indices) const override
void permute(ptr_param< const Permutation< int64 > > permutation, ptr_param< Dense > output, permute_mode mode) const
void inverse_permute(const array< int32 > *permutation_indices, ptr_param< Dense > output) const
std::unique_ptr< Dense > row_gather(const array< int32 > *gather_indices) const
void extract_diagonal(ptr_param< Diagonal< ValueType > > output) const
void make_complex(ptr_param< complex_type > result) const
std::unique_ptr< absolute_type > compute_absolute() const override
void scale_permute(ptr_param< const ScaledPermutation< value_type, int32 > > row_permutation, ptr_param< const ScaledPermutation< value_type, int32 > > column_permutation, ptr_param< Dense > output, bool invert=false) const
void permute(ptr_param< const Permutation< int32 > > permutation, ptr_param< Dense > output, permute_mode mode) const
void row_gather(ptr_param< const LinOp > alpha, const array< int32 > *gather_indices, ptr_param< const LinOp > beta, ptr_param< LinOp > row_collection) const
const value_type * get_const_values() const noexcept
Definition dense.hpp:859
size_type get_num_stored_elements() const noexcept
Definition dense.hpp:876
void compute_mean(ptr_param< LinOp > result, array< char > &tmp) const
ValueType & at(size_type idx) noexcept
Definition dense.hpp:918
std::unique_ptr< Dense > scale_permute(ptr_param< const ScaledPermutation< value_type, int32 > > row_permutation, ptr_param< const ScaledPermutation< value_type, int32 > > column_permutation, bool invert=false) const
void scale_permute(ptr_param< const ScaledPermutation< value_type, int64 > > row_permutation, ptr_param< const ScaledPermutation< value_type, int64 > > column_permutation, ptr_param< Dense > output, bool invert=false) const
void compute_conj_dot(ptr_param< const LinOp > b, ptr_param< LinOp > result, array< char > &tmp) const
void compute_mean(ptr_param< LinOp > result) const
static std::unique_ptr< Dense > create(std::shared_ptr< const Executor > exec, const dim< 2 > &size, array< value_type > values, size_type stride)
size_type get_stride() const noexcept
Definition dense.hpp:869
std::unique_ptr< LinOp > inverse_permute(const array< int32 > *permutation_indices) const override
void permute(const array< int32 > *permutation_indices, ptr_param< Dense > output) const
virtual void compute_mean_impl(LinOp *result) const
void scale_permute(ptr_param< const ScaledPermutation< value_type, int64 > > permutation, ptr_param< Dense > output, permute_mode mode) const
void inverse_row_permute(const array< int32 > *permutation_indices, ptr_param< Dense > output) const
void inverse_column_permute(const array< int32 > *permutation_indices, ptr_param< Dense > output) const
void add_scaled(ptr_param< const LinOp > alpha, ptr_param< const LinOp > b)
std::unique_ptr< LinOp > inverse_column_permute(const array< int64 > *permutation_indices) const override
static std::unique_ptr< Dense > create_view_of(ptr_param< Dense > other)
Definition dense.hpp:263
void permute(ptr_param< const Permutation< int32 > > row_permutation, ptr_param< const Permutation< int32 > > column_permutation, ptr_param< Dense > output, bool invert=false) const
void compute_norm1(ptr_param< LinOp > result, array< char > &tmp) const
std::unique_ptr< LinOp > inverse_row_permute(const array< int64 > *permutation_indices) const override
std::unique_ptr< Dense > scale_permute(ptr_param< const ScaledPermutation< value_type, int32 > > permutation, permute_mode mode=permute_mode::symmetric) const
void transpose(ptr_param< Dense > output) const
void compute_conj_dot(ptr_param< const LinOp > b, ptr_param< LinOp > result) const
void resize(gko::dim< 2 > new_size)
std::unique_ptr< real_type > get_real() const
std::unique_ptr< Dense > scale_permute(ptr_param< const ScaledPermutation< value_type, int64 > > permutation, permute_mode mode=permute_mode::symmetric) const
static std::unique_ptr< const Dense > create_const_view_of(ptr_param< const Dense > other)
Definition dense.hpp:275
virtual void compute_squared_norm2_impl(LinOp *result) const
virtual void compute_norm1_impl(LinOp *result) const
std::unique_ptr< LinOp > conj_transpose() const override
std::unique_ptr< LinOp > column_permute(const array< int32 > *permutation_indices) const override
std::unique_ptr< LinOp > transpose() const override
void scale_permute(ptr_param< const ScaledPermutation< value_type, int32 > > permutation, ptr_param< Dense > output, permute_mode mode) const
void compute_absolute_inplace() override
std::unique_ptr< complex_type > make_complex() const
std::unique_ptr< const real_type > create_real_view() const
virtual void compute_dot_impl(const LinOp *b, LinOp *result) const
virtual std::unique_ptr< Dense > create_submatrix_impl(const span &rows, const span &columns, const size_type stride)
virtual void inv_scale_impl(const LinOp *alpha)
void column_permute(const array< int64 > *permutation_indices, ptr_param< Dense > output) const
void inverse_row_permute(const array< int64 > *permutation_indices, ptr_param< Dense > output) const
value_type at(size_type row, size_type col) const noexcept
Definition dense.hpp:899
static std::unique_ptr< Dense > create(std::shared_ptr< const Executor > exec, const dim< 2 > &size={}, size_type stride=0)
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)
void permute(ptr_param< const Permutation< int64 > > row_permutation, ptr_param< const Permutation< int64 > > column_permutation, ptr_param< Dense > output, bool invert=false) const
void inv_scale(ptr_param< const LinOp > alpha)
Dense & operator=(Dense &&)
value_type * get_values() noexcept
Definition dense.hpp:850
void inverse_column_permute(const array< int64 > *permutation_indices, ptr_param< Dense > output) const
void compute_norm2(ptr_param< LinOp > result) const
virtual std::unique_ptr< Dense > create_with_type_of_impl(std::shared_ptr< const Executor > exec, const dim< 2 > &size, size_type stride) const
Definition dense.hpp:1275
void row_gather(const array< int64 > *gather_indices, ptr_param< LinOp > row_collection) const
virtual void compute_conj_dot_impl(const LinOp *b, LinOp *result) const
std::unique_ptr< real_type > get_imag() const
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:229
std::unique_ptr< real_type > create_real_view()
std::unique_ptr< Diagonal< ValueType > > extract_diagonal() const override
virtual void compute_norm2_impl(LinOp *result) const
void fill(const ValueType value)
void compute_dot(ptr_param< const LinOp > b, ptr_param< LinOp > result, array< char > &tmp) const
void row_gather(ptr_param< const LinOp > alpha, const array< int64 > *gather_indices, ptr_param< const LinOp > beta, ptr_param< LinOp > row_collection) const
Definition diagonal.hpp:52
Definition ell.hpp:63
Fixed-block compressed sparse row storage matrix format.
Definition fbcsr.hpp:112
Definition hybrid.hpp:54
Definition permutation.hpp:111
Definition scaled_permutation.hpp:37
Definition sellp.hpp:54
Definition sparsity_csr.hpp:55
Definition utils_helper.hpp:41
Definition range.hpp:297
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)
Definition dense.hpp:1564
permute_mode
Definition permutation.hpp:42
The Ginkgo namespace.
Definition abstract_factory.hpp:20
std::int32_t int32
Definition types.hpp:106
std::unique_ptr< const matrix::Dense< typename detail::pointee< VecPtr >::value_type > > make_const_dense_view(VecPtr &&vector)
Definition dense.hpp:1536
detail::const_array_view< ValueType > make_const_array_view(std::shared_ptr< const Executor > exec, size_type size, const ValueType *data)
Definition array.hpp:806
typename detail::next_precision_impl< T >::type next_precision
Definition math.hpp:438
std::int64_t int64
Definition types.hpp:112
std::unique_ptr< matrix::Dense< typename detail::pointee< VecPtr >::value_type > > make_dense_view(VecPtr &&vector)
Definition dense.hpp:1519
std::size_t size_type
Definition types.hpp:89
array< ValueType > make_array_view(std::shared_ptr< const Executor > exec, size_type size, ValueType *data)
Definition array.hpp:787
detail::cloned_type< Pointer > clone(const Pointer &p)
Definition utils_helper.hpp:173
typename detail::to_complex_s< T >::type to_complex
Definition math.hpp:279
typename detail::remove_complex_s< T >::type remove_complex
Definition math.hpp:260
STL namespace.
Definition dim.hpp:26
Definition matrix_data.hpp:126
Definition range.hpp:46