51 m_model_parameters->set_prior_distribution_seed(m_seed_generator);
58 cbl::statistics::Posterior::Posterior (
const std::vector<std::shared_ptr<PriorDistribution>> prior_distributions,
const std::shared_ptr<data::Data> data,
const std::shared_ptr<Model> model,
const LikelihoodType likelihood_type,
const std::vector<size_t> x_index,
const int w_index,
const int seed)
60 set(prior_distributions, data, model, likelihood_type, x_index, w_index, seed);
84 cbl::statistics::Posterior::Posterior (
const std::string file_name,
const std::string path_file,
const std::vector<int> usecols,
const std::vector<std::string> parameter_names,
const int skip_header)
86 std::vector<std::vector<double>> chain =
cbl::read_file(file_name, path_file, usecols, skip_header);
88 m_Nparameters = usecols.size()-1;
89 m_log_posterior = chain[m_Nparameters];
90 m_parameters.resize(m_Nparameters);
92 for (
int N=0; N<m_Nparameters; N++)
93 m_parameters[N] = chain[N];
97 m_model_parameters = make_shared<ModelParameters> (
ModelParameters(m_Nparameters, parameter_names));
107 pp = m_model_parameters->full_parameter(pp);
108 double prior = m_prior->operator()(pp);
111 return (m_use_grid) ? m_likelihood_function_grid(pp, m_likelihood_inputs)*prior : m_likelihood_function(pp, m_likelihood_inputs)*prior;
123 const int chain_size = m_model_parameters->chain_size();
124 const int n_walkers = m_model_parameters->chain_nwalkers();
126 for (
int j=start; j<chain_size; j+=thin)
127 for (
int i=0; i<n_walkers; i++)
128 ww.push_back(m_weight[j*n_walkers+i]);
139 pp = m_model_parameters->full_parameter(pp);
140 const double logprior = m_prior->log(pp);
144 val = (m_use_grid) ? m_log_likelihood_function_grid(pp, m_likelihood_inputs)+logprior : m_log_likelihood_function(pp, m_likelihood_inputs)+logprior;
157 vector<double> pp = (parameter.size()>0) ? parameter : m_model_parameters->bestfit_value();
159 return (m_use_grid) ? -2.*m_log_likelihood_function_grid(pp, m_likelihood_inputs) : -2.*m_log_likelihood_function(pp, m_likelihood_inputs);
168 switch (model->dimension()) {
170 m_model = make_shared<Model1D>(*static_pointer_cast<Model1D>(model));
173 m_model = make_shared<Model2D>(*static_pointer_cast<Model2D>(model));
176 ErrorCBL(
"the model dimension must be Dim::_1D_ or Dim::_2D_ !",
"set_model",
"Posterior.cpp");
179 if (model_parameters!=NULL)
180 m_model->set_parameters(model_parameters);
182 m_model->set_parameters(m_model_parameters);
190 void cbl::statistics::Posterior::set (
const std::vector<std::shared_ptr<PriorDistribution>> prior_distributions,
const std::shared_ptr<data::Data> data,
const std::shared_ptr<Model> model,
const LikelihoodType likelihood_type,
const std::vector<size_t> x_index,
const int w_index,
const int seed)
195 m_model_parameters = make_shared<PosteriorParameters>(
PosteriorParameters(m_model->parameters()->nparameters(), prior_distributions, m_model->parameters()->type(), m_model->parameters()->name()));
197 m_model->set_parameters(m_model_parameters);
198 m_model_parameters->set_prior_distribution(prior_distributions);
200 m_prior = m_model_parameters->prior();
202 set_function(likelihood_type, x_index, w_index);
203 m_likelihood_inputs = make_shared<STR_likelihood_inputs>(
STR_likelihood_inputs(m_data, m_model, m_x_index, m_w_index));
214 vector<double> starting_par;
216 const unsigned int npar_free = m_model->parameters()->nparameters_free();
217 const unsigned int npar = m_model->parameters()->nparameters();
219 if (start.size()==npar_free)
220 starting_par = start;
221 else if (start.size()==npar)
222 for (
size_t i=0; i<npar_free; i++)
223 starting_par.push_back(start[m_model->parameters()->free_parameter()[i]]);
227 function<double(vector<double> &)> post = [
this] (vector<double> &pp) {
return -this->log(pp); };
231 function<bool(vector<double> &)> checkWrong = [&] (vector<double> &pp) {
237 vector<double> par = starting_par;
239 ErrorCBL(
"The starting position is outside the prior range: the first input parameter must be changed!",
"maximize",
"Posterior.cpp");
242 for (
size_t i=0; i<npar_free; i++) {
246 ErrorCBL(
"The simplex side is outside prior range: the epsilon parameter or the starting position must be changed.",
"maximize",
"Posterior.cpp");
250 coutCBL <<
"Maximizing the posterior..." << endl;
255 coutCBL <<
"Done!" << endl << endl;
256 m_model_parameters->set_bestfit_values(result);
257 m_model_parameters->write_bestfit_info();
258 coutCBL <<
"-log(posterior) = " << post(result) << endl << endl;
261 ErrorCBL(
"the maximization ended with parameter values out of the priors: check your inputs or change the epsilon value!",
"maximize",
"Posterior.cpp");
271 WarningMsgCBL(
"no run-time output available for parallel stretch-move algorithm: this option will be ignored!",
"sample_stretch_move",
"Posterior.cpp");
273 coutCBL <<
"Sampling the posterior..." << endl;
275 const int seed = m_generate_seed();
276 const int nparameters = m_model_parameters->nparameters();
277 const int nparameters_free = m_model_parameters->nparameters_free();
278 const int chain_size = m_model_parameters->chain_size();
279 const int n_walkers = m_model_parameters->chain_nwalkers();
281 vector<vector<double>> Start(n_walkers, vector<double>(nparameters, 0));
283 for (
int i=0; i<nparameters; i++)
284 for (
int j=0; j<n_walkers; j++)
285 Start[j][i] = m_model_parameters->chain_value(i, 0, j);
287 auto posterior = [
this] (vector<double> &pp) {
return log(pp); };
295 vector<vector<double>> chain_values;
299 m_model_parameters->set_chain_values(chain_values, n_walkers);
302 m_model_parameters->set_bestfit_values(start, thin, nbins, m_generate_seed());
304 m_weight.erase(m_weight.begin(), m_weight.end());
305 m_weight.resize(m_log_posterior.size(), 1.);
312 void cbl::statistics::Posterior::importance_sampling (
const std::string input_dir,
const std::string input_file,
const vector<size_t> column,
const int header_lines_to_skip,
const bool is_FITS_format,
const bool apply_to_likelihood,
const int n_walkers)
315 read_chain(input_dir, input_file, n_walkers, column, header_lines_to_skip, is_FITS_format);
317 const int n_parameters = m_model_parameters->nparameters();
318 const int chain_size = m_model_parameters->chain_size();
320 vector<double> log_dist(m_log_likelihood.size(), 1.), input_log_dist(m_log_likelihood.size(), 1.);
323 for (
int chain_position=0; chain_position<chain_size; ++chain_position) {
326 #pragma omp parallel for schedule(dynamic)
327 for (
int walker_index=0; walker_index<n_walkers; ++walker_index) {
329 vector<double> pp(n_parameters);
330 for (
int parameter=0; parameter<n_parameters; ++parameter)
331 pp[parameter] = m_model_parameters->chain_value(parameter, chain_position, walker_index);
334 log_dist[chain_position*n_walkers+walker_index] = (apply_to_likelihood) ?
Likelihood::log(pp) : log(pp);
337 input_log_dist[chain_position*n_walkers+walker_index] =
338 (apply_to_likelihood) ? m_log_likelihood[chain_position*n_walkers+walker_index]
339 : m_log_posterior[chain_position*n_walkers+walker_index];
342 coutCBL << int(
double(chain_position)/(chain_size)*100.) <<
"% \r"; cout.flush();
348 const double shift =
Max(input_log_dist)-
Max(log_dist);
350 for (
int chain_position=0; chain_position<chain_size; ++chain_position)
351 #pragma omp parallel
for schedule(dynamic)
352 for (
int walker_index=0; walker_index<n_walkers; ++walker_index)
353 m_weight[chain_position*n_walkers+walker_index] = exp(log_dist[chain_position*n_walkers+walker_index]-input_log_dist[chain_position*n_walkers+walker_index]+shift);
361 void cbl::statistics::Posterior::read_chain (
const string input_dir,
const string input_file,
const int n_walkers,
const vector<size_t> column,
const int header_lines_to_skip,
const bool is_FITS_format)
364 read_chain_fits(input_dir, input_file, n_walkers, column);
366 read_chain_ascii(input_dir, input_file, n_walkers, column, header_lines_to_skip);
375 const string file = input_dir+input_file;
376 coutCBL <<
"Reading the chain file " << file << endl;
378 const int nparameters = m_model_parameters->nparameters();
380 std::function<vector<double>(
const vector<double> params)> assign;
382 if (column.size()==0) {
383 assign = [&] (
const vector<double> params) {
384 vector<double> pp(nparameters);
385 for (
int i=0; i<nparameters; i++)
391 checkDim(column, nparameters,
"columns");
392 assign = [&] (
const vector<double> params) {
393 vector<double> pp(nparameters);
394 for (
int i=0; i<nparameters; i++)
395 pp[i] = params[column[i]+1];
400 ifstream fin(file.c_str());
checkIO(fin, file);
403 for (
int i=0; i<skip_header; i++)
406 vector<vector<double>> chain_value;
408 m_log_likelihood.erase(m_log_likelihood.begin(), m_log_likelihood.end());
409 m_log_posterior.erase(m_log_posterior.begin(), m_log_posterior.end());
410 m_weight.erase(m_weight.begin(), m_weight.end());
412 while (getline(fin, line)) {
413 stringstream ss(line);
417 while (ss>>NUM) ll.push_back(NUM);
419 vector<double> params = assign(ll);
421 m_log_likelihood.push_back(ll[ll.size()-4]);
422 m_log_posterior.push_back(ll[ll.size()-2]);
423 m_weight.push_back(ll[ll.size()-1]);
425 chain_value.push_back(params);
427 const int chain_size = chain_value.size()/n_walkers;
429 fin.clear(); fin.close();
431 checkDim(chain_value, n_walkers*chain_size, m_model_parameters->nparameters(),
"chain_value");
432 checkDim(m_log_posterior, n_walkers*chain_size,
"m_log_posterior");
433 checkDim(m_weight, n_walkers*chain_size,
"m_weight");
437 m_model_parameters->set_chain_values(chain_value, n_walkers);
439 coutCBL <<
"Done!" << endl << endl;
450 const int nparameters = m_model_parameters->nparameters();
452 string file = input_dir+input_file;
453 coutCBL <<
"Reading the chain file " << file << endl;
455 vector<string> names = m_model_parameters->name();
456 names.push_back(
"Log(Likelihood)");
457 names.push_back(
"Log(Posterior)");
458 names.push_back(
"Weight");
460 vector<vector<double>> chain_value(nparameters);
461 m_log_likelihood.erase(m_log_likelihood.begin(), m_log_likelihood.end());
462 m_log_posterior.erase(m_log_posterior.begin(), m_log_posterior.end());
463 m_weight.erase(m_weight.begin(), m_weight.end());
467 for (
int i=0; i<nparameters; i++)
468 chain_value[i] = values[i];
470 m_log_likelihood = values[nparameters-2];
471 m_log_posterior = values[nparameters];
472 m_weight = values[nparameters+1];
474 int chain_size = m_log_posterior.size()/n_walkers;
476 checkDim(chain_value, nparameters, n_walkers*chain_size,
"chain_value");
477 checkDim(m_log_likelihood, n_walkers*chain_size,
"m_log_likelihood");
478 checkDim(m_log_posterior, n_walkers*chain_size,
"m_log_posterior");
479 checkDim(m_weight, n_walkers*chain_size,
"m_weight");
481 m_model_parameters->set_chain_values(chain_value, n_walkers);
483 coutCBL <<
"Done!" << endl << endl;
493 write_chain_fits(output_dir, output_file, start, thin);
495 write_chain_ascii(output_dir, output_file, start, thin, prec, ww);
504 const int nparameters = m_model_parameters->nparameters();
505 const int chain_size = m_model_parameters->chain_size();
506 const int n_walkers = m_model_parameters->chain_nwalkers();
508 checkDim(m_log_posterior, n_walkers*chain_size,
"m_log_posterior",
false);
510 string MK =
"mkdir -p "+output_dir;
511 if (system(MK.c_str())) {}
513 string file = output_dir+output_file;
515 ofstream fout(file.c_str());
checkIO(fout, file);
519 for (
int k=0; k<nparameters; k++)
520 fout << m_model_parameters->name(k) <<
" ";
521 fout <<
" log(Likelihood) log(Prior) log(Posterior) Weight" << endl;
525 for (
int j=start; j<chain_size; j+=thin) {
526 for (
int i=0; i<n_walkers; i++) {
527 fout << setw(6) << nn++ <<
" ";
529 vector<double> pp(nparameters);
531 for (
int k=0; k<nparameters; k++) {
532 pp[k] = m_model_parameters->chain_value(k, j, i);
533 cbl::Print(m_model_parameters->chain_value(k, j, i), prec, ww,
"",
" ",
false, fout);
536 if (m_log_likelihood.size()>
size_t(j*n_walkers+i)) {
537 cbl::Print(m_log_likelihood[j*n_walkers+i], prec, ww,
"",
" ",
false, fout);
538 cbl::Print(m_log_posterior[j*n_walkers+i]-m_log_likelihood[j*n_walkers+i], prec, ww,
"",
" ",
false, fout);
541 const double pr = m_prior->log(pp);
542 cbl::Print(m_log_posterior[j*n_walkers+i]-pr, prec, ww,
"",
" ",
false, fout);
543 cbl::Print(pr, prec, ww,
"",
" ",
false, fout);
546 cbl::Print(m_log_posterior[j*n_walkers+i], prec, ww,
"",
" ",
false, fout);
547 cbl::Print(m_weight[j*n_walkers+i], prec, ww,
"",
"\n",
false, fout);
551 fout.clear(); fout.close();
553 coutCBL <<
"I wrote the file: " << file << endl;
562 const int nparameters = m_model_parameters->nparameters();
563 const int chain_size = m_model_parameters->chain_size();
564 const int n_walkers = m_model_parameters->chain_nwalkers();
566 checkDim(m_log_posterior, n_walkers*chain_size,
"m_log_posterior",
false);
568 string MK =
"mkdir -p "+output_dir;
569 if (system(MK.c_str())) {}
571 vector<string> names;
572 names.push_back(
"Step");
573 for (
int k=0; k<nparameters; k++)
574 names.emplace_back(m_model_parameters->name(k));
576 names.push_back(
"Log(Likelihood)");
577 names.push_back(
"Log(Prior)");
578 names.push_back(
"Log(Posterior)");
579 names.push_back(
"Weight");
581 vector<vector<double>> value(nparameters+5);
584 for (
int j=start; j<chain_size; j+=thin)
585 for (
int i=0; i<n_walkers; i++) {
586 value[0].emplace_back(n);
587 vector<double> pp(nparameters);
588 for (
int k=0; k<nparameters; k++) {
589 value[k+1].emplace_back(m_model_parameters->chain_value(k, j, i));
590 pp[k] = m_model_parameters->chain_value(k, j, i);
593 if (m_log_likelihood.size()>
size_t(j*n_walkers+i)) {
594 value[nparameters+1].emplace_back(m_log_likelihood[j*n_walkers+i]);
595 value[nparameters+2].emplace_back(m_log_posterior[j*n_walkers+i]-m_log_likelihood[j*n_walkers+i]);
598 const double lpr = m_prior->log(pp);
599 value[nparameters+1].emplace_back(m_log_posterior[j*n_walkers+i]-lpr);
600 value[nparameters+2].emplace_back(lpr);
603 value[nparameters+3].emplace_back(m_log_posterior[j*n_walkers+i]);
604 value[nparameters+4].emplace_back(m_weight[j*n_walkers+i]);
617 m_model_parameters->set_chain(chain_size, n_walkers);
618 m_model_parameters->initialize_chain_from_prior();
627 maximize(start, max_iter, tol, epsilon);
629 m_model_parameters->set_chain(chain_size, n_walkers);
630 m_model_parameters->initialize_chain_ball_bestfit(radius, m_generate_seed());
639 m_model_parameters->set_chain(chain_size, n_walkers);
640 m_model_parameters->initialize_chain_ball(value, radius, m_generate_seed());
649 const int n_walkers = chain_value[0].size();
650 m_model_parameters->set_chain(chain_size, n_walkers);
652 for (
size_t pp=0; pp<m_model_parameters->nparameters(); pp++)
653 for (
int ww=0; ww<n_walkers; ww++)
654 m_model_parameters->set_chain_value(pp, 0, ww, chain_value[pp][ww]);
663 string last_step_file = input_dir+input_file+
"_LastStep";
664 string get_last_step =
"tail -n "+
conv(n_walkers,
par::fINT)+
" "+input_dir+input_file+
" > "+last_step_file;
665 if (system(get_last_step.c_str())) {}
667 ifstream fin(last_step_file);
670 vector<vector<double>> chain_value;
672 while (getline(fin, line))
674 stringstream ss(line);
676 vector<double> ll, params;
678 while (ss>>NUM) ll.push_back(NUM);
679 for (
size_t i=1; i<ll.size()-3; i++)
680 params.push_back(ll[i]);
682 chain_value.push_back(params);
684 fin.clear(); fin.close();
686 string rm_last_step =
"rm -r "+last_step_file;
687 if (system(rm_last_step.c_str())) {}
689 checkDim(chain_value, n_walkers, m_model_parameters->nparameters(),
"chain_from_LastStep_file");
692 initialize_chains(chain_size, chain_value);
701 coutCBL <<
"Writing results of posterior maximization on " << dir_output+file << endl;
702 vector<double> bestFitValues = m_model_parameters->bestfit_value();
704 double posteriorValue = this->log(bestFitValues);
706 string mkdir =
"mkdir -p "+dir_output;
707 if (system(mkdir.c_str())) {}
709 ofstream fout(dir_output+file);
711 fout <<
"#Parameters information" << endl;
712 fout <<
"number of parameters = " << bestFitValues.size() << endl;
714 for (
size_t i=0; i<bestFitValues.size(); i++) {
715 fout <<
"par" << i+1 <<
"_name = " << m_model_parameters->name(i) << endl;
716 fout <<
"par" << i+1 <<
"_status = " << m_model_parameters->status(i) << endl;
717 fout <<
"par" << i+1 <<
"_bestfit_value = " << bestFitValues[i] << endl;
720 fout <<
"#Likelihood information" << endl;
721 fout <<
"likelihoodType = " << name << endl;
722 fout <<
"logPosteriorValue = " << posteriorValue << endl;
724 fout.clear(); fout.close();
725 coutCBL <<
"I wrote the file " << dir_output+file << endl;
734 m_model_parameters->show_results(start, thin, nbins, m_generate_seed(), show_mode, ns, nb, weight(start, thin));
741 void cbl::statistics::Posterior::write_results (
const string output_dir,
const string root_file,
const int start,
const int thin,
const int nbins,
const bool fits,
const bool compute_mode,
const int ns,
const int nb)
743 const string extension = (fits) ?
"_chain.fits" :
"_chain.dat";
744 write_chain(output_dir, root_file+extension, start, thin, fits);
746 m_model_parameters->write_results(output_dir, root_file, start, thin, nbins, m_generate_seed(), compute_mode, ns, nb, weight(start, thin));
755 switch (m_model->dimension()) {
759 vector<double> xvec = xx;
763 m_model->write_from_chains(output_dir, output_file, xvec, start, thin);
769 vector<double> xvec = xx, yvec = yy;
775 m_model->write_from_chains(output_dir, output_file, xvec, yvec, start, thin);
780 ErrorCBL(
"the input dimension must be Dim::_1D_ or Dim::_2D_ !",
"write_model_from_chain",
"Posterior.cpp");
Implementation of the chain-mesh data structure.
class FITSwrapper that wrap CCfits routines to manage FITS files
#define coutCBL
CBL print message.
The class PosteriorParameters.
std::shared_ptr< void > m_likelihood_inputs
likelihood inputs
double log(std::vector< double > ¶meter) const
evaluate the logarithm of the likelihood for the input parameters
std::shared_ptr< Model > m_model
model to test
int m_w_index
the index in extra info where the bin weight is stored
std::shared_ptr< ModelParameters > m_model_parameters
likelihood parameters
std::vector< size_t > m_x_index
std::shared_ptr< data::Data > m_data
data containers
The class ModelParameters.
The class PosteriorParameters.
void set_model(std::shared_ptr< Model > model=NULL, const std::shared_ptr< ModelParameters > model_parameters=NULL)
set the model for the posterior analysis
void maximize(const std::vector< double > start, const std::vector< std::vector< double >> parameter_limits, const unsigned int max_iter=10000, const double tol=1.e-6, const double epsilon=1.e-3)
function that maximizes the posterior, finds the best-fit parameters and store them in the model
void read_chain_ascii(const std::string input_dir, const std::string input_file, const int n_walkers, const std::vector< size_t > column={}, const int header_lines_to_skip=1)
read the chains from an ascii file
double operator()(std::vector< double > &pp) const
the un-normalized posterior
void initialize_chains(const int chain_size, const int n_walkers)
initialize the chains by drawing from the prior distributions
std::vector< double > weight(const int start=0, const int thin=1) const
return the internal member m_weights
std::shared_ptr< cbl::statistics::Prior > m_prior
the prior distribution
void read_chain(const std::string input_dir, const std::string input_file, const int n_walkers, const std::vector< size_t > column={}, const int header_lines_to_skip=1, const bool is_FITS_format=false)
read the chains
double log(std::vector< double > &pp) const
the logarithm of the un-normalized posterior
void importance_sampling(const std::string input_dir, const std::string input_file, const std::vector< size_t > column={}, const int header_lines_to_skip=1, const bool is_FITS_format=false, const bool apply_to_likelihood=false, const int n_walkers=100)
perform importance sampling
void m_set_seed(const int seed)
set the internal attribute m_seed and related quantities
double chi2(const std::vector< double > parameter={}) const
the
void write_model_from_chain(const std::string output_dir, const std::string output_file, const std::vector< double > xx={}, const std::vector< double > yy={}, const int start=0, const int thin=1)
write the model at xx, yy computing 16th, 50th and 84th percentiles from the MCMC chains
void show_results(const int start, const int thin, const int nbins=50, const bool show_mode=false, const int ns=-1, const int nb=-1)
show the results of the MCMC sampling on screen
void write_chain_ascii(const std::string output_dir, const std::string output_file, const int start=0, const int thin=1, const int prec=5, const int ww=14)
write the chains obtained after the MCMC sampling on an ascii file
void write_results(const std::string output_dir, const std::string root_file, const int start=0, const int thin=1, const int nbins=50, const bool fits=false, const bool compute_mode=false, const int ns=-1, const int nb=-1)
store the results of the MCMC sampling to file
void write_chain_fits(const std::string output_dir, const std::string output_file, const int start=0, const int thin=1)
write the chains obtained after the MCMC sampling on a FITS file
void write_chain(const std::string output_dir, const std::string output_file, const int start=0, const int thin=1, const bool is_FITS_format=false, const int prec=5, const int ww=14)
write the chains obtained after the MCMC sampling
void set(const std::vector< std::shared_ptr< PriorDistribution >> prior_distributions, const std::shared_ptr< data::Data > data, const std::shared_ptr< Model > model, const LikelihoodType likelihood_type, const std::vector< size_t > x_index, const int w_index, const int seed)
set the posterior type using the LikelihoodType object
void sample_stretch_move(const double aa=2, const bool parallel=true, const std::string outputFile=par::defaultString, const int start=0, const int thin=1, const int nbins=50)
sample the posterior using the stretch-move sampler (Foreman-Mackey et al. 2012)
void write_maximization_results(const std::string output_dir, const std::string root_file)
write maximization results on a file
void read_chain_fits(const std::string input_dir, const std::string input_file, const int n_walkers, const std::vector< size_t > column)
read the chains from an ascii file
Posterior()=default
default constructor
void sample_stretch_move(const int chain_size, const int nwalkers, const std::vector< std::vector< double >> start, const int seed=4241, const double aa=2, const std::string outputFile=cbl::par::defaultString)
sample the input function using the stretch-move algorithm on n-dimensional parameter space
void get_chain_function_acceptance(std::vector< std::vector< double >> &chains, std::vector< double > &function, std::vector< double > &acceptance, const int start=0, const int thin=1)
get the chain values and the function
void sample_stretch_move_parallel(const int chain_size, const int nwalkers, const std::vector< std::vector< double >> start, const int seed=4241, const double aa=2)
sample the input function using the stretch-move algorithm on n-dimensional parameter space - paralle...
static const char fINT[]
conversion symbol for: int -> std::string
static const std::string defaultString
default std::string value
static const double defaultDouble
default double value
LikelihoodType
the type of likelihood function
std::vector< std::string > LikelihoodTypeNames()
return a vector containing the LikelihoodType names
std::vector< std::vector< double > > read_table_fits(const std::string input_fits, const std::vector< std::string > column_names, const int next=1, const double fill_value=cbl::par::defaultDouble)
function to read a table from a fits file
void write_table_fits(const std::string output_dir, const std::string file_fits, const std::vector< std::string > column_names, const std::vector< std::vector< double >> table, const std::vector< std::string > column_units={})
function that writes a table on a fits file
std::vector< double > GSL_minimize_nD(FunctionDoubleVector func, const std::vector< double > start, const std::vector< std::vector< double >> ranges, const unsigned int max_iter=1000, const double tol=1.e-6, const double epsilon=0.1)
minimize the provided function using GSL procedure
The global namespace of the CosmoBolognaLib
std::string conv(const T val, const char *fact)
convert a number to a std::string
void Print(const T value, const int prec, const int ww, const std::string header="", const std::string end="\n", const bool use_coutCBL=true, std::ostream &stream=std::cout, const std::string colour=cbl::par::col_default)
function to print values with a proper homegenised format
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
void checkDim(const std::vector< T > vect, const int val, const std::string vector, bool equal=true)
check if the dimension of a std::vector is equal/lower than an input value
void checkIO(const std::ifstream &fin, const std::string file="NULL")
check if an input file can be opened
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
std::vector< std::vector< T > > transpose(std::vector< std::vector< T >> matrix)
transpose a matrix
void WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message
@ _2D_
2D pair, used e.g. for 2D pairs, in Cartesian or polar coordinates
@ _1D_
1D, used e.g. for 1D pairs, in angular or comoving separations