SST 12.1.0
Structural Simulation Toolkit
discrete.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//
5// Copyright (c) 2009-2022, NTESS
6// All rights reserved.
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_DISCRETE_H
13#define SST_CORE_RNG_DISCRETE_H
14
15#include "distrib.h"
16#include "math.h"
17#include "mersenne.h"
18#include "rng.h"
19
20#include <cstdlib> // for malloc/free
21
22using namespace SST::RNG;
23
24namespace SST {
25namespace RNG {
26
27/**
28 \class DiscreteDistribution discrete.h "sst/core/rng/discrete.h"
29
30 Creates a discrete distribution for use within SST. This distribution is the same across
31 platforms and compilers.
32*/
34{
35
36public:
37 /**
38 Creates an exponential distribution with a specific lambda
39 \param lambda The lambda of the exponential distribution
40 */
41 DiscreteDistribution(const double* probs, const uint32_t probsCount) :
42 SST::RNG::RandomDistribution(),
43 probCount(probsCount)
44 {
45
46 probabilities = (double*)malloc(sizeof(double) * probsCount);
47 double prob_sum = 0;
48
49 for ( uint32_t i = 0; i < probsCount; i++ ) {
50 probabilities[i] = prob_sum;
51 prob_sum += probs[i];
52 }
53
55 deleteDistrib = true;
56 }
57
58 /**
59 Creates an exponential distribution with a specific lambda and a base random number generator
60 \param lambda The lambda of the exponential distribution
61 \param baseDist The base random number generator to take the distribution from.
62 */
63 DiscreteDistribution(const double* probs, const uint32_t probsCount, SST::RNG::Random* baseDist) :
64 probCount(probsCount)
65 {
66
67 probabilities = (double*)malloc(sizeof(double) * probsCount);
68 double prob_sum = 0;
69
70 for ( uint32_t i = 0; i < probsCount; i++ ) {
71 probabilities[i] = prob_sum;
72 prob_sum += probs[i];
73 }
74
75 baseDistrib = baseDist;
76 deleteDistrib = false;
77 }
78
79 /**
80 Destroys the exponential distribution
81 */
83 {
84 free(probabilities);
85
86 if ( deleteDistrib ) { delete baseDistrib; }
87 }
88
89 /**
90 Gets the next (random) double value in the distribution
91 \return The next random double from the discrete distribution, this is the double converted of the index where
92 the probability is located
93 */
95 {
96 const double nextD = baseDistrib->nextUniform();
97
98 uint32_t index = 0;
99
100 for ( ; index < probCount; index++ ) {
101 if ( probabilities[index] >= nextD ) { break; }
102 }
103
104 return (double)index;
105 }
106
107protected:
108 /**
109 Sets the base random number generator for the distribution.
110 */
112
113 /**
114 Controls whether the base distribution should be deleted when this class is destructed.
115 */
117
118 /**
119 The discrete probability list
120 */
122
123 /**
124 Count of discrete probabilities
125 */
126 uint32_t probCount;
127};
128
130
131} // namespace RNG
132} // namespace SST
133
134#endif // SST_CORE_RNG_DISCRETE_H
Creates a discrete distribution for use within SST.
Definition: discrete.h:34
~DiscreteDistribution()
Destroys the exponential distribution.
Definition: discrete.h:82
uint32_t probCount
Count of discrete probabilities.
Definition: discrete.h:126
DiscreteDistribution(const double *probs, const uint32_t probsCount, SST::RNG::Random *baseDist)
Creates an exponential distribution with a specific lambda and a base random number generator.
Definition: discrete.h:63
bool deleteDistrib
Controls whether the base distribution should be deleted when this class is destructed.
Definition: discrete.h:116
double getNextDouble()
Gets the next (random) double value in the distribution.
Definition: discrete.h:94
double * probabilities
The discrete probability list.
Definition: discrete.h:121
SST::RNG::Random * baseDistrib
Sets the base random number generator for the distribution.
Definition: discrete.h:111
DiscreteDistribution(const double *probs, const uint32_t probsCount)
Creates an exponential distribution with a specific lambda.
Definition: discrete.h:41
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).