diff --git a/src/utils/RandomEngine.cpp b/src/utils/RandomEngine.cpp index 508f77a39123492376a5141662f4b3daa41476f9..9b7efc162c4d2d7b0ff912689b9f718eae39af5b 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 7904eedc03c7a203667e5c604096a5cded6e136b..e112df5a6cff9d7a7a83696017e16dd79ddfb136 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 51a01b0cfa99b36995b8849fc1fdb94360d971ad..4c94634173799a17519b5d417bfc914a99e2e740 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 0000000000000000000000000000000000000000..241b40dbe958b68ccf631fce2291affca9e1e29c --- /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 b5316614d10c21cbe13bb5540cc0a13d7e4b4b24..9c03ba9213ece8947688036ca7d5554c8e38a279 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(); } }