|
16 | 16 | * |
17 | 17 | *=========================================================================*/ |
18 | 18 |
|
| 19 | +#ifndef ITK_FUTURE_LEGACY_REMOVE |
| 20 | +# define ITK_LEGACY_SILENT |
| 21 | +#endif |
| 22 | + |
19 | 23 | // First include the header file to be tested: |
20 | 24 | #include "itkMersenneTwisterRandomVariateGenerator.h" |
21 | | -#include <gtest/gtest.h> |
| 25 | +#include "itkGTest.h" |
| 26 | +#include "itkMath.h" |
22 | 27 | #include <random> // For mt19937. |
23 | 28 |
|
24 | 29 | // The class to be tested. |
@@ -100,3 +105,78 @@ TEST(MersenneTwisterRandomVariateGenerator, ResetNextSeed) |
100 | 105 | MersenneTwisterRandomVariateGenerator::ResetNextSeed(); |
101 | 106 | EXPECT_EQ(MersenneTwisterRandomVariateGenerator::GetNextSeed(), seed); |
102 | 107 | } |
| 108 | + |
| 109 | + |
| 110 | +TEST(MersenneTwisterRandomVariateGenerator, BasicObjectMethods) |
| 111 | +{ |
| 112 | + auto twister = MersenneTwisterRandomVariateGenerator::New(); |
| 113 | + ITK_GTEST_EXERCISE_BASIC_OBJECT_METHODS(twister, MersenneTwisterRandomVariateGenerator, RandomVariateGeneratorBase); |
| 114 | +} |
| 115 | + |
| 116 | + |
| 117 | +TEST(MersenneTwisterRandomVariateGenerator, SingletonSeedAndKnownSequence) |
| 118 | +{ |
| 119 | + using Twister = MersenneTwisterRandomVariateGenerator; |
| 120 | + constexpr Twister::IntegerType seed{ 1234 }; |
| 121 | + |
| 122 | + Twister::GetInstance()->SetSeed(seed); |
| 123 | + EXPECT_EQ(Twister::GetInstance()->GetSeed(), seed); |
| 124 | + |
| 125 | + auto twister = Twister::New(); |
| 126 | + |
| 127 | + // New instance gets seed = singleton's seed + 1 |
| 128 | + EXPECT_EQ(Twister::GetInstance()->GetSeed() + 1, twister->GetSeed()); |
| 129 | + |
| 130 | + // Sync seeds and verify same sequence |
| 131 | + twister->SetSeed(Twister::GetInstance()->GetSeed()); |
| 132 | + for (int i = 0; i < 200; ++i) |
| 133 | + { |
| 134 | + EXPECT_EQ(Twister::GetInstance()->GetIntegerVariate(), twister->GetIntegerVariate()); |
| 135 | + } |
| 136 | + |
| 137 | + // Check known sequence of values |
| 138 | + constexpr Twister::IntegerType expected[5]{ static_cast<Twister::IntegerType>(3294740812u), |
| 139 | + static_cast<Twister::IntegerType>(4175194053u), |
| 140 | + static_cast<Twister::IntegerType>(3041332341u), |
| 141 | + static_cast<Twister::IntegerType>(199851601u), |
| 142 | + static_cast<Twister::IntegerType>(3422518480u) }; |
| 143 | + for (const auto i : expected) |
| 144 | + { |
| 145 | + EXPECT_EQ(twister->GetIntegerVariate(), i); |
| 146 | + } |
| 147 | +} |
| 148 | + |
| 149 | + |
| 150 | +TEST(MersenneTwisterRandomVariateGenerator, NormalVariateStatistics) |
| 151 | +{ |
| 152 | + auto twister = MersenneTwisterRandomVariateGenerator::New(); |
| 153 | + |
| 154 | + double sum = 0.0; |
| 155 | + double sum2 = 0.0; |
| 156 | + constexpr int count{ 500000 }; |
| 157 | + for (int i = 0; i < count; ++i) |
| 158 | + { |
| 159 | + const double v = twister->GetNormalVariate(); |
| 160 | + sum += v; |
| 161 | + sum2 += v * v; |
| 162 | + } |
| 163 | + const double mean = sum / static_cast<double>(count); |
| 164 | + const double variance = sum2 / static_cast<double>(count) - mean * mean; |
| 165 | + EXPECT_NEAR(mean, 0.0, 0.01); |
| 166 | + EXPECT_NEAR(variance, 1.0, 0.01); |
| 167 | +} |
| 168 | + |
| 169 | + |
| 170 | +#ifndef ITK_FUTURE_LEGACY_REMOVE |
| 171 | +TEST(MersenneTwisterRandomVariateGenerator, LegacyInitializeEqualSetSeed) |
| 172 | +{ |
| 173 | + auto twister = MersenneTwisterRandomVariateGenerator::New(); |
| 174 | + |
| 175 | + twister->Initialize(); |
| 176 | + twister->SetSeed(1234); |
| 177 | + const MersenneTwisterRandomVariateGenerator::IntegerType withSetSeed = twister->GetIntegerVariate(); |
| 178 | + twister->Initialize(1234); |
| 179 | + const MersenneTwisterRandomVariateGenerator::IntegerType withInitialize = twister->GetIntegerVariate(); |
| 180 | + EXPECT_EQ(withSetSeed, withInitialize); |
| 181 | +} |
| 182 | +#endif |
0 commit comments