CosmoBolognaLib
Free Software C++/Python libraries for cosmological calculations
Posterior.h
Go to the documentation of this file.
1 /********************************************************************
2  * Copyright (C) 2014 by Federico Marulli and Alfonso Veropalumbo *
3  * federico.marulli3@unibo.it *
4  * *
5  * This program is free software; you can redistribute it and/or *
6  * modify it under the terms of the GNU General Public License as *
7  * published by the Free Software Foundation; either version 2 of *
8  * the License, or (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public *
16  * License along with this program; if not, write to the Free *
17  * Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ********************************************************************/
20 
33 #ifndef __POSTERIOR__
34 #define __POSTERIOR__
35 
36 #include "RandomNumbers.h"
37 #include "Prior.h"
38 #include "Likelihood.h"
39 
40 
41 // ===================================================================================================
42 
43 
44 namespace cbl {
45 
46  namespace statistics {
47 
55  class Posterior : public Likelihood {
56 
57  protected:
58 
60  std::shared_ptr<cbl::statistics::Prior> m_prior;
61 
63  std::shared_ptr<statistics::Model> m_response_func = NULL;
64 
66  std::vector<double> m_log_likelihood;
67 
69  std::vector<double> m_acceptance;
70 
72  int m_seed;
73 
75  std::shared_ptr<cbl::random::UniformRandomNumbers_Int> m_seed_generator;
76 
78  std::vector<double> m_log_posterior;
79 
82 
84  std::vector<std::vector<double>> m_parameters;
85 
87  std::vector<double> m_weight;
88 
97  void m_set_seed (const int seed);
98 
104  int m_generate_seed () { return m_seed_generator->operator()(); }
105 
110  void m_isSet_response () {if (m_response_func == NULL) ErrorCBL("the response function for the SSC is not set!", "m_isSet_response", "Posterior.h");};
111 
112  public:
113 
118 
124  Posterior () = default;
125 
139  Posterior (const std::vector<std::shared_ptr<PriorDistribution>> prior_distributions, const Likelihood &likelihood, const int seed=5341);
140 
164  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=5341);
165 
180  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);
181 
187  ~Posterior () = default;
188 
190 
191 
197  std::shared_ptr<ModelParameters> parameters () const { return m_model_parameters; }
198 
214  double operator () (std::vector<double> &pp) const;
215 
225  std::vector<double> weight (const int start=0, const int thin=1) const;
226 
244  double log (std::vector<double> &pp) const;
245 
263  double chi2 (const std::vector<double> parameter={}) const;
264 
274  void set_model (std::shared_ptr<Model> model=NULL, const std::shared_ptr<ModelParameters> model_parameters=NULL);
275 
299  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);
300 
306  int get_Nparameters () { return m_Nparameters; }
307 
313  int m_get_seed () { return m_seed; }
314 
320  bool get_m_use_grid() { return m_use_grid; }
321 
327  std::vector<std::vector<double>> get_parameters () { return m_parameters; }
328 
334  std::vector<double> get_log_posterior () { return m_log_posterior; }
335 
341  std::shared_ptr<void> get_m_likelihood_inputs() { return m_likelihood_inputs; }
342 
348  std::shared_ptr<cbl::statistics::Prior> get_m_prior() { return m_prior; }
349 
356 
363 
370 
377 
384  void set_response_function (std::shared_ptr<statistics::Model> response) {m_response_func = response;};
385 
392  std::shared_ptr<statistics::Model> get_response_function () {m_isSet_response(); return m_response_func;};
393 
394 
428  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)
429  { (void)start; (void)parameter_limits; (void)max_iter; (void)tol; (void)epsilon; ErrorCBL("the method is used without parameter_ranges!", "maximize", "Posterior.h"); }
430 
446  void maximize (const std::vector<double> start, const unsigned int max_iter=10000, const double tol=1.e-6, const double epsilon=1.e-4);
447 
462  void initialize_chains (const int chain_size, const int n_walkers);
463 
494  void initialize_chains (const int chain_size, const int n_walkers, const double radius, const std::vector<double> start, const unsigned int max_iter=10000, const double tol=1.e-6, const double epsilon=1.e-3);
495 
516  void initialize_chains (const int chain_size, const int n_walkers, std::vector<double> &value, const double radius);
517 
529  void initialize_chains (const int chain_size, const std::vector<std::vector<double>> chain_value);
530 
547  void initialize_chains (const int chain_size, const int n_walkers, const std::string input_dir, const std::string input_file);
548 
579  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);
580 
617  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);
618 
637  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);
638 
653  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);
654 
666  void read_chain_fits (const std::string input_dir, const std::string input_file, const int n_walkers, const std::vector<size_t> column);
667 
690  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);
691 
708  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);
709 
722  void write_chain_fits (const std::string output_dir, const std::string output_file, const int start=0, const int thin=1);
723 
724 
732  void write_maximization_results (const std::string output_dir, const std::string root_file);
733 
775  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);
776 
831  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);
832 
849  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);
850  };
851  }
852 }
853 
854 #endif
The class Likelihood.
The class Prior.
Class functions used to generate random numbers.
The class Likelihood.
Definition: Likelihood.h:56
Likelihood_function m_likelihood_function
likelihood function
Definition: Likelihood.h:79
std::shared_ptr< void > m_likelihood_inputs
likelihood inputs
Definition: Likelihood.h:67
LogLikelihood_function m_log_likelihood_function_grid
log-likelihood function on a grid
Definition: Likelihood.h:85
std::shared_ptr< ModelParameters > m_model_parameters
likelihood parameters
Definition: Likelihood.h:70
LogLikelihood_function m_likelihood_function_grid
likelihood function on a grid
Definition: Likelihood.h:82
LogLikelihood_function m_log_likelihood_function
log-likelihood function
Definition: Likelihood.h:76
The class Posterior.
Definition: Posterior.h:55
LogLikelihood_function get_m_log_likelihood_function()
get the values of the internal variable m_log_likelihood_function
Definition: Posterior.h:355
void set_model(std::shared_ptr< Model > model=NULL, const std::shared_ptr< ModelParameters > model_parameters=NULL)
set the model for the posterior analysis
Definition: Posterior.cpp:166
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
Definition: Posterior.h:428
std::shared_ptr< cbl::statistics::Prior > get_m_prior()
get the values of the internal variable m_prior
Definition: Posterior.h:348
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
Definition: Posterior.cpp:373
double operator()(std::vector< double > &pp) const
the un-normalized posterior
Definition: Posterior.cpp:105
void initialize_chains(const int chain_size, const int n_walkers)
initialize the chains by drawing from the prior distributions
Definition: Posterior.cpp:615
std::vector< double > weight(const int start=0, const int thin=1) const
return the internal member m_weights
Definition: Posterior.cpp:120
std::shared_ptr< cbl::statistics::Prior > m_prior
the prior distribution
Definition: Posterior.h:60
int m_seed
general seed for prior/posterior distribution and sampler
Definition: Posterior.h:72
std::shared_ptr< statistics::Model > m_response_func
response function for the computation of the super-sample covariance
Definition: Posterior.h:63
std::shared_ptr< cbl::random::UniformRandomNumbers_Int > m_seed_generator
seed generator
Definition: Posterior.h:75
int get_Nparameters()
get the number of parameters used
Definition: Posterior.h:306
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
Definition: Posterior.cpp:361
double log(std::vector< double > &pp) const
the logarithm of the un-normalized posterior
Definition: Posterior.cpp:137
LogLikelihood_function get_m_log_likelihood_function_grid()
get the values of the internal variable m_log_likelihood_function_grid
Definition: Posterior.h:376
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
Definition: Posterior.cpp:312
void m_set_seed(const int seed)
set the internal attribute m_seed and related quantities
Definition: Posterior.cpp:47
std::vector< std::vector< double > > get_parameters()
get the values of the internal variable m_parameters
Definition: Posterior.h:327
double chi2(const std::vector< double > parameter={}) const
the
Definition: Posterior.cpp:155
std::vector< double > m_acceptance
the MCMC acceptance rate
Definition: Posterior.h:69
bool get_m_use_grid()
get the value of the internal variable m_use_grid
Definition: Posterior.h:320
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
Definition: Posterior.cpp:753
int m_get_seed()
get the value of the internal variable m_seed
Definition: Posterior.h:313
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
Definition: Posterior.cpp:732
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
Definition: Posterior.cpp:502
int m_generate_seed()
generate a seed
Definition: Posterior.h:104
void set_response_function(std::shared_ptr< statistics::Model > response)
set the response function used to compute the super-sample covariance
Definition: Posterior.h:384
std::shared_ptr< void > get_m_likelihood_inputs()
get the values of the internal variable m_likelihood_inputs
Definition: Posterior.h:341
std::vector< double > m_log_likelihood
the logarithm of the likelihood
Definition: Posterior.h:66
Likelihood_function get_m_likelihood_function_grid()
get the values of the internal variable m_likelihood_function_grid
Definition: Posterior.h:369
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
Definition: Posterior.cpp:741
int m_Nparameters
the number of parameters
Definition: Posterior.h:81
~Posterior()=default
default destructor
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
Definition: Posterior.cpp:560
std::shared_ptr< statistics::Model > get_response_function()
return the response function used to compute the super-sample covariance
Definition: Posterior.h:392
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
Definition: Posterior.cpp:490
std::vector< double > m_weight
the chain weight
Definition: Posterior.h:87
std::vector< double > get_log_posterior()
get the values of the internal variable m_log_posterior
Definition: Posterior.h:334
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
Definition: Posterior.cpp:190
std::vector< double > m_log_posterior
the logarithm of the posterior
Definition: Posterior.h:78
std::shared_ptr< ModelParameters > parameters() const
return the posterior parameters
Definition: Posterior.h:197
void m_isSet_response()
check if the response function used to compute the super-sample covariance is set
Definition: Posterior.h:110
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)
Definition: Posterior.cpp:268
void write_maximization_results(const std::string output_dir, const std::string root_file)
write maximization results on a file
Definition: Posterior.cpp:699
Likelihood_function get_m_likelihood_function()
get the values of the internal variable m_likelihood_function
Definition: Posterior.h:362
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
Definition: Posterior.cpp:446
Posterior()=default
default constructor
std::vector< std::vector< double > > m_parameters
the parameters
Definition: Posterior.h:84
static const std::string defaultString
default std::string value
Definition: Constants.h:336
LikelihoodType
the type of likelihood function
std::function< double(std::vector< double > &, const std::shared_ptr< void >)> LogLikelihood_function
definition of a function for computation of the LogLikelihood
std::function< double(std::vector< double > &, const std::shared_ptr< void >)> Likelihood_function
definition of a function for computation of the Likelihood
The global namespace of the CosmoBolognaLib
Definition: CAMB.h:38
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
Definition: Kernel.h:780