 |
Ginkgo
Generated from pipelines/2969282958 branch based on develop. Ginkgo version 2.0.0
A numerical linear algebra library targeting many-core architectures
|
5 #ifndef GKO_PUBLIC_CORE_BASE_LIN_OP_HPP_
6 #define GKO_PUBLIC_CORE_BASE_LIN_OP_HPP_
10 #include <type_traits>
13 #include <ginkgo/core/base/abstract_factory.hpp>
14 #include <ginkgo/core/base/device_matrix_data.hpp>
15 #include <ginkgo/core/base/dim.hpp>
16 #include <ginkgo/core/base/exception_helpers.hpp>
17 #include <ginkgo/core/base/math.hpp>
18 #include <ginkgo/core/base/matrix_assembly_data.hpp>
19 #include <ginkgo/core/base/matrix_data.hpp>
20 #include <ginkgo/core/base/polymorphic_object.hpp>
21 #include <ginkgo/core/base/types.hpp>
22 #include <ginkgo/core/base/utils.hpp>
23 #include <ginkgo/core/log/logger.hpp>
30 template <
typename ValueType>
129 this->
template log<log::Logger::linop_apply_started>(
this, b.
get(),
131 this->validate_application_parameters(b.
get(), x.
get());
135 this->
template log<log::Logger::linop_apply_completed>(
this, b.
get(),
151 this->
template log<log::Logger::linop_advanced_apply_started>(
153 this->validate_application_parameters(alpha.
get(), b.
get(), beta.
get(),
160 this->
template log<log::Logger::linop_advanced_apply_completed>(
190 if (
this != &other) {
191 PolymorphicObject::operator=(std::move(other));
192 this->set_size(other.get_size());
207 size_{std::exchange(other.size_,
dim<2>{})}
217 explicit LinOp(std::shared_ptr<const Executor> exec,
218 const dim<2>& size = dim<2>{})
219 : PolymorphicObject(exec), size_{size}
227 void set_size(
const dim<2>& value) noexcept { size_ = value; }
238 virtual void apply_impl(
const LinOp* b,
LinOp* x)
const = 0;
249 virtual void apply_impl(
const LinOp* alpha,
const LinOp* b,
259 void validate_application_parameters(
const LinOp* b,
const LinOp* x)
const
261 GKO_ASSERT_CONFORMANT(
this, b);
262 GKO_ASSERT_EQUAL_ROWS(
this, x);
263 GKO_ASSERT_EQUAL_COLS(b, x);
275 void validate_application_parameters(
const LinOp* alpha,
const LinOp* b,
277 const LinOp* x)
const
279 this->validate_application_parameters(b, x);
280 GKO_ASSERT_EQUAL_DIMENSIONS(alpha, dim<2>(1, 1));
281 GKO_ASSERT_EQUAL_DIMENSIONS(beta, dim<2>(1, 1));
346 using AbstractFactory::AbstractFactory;
348 std::unique_ptr<LinOp> generate(std::shared_ptr<const LinOp> input)
const
350 this->
template log<log::Logger::linop_factory_generate_started>(
352 const auto exec = this->get_executor();
353 std::unique_ptr<LinOp> generated;
354 if (input->get_executor() == exec) {
360 this->
template log<log::Logger::linop_factory_generate_completed>(
361 this, input.get(), generated.get());
390 virtual std::unique_ptr<ReuseData> create_empty_reuse_data()
const;
432 std::unique_ptr<LinOp> generate_reuse(std::shared_ptr<const LinOp> input,
447 virtual void check_reuse_consistent(
const LinOp* input,
462 virtual std::unique_ptr<LinOp> generate_reuse_impl(
463 std::shared_ptr<const LinOp> input,
ReuseData& reuse_data)
const;
501 virtual std::unique_ptr<LinOp>
transpose()
const = 0;
509 virtual std::unique_ptr<LinOp> conj_transpose()
const = 0;
542 template <
typename IndexType>
564 return as<Permutable>(this->row_permute(permutation_indices))
565 ->column_permute(permutation_indices);
585 return as<Permutable>(this->inverse_row_permute(permutation_indices))
586 ->inverse_column_permute(permutation_indices);
602 virtual std::unique_ptr<LinOp> row_permute(
619 virtual std::unique_ptr<LinOp> column_permute(
635 virtual std::unique_ptr<LinOp> inverse_row_permute(
652 virtual std::unique_ptr<LinOp> inverse_column_permute(
663 template <
typename ValueType,
typename IndexType>
666 using value_type = ValueType;
667 using index_type = IndexType;
706 this->
read(data.copy_to_host());
718 template <
typename ValueType,
typename IndexType>
721 using value_type = ValueType;
722 using index_type = IndexType;
745 this->
write(host_data);
769 return preconditioner_;
780 preconditioner_ = new_precond;
784 std::shared_ptr<const LinOp> preconditioner_{};
806 virtual std::unique_ptr<LinOp> extract_diagonal_linop()
const = 0;
817 template <
typename ValueType>
820 using value_type = ValueType;
824 std::unique_ptr<LinOp> extract_diagonal_linop()
const override;
831 virtual std::unique_ptr<matrix::Diagonal<ValueType>> extract_diagonal()
870 template <
typename AbsoluteLinOp>
873 using absolute_type = AbsoluteLinOp;
909 GKO_ASSERT_IS_SCALAR(a);
910 GKO_ASSERT_IS_SCALAR(b);
913 add_scaled_identity_impl(ae.get(), be.get());
917 virtual void add_scaled_identity_impl(
const LinOp* a,
const LinOp* b) = 0;
938 template <
typename ConcreteFactory,
typename ConcreteLinOp,
939 typename ParametersType,
typename PolymorphicBase = LinOpFactory>
941 EnableDefaultFactory<ConcreteFactory, ConcreteLinOp, ParametersType,
965 template <
typename ConcreteFactory,
typename ConcreteLinOp,
966 typename ParametersType,
typename ReuseDataType,
970 ParametersType, PolymorphicBase> {
973 ParametersType, PolymorphicBase>;
978 std::shared_ptr<const LinOp> input,
981 return std::unique_ptr<ConcreteLinOp>(static_cast<ConcreteLinOp*>(
986 std::unique_ptr<LinOpFactory::ReuseData> create_empty_reuse_data()
989 return std::make_unique<ReuseDataType>();
992 void check_reuse_consistent(
994 const LinOpFactory::ReuseData& reuse_data)
const override
996 ConcreteLinOp::check_reuse_consistent(
997 static_cast<const ConcreteFactory*>(
this), input,
998 *as<ReuseDataType>(&reuse_data));
1002 explicit EnableDefaultReusableLinOpFactory(
1003 std::shared_ptr<const Executor> exec,
1004 const ParametersType& parameters = {})
1005 : base_type(std::move(exec), parameters)
1008 std::unique_ptr<LinOp> generate_reuse_impl(
1009 std::shared_ptr<const LinOp> input,
1010 LinOpFactory::ReuseData& reuse_data)
const override
1012 return std::unique_ptr<LinOp>(
new ConcreteLinOp(
1013 static_cast<const ConcreteFactory*>(
this), std::move(input),
1014 *as<ReuseDataType>(&reuse_data)));
1094 #define GKO_ENABLE_LIN_OP_FACTORY(_lin_op, _parameters_name, _factory_name) \
1096 const _parameters_name##_type& get_##_parameters_name() const \
1098 return _parameters_name##_; \
1101 class _factory_name \
1102 : public ::gko::EnableDefaultLinOpFactory<_factory_name, _lin_op, \
1103 _parameters_name##_type> { \
1104 friend class ::gko::enable_parameters_type<_parameters_name##_type, \
1106 explicit _factory_name(std::shared_ptr<const ::gko::Executor> exec) \
1107 : ::gko::EnableDefaultLinOpFactory<_factory_name, _lin_op, \
1108 _parameters_name##_type>( \
1111 explicit _factory_name(std::shared_ptr<const ::gko::Executor> exec, \
1112 const _parameters_name##_type& parameters) \
1113 : ::gko::EnableDefaultLinOpFactory<_factory_name, _lin_op, \
1114 _parameters_name##_type>( \
1115 std::move(exec), parameters) \
1118 friend ::gko::EnableDefaultLinOpFactory<_factory_name, _lin_op, \
1119 _parameters_name##_type>; \
1123 _parameters_name##_type _parameters_name##_; \
1126 static_assert(true, \
1127 "This assert is used to counter the false positive extra " \
1128 "semi-colon warnings")
1167 #define GKO_ENABLE_LIN_OP_FACTORY_WITH_REUSE(_lin_op, _parameters_name, \
1168 _factory_name, _reuse_data_type) \
1170 const _parameters_name##_type& get_##_parameters_name() const \
1172 return _parameters_name##_; \
1175 class _factory_name : public ::gko::EnableDefaultReusableLinOpFactory< \
1176 _factory_name, _lin_op, _parameters_name##_type, \
1177 _reuse_data_type> { \
1178 friend class ::gko::enable_parameters_type<_parameters_name##_type, \
1180 explicit _factory_name(std::shared_ptr<const ::gko::Executor> exec) \
1181 : ::gko::EnableDefaultReusableLinOpFactory< \
1182 _factory_name, _lin_op, _parameters_name##_type, \
1183 _reuse_data_type>(std::move(exec)) \
1185 explicit _factory_name(std::shared_ptr<const ::gko::Executor> exec, \
1186 const _parameters_name##_type& parameters) \
1187 : ::gko::EnableDefaultReusableLinOpFactory< \
1188 _factory_name, _lin_op, _parameters_name##_type, \
1189 _reuse_data_type>(std::move(exec), parameters) \
1192 friend ::gko::EnableDefaultLinOpFactory<_factory_name, _lin_op, \
1193 _parameters_name##_type>; \
1194 friend ::gko::EnableDefaultReusableLinOpFactory< \
1195 _factory_name, _lin_op, _parameters_name##_type, _reuse_data_type>; \
1199 _parameters_name##_type _parameters_name##_; \
1202 static_assert(true, \
1203 "This assert is used to counter the false positive extra " \
1204 "semi-colon warnings")
1210 #endif // GKO_PUBLIC_CORE_BASE_LIN_OP_HPP_
host_type copy_to_host() const
Copies the device_matrix_data entries to the host to return a regular matrix_data object with the sam...
std::unique_ptr< MatrixType > read(StreamType &&is, MatrixArgs &&... args)
Reads a matrix stored in matrix market format from an input stream.
Definition: mtx_io.hpp:160
void add_scaled_identity(ptr_param< const LinOp > const a, ptr_param< const LinOp > const b)
Scales this and adds another scalar times the identity to it.
Definition: lin_op.hpp:906
Definition: lin_op.hpp:117
EnableDefaultLinOpFactory with LinOpFactory::generate_reuse() support, usually used through GKO_ENABL...
Definition: lin_op.hpp:968
A LinOp implementing this interface can be preconditioned.
Definition: lin_op.hpp:758
The AbstractFactory is a generic interface template that enables easy implementation of the abstract ...
Definition: abstract_factory.hpp:77
A PolymorphicObject is the abstract base for all "heavy" objects in Ginkgo that behave polymorphicall...
Definition: polymorphic_object.hpp:46
LinOp(LinOp &&other)
Move-constructs a LinOp.
Definition: lin_op.hpp:205
std::unique_ptr< abstract_product_type > generate(Args &&... args) const
Creates a new product from the given components.
Definition: abstract_factory.hpp:97
virtual std::unique_ptr< LinOp > permute(const array< IndexType > *permutation_indices) const
Returns a LinOp representing the symmetric row and column permutation of the Permutable object.
Definition: lin_op.hpp:561
std::shared_ptr< const Executor > get_executor() const
Returns the executor used to store the device_matrix_data entries.
Definition: device_matrix_data.hpp:151
Linear operators which support transposition should implement the Transposable interface.
Definition: lin_op.hpp:492
static device_matrix_data create_from_host(std::shared_ptr< const Executor > exec, const host_type &data)
Creates a device_matrix_data object from the given host data on the given executor.
The AbsoluteComputable is an interface that allows to get the component wise absolute of a LinOp.
Definition: lin_op.hpp:841
EnableDefaultFactory< ConcreteFactory, ConcreteLinOp, ParametersType, PolymorphicBase > EnableDefaultLinOpFactory
This is an alias for the EnableDefaultFactory mixin, which correctly sets the template parameters to ...
Definition: lin_op.hpp:942
T * get() const
Definition: utils_helper.hpp:77
virtual std::unique_ptr< LinOp > compute_absolute_linop() const =0
Gets the absolute LinOp.
This mixin provides a default implementation of a concrete factory.
Definition: abstract_factory.hpp:154
detail::cloned_type< Pointer > clone(const Pointer &p)
Creates a unique clone of the object pointed to by p.
Definition: utils_helper.hpp:425
void apply(ptr_param< const LinOp > b, ptr_param< LinOp > x) const
Applies a linear operator to a vector (or a sequence of vectors).
Definition: lin_op.hpp:127
Linear operators which support permutation should implement the Permutable interface.
Definition: lin_op.hpp:543
LinOp & operator=(LinOp &&other)
Move-assigns a LinOp.
Definition: lin_op.hpp:188
virtual std::shared_ptr< const LinOp > get_preconditioner() const
Returns the preconditioner operator used by the Preconditionable.
Definition: lin_op.hpp:767
The Ginkgo namespace.
Definition: abstract_factory.hpp:19
virtual void read(const device_matrix_data< ValueType, IndexType > &data)
Reads a matrix from a device_matrix_data structure.
Definition: lin_op.hpp:693
void read(const matrix_assembly_data< ValueType, IndexType > &data)
Reads a matrix from a matrix_assembly_data structure.
Definition: lin_op.hpp:683
This structure is used as an intermediate data type to store a sparse matrix.
Definition: matrix_data.hpp:126
virtual bool apply_uses_initial_guess() const
Returns true if the linear operator uses the data given in x as an initial guess.
Definition: lin_op.hpp:178
virtual std::unique_ptr< LinOp > inverse_permute(const array< IndexType > *permutation_indices) const
Returns a LinOp representing the symmetric inverse row and column permutation of the Permutable objec...
Definition: lin_op.hpp:582
This class is a utility which efficiently implements the diagonal matrix (a linear operator which sca...
Definition: lin_op.hpp:31
std::unique_ptr< ConcreteLinOp > generate_reuse(std::shared_ptr< const LinOp > input, LinOpFactory::ReuseData &reuse_data) const
LinOpFactory::generate_reuse(), returning the concrete LinOp type.
Definition: lin_op.hpp:977
matrix_data< ValueType, IndexType > get_ordered_data() const
Definition: matrix_assembly_data.hpp:142
virtual void set_preconditioner(std::shared_ptr< const LinOp > new_precond)
Sets the preconditioner operator used by the Preconditionable.
Definition: lin_op.hpp:778
This class is used for function parameters in the place of raw pointers.
Definition: utils_helper.hpp:43
void apply(ptr_param< const LinOp > alpha, ptr_param< const LinOp > b, ptr_param< const LinOp > beta, ptr_param< LinOp > x) const
Performs the operation x = alpha * op(b) + beta * x.
Definition: lin_op.hpp:148
std::unique_ptr< LinOp > generate_reuse(std::shared_ptr< const LinOp > input, ReuseData &reuse_data) const
Generates a LinOp like generate(), reusing what earlier calls recorded in reuse_data.
virtual void compute_absolute_inplace()=0
Compute absolute inplace on each element.
virtual void read(device_matrix_data< ValueType, IndexType > &&data)
Reads a matrix from a device_matrix_data structure.
Definition: lin_op.hpp:704
A LinOp implementing this interface can read its data from a matrix_data structure.
Definition: lin_op.hpp:664
A LinOp implementing this interface can write its data to a matrix_data structure.
Definition: lin_op.hpp:719
LinOp & operator=(const LinOp &)=default
Copy-assigns a LinOp.
void write(StreamType &&os, MatrixPtrType &&matrix, layout_type layout=detail::mtx_io_traits< std::remove_cv_t< detail::pointee< MatrixPtrType >>>::default_layout)
Writes a matrix into an output stream in matrix market format.
Definition: mtx_io.hpp:299
batch_dim< 2, DimensionType > transpose(const batch_dim< 2, DimensionType > &input)
Returns a batch_dim object with its dimensions swapped for batched operators.
Definition: batch_dim.hpp:118
Adds the operation M <- a I + b M for matrix M, identity operator I and scalars a and b,...
Definition: lin_op.hpp:895
This structure is used as an intermediate type to assemble a sparse matrix.
Definition: matrix_assembly_data.hpp:59
Opaque base for the data a factory records in generate_reuse() to speed up later generations.
Definition: lin_op.hpp:371
virtual void write(device_matrix_data< ValueType, IndexType > &data) const
Writes a matrix to a device_matrix_data structure.
Definition: lin_op.hpp:742
virtual std::unique_ptr< absolute_type > compute_absolute() const =0
Gets the AbsoluteLinOp.
detail::temporary_clone< detail::pointee< Ptr > > make_temporary_clone(std::shared_ptr< const Executor > exec, Ptr &&ptr)
Creates a temporary_clone.
Definition: temporary_clone.hpp:208
The EnableAbsoluteComputation mixin provides the default implementations of compute_absolute_linop an...
Definition: lin_op.hpp:871
A LinOpFactory represents a higher order mapping which transforms one linear operator into another.
Definition: lin_op.hpp:343
std::unique_ptr< LinOp > compute_absolute_linop() const override
Gets the absolute LinOp.
Definition: lin_op.hpp:877
std::shared_ptr< const Executor > get_executor() const noexcept
Returns the Executor of the object.
Definition: polymorphic_object.hpp:69
const dim< 2 > & get_size() const noexcept
Returns the size of the operator.
Definition: lin_op.hpp:169
This type is a device-side equivalent to matrix_data.
Definition: device_matrix_data.hpp:36
LinOp(const LinOp &)=default
Copy-constructs a LinOp.