queso-0.51.1
Protected Attributes | List of all members
QUESO::FiniteDistribution Class Reference

A templated class for a finite distribution. More...

#include <FiniteDistribution.h>

Collaboration diagram for QUESO::FiniteDistribution:
Collaboration graph
[legend]

Public Member Functions

Constructor/Destructor methods
 FiniteDistribution (const BaseEnvironment &env, const char *prefix, const std::vector< double > &inpWeights)
 Constructor. More...
 
virtual ~FiniteDistribution ()
 Virtual destructor. More...
 
Misc methods
const BaseEnvironmentenv () const
 Environment; access to protected attribute m_env. More...
 
Statistical methods
const std::vector< double > & weights () const
 Weights. More...
 
unsigned int sample () const
 Samples. More...
 

Protected Attributes

const BaseEnvironmentm_env
 
std::string m_prefix
 
std::vector< double > m_weights
 
std::map< double, unsigned int > m_map
 

Detailed Description

A templated class for a finite distribution.

Unordered, discrete distribution, whose weights must be nonnegative, and are treated as unnormalized probabilities.
TODO: Describe me better!

Definition at line 43 of file FiniteDistribution.h.

Constructor & Destructor Documentation

QUESO::FiniteDistribution::FiniteDistribution ( const BaseEnvironment env,
const char *  prefix,
const std::vector< double > &  inpWeights 
)

Constructor.

Definition at line 30 of file FiniteDistribution.C.

References QUESO::BaseEnvironment::displayVerbosity(), m_env, m_map, m_prefix, m_weights, QUESO::BaseEnvironment::subDisplayFile(), UQ_FATAL_TEST_MACRO, and QUESO::BaseEnvironment::worldRank().

34  :
35  m_env (env),
36  m_prefix ((std::string)(prefix)+"fd_"),
37  m_weights(inpWeights.size(),0.)
38 {
39  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
40  *m_env.subDisplayFile() << "Entering FiniteDistribution::constructor()"
41  << ": prefix = " << m_prefix
42  << ", inpWeights.size() = " << inpWeights.size()
43  << std::endl;
44  }
45 
46  unsigned int numOfZeroWeights = 0;
47  unsigned int numRareCases = 0;
48  double sumCheck = 0.;
49  unsigned int j = 0;
50  m_map.empty(); // prudenci 2010-08-11
51  for (unsigned int i = 0; i < inpWeights.size(); ++i) {
52  double previousSum = sumCheck;
53  sumCheck += inpWeights[i];
54  if (sumCheck == previousSum) {
55  numOfZeroWeights++;
56  }
57  else {
58  if ((sumCheck - 1) > 1.e-8) {
59  std::cerr << "In FiniteDistribution::constructor()"
60  << ": sumCheck - 1 = " << sumCheck - 1.
61  << std::endl;
62  }
63  UQ_FATAL_TEST_MACRO((sumCheck - 1) > 1.e-8,
64  m_env.worldRank(),
65  "FiniteDistribution::constructor()",
66  "weights sum is too bigger than 1.");
67 
68  if (sumCheck > 1.) sumCheck = 1.;
69  m_weights[j] = inpWeights[i];
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) {
73  j++;
74  }
75  else {
76  numRareCases++;
77  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
78  *m_env.subDisplayFile() << "In FiniteDistribution::constructor()"
79  << ": WARNING, map insertion failed"
80  << std::endl;
81  }
82  }
83  }
84  }
85  m_weights.resize(j,0.);
86 
87  if ((1 - sumCheck) > 1.e-8) {
88  std::cerr << "In FiniteDistribution::constructor()"
89  << ": 1 - sumCheck = " << 1. - sumCheck
90  << std::endl;
91  }
92  UQ_FATAL_TEST_MACRO((1 - sumCheck) > 1.e-8,
93  m_env.worldRank(),
94  "FiniteDistribution::constructor()",
95  "weights sum is too smaller than 1.");
96 
97 
98  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 3)) {
99  *m_env.subDisplayFile() << "In FiniteDistribution::constructor()"
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()
105  << std::endl;
106  }
107 
108  UQ_FATAL_TEST_MACRO((inpWeights.size() != (m_weights.size()+numOfZeroWeights+numRareCases)),
109  m_env.worldRank(),
110  "FiniteDistribution::constructor()",
111  "number of input weights was not conserved");
112 
113  UQ_FATAL_TEST_MACRO((m_map.size() != m_weights.size()),
114  m_env.worldRank(),
115  "FiniteDistribution::constructor()",
116  "map and inpWeights have different sizes");
117 
118  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
119  *m_env.subDisplayFile() << "Leaving FiniteDistribution::constructor()"
120  << ": prefix = " << m_prefix
121  << std::endl;
122  }
123 }
const BaseEnvironment & env() const
Environment; access to protected attribute m_env.
const BaseEnvironment & m_env
int worldRank() const
Returns the process world rank.
Definition: Environment.C:235
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
Definition: Environment.C:305
std::map< double, unsigned int > m_map
std::vector< double > m_weights
unsigned int displayVerbosity() const
Definition: Environment.C:436
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
Definition: Defines.h:223
QUESO::FiniteDistribution::~FiniteDistribution ( )
virtual

Virtual destructor.

Definition at line 125 of file FiniteDistribution.C.

References m_map, and m_weights.

126 {
127  m_map.empty();
128  m_weights.clear();
129 }
std::map< double, unsigned int > m_map
std::vector< double > m_weights

Member Function Documentation

const BaseEnvironment & QUESO::FiniteDistribution::env ( ) const

Environment; access to protected attribute m_env.

Definition at line 132 of file FiniteDistribution.C.

References m_env.

133 {
134  return m_env;
135 }
const BaseEnvironment & m_env
unsigned int QUESO::FiniteDistribution::sample ( ) const

Samples.

Definition at line 144 of file FiniteDistribution.C.

References m_env, m_map, QUESO::BaseEnvironment::rngObject(), QUESO::RngBase::uniformSample(), UQ_FATAL_TEST_MACRO, and QUESO::BaseEnvironment::worldRank().

Referenced by QUESO::MLSampling< P_V, P_M >::sampleIndexes_proc0().

145 {
146  unsigned int result = 0;
147 
148  double aux = m_env.rngObject()->uniformSample();
149  UQ_FATAL_TEST_MACRO((aux < 0) || (aux > 1.),
150  m_env.worldRank(),
151  "FiniteDistribution::sample()",
152  "invalid uniform");
153 
154  if (aux == 0.) {
155  result = 0;
156  }
157  else if (aux == 1.) {
158  result = m_map.find(aux)->second;
159  }
160  else {
161  result = m_map.upper_bound(aux)->second;
162  //if (m_map.upper_bound(aux)->second == 0) {
163  // result = 0;
164  //}
165  //else {
166  // result = m_map.upper_bound(aux)->second-1;
167  //}
168  }
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()"
172  << ": aux = " << aux
173  << ", m_map.size() = " << m_map.size()
174  << ", result = " << result
175  << std::endl;
176  }
177  UQ_FATAL_TEST_MACRO((result >= m_map.size()),
178  m_env.worldRank(),
179  "FiniteDistribution::sample()",
180  "invalid result");
181 #endif
182 
183  return result;
184 }
const BaseEnvironment & m_env
const RngBase * rngObject() const
Access to the RNG object.
Definition: Environment.C:466
int worldRank() const
Returns the process world rank.
Definition: Environment.C:235
std::map< double, unsigned int > m_map
virtual double uniformSample() const =0
Samples a value from a uniform distribution.
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
Definition: Defines.h:223
const std::vector< double > & QUESO::FiniteDistribution::weights ( ) const

Weights.

Definition at line 138 of file FiniteDistribution.C.

References m_weights.

139 {
140  return m_weights;
141 }
std::vector< double > m_weights

Member Data Documentation

const BaseEnvironment& QUESO::FiniteDistribution::m_env
protected

Definition at line 71 of file FiniteDistribution.h.

Referenced by env(), FiniteDistribution(), and sample().

std::map<double,unsigned int> QUESO::FiniteDistribution::m_map
protected

Definition at line 75 of file FiniteDistribution.h.

Referenced by FiniteDistribution(), sample(), and ~FiniteDistribution().

std::string QUESO::FiniteDistribution::m_prefix
protected

Definition at line 72 of file FiniteDistribution.h.

Referenced by FiniteDistribution().

std::vector<double> QUESO::FiniteDistribution::m_weights
protected

Definition at line 73 of file FiniteDistribution.h.

Referenced by FiniteDistribution(), weights(), and ~FiniteDistribution().


The documentation for this class was generated from the following files:

Generated on Thu Apr 23 2015 19:26:17 for queso-0.51.1 by  doxygen 1.8.5