39 cbl::glob::CombinedDistribution::CombinedDistribution (
const DistributionType distributionType,
const std::vector<double> meanVec,
const std::vector<std::vector<double>> covMat,
const std::vector<double> xMinVec,
const std::vector<double> xMaxVec,
const int seed)
41 if (distributionType!=glob::DistributionType::_Gaussian_)
42 ErrorCBL(
"this constructor only allows DistributionType::_Gaussian_!",
"CombinedDistribution",
"CombinedDistribution.cpp");
48 glob::STR_multivariateGaussian parameters;
52 m_inputs = std::make_shared<glob::STR_multivariateGaussian>(parameters);
55 m_distributionVec.erase(m_distributionVec.begin(), m_distributionVec.end());
56 m_distributionVec.resize(meanVec.size(), NULL);
58 for (
size_t i=0; i<meanVec.size(); i++)
66 cbl::glob::CombinedDistribution::CombinedDistribution (
const std::string filename,
const std::string path,
const std::vector<int> columns_to_read,
const int skip_nlines,
const int type_data,
const bool normalize,
const int distNum,
const double rMAX,
const double cell_size)
68 int nparams = columns_to_read.size()-1;
69 std::vector<std::vector<double>> all_data =
cbl::read_file(filename, path, columns_to_read, skip_nlines);
70 std::vector<double> posterior;
74 coutCBL <<
"Reading log(Posterior) distribution as column number " << columns_to_read[nparams] << std::endl;
75 posterior = all_data[nparams];
76 if (
cbl::Min(posterior)<log(DBL_MIN))
ErrorCBL(
"please select a valid higher log(Posterior) values!",
"CombinedDistribution",
"CombinedDistribution.cpp");
77 for (
size_t i=0; i<posterior.size(); i++) posterior[i] = exp(posterior[i]);
81 coutCBL <<
"Reading Posterior distribution as column number " << columns_to_read[nparams] << std::endl;
82 posterior = all_data[nparams+1];
83 if (
cbl::Min(posterior)<0.)
ErrorCBL(
"please select a valid positive Posterior values!",
"CombinedDistribution",
"CombinedDistribution.cpp");
87 coutCBL <<
"Reading Chi2 distribution as column number " << columns_to_read[nparams] << std::endl;
88 posterior = all_data[nparams];
89 if (
cbl::Min(posterior)<-2.*log(DBL_MIN))
ErrorCBL(
"please select a valid higher log(Posterior) values!",
"CombinedDistribution",
"CombinedDistribution.cpp");
90 for (
size_t i=0; i<posterior.size(); i++) posterior[i] = exp(-0.5*posterior[i]);
94 ErrorCBL(
"please select a valid type_data!",
"CombinedDistribution",
"CombinedDistribution.cpp");
98 const double Min_post =
cbl::Min(posterior);
99 const double Max_post =
cbl::Max(posterior);
100 const double Norm = fabs(Max_post-Min_post);
101 for (
size_t i=0; i<posterior.size(); i++) posterior[i] = (posterior[i]-Min_post)/Norm;
104 m_xMinVec.erase(m_xMinVec.begin(), m_xMinVec.end());
105 m_xMaxVec.erase(m_xMaxVec.begin(), m_xMaxVec.end());
106 m_xMinVec.resize(nparams);
107 m_xMaxVec.resize(nparams);
109 std::vector<std::vector<double>> data(nparams);
110 for (
int i=0; i<nparams; i++) {
111 data[i] = all_data[i];
112 m_xMinVec[i] =
cbl::Min(data[i])*0.99;
113 m_xMaxVec[i] =
cbl::Max(data[i])*1.01;
117 chMesh.normalize(data, posterior, rMAX);
119 glob::STR_chainMeshInterpolate parameters;
120 parameters.ChainMesh = chMesh;
121 parameters.DistNum = distNum;
123 m_inputs = std::make_shared<glob::STR_chainMeshInterpolate>(parameters);
126 m_distributionVec.erase(m_distributionVec.begin(), m_distributionVec.end());
127 m_distributionVec.resize(nparams, NULL);
129 for (
int i=0; i<nparams; i++)
137 double cbl::glob::CombinedDistribution::operator[] (std::vector<double> xx)
139 double fact = m_Func(xx, m_inputs);
141 if (fact==0.) fact = DBL_MIN;
143 else if (!std::isfinite(fact)) {
145 WarningMsgCBL(
"inf or nan values encountered",
"operator[]",
"CombinedDistribution.cpp");
The class CombinedDistribution.
#define coutCBL
CBL print message.
The class CombinedDistribution.
DistributionType
the distribution type
@ _Uniform_
Identity function.
@ _Gaussian_
Gaussian function.
Eigen::MatrixXd MatrixToEigen(const std::vector< std::vector< double >> mat)
convert a std::vector<std::vector<double>> to an Eigen::MatrixXd object
Eigen::MatrixXd VectorToEigen(const std::vector< double > vec)
convert a std::vector<double> to an Eigen::MatrixXd object
std::vector< double > EigenToVector(const Eigen::MatrixXd vec)
convert an Eigen::MatrixXd to a std::vector<double>
T Min(const std::vector< T > vect)
minimum element of a std::vector
double multivariateGaussian(std::vector< double > xx, std::shared_ptr< void > pars)
the multivariate Gaussian function
std::vector< std::vector< double > > read_file(const std::string file_name, const std::string path_name, const std::vector< int > column_data, const int skip_nlines=0)
read a data from a file ASCII
double chainMeshInterpolate(std::vector< double > xx, std::shared_ptr< void > pars)
a multidimension interpolator
int ErrorCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL, const cbl::glob::ExitCode exitCode=cbl::glob::ExitCode::_error_)
throw an exception: it is used for handling exceptions inside the CosmoBolognaLib
T Max(const std::vector< T > vect)
maximum element of a std::vector
void WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message