From aecb90ec602030725db3921910f0ebe1456b90bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Mon, 26 Jul 2021 12:43:14 +0200 Subject: [PATCH] Add missing tests and simplify implementation --- src/utils/RandomEngine.cpp | 13 ++++------ tests/CMakeLists.txt | 1 + tests/mpi_test_main.cpp | 3 +++ tests/test_RandomEngine.cpp | 52 +++++++++++++++++++++++++++++++++++++ tests/test_main.cpp | 3 +++ 5 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 tests/test_RandomEngine.cpp diff --git a/src/utils/RandomEngine.cpp b/src/utils/RandomEngine.cpp index 508f77a39..9b7efc162 100644 --- a/src/utils/RandomEngine.cpp +++ b/src/utils/RandomEngine.cpp @@ -41,13 +41,7 @@ RandomEngine::destroy() RandomEngine::RandomEngine() { - uint64_t random_seed = std::random_device{}(); - parallel::broadcast(random_seed, 0); - - m_random_engine = std::default_random_engine(random_seed); - - std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow - << random_seed << rang::style::reset << '\n'; + this->resetRandomSeed(); } void @@ -62,5 +56,8 @@ RandomEngine::setRandomSeed(const uint64_t random_seed) void RandomEngine::resetRandomSeed() { - m_instance = std::unique_ptr<RandomEngine>(new RandomEngine); + uint64_t random_seed = std::random_device{}(); + parallel::broadcast(random_seed, 0); + + this->setRandomSeed(random_seed); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7904eedc0..e112df5a6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -113,6 +113,7 @@ add_executable (mpi_unit_tests test_ItemValueUtils.cpp test_Messenger.cpp test_Partitioner.cpp + test_RandomEngine.cpp test_SubItemValuePerItem.cpp test_SubItemArrayPerItem.cpp ) diff --git a/tests/mpi_test_main.cpp b/tests/mpi_test_main.cpp index 51a01b0cf..4c9463417 100644 --- a/tests/mpi_test_main.cpp +++ b/tests/mpi_test_main.cpp @@ -9,6 +9,7 @@ #include <mesh/SynchronizerManager.hpp> #include <utils/Messenger.hpp> #include <utils/PETScWrapper.hpp> +#include <utils/RandomEngine.hpp> #include <utils/pugs_config.hpp> #include <MeshDataBaseForTests.hpp> @@ -57,6 +58,7 @@ main(int argc, char* argv[]) std::cout.setstate(std::ios::badbit); SynchronizerManager::create(); + RandomEngine::create(); MeshDataManager::create(); DiamondDualConnectivityManager::create(); DiamondDualMeshManager::create(); @@ -89,6 +91,7 @@ main(int argc, char* argv[]) DiamondDualMeshManager::destroy(); DiamondDualConnectivityManager::destroy(); MeshDataManager::destroy(); + RandomEngine::destroy(); SynchronizerManager::destroy(); } } diff --git a/tests/test_RandomEngine.cpp b/tests/test_RandomEngine.cpp new file mode 100644 index 000000000..241b40dbe --- /dev/null +++ b/tests/test_RandomEngine.cpp @@ -0,0 +1,52 @@ +#include <catch2/catch_test_macros.hpp> +#include <catch2/matchers/catch_matchers_all.hpp> + +#include <utils/Messenger.hpp> +#include <utils/RandomEngine.hpp> + +#include <utils/pugs_config.hpp> + +// clazy:excludeall=non-pod-global-static + +TEST_CASE("RandomEngine", "[random]") +{ + SECTION("current state") + { + RandomEngine& random_engine = RandomEngine::instance(); + REQUIRE(isSynchronized(random_engine)); + } + + SECTION("set seed") + { + RandomEngine& random_engine = RandomEngine::instance(); + random_engine.setRandomSeed(1402339680); + + REQUIRE(isSynchronized(random_engine)); + + REQUIRE(random_engine.getCurrentSeed() == 1402339680); + } + + SECTION("reset seed") + { + RandomEngine& random_engine = RandomEngine::instance(); + random_engine.resetRandomSeed(); + + REQUIRE(isSynchronized(random_engine)); + } + + SECTION("de-synchronize seeds") + { + RandomEngine& random_engine = RandomEngine::instance(); + random_engine.resetRandomSeed(); + auto& engine = random_engine.engine(); + + for (size_t i = 0; i < parallel::rank(); ++i) { + engine(); + } + + REQUIRE(((parallel::size() == 1) or not isSynchronized(random_engine))); + + random_engine.resetRandomSeed(); + REQUIRE(isSynchronized(random_engine)); + } +} diff --git a/tests/test_main.cpp b/tests/test_main.cpp index b5316614d..9c03ba921 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -9,6 +9,7 @@ #include <mesh/SynchronizerManager.hpp> #include <utils/Messenger.hpp> #include <utils/PETScWrapper.hpp> +#include <utils/RandomEngine.hpp> #include <utils/SLEPcWrapper.hpp> #include <MeshDataBaseForTests.hpp> @@ -34,6 +35,7 @@ main(int argc, char* argv[]) std::cout.setstate(std::ios::badbit); SynchronizerManager::create(); + RandomEngine::create(); MeshDataManager::create(); DiamondDualConnectivityManager::create(); DiamondDualMeshManager::create(); @@ -51,6 +53,7 @@ main(int argc, char* argv[]) DiamondDualMeshManager::destroy(); DiamondDualConnectivityManager::destroy(); MeshDataManager::destroy(); + RandomEngine::destroy(); SynchronizerManager::destroy(); } } -- GitLab