SST 12.1.0 Structural Simulation Toolkit
gaussian.h
1// Copyright 2009-2022 NTESS. Under the terms
2// of Contract DE-NA0003525 with NTESS, the U.S.
3// Government retains certain rights in this software.
4//
7//
8// This file is part of the SST software package. For license
9// information, see the LICENSE file in the top level directory of the
10// distribution.
11
12#ifndef SST_CORE_RNG_GAUSSIAN_H
13#define SST_CORE_RNG_GAUSSIAN_H
14
15#include "distrib.h"
16#include "math.h"
17#include "mersenne.h"
18#include "rng.h"
19
20using namespace SST::RNG;
21
22namespace SST {
23namespace RNG {
24
25/**
26 \class GaussianDistribution gaussian.h "sst/core/rng/gaussian.h"
27
28 Creates a Gaussian (normal) distribution for which to sample
29*/
31{
32
33public:
34 /**
35 Creates a new distribution with a predefined random number generator with a specified mean and standard
36 deviation. \param mn The mean of the Gaussian distribution \param sd The standard deviation of the Gaussian
37 distribution
38 */
39 GaussianDistribution(double mn, double sd) : RandomDistribution()
40 {
41
42 mean = mn;
43 stddev = sd;
44
46 unusedPair = 0;
47 usePair = false;
48 deleteDistrib = true;
49 }
50
51 /**
52 Creates a new distribution with a predefined random number generator with a specified mean and standard
53 deviation. \param mn The mean of the Gaussian distribution \param sd The standard deviation of the Gaussian
54 distribution \param baseRNG The random number generator as the base of the distribution
55 */
56 GaussianDistribution(double mn, double sd, SST::RNG::Random* baseRNG) : RandomDistribution()
57 {
58
59 mean = mn;
60 stddev = sd;
61
62 baseDistrib = baseRNG;
63 unusedPair = 0;
64 usePair = false;
65 deleteDistrib = false;
66 }
67
68 /**
69 Destroys the Gaussian distribution.
70 */
72 {
73 if ( deleteDistrib ) { delete baseDistrib; }
74 }
75
76 /**
77 Gets the next double value in the distribution
78 \return The next double value of the distribution (in this case a Gaussian distribution)
79 */
81 {
82 if ( usePair ) {
83 usePair = false;
84 return unusedPair;
85 }
86 else {
87 double gauss_u, gauss_v, sq_sum;
88
89 do {
90 gauss_u = baseDistrib->nextUniform();
91 gauss_v = baseDistrib->nextUniform();
92 sq_sum = (gauss_u * gauss_u) + (gauss_v * gauss_v);
93 } while ( sq_sum >= 1 || sq_sum == 0 );
94
95 if ( baseDistrib->nextUniform() < 0.5 ) { gauss_u *= -1.0; }
96
97 if ( baseDistrib->nextUniform() < 0.5 ) { gauss_v *= -1.0; }
98
99 double multiplier = sqrt(-2.0 * log(sq_sum) / sq_sum);
100 unusedPair = mean + stddev * gauss_v * multiplier;
101 usePair = true;
102
103 return mean + stddev * gauss_u * multiplier;
104 }
105 }
106
107 /**
108 Gets the mean of the distribution
109 \return The mean of the Guassian distribution
110 */
111 double getMean() { return mean; }
112
113 /**
114 Gets the standard deviation of the distribution
115 \return The standard deviation of the Gaussian distribution
116 */
117 double getStandardDev() { return stddev; }
118
119protected:
120 /**
121 The mean of the Gaussian distribution
122 */
123 double mean;
124 /**
125 The standard deviation of the Gaussian distribution
126 */
127 double stddev;
128 /**
129 The base random number generator for the distribution
130 */
132 /**
133 Random numbers for the distribution are read in pairs, this stores the second of the pair
134 */
136 /**
137 Random numbers for the distribution are read in pairs, this tells the code to use the second of the pair
138 */
140
141 /**
142 Controls whether the destructor deletes the distribution (we need to ensure we do this IF we created the
143 distribution)
144 */
146};
147
149
150} // namespace RNG
151} // namespace SST
152
153#endif // SST_CORE_RNG_GAUSSIAN_H
Creates a Gaussian (normal) distribution for which to sample.
Definition: gaussian.h:31
bool usePair
Random numbers for the distribution are read in pairs, this tells the code to use the second of the p...
Definition: gaussian.h:139
GaussianDistribution(double mn, double sd, SST::RNG::Random *baseRNG)
Creates a new distribution with a predefined random number generator with a specified mean and standa...
Definition: gaussian.h:56
~GaussianDistribution()
Destroys the Gaussian distribution.
Definition: gaussian.h:71
double getMean()
Gets the mean of the distribution.
Definition: gaussian.h:111
double getNextDouble()
Gets the next double value in the distribution.
Definition: gaussian.h:80
SST::RNG::Random * baseDistrib
The base random number generator for the distribution.
Definition: gaussian.h:131
double mean
The mean of the Gaussian distribution.
Definition: gaussian.h:123
bool deleteDistrib
Controls whether the destructor deletes the distribution (we need to ensure we do this IF we created ...
Definition: gaussian.h:145
GaussianDistribution(double mn, double sd)
Creates a new distribution with a predefined random number generator with a specified mean and standa...
Definition: gaussian.h:39
double unusedPair
Random numbers for the distribution are read in pairs, this stores the second of the pair.
Definition: gaussian.h:135
double getStandardDev()
Gets the standard deviation of the distribution.
Definition: gaussian.h:117
double stddev
The standard deviation of the Gaussian distribution.
Definition: gaussian.h:127
Implements a Mersenne-based RNG for use in the SST core or components.
Definition: mersenne.h:35
Base class of statistical distributions in SST.
Definition: distrib.h:23
Implements the base class for random number generators for the SST core.
Definition: rng.h:28
virtual double nextUniform()=0
Generates the next random number in the range [0,1).