5 #ifndef GKO_PUBLIC_CORE_STOP_RESIDUAL_NORM_HPP_
6 #define GKO_PUBLIC_CORE_STOP_RESIDUAL_NORM_HPP_
11 #include <ginkgo/core/base/array.hpp>
12 #include <ginkgo/core/base/math.hpp>
13 #include <ginkgo/core/base/types.hpp>
14 #include <ginkgo/core/base/utils.hpp>
15 #include <ginkgo/core/matrix/dense.hpp>
16 #include <ginkgo/core/stop/criterion.hpp>
37 enum class mode { absolute, initial_resnorm, rhs_norm };
49 template <
typename ValueType>
54 GKO_ASSERT_SUPPORTED_VALUE_TYPE;
61 bool check_impl(
uint8 stoppingId,
bool setFinalized,
67 device_storage_{exec, 2}
72 absolute_type reduction_factor,
mode baseline);
75 std::unique_ptr<NormVector> starting_tau_{};
76 std::unique_ptr<NormVector> u_dense_tau_{};
81 mode baseline_{mode::rhs_norm};
82 std::shared_ptr<const LinOp> system_matrix_{};
83 std::shared_ptr<const LinOp> b_{};
85 std::shared_ptr<const Vector> one_{};
86 std::shared_ptr<const Vector> neg_one_{};
112 template <
typename ValueType = default_precision>
125 5 * std ::numeric_limits<remove_complex<ValueType>>::epsilon()};
129 this->reduction_factor = value;
143 explicit ResidualNorm(std::shared_ptr<const gko::Executor> exec)
149 factory->get_executor(), args,
150 factory->get_parameters().reduction_factor,
151 factory->get_parameters().baseline),
152 parameters_{factory->get_parameters()}
174 template <
typename ValueType = default_precision>
187 5 * std ::numeric_limits<remove_complex<ValueType>>::epsilon()};
191 this->reduction_factor = value;
208 bool check_impl(
uint8 stoppingId,
bool setFinalized,
219 factory->get_executor(), args,
220 factory->get_parameters().reduction_factor,
221 factory->get_parameters().baseline),
222 parameters_{factory->get_parameters()}
230 GKO_BEGIN_DISABLE_DEPRECATION_WARNINGS
252 template <
typename ValueType = default_precision>
253 class GKO_DEPRECATED(
254 "Please use the class
ResidualNorm with the factory parameter baseline =
"
255 "mode::initial_resnorm
") ResidualNormReduction
256 : public ResidualNormBase<ValueType> {
258 using ComplexVector = matrix::Dense<to_complex<ValueType>>;
259 using NormVector = matrix::Dense<remove_complex<ValueType>>;
260 using Vector = matrix::Dense<ValueType>;
262 GKO_CREATE_FACTORY_PARAMETERS(parameters, Factory)
267 remove_complex<ValueType> reduction_factor{
268 5 * std ::numeric_limits<remove_complex<ValueType>>::epsilon()};
270 parameters_type& with_reduction_factor(remove_complex<ValueType> value)
272 this->reduction_factor = value;
276 GKO_ENABLE_CRITERION_FACTORY(ResidualNormReduction<ValueType>, parameters,
278 GKO_ENABLE_BUILD_METHOD(Factory);
281 explicit ResidualNormReduction(std::shared_ptr<const gko::Executor> exec)
282 : ResidualNormBase<ValueType>(exec)
285 explicit ResidualNormReduction(const Factory* factory,
286 const CriterionArgs& args)
287 : ResidualNormBase<ValueType>(
288 factory->get_executor(), args,
289 factory->get_parameters().reduction_factor,
290 mode::initial_resnorm),
291 parameters_{factory->get_parameters()}
314 template <typename ValueType = default_precision>
315 class GKO_DEPRECATED(
316 "Please use the
class ResidualNorm with the factory parameter baseline =
"
317 "mode::rhs_norm
") RelativeResidualNorm
318 : public ResidualNormBase<ValueType> {
320 using ComplexVector = matrix::Dense<to_complex<ValueType>>;
321 using NormVector = matrix::Dense<remove_complex<ValueType>>;
322 using Vector = matrix::Dense<ValueType>;
324 GKO_CREATE_FACTORY_PARAMETERS(parameters, Factory)
329 remove_complex<ValueType> tolerance{
330 5 * std ::numeric_limits<remove_complex<ValueType>>::epsilon()};
333 parameters_type& with_tolerance(remove_complex<ValueType> value)
335 this->tolerance = value;
339 GKO_ENABLE_CRITERION_FACTORY(RelativeResidualNorm<ValueType>, parameters,
341 GKO_ENABLE_BUILD_METHOD(Factory);
344 explicit RelativeResidualNorm(std::shared_ptr<const gko::Executor> exec)
345 : ResidualNormBase<ValueType>(exec)
348 explicit RelativeResidualNorm(const Factory* factory,
349 const CriterionArgs& args)
350 : ResidualNormBase<ValueType>(factory->get_executor(), args,
351 factory->get_parameters().tolerance,
353 parameters_{factory->get_parameters()}
375 template <typename ValueType = default_precision>
376 class GKO_DEPRECATED(
377 "Please use the
class ResidualNorm with the factory parameter baseline =
"
378 "mode::absolute
") AbsoluteResidualNorm
379 : public ResidualNormBase<ValueType> {
381 using NormVector = matrix::Dense<remove_complex<ValueType>>;
382 using Vector = matrix::Dense<ValueType>;
384 GKO_CREATE_FACTORY_PARAMETERS(parameters, Factory)
389 remove_complex<ValueType> tolerance{
390 5 * std ::numeric_limits<remove_complex<ValueType>>::epsilon()};
392 parameters_type& with_tolerance(remove_complex<ValueType> value)
394 this->tolerance = value;
398 GKO_ENABLE_CRITERION_FACTORY(AbsoluteResidualNorm<ValueType>, parameters,
400 GKO_ENABLE_BUILD_METHOD(Factory);
403 explicit AbsoluteResidualNorm(std::shared_ptr<const gko::Executor> exec)
404 : ResidualNormBase<ValueType>(exec)
407 explicit AbsoluteResidualNorm(const Factory* factory,
408 const CriterionArgs& args)
409 : ResidualNormBase<ValueType>(factory->get_executor(), args,
410 factory->get_parameters().tolerance,
412 parameters_{factory->get_parameters()}
417 GKO_END_DISABLE_DEPRECATION_WARNINGS
424 #endif // GKO_PUBLIC_CORE_STOP_RESIDUAL_NORM_HPP_