25 #include <queso/SampledScalarCdf.h>
35 const std::vector<double>& cdfValues)
39 m_cdfValues (cdfValues)
69 if (paramValue <= m_cdfGrid[0]) {
72 else if (m_cdfGrid[m_cdfGrid.size()-1] <= paramValue) {
76 unsigned int intervalId = m_cdfGrid.findIntervalId(paramValue);
79 double intervalLen = m_cdfGrid[intervalId+1] - m_cdfGrid[intervalId];
80 double ratio = (paramValue - m_cdfGrid[intervalId])/intervalLen;
82 *m_env.subDisplayFile() <<
"In SampledScalarCdf::value()"
83 <<
": paramValue = " << paramValue
84 <<
", intervalId = " << intervalId
85 <<
", cdfGrid.size() = " << m_cdfGrid.size()
86 <<
", m_cdfGrid[intervalId] = " << m_cdfGrid[intervalId]
87 <<
", m_cdfGrid[intervalId+1] = " << m_cdfGrid[intervalId+1]
88 <<
", intervalLen = " << intervalLen
89 <<
", ratio = " << ratio
94 result = (1.-ratio)*m_cdfValues[intervalId] + ratio*m_cdfValues[intervalId+1];
109 unsigned int j = m_cdfValues.size()-1;
110 bool searchPosition =
true;
112 if (cdfValue == m_cdfValues[i]) {
113 while ((0 < i) && (cdfValue == m_cdfValues[i-1])) --i;
114 result = m_cdfGrid[i];
115 searchPosition =
false;
118 if (cdfValue == m_cdfValues[j]) {
119 while ((0 < j) && (cdfValue == m_cdfValues[j-1])) --j;
120 result = m_cdfGrid[j];
121 searchPosition =
false;
127 else if ((j-i) == 1) {
128 double ratio = (cdfValue-m_cdfValues[i])/(m_cdfValues[j]-m_cdfValues[i]);
129 result = (1.-ratio)*m_cdfGrid[i] + ratio*m_cdfGrid[j];
130 searchPosition =
false;
133 unsigned int k= (
unsigned int) ((i+j)*.5);
134 if (cdfValue < m_cdfValues[k]) {
137 else if (cdfValue == m_cdfValues[k]) {
138 while ((0 < k) && (cdfValue == m_cdfValues[k-1])) --
k;
139 result = m_cdfGrid[
k];
140 searchPosition =
false;
146 }
while (searchPosition);
155 if ((m_minHorizontal == -INFINITY) ||
156 (m_maxHorizontal == INFINITY)) {
157 queso_require_msg(!((m_minHorizontal != -INFINITY) || (m_maxHorizontal != INFINITY)),
"unexpected values of m_minHorizontal and/or m_maxHorizontal");
159 unsigned int iMax = m_cdfGrid.size();
161 for (
unsigned int i = 0; i < iMax; ++i) {
162 if (m_cdfValues[i] > 0.) {
164 m_minHorizontal = m_cdfGrid[i];
173 m_maxHorizontal = m_cdfGrid[iMax-1];
175 else for (
unsigned int i = 0; i < iMax; ++i) {
176 if (m_cdfValues[iMax-1-i] < 1.) {
178 m_maxHorizontal = m_cdfGrid[iMax-1-i];
186 minHorizontal = m_minHorizontal;
187 maxHorizontal = m_maxHorizontal;
200 os << m_prefix <<
"values_sub" << m_env.subIdString() <<
" = zeros(" << m_cdfValues.size()
204 os << m_prefix <<
"values_sub" << m_env.subIdString() <<
" = [";
205 for (
unsigned int j = 0; j < m_cdfValues.size(); ++j) {
206 os << m_cdfValues[j] <<
" ";
217 const std::string& varNamePrefix,
218 const std::string& fileName,
219 const std::string& fileType,
220 const std::set<unsigned int>& allowedSubEnvIds)
const
225 if (m_env.openOutputFile(fileName,
232 *filePtrSet.
ofsVar << varNamePrefix <<
"grid_sub" << m_env.subIdString() <<
" = zeros(" << m_cdfGrid.size()
236 *filePtrSet.ofsVar << varNamePrefix <<
"grid_sub" << m_env.subIdString() <<
" = [";
238 unsigned int savedPrecision = filePtrSet.ofsVar->precision();
239 filePtrSet.ofsVar->precision(16);
240 for (
unsigned int j = 0; j < m_cdfGrid.size(); ++j) {
241 *filePtrSet.ofsVar << m_cdfGrid[j] <<
" ";
243 filePtrSet.ofsVar->precision(savedPrecision);
245 *filePtrSet.ofsVar <<
"];\n";
248 *filePtrSet.ofsVar << varNamePrefix <<
"values_sub" << m_env.subIdString() <<
" = zeros(" << m_cdfValues.size()
252 *filePtrSet.ofsVar << varNamePrefix <<
"values_sub" << m_env.subIdString() <<
" = [";
254 savedPrecision = filePtrSet.ofsVar->precision();
255 filePtrSet.ofsVar->precision(16);
256 for (
unsigned int j = 0; j < m_cdfValues.size(); ++j) {
257 *filePtrSet.ofsVar << m_cdfValues[j] <<
" ";
259 filePtrSet.ofsVar->precision(savedPrecision);
261 *filePtrSet.ofsVar <<
"];\n";
264 m_env.closeFile(filePtrSet,fileType);
unsigned int displayVerbosity() const
SampledScalarCdf(const BaseEnvironment &env, const char *prefix, const BaseOneDGrid< T > &cdfGrid, const std::vector< double > &cdfValues)
Default constructor.
A templated (base) class for handling CDFs.
std::ofstream * ofsVar
Provides a stream interface to write data to files.
const BaseEnvironment & m_env
#define queso_error_msg(msg)
void subWriteContents(const std::string &varNamePrefix, const std::string &fileName, const std::string &fileType, const std::set< unsigned int > &allowedSubEnvIds) const
Writes the CDF of an allowed sub-environment to a file.
#define queso_require_less_msg(expr1, expr2, msg)
#define queso_require_not_equal_to_msg(expr1, expr2, msg)
#define queso_require_msg(asserted, msg)
void print(std::ostream &os) const
Prints the CDF (values of the grid points and of the CDF at such grid points).
#define queso_require_equal_to_msg(expr1, expr2, msg)
#define queso_require_greater_equal_msg(expr1, expr2, msg)
Struct for handling data input and output from files.
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
void getSupport(T &minHorizontal, T &maxHorizontal) const
Returns the support (image) of the CDF between two horizontal values (domain).
This (virtual) class sets up the environment underlying the use of the QUESO library by an executable...
Base class for accommodating one-dimensional grids.
T inverse(double cdfValue) const
Returns the position of a given value of CDF.
~SampledScalarCdf()
Destructor.
double value(T paramValue) const
Returns the value of the CDF at paramValue.