25 #include <queso/FiniteDistribution.h>
33 const std::vector<double>& inpWeights)
36 m_prefix ((std::string)(prefix)+
"fd_"),
37 m_weights(inpWeights.size(),0.)
42 <<
", inpWeights.size() = " << inpWeights.size()
46 unsigned int numOfZeroWeights = 0;
47 unsigned int numRareCases = 0;
51 for (
unsigned int i = 0; i < inpWeights.size(); ++i) {
52 double previousSum = sumCheck;
53 sumCheck += inpWeights[i];
54 if (sumCheck == previousSum) {
58 if ((sumCheck - 1) > 1.e-8) {
59 std::cerr <<
"In FiniteDistribution::constructor()"
60 <<
": sumCheck - 1 = " << sumCheck - 1.
65 "FiniteDistribution::constructor()",
66 "weights sum is too bigger than 1.");
68 if (sumCheck > 1.) sumCheck = 1.;
70 std::pair<std::map<double,unsigned int>::iterator,
bool> ret;
71 ret =
m_map.insert(std::map<double,unsigned int>::value_type(sumCheck,i));
72 if (ret.second ==
true) {
79 <<
": WARNING, map insertion failed"
87 if ((1 - sumCheck) > 1.e-8) {
88 std::cerr <<
"In FiniteDistribution::constructor()"
89 <<
": 1 - sumCheck = " << 1. - sumCheck
94 "FiniteDistribution::constructor()",
95 "weights sum is too smaller than 1.");
100 <<
": inpWeights.size() = " << inpWeights.size()
101 <<
", numOfZeroWeights = " << numOfZeroWeights
102 <<
", numRareCases = " << numRareCases
103 <<
", m_map.size() = " <<
m_map.size()
104 <<
", m_weights.size() = " <<
m_weights.size()
110 "FiniteDistribution::constructor()",
111 "number of input weights was not conserved");
115 "FiniteDistribution::constructor()",
116 "map and inpWeights have different sizes");
137 const std::vector<double>&
146 unsigned int result = 0;
151 "FiniteDistribution::sample()",
157 else if (aux == 1.) {
158 result =
m_map.find(aux)->second;
161 result =
m_map.upper_bound(aux)->second;
169 #if 0 // WE insert 'i' in map, not 'j'. So, the tests below don't make sense
170 if (result >=
m_map.size()) {
171 std::cerr <<
"In FiniteDistribution::sample()"
173 <<
", m_map.size() = " <<
m_map.size()
174 <<
", result = " << result
179 "FiniteDistribution::sample()",
const BaseEnvironment & env() const
Environment; access to protected attribute m_env.
const BaseEnvironment & m_env
const RngBase * rngObject() const
Access to the RNG object.
int worldRank() const
Returns the process world rank.
unsigned int sample() const
Samples.
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
FiniteDistribution(const BaseEnvironment &env, const char *prefix, const std::vector< double > &inpWeights)
Constructor.
This (virtual) class sets up the environment underlying the use of the QUESO library by an executable...
const std::vector< double > & weights() const
Weights.
std::map< double, unsigned int > m_map
virtual ~FiniteDistribution()
Virtual destructor.
std::vector< double > m_weights
virtual double uniformSample() const =0
Samples a value from a uniform distribution.
unsigned int displayVerbosity() const
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)