diff --git a/core/test/config/config.cpp b/core/test/config/config.cpp index a791667b8e2..03acceabeef 100644 --- a/core/test/config/config.cpp +++ b/core/test/config/config.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "core/config/config_helper.hpp" @@ -130,6 +131,60 @@ TEST_F(Config, GenerateObjectWithCustomBuild) } +TEST_F(Config, GenerateCriteriaFromMinimalConfig) +{ + auto reg = registry(); + reg.emplace("precond", this->mtx); + pnode minimal_stop{{ + {"iteration", pnode{10}}, + {"relative_implicit_residual_norm", pnode{0.01}}, + {"relative_residual_norm", pnode{0.01}}, + {"time", pnode{100}}, + }}; + + pnode p{{{"criteria", minimal_stop}}}; + auto obj = std::dynamic_pointer_cast::Factory>( + parse(p, reg, type_descriptor{"float32", "void"}) + .on(this->exec)); + + ASSERT_NE(obj, nullptr); + auto criteria = obj->get_parameters().criteria; + ASSERT_EQ(criteria.size(), minimal_stop.get_map().size()); + { + SCOPED_TRACE("Iteration Criterion"); + auto it = + std::dynamic_pointer_cast( + criteria[0]); + ASSERT_NE(it, nullptr); + EXPECT_EQ(it->get_parameters().max_iters, 10); + } + { + SCOPED_TRACE("Implicit Residual Criterion"); + auto res = std::dynamic_pointer_cast< + const gko::stop::ImplicitResidualNorm::Factory>(criteria[1]); + ASSERT_NE(res, nullptr); + EXPECT_EQ(res->get_parameters().baseline, gko::stop::mode::rhs_norm); + EXPECT_EQ(res->get_parameters().reduction_factor, 0.01f); + } + { + SCOPED_TRACE("Residual Criterion"); + auto res = std::dynamic_pointer_cast< + const gko::stop::ResidualNorm::Factory>(criteria[2]); + ASSERT_NE(res, nullptr); + EXPECT_EQ(res->get_parameters().baseline, gko::stop::mode::rhs_norm); + EXPECT_EQ(res->get_parameters().reduction_factor, 0.01f); + } + { + SCOPED_TRACE("Time Criterion"); + using namespace std::chrono_literals; + auto time = std::dynamic_pointer_cast( + criteria[3]); + ASSERT_NE(time, nullptr); + EXPECT_EQ(time->get_parameters().time_limit, 100ns); + } +} + + TEST(GetValue, IndexType) { long long int value = 123;