CosmoBolognaLib
Free Software C++/Python libraries for cosmological calculations
CombinedPosterior.h
Go to the documentation of this file.
1 /********************************************************************
2  * Copyright (C) 2020 by Davide Pelliciari and Sofia Contarini *
3  * davide.pelliciari@studio.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 
37 #ifndef __COMBINEDPOSTERIOR__
38 #define __COMBINEDPOSTERIOR__
39 
40 #include "RandomNumbers.h"
41 #include "Prior.h"
42 #include "Likelihood.h"
43 #include "Posterior.h"
44 #include "CovarianceMatrix.h"
45 #include "SuperSampleCovariance.h"
46 
47 
48 // ===================================================================================================
49 
50 
51 namespace cbl {
52 
53  namespace statistics {
54 
55 
64 
66  std::shared_ptr<data::CovarianceMatrix> covariance;
67 
69  std::vector<std::shared_ptr<Model>> models;
70 
72  std::vector<std::shared_ptr<Model>> responses;
73 
75  std::shared_ptr<cbl::cosmology::SuperSampleCovariance> Sij;
76 
78  std::vector<std::vector<double>> xx;
79 
81  std::vector<double> flat_xx;
82 
84  std::vector<double> flat_data;
85 
87  std::vector<std::vector<int>> par_indexes;
88 
90  std::vector<int> cosmoPar_indexes;
91 
96  };
97 
105  class CombinedPosterior : public Posterior {
106 
107  private:
108 
111 
113  std::vector<std::shared_ptr<Posterior>> m_posteriors;
114 
117 
119  std::vector<std::vector<int>> m_parameter_indexes;
120 
122  std::vector<std::vector<int>> m_parameter_indexes2;
123 
125  std::vector<int> m_cosmoPar_indexes;
126 
128  std::vector<std::vector<std::string>> m_parameter_names;
129 
131  bool impsampling = false;
132 
134  std::vector<std::shared_ptr<void>> m_likelihood_inputs;
135 
137  std::vector<LogLikelihood_function> m_log_likelihood_functions;
138 
140  std::vector<Likelihood_function> m_likelihood_functions;
141 
143  std::vector<LogLikelihood_function> m_likelihood_functions_grid;
144 
146  std::vector<LogLikelihood_function> m_log_likelihood_functions_grid;
147 
149  std::vector<std::shared_ptr<data::Data>> m_datasets;
150 
152  std::vector<std::shared_ptr<Model>> m_models;
153 
155  std::vector<bool> m_use_grid;
156 
157 
158  public:
159 
164 
170  CombinedPosterior () = default;
171 
205  CombinedPosterior (const std::vector<std::shared_ptr<Posterior>> posteriors, std::vector<std::string> repeated_par={}, const std::vector<std::vector<std::vector<int>>> common_repeated_par={});
206 
263  CombinedPosterior (const std::vector<std::vector<std::shared_ptr<Posterior>>> posteriors, const std::vector<std::shared_ptr<data::CovarianceMatrix>> covariance, const std::vector<cbl::statistics::LikelihoodType> likelihood_types, const std::vector<std::string> repeated_par={}, const std::vector<std::vector<std::vector<int>>> common_repeated_par={}, const std::vector<std::shared_ptr<cbl::cosmology::SuperSampleCovariance>> SSC={});
264 
270  ~CombinedPosterior () = default;
271 
273 
274 
284  void set_log_posterior(const std::vector<double> logpostA, const std::vector<double> logpostB);
285 
295  void set_parameters(const std::vector<std::vector<double>> parametersA, const std::vector<std::vector<double>> parametersB);
296 
306  void set_weight(const std::vector<double> weightsA, const std::vector<double> weightsB);
307 
318  void m_check_repeated_par (int dummy_Nposteriors, std::vector<std::shared_ptr<Posterior>> posteriors, const std::vector<std::string> repeated_par);
319 
333  void m_check_common_repeated_par (int dummy_Nposteriors, std::vector<std::shared_ptr<Posterior>> posteriors, std::vector<std::string> repeated_par, std::vector<std::vector<std::vector<int>>> common_repeated_par);
334 
350  void m_add_prior (bool par_is_repeated, std::vector<std::shared_ptr<Posterior>> posteriors, const int N, const int k, std::vector<std::shared_ptr<cbl::statistics::PriorDistribution>> &prior_distributions);
351 
378  void m_set_common_repeated_par (std::vector<std::shared_ptr<Posterior>> posteriors, const bool is_in_parnames, const int N, const int k, const std::vector<std::string> repeated_par, const std::vector<std::vector<std::vector<int>>> common_repeated_par, std::vector<std::shared_ptr<cbl::statistics::PriorDistribution>> &prior_distributions, std::vector<std::string> &parameter_names, std::vector<std::string> &original_names, std::vector<ParameterType> &parameter_types);
379 
406  void m_set_repeated_par (std::vector<std::shared_ptr<Posterior>> posteriors, const bool is_in_parnames, const int N, const int k, const std::vector<std::string> repeated_par, const std::vector<std::vector<std::vector<int>>> common_repeated_par, std::vector<std::shared_ptr<cbl::statistics::PriorDistribution>> &prior_distributions, std::vector<std::string> &parameter_names, std::vector<std::string> &original_names, std::vector<ParameterType> &parameter_types);
407 
439  void m_set_parameters_priors (std::vector<std::shared_ptr<Posterior>> posteriors, std::vector<std::string> repeated_par={}, const std::vector<std::vector<std::vector<int>>> common_repeated_par={});
440 
441 
447  void m_set_independent_probes ();
448 
449 
462  void importance_sampling(const int distNum, const double cell_size, const double rMAX, const double cut_sigma=-1);
463 
486  void importance_sampling(const std::string output_path, const std::string model_nameA, const std::string model_nameB, const std::vector<double> start, const int chain_size, const int nwalkers, const int burn_in, const int thin);
487 
518  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);
519 
520 
539  void initialize_chains (const int chain_size, const int n_walkers);
540 
556  void initialize_chains (const int chain_size, const int n_walkers, const std::string input_dir, const std::string input_file, const int seed);
557 
590  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);
591 
592 
609  double operator () (std::vector<double> &pp) const;
610 
628  double log (std::vector<double> &pp) const;
629 
663  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)
664  { (void)start; (void)parameter_limits; (void)max_iter; (void)tol; (void)epsilon; ErrorCBL("the method is used without parameter_ranges!", "maximize", "Posterior.h"); }
665 
681  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);
682 
739  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);
740 
791  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);
816  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);
817 
836  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);
837 
852  void write_chain_fits (const std::string output_dir, const std::string output_file, const int start=0, const int thin=1);
853 
875  void write_model_from_chain (const std::string output_dir, const std::string output_file, const int start, const int thin, const std::vector<double> xx={}, const std::vector<double> yy={});
876 
886  void write_maximization_results (const std::string dir_output, const std::string file);
887 
897  std::vector<std::vector<double>> read (const std::string path, const std::string filename);
898 
899 
900  };
901 
906 
918  double LogLikelihood_Gaussian_combined (std::vector<double> &likelihood_parameter, const std::shared_ptr<void> input);
919 
931  double LogLikelihood_Poissonian_combined (std::vector<double> &likelihood_parameter, const std::shared_ptr<void> input);
932 
944  double LogLikelihood_Poissonian_SSC_combined (std::vector<double> &likelihood_parameter, const std::shared_ptr<void> input);
945 
947 
948  }
949 }
950 
951 #endif
The class CovarianceMatrix.
The class Likelihood.
The class Posterior.
The class Prior.
Class functions used to generate random numbers.
The class SuperSampleCovariance.
The class CombinedPosterior.
void importance_sampling(const int distNum, const double cell_size, const double rMAX, const double cut_sigma=-1)
do the importance sampling for two Posterior objects, which has been read externally
std::vector< std::vector< int > > m_parameter_indexes2
indexes of the parameters, for each posterior object, in the total parameter vector
std::vector< std::vector< int > > m_parameter_indexes
indexes of the parameters, for each posterior object, in the total parameter vector
int m_Nposteriors
number of posteriors
void m_add_prior(bool par_is_repeated, std::vector< std::shared_ptr< Posterior >> posteriors, const int N, const int k, std::vector< std::shared_ptr< cbl::statistics::PriorDistribution >> &prior_distributions)
add a prior
void m_set_parameters_priors(std::vector< std::shared_ptr< Posterior >> posteriors, std::vector< std::string > repeated_par={}, const std::vector< std::vector< std::vector< int >>> common_repeated_par={})
set the parameters and the priors
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 combination on the screen.
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
~CombinedPosterior()=default
default destructor
void m_set_independent_probes()
set all the internal variables needed for modelling independent probes
std::vector< bool > m_use_grid
use_grid vector
std::vector< std::shared_ptr< Model > > m_models
models to test
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 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)
std::vector< std::vector< double > > read(const std::string path, const std::string filename)
read an entire 2d table data (MCMC chain) of unknown dimension
bool impsampling
importance sampling mode
STR_DependentProbes_data_model m_data_model
the container of parameters for statistically dependent probes
double log(std::vector< double > &pp) const
evaluate the logarithm of the un-normalized posterior as the sum of all the logarithm of the un-norma...
void m_set_repeated_par(std::vector< std::shared_ptr< Posterior >> posteriors, const bool is_in_parnames, const int N, const int k, const std::vector< std::string > repeated_par, const std::vector< std::vector< std::vector< int >>> common_repeated_par, std::vector< std::shared_ptr< cbl::statistics::PriorDistribution >> &prior_distributions, std::vector< std::string > &parameter_names, std::vector< std::string > &original_names, std::vector< ParameterType > &parameter_types)
set a repeated parameter
void m_set_common_repeated_par(std::vector< std::shared_ptr< Posterior >> posteriors, const bool is_in_parnames, const int N, const int k, const std::vector< std::string > repeated_par, const std::vector< std::vector< std::vector< int >>> common_repeated_par, std::vector< std::shared_ptr< cbl::statistics::PriorDistribution >> &prior_distributions, std::vector< std::string > &parameter_names, std::vector< std::string > &original_names, std::vector< ParameterType > &parameter_types)
set a common repeated parameter
void m_check_repeated_par(int dummy_Nposteriors, std::vector< std::shared_ptr< Posterior >> posteriors, const std::vector< std::string > repeated_par)
check the repeated parameters
void set_log_posterior(const std::vector< double > logpostA, const std::vector< double > logpostB)
set the internal values of m_log_posterior as the concatenation of the logposterior vectors of two co...
void write_model_from_chain(const std::string output_dir, const std::string output_file, const int start, const int thin, const std::vector< double > xx={}, const std::vector< double > yy={})
write the model computing 16th, 50th and 84th percentiles from the MCMC
std::vector< LogLikelihood_function > m_likelihood_functions_grid
likelihood functions on a grid
CombinedPosterior()=default
default constructor
std::vector< Likelihood_function > m_likelihood_functions
likelihood functions
void set_weight(const std::vector< double > weightsA, const std::vector< double > weightsB)
set the internal values of m_weight as the concatenation of the weights vectors of two MCMC chains
std::vector< LogLikelihood_function > m_log_likelihood_functions
log-likelihood functions
std::vector< LogLikelihood_function > m_log_likelihood_functions_grid
log-likelihood functions on a grid
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 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 m_check_common_repeated_par(int dummy_Nposteriors, std::vector< std::shared_ptr< Posterior >> posteriors, std::vector< std::string > repeated_par, std::vector< std::vector< std::vector< int >>> common_repeated_par)
check the common repeated parameters
std::vector< std::shared_ptr< void > > m_likelihood_inputs
likelihood inputs
void set_parameters(const std::vector< std::vector< double >> parametersA, const std::vector< std::vector< double >> parametersB)
set the internal values of m_parameters as the concatenation of the parameters vectors of two cosmolo...
void write_maximization_results(const std::string dir_output, const std::string file)
write maximization results on a file
std::vector< std::shared_ptr< Posterior > > m_posteriors
shared pointers vector containing input Posterior objects
std::vector< std::vector< std::string > > m_parameter_names
names of the parameters, for each posterior object
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
std::vector< std::shared_ptr< data::Data > > m_datasets
data containers
double operator()(std::vector< double > &pp) const
evaluate the un-normalized posterior as the product of the un-normalized entry posteriors....
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)
initialize the chains in a ball around the posterior best-fit parameter values
std::vector< int > m_cosmoPar_indexes
indexes of the cosmological parameters
The class Posterior.
Definition: Posterior.h:55
static const std::string defaultString
default std::string value
Definition: Constants.h:336
double LogLikelihood_Poissonian_combined(std::vector< double > &likelihood_parameter, const std::shared_ptr< void > input)
Poissonian log-likelihood.
double LogLikelihood_Gaussian_combined(std::vector< double > &likelihood_parameter, const std::shared_ptr< void > input)
Gaussian log-likelihood.
double LogLikelihood_Poissonian_SSC_combined(std::vector< double > &likelihood_parameter, const std::shared_ptr< void > input)
Poissonian log-likelihood with super-sample covariance.
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
the structure STR_DependentProbes_data_model
STR_DependentProbes_data_model()=default
default constructor
std::vector< std::vector< int > > par_indexes
parameter indexes for the dependent probes
std::vector< double > flat_xx
flat xx vector
std::vector< std::shared_ptr< Model > > models
vector of pointers to the Model objects
std::vector< double > flat_data
flat data vector
std::vector< std::shared_ptr< Model > > responses
vector of pointers to the response functions, used for super-sample covariance
std::shared_ptr< data::CovarianceMatrix > covariance
pointer to the CovarianceMatrix object
std::vector< std::vector< double > > xx
values where the models are computed
std::shared_ptr< cbl::cosmology::SuperSampleCovariance > Sij
pointer to cbl::cosmology::SuperSampleCovariance object
std::vector< int > cosmoPar_indexes
indexes of the cosmological parameters