OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
TestRandom.cpp
Go to the documentation of this file.
1
37#include <gtest/gtest.h>
38#include <algorithm>
39#include <cmath>
40#include <numeric>
41#include <vector>
42#include "Utilities/Random.h"
43
44class RandomTest : public ::testing::Test {
45protected:
46 void SetUp() override {
48 rng->seed(12345); // Fixed seed for reproducibility
49 }
50
51 void TearDown() override { gsl_rng_free(rng); }
52
54};
55
56TEST_F(RandomTest, UniformDistribution) {
57 std::vector<double> samples(1000);
58 for (size_t i = 0; i < samples.size(); ++i) {
59 samples[i] = gsl_rng_uniform(rng);
60 }
61
62 // Check bounds
63 for (double val : samples) {
64 EXPECT_GE(val, 0.0);
65 EXPECT_LT(val, 1.0);
66 }
67
68 // Check mean (should be around 0.5)
69 double mean = std::accumulate(samples.begin(), samples.end(), 0.0) / samples.size();
70 EXPECT_NEAR(mean, 0.5, 0.1);
71}
72
73TEST_F(RandomTest, GaussianDistribution) {
74 double sigma = 2.0;
75 std::vector<double> samples(10000);
76 for (size_t i = 0; i < samples.size(); ++i) {
77 samples[i] = gsl_ran_gaussian(rng, sigma);
78 }
79
80 // Check mean (should be around 0)
81 double mean = std::accumulate(samples.begin(), samples.end(), 0.0) / samples.size();
82 EXPECT_NEAR(mean, 0.0, 0.1);
83
84 // Check variance (should be around sigma^2)
85 double variance = 0.0;
86 for (double val : samples) {
87 variance += val * val;
88 }
89 variance /= samples.size();
90 EXPECT_NEAR(variance, sigma * sigma, 0.5);
91}
92
93TEST_F(RandomTest, SeedReproducibility) {
96
97 rng1->seed(42);
98 rng2->seed(42);
99
100 // Generate same sequence
101 for (int i = 0; i < 100; ++i) {
102 double val1 = gsl_rng_uniform(rng1);
103 double val2 = gsl_rng_uniform(rng2);
104 EXPECT_DOUBLE_EQ(val1, val2);
105 }
106
107 gsl_rng_free(rng1);
108 gsl_rng_free(rng2);
109}
110
111TEST_F(RandomTest, DifferentSeedsDifferentSequences) {
114
115 rng1->seed(100);
116 rng2->seed(200);
117
118 // Generate sequences - should be different
119 bool different = false;
120 for (int i = 0; i < 100; ++i) {
121 double val1 = gsl_rng_uniform(rng1);
122 double val2 = gsl_rng_uniform(rng2);
123 if (std::abs(val1 - val2) > 1e-10) {
124 different = true;
125 break;
126 }
127 }
128 EXPECT_TRUE(different);
129
130 gsl_rng_free(rng1);
131 gsl_rng_free(rng2);
132}
133
134TEST_F(RandomTest, GaussianStatistics) {
135 double sigma = 1.0;
136 int n_samples = 100000;
137 std::vector<double> samples(n_samples);
138
139 for (int i = 0; i < n_samples; ++i) {
140 samples[i] = gsl_ran_gaussian(rng, sigma);
141 }
142
143 // Calculate mean
144 double mean = std::accumulate(samples.begin(), samples.end(), 0.0) / n_samples;
145
146 // Calculate standard deviation
147 double variance = 0.0;
148 for (double val : samples) {
149 double diff = val - mean;
150 variance += diff * diff;
151 }
152 variance /= n_samples;
153 double std_dev = std::sqrt(variance);
154
155 EXPECT_NEAR(mean, 0.0, 0.01);
156 EXPECT_NEAR(std_dev, sigma, 0.01);
157}
double gsl_rng_uniform(gsl_rng *rng)
Definition Random.h:64
#define gsl_rng_default
Definition Random.h:73
void gsl_rng_free(gsl_rng *rng)
Definition Random.h:62
double gsl_ran_gaussian(gsl_rng *rng, double sigma)
Definition Random.h:66
gsl_rng * gsl_rng_alloc(const gsl_rng_type *)
Definition Random.h:60
TEST_F(RandomTest, UniformDistribution)
void SetUp() override
gsl_rng * rng
void TearDown() override
void seed(unsigned long seed)
Definition Random.h:37