Ginkgo  Generated from pipelines/2837190956 branch based on develop. Ginkgo version 2.0.0
A numerical linear algebra library targeting many-core architectures
criterion.hpp
1 // SPDX-FileCopyrightText: 2017 - 2026 The Ginkgo authors
2 //
3 // SPDX-License-Identifier: BSD-3-Clause
4 
5 #ifndef GKO_PUBLIC_CORE_STOP_CRITERION_HPP_
6 #define GKO_PUBLIC_CORE_STOP_CRITERION_HPP_
7 
8 
9 #include <ginkgo/core/base/abstract_factory.hpp>
10 #include <ginkgo/core/base/array.hpp>
11 #include <ginkgo/core/base/executor.hpp>
12 #include <ginkgo/core/base/lin_op.hpp>
13 #include <ginkgo/core/base/polymorphic_object.hpp>
14 #include <ginkgo/core/base/utils.hpp>
15 #include <ginkgo/core/log/logger.hpp>
16 #include <ginkgo/core/stop/stopping_status.hpp>
17 
18 
19 namespace gko {
25 namespace stop {
26 
27 
36 class Criterion : public PolymorphicObject {
37 public:
59  class Updater {
60  friend class Criterion;
61 
62  public:
68  Updater(const Updater&) = delete;
69  Updater(Updater&&) = delete;
70  Updater& operator=(const Updater&) = delete;
71  Updater& operator=(Updater&&) = delete;
72 
77  bool check(uint8 stopping_id, bool set_finalized,
78  array<stopping_status>* stop_status, bool* one_changed) const
79  {
80  auto converged = parent_->check(stopping_id, set_finalized,
81  stop_status, one_changed, *this);
82  return converged;
83  }
84 
88 #define GKO_UPDATER_REGISTER_PARAMETER(_type, _name) \
89  const Updater& _name(_type const& value) const \
90  { \
91  _name##_ = value; \
92  return *this; \
93  } \
94  mutable _type _name##_ {}
95 #define GKO_UPDATER_REGISTER_PTR_PARAMETER(_type, _name) \
96  const Updater& _name(ptr_param<_type> value) const \
97  { \
98  _name##_ = value.get(); \
99  return *this; \
100  } \
101  mutable _type* _name##_ {}
102 
103  GKO_UPDATER_REGISTER_PARAMETER(size_type, num_iterations);
104  // ignore_residual_check default is false
105  GKO_UPDATER_REGISTER_PARAMETER(bool, ignore_residual_check);
106  GKO_UPDATER_REGISTER_PTR_PARAMETER(const LinOp, residual);
107  GKO_UPDATER_REGISTER_PTR_PARAMETER(const LinOp, residual_norm);
108  GKO_UPDATER_REGISTER_PTR_PARAMETER(const LinOp,
109  implicit_sq_residual_norm);
110  GKO_UPDATER_REGISTER_PTR_PARAMETER(const LinOp, solution);
111 
112 #undef GKO_UPDATER_REGISTER_PTR_PARAMETER
113 #undef GKO_UPDATER_REGISTER_PARAMETER
114 
115  private:
116  Updater(Criterion* parent) : parent_{parent} {}
117 
118  Criterion* parent_;
119  };
120 
126  Updater update() { return {this}; }
127 
141  bool check(uint8 stopping_id, bool set_finalized,
142  array<stopping_status>* stop_status, bool* one_changed,
143  const Updater& updater)
144  {
145  this->template log<log::Logger::criterion_check_started>(
146  this, updater.num_iterations_, updater.residual_,
147  updater.residual_norm_, updater.solution_, stopping_id,
148  set_finalized);
149  auto all_converged = this->check_impl(
150  stopping_id, set_finalized, stop_status, one_changed, updater);
151  this->template log<log::Logger::criterion_check_completed>(
152  this, updater.num_iterations_, updater.residual_,
153  updater.residual_norm_, updater.implicit_sq_residual_norm_,
154  updater.solution_, stopping_id, set_finalized, stop_status,
155  *one_changed, all_converged);
156  return all_converged;
157  }
158 
159 protected:
176  virtual bool check_impl(uint8 stopping_id, bool set_finalized,
177  array<stopping_status>* stop_status,
178  bool* one_changed, const Updater& updater) = 0;
179 
190  void set_all_statuses(uint8 stopping_id, bool set_finalized,
191  array<stopping_status>* stop_status);
192 
193  explicit Criterion(std::shared_ptr<const gko::Executor> exec)
194  : PolymorphicObject(exec)
195  {}
196 };
197 
198 
210  std::shared_ptr<const LinOp> system_matrix;
211  std::shared_ptr<const LinOp> b;
212  const LinOp* x;
213  const LinOp* initial_residual;
214 
215 
216  CriterionArgs(std::shared_ptr<const LinOp> system_matrix,
217  std::shared_ptr<const LinOp> b, const LinOp* x,
218  const LinOp* initial_residual = nullptr)
219  : system_matrix{system_matrix},
220  b{b},
221  x{x},
222  initial_residual{initial_residual}
223  {}
224 };
225 
226 
231 
232 
248 template <typename ConcreteFactory, typename ConcreteCriterion,
249  typename ParametersType, typename PolymorphicBase = CriterionFactory>
251  EnableDefaultFactory<ConcreteFactory, ConcreteCriterion, ParametersType,
252  PolymorphicBase>;
253 
254 
279 #define GKO_ENABLE_CRITERION_FACTORY(_criterion, _parameters_name, \
280  _factory_name) \
281 public: \
282  const _parameters_name##_type& get_##_parameters_name() const \
283  { \
284  return _parameters_name##_; \
285  } \
286  \
287  class _factory_name \
288  : public ::gko::stop::EnableDefaultCriterionFactory< \
289  _factory_name, _criterion, _parameters_name##_type> { \
290  friend class ::gko::enable_parameters_type<_parameters_name##_type, \
291  _factory_name>; \
292  explicit _factory_name(std::shared_ptr<const ::gko::Executor> exec) \
293  : ::gko::stop::EnableDefaultCriterionFactory< \
294  _factory_name, _criterion, _parameters_name##_type>( \
295  std::move(exec)) \
296  {} \
297  explicit _factory_name(std::shared_ptr<const ::gko::Executor> exec, \
298  const _parameters_name##_type& parameters) \
299  : ::gko::stop::EnableDefaultCriterionFactory< \
300  _factory_name, _criterion, _parameters_name##_type>( \
301  std::move(exec), parameters) \
302  {} \
303  }; \
304  friend ::gko::stop::EnableDefaultCriterionFactory< \
305  _factory_name, _criterion, _parameters_name##_type>; \
306  \
307 private: \
308  _parameters_name##_type _parameters_name##_; \
309  \
310 public: \
311  static_assert(true, \
312  "This assert is used to counter the false positive extra " \
313  "semi-colon warnings")
314 
315 
316 } // namespace stop
317 } // namespace gko
318 
319 
320 #endif // GKO_PUBLIC_CORE_STOP_CRITERION_HPP_
gko::stop::CriterionArgs
This struct is used to pass parameters to the EnableDefaultCriterionFactoryCriterionFactory::generate...
Definition: criterion.hpp:209
gko::stop::Criterion::Updater::check
bool check(uint8 stopping_id, bool set_finalized, array< stopping_status > *stop_status, bool *one_changed) const
Calls the parent Criterion object's check method.
Definition: criterion.hpp:77
gko::uint8
std::uint8_t uint8
8-bit unsigned integral type.
Definition: types.hpp:130
gko::LinOp
Definition: lin_op.hpp:117
gko::AbstractFactory
The AbstractFactory is a generic interface template that enables easy implementation of the abstract ...
Definition: abstract_factory.hpp:77
gko::PolymorphicObject
A PolymorphicObject is the abstract base for all "heavy" objects in Ginkgo that behave polymorphicall...
Definition: polymorphic_object.hpp:46
gko::stop::Criterion::update
Updater update()
Returns the updater object.
Definition: criterion.hpp:126
gko::size_type
std::size_t size_type
Integral type used for allocation quantities.
Definition: types.hpp:101
gko::EnableDefaultFactory
This mixin provides a default implementation of a concrete factory.
Definition: abstract_factory.hpp:154
gko::stop::Criterion::Updater::Updater
Updater(const Updater &)=delete
Prevent copying and moving the object This is to enforce the use of argument passing and calling chec...
gko
The Ginkgo namespace.
Definition: abstract_factory.hpp:19
gko::stop::Criterion::check
bool check(uint8 stopping_id, bool set_finalized, array< stopping_status > *stop_status, bool *one_changed, const Updater &updater)
This checks whether convergence was reached for a certain criterion.
Definition: criterion.hpp:141
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::stop::Criterion
The Criterion class is a base class for all stopping criteria.
Definition: criterion.hpp:36
gko::stop::Criterion::Updater
The Updater class serves for convenient argument passing to the Criterion's check function.
Definition: criterion.hpp:59