|
16 | 16 | #include <ginkgo/core/stop/time.hpp> |
17 | 17 |
|
18 | 18 | #include "core/config/config_helper.hpp" |
| 19 | +#include "core/stop/iteration.hpp" |
19 | 20 | #include "core/test/utils.hpp" |
20 | 21 |
|
21 | 22 |
|
@@ -286,6 +287,68 @@ TEST_F(Config, GenerateCriteriaFromMinimalConfigWithValueType) |
286 | 287 | } |
287 | 288 |
|
288 | 289 |
|
| 290 | +TEST_F(Config, GenerateOneCriteriaFromMinimalConfigWithMinIters) |
| 291 | +{ |
| 292 | + auto reg = registry(); |
| 293 | + reg.emplace("precond", this->mtx); |
| 294 | + pnode minimal_stop{{{"iteration", pnode{5}}, {"min_iters", pnode{10}}}}; |
| 295 | + |
| 296 | + pnode p{{{"criteria", minimal_stop}}}; |
| 297 | + auto obj = std::dynamic_pointer_cast<gko::solver::Cg<float>::Factory>( |
| 298 | + parse<LinOpFactoryType::Cg>(p, reg, type_descriptor{"float32", "void"}) |
| 299 | + .on(this->exec)); |
| 300 | + |
| 301 | + ASSERT_NE(obj, nullptr); |
| 302 | + auto criteria = gko::as<gko::stop::MinIterationWrapper::Factory>( |
| 303 | + obj->get_parameters().criteria.at(0)); |
| 304 | + auto inner = gko::as<gko::stop::Iteration::Factory>( |
| 305 | + criteria->get_parameters().inner_criterion); |
| 306 | + ASSERT_EQ(criteria->get_parameters().min_iters, 10); |
| 307 | + ASSERT_EQ(inner->get_parameters().max_iters, 5); |
| 308 | +} |
| 309 | + |
| 310 | + |
| 311 | +TEST_F(Config, GenerateCriteriaFromMinimalConfigWithMinIters) |
| 312 | +{ |
| 313 | + auto reg = registry(); |
| 314 | + reg.emplace("precond", this->mtx); |
| 315 | + pnode minimal_stop{{{"iteration", pnode{5}}, |
| 316 | + {"time", pnode{100}}, |
| 317 | + {"min_iters", pnode{10}}}}; |
| 318 | + |
| 319 | + pnode p{{{"criteria", minimal_stop}}}; |
| 320 | + auto obj = std::dynamic_pointer_cast<gko::solver::Cg<float>::Factory>( |
| 321 | + parse<LinOpFactoryType::Cg>(p, reg, type_descriptor{"float32", "void"}) |
| 322 | + .on(this->exec)); |
| 323 | + |
| 324 | + ASSERT_NE(obj, nullptr); |
| 325 | + auto criteria = gko::as<gko::stop::MinIterationWrapper::Factory>( |
| 326 | + obj->get_parameters().criteria.at(0)); |
| 327 | + auto inner = gko::as<gko::stop::Combined::Factory>( |
| 328 | + criteria->get_parameters().inner_criterion); |
| 329 | + ASSERT_EQ(criteria->get_parameters().min_iters, 10); |
| 330 | + ASSERT_EQ(inner->get_parameters().criteria.size(), 2); |
| 331 | + if (auto inner1 = gko::as<gko::stop::Iteration::Factory>( |
| 332 | + inner->get_parameters().criteria.at(0))) { |
| 333 | + auto inner2 = gko::as<gko::stop::Time::Factory>( |
| 334 | + inner->get_parameters().criteria.at(1)); |
| 335 | + ASSERT_EQ(inner1->get_parameters().max_iters, 5); |
| 336 | + ASSERT_EQ(inner2->get_parameters().time_limit, |
| 337 | + std::chrono::nanoseconds(100)); |
| 338 | + } else if (auto inner1 = gko::as<gko::stop::Time::Factory>( |
| 339 | + inner->get_parameters().criteria.at(0))) { |
| 340 | + auto inner2 = gko::as<gko::stop::Iteration::Factory>( |
| 341 | + inner->get_parameters().criteria.at(1)); |
| 342 | + ASSERT_EQ(inner2->get_parameters().max_iters, 5); |
| 343 | + ASSERT_EQ(inner1->get_parameters().time_limit, |
| 344 | + std::chrono::nanoseconds(100)); |
| 345 | + } else { |
| 346 | + ASSERT_TRUE(false) |
| 347 | + << "the first criterion is not ResidualNorm or Time."; |
| 348 | + } |
| 349 | +} |
| 350 | + |
| 351 | + |
289 | 352 | TEST_F(Config, MinimalConfigThrowWhenKeyIsInvalid) |
290 | 353 | { |
291 | 354 | pnode minimal_stop{{{"time", pnode{100}}, {"invalid", pnode{"no"}}}}; |
|
0 commit comments