Ginkgo  Generated from pipelines/1330831941 branch based on master. Ginkgo version 1.8.0
A numerical linear algebra library targeting many-core architectures
composition.hpp
1 // SPDX-FileCopyrightText: 2017 - 2024 The Ginkgo authors
2 //
3 // SPDX-License-Identifier: BSD-3-Clause
4 
5 #ifndef GKO_PUBLIC_CORE_BASE_COMPOSITION_HPP_
6 #define GKO_PUBLIC_CORE_BASE_COMPOSITION_HPP_
7 
8 
9 #include <vector>
10 
11 
12 #include <ginkgo/core/base/executor.hpp>
13 #include <ginkgo/core/base/lin_op.hpp>
14 
15 
16 namespace gko {
17 
18 
38 template <typename ValueType = default_precision>
39 class Composition : public EnableLinOp<Composition<ValueType>>,
40  public EnableCreateMethod<Composition<ValueType>>,
41  public Transposable {
43  friend class EnableCreateMethod<Composition>;
44 
45 public:
46  using value_type = ValueType;
48 
54  const std::vector<std::shared_ptr<const LinOp>>& get_operators()
55  const noexcept
56  {
57  return operators_;
58  }
59 
60  std::unique_ptr<LinOp> transpose() const override;
61 
62  std::unique_ptr<LinOp> conj_transpose() const override;
63 
69 
77 
82  Composition(const Composition&);
83 
90 
91 protected:
92  void add_operators() {}
93 
94  template <typename... Rest>
95  void add_operators(std::shared_ptr<const LinOp> oper, Rest&&... rest)
96  {
97  if (!operators_.empty()) {
98  GKO_ASSERT_CONFORMANT(this, oper);
99  }
100  auto exec = this->get_executor();
101  operators_.push_back(std::move(oper));
102  if (operators_.back()->get_executor() != exec) {
103  operators_.back() = gko::clone(exec, operators_.back());
104  }
105  this->set_size(dim<2>{operators_.front()->get_size()[0],
106  operators_.back()->get_size()[1]});
107  add_operators(std::forward<Rest>(rest)...);
108  }
109 
115  explicit Composition(std::shared_ptr<const Executor> exec)
116  : EnableLinOp<Composition>(exec), storage_{exec}
117  {}
118 
128  template <typename Iterator,
129  typename = xstd::void_t<
130  typename std::iterator_traits<Iterator>::iterator_category>>
131  explicit Composition(Iterator begin, Iterator end)
132  : EnableLinOp<Composition>([&] {
133  if (begin == end) {
134  throw OutOfBoundsError(__FILE__, __LINE__, 1, 0);
135  }
136  return (*begin)->get_executor();
137  }()),
138  storage_{this->get_executor()}
139  {
140  for (auto it = begin; it != end; ++it) {
141  add_operators(*it);
142  }
143  }
144 
153  template <typename... Rest>
154  explicit Composition(std::shared_ptr<const LinOp> oper, Rest&&... rest)
155  : Composition(oper->get_executor())
156  {
157  add_operators(std::move(oper), std::forward<Rest>(rest)...);
158  }
159 
160  void apply_impl(const LinOp* b, LinOp* x) const override;
161 
162  void apply_impl(const LinOp* alpha, const LinOp* b, const LinOp* beta,
163  LinOp* x) const override;
164 
165 private:
166  std::vector<std::shared_ptr<const LinOp>> operators_;
167  mutable array<ValueType> storage_;
168 };
169 
170 
177 template <typename ValueType = default_precision>
179 public:
180  using value_type = ValueType;
186  std::shared_ptr<Composition<ValueType>> get_composition() const
187  {
188  return composition_;
189  }
190 
203  std::shared_ptr<const LinOp> get_operator_at(size_type index) const
204  {
205  if (composition_ == nullptr) {
206  return nullptr;
207  } else {
208  return composition_->get_operators().at(index);
209  }
210  }
211 
212 protected:
216  template <typename... LinOp>
217  void set_composition(LinOp&&... linop)
218  {
219  composition_ =
220  Composition<ValueType>::create(std::forward<LinOp>(linop)...);
221  }
222 
223 private:
224  std::shared_ptr<Composition<ValueType>> composition_;
225 };
226 
227 
228 } // namespace gko
229 
230 
231 #endif // GKO_PUBLIC_CORE_BASE_COMPOSITION_HPP_
gko::Composition::operator=
Composition & operator=(const Composition &)
Copy-assigns a Composition.
gko::UseComposition
The UseComposition class can be used to store the composition information in LinOp.
Definition: composition.hpp:178
gko::LinOp
Definition: lin_op.hpp:118
gko::EnableCreateMethod
This mixin implements a static create() method on ConcreteType that dynamically allocates the memory,...
Definition: polymorphic_object.hpp:748
gko::Transposable
Linear operators which support transposition should implement the Transposable interface.
Definition: lin_op.hpp:434
gko::size_type
std::size_t size_type
Integral type used for allocation quantities.
Definition: types.hpp:108
gko::UseComposition::get_composition
std::shared_ptr< Composition< ValueType > > get_composition() const
Returns the composition operators.
Definition: composition.hpp:186
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:175
gko
The Ginkgo namespace.
Definition: abstract_factory.hpp:20
gko::Composition
The Composition class can be used to compose linear operators op1, op2, ..., opn and obtain the opera...
Definition: composition.hpp:39
gko::Composition::Composition
Composition(const Composition &)
Copy-constructs a Composition.
gko::Composition::get_operators
const std::vector< std::shared_ptr< const LinOp > > & get_operators() const noexcept
Returns a list of operators of the composition.
Definition: composition.hpp:54
gko::UseComposition::get_operator_at
std::shared_ptr< const LinOp > get_operator_at(size_type index) const
Returns the operator at index-th position of composition.
Definition: composition.hpp:203
gko::Composition::conj_transpose
std::unique_ptr< LinOp > conj_transpose() const override
Returns a LinOp representing the conjugate transpose of the Transposable object.
gko::PolymorphicObject::get_executor
std::shared_ptr< const Executor > get_executor() const noexcept
Returns the Executor of the object.
Definition: polymorphic_object.hpp:235
gko::EnableLinOp
The EnableLinOp mixin can be used to provide sensible default implementations of the majority of the ...
Definition: lin_op.hpp:878
gko::Composition::transpose
std::unique_ptr< LinOp > transpose() const override
Returns a LinOp representing the transpose of the Transposable object.
gko::LinOp::LinOp
LinOp(const LinOp &)=default
Copy-constructs a LinOp.
gko::EnablePolymorphicObject
This mixin inherits from (a subclass of) PolymorphicObject and provides a base implementation of a ne...
Definition: polymorphic_object.hpp:662