CosmoBolognaLib
Free Software C++/Python libraries for cosmological calculations
LikelihoodFunction.cpp
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 #include "LikelihoodFunction.h"
34 
35 using namespace std;
36 
37 using namespace cbl;
38 
39 // ============================================================================================
40 
41 
42 cbl::statistics::STR_likelihood_inputs::STR_likelihood_inputs (const std::shared_ptr<data::Data> input_data, const std::shared_ptr<Model> input_model, const vector<size_t> input_x_index, const int input_w_index) : data(input_data), model(input_model)
43 {
44  switch (data->dataType()) {
46  xx = data->xx();
47  weights1D.resize(data->ndata(), 1.);
48  break;
49 
51 
52  if (input_x_index.size()==0)
53  xx = data->xx();
54  else
55  for (int i=0; i<data->ndata(); i++) // using extra info
56  xx.push_back(data->extra_info(input_x_index[0], i));
57 
58  if (input_w_index<0)
59  weights1D.resize(data->ndata(), 1.);
60  else
61  for (int i=0; i<data->ndata(); i++) // using extra info
62  weights1D.push_back(data->extra_info(input_w_index, i));
63  break;
64 
65  case (data::DataType::_2D_):
66  xx = data->xx();
67  yy = data->yy();
68  if (input_w_index<0)
69  weights2D.resize(data->xsize(), vector<double>(data->ysize(), 1.));
70  break;
71 
73  if (input_x_index.size()==0) {
74  xx = data->xx();
75  yy = data->yy();
76  }
77  else {
78  for (int i=0; i<data->ndata(); i++) { // using extra info
79  xx.push_back(data->extra_info(input_x_index[0], i));
80  yy.push_back(data->extra_info(input_x_index[1], i));
81  }
84  }
85 
86  if (input_w_index<0)
87  weights2D.resize(data->xsize(), vector<double>(data->ysize(), 1.));
88  else {
89  weights2D.resize(data->xsize(), vector<double>(data->ysize(), 0));
90  for (int i=0; i<data->xsize(); i++)
91  for (int j=0; j<data->ysize(); j++)
92  weights2D[i][j] = data->extra_info(input_w_index, i*data->ysize()+j);
93  }
94  break;
95  default:
96  ErrorCBL("wrong dataType!", "STR_likelihood_inputs", "LikelihoodFunction.cpp");
97  }
98 }
99 
100 
101 // ============================================================================================
102 
103 
104 double statistics::LogLikelihood_1D_interpolated (std::vector<double> &likelihood_parameter, const std::shared_ptr<void> fixed_parameter)
105 {
106  // ----- extract the parameters -----
107  shared_ptr<statistics::STR_likelihood_inputs> pp = static_pointer_cast<statistics::STR_likelihood_inputs>(fixed_parameter);
108 
109  double ll = pp->interp_function1D->operator()(likelihood_parameter[0]);
110  pp->model->parameters()->full_parameter(likelihood_parameter);
111 
112  return ll;
113 }
114 
115 
116 // ============================================================================================
117 
118 
119 double statistics::LogLikelihood_2D_interpolated (std::vector<double> &likelihood_parameter, const std::shared_ptr<void> fixed_parameter)
120 {
121  // ----- extract the parameters -----
122  shared_ptr<statistics::STR_likelihood_inputs> pp = static_pointer_cast<statistics::STR_likelihood_inputs>(fixed_parameter);
123 
124  double ll = pp->interp_function2D->operator()(likelihood_parameter[0], likelihood_parameter[1]);
125  pp->model->parameters()->full_parameter(likelihood_parameter);
126 
127  return ll;
128 }
129 
130 
131 // ============================================================================================
132 
133 
134 double statistics::LogLikelihood_Gaussian_1D_error (std::vector<double> &likelihood_parameter, const std::shared_ptr<void> fixed_parameter)
135 {
136  // ----- extract the parameters -----
137  shared_ptr<statistics::STR_likelihood_inputs> pp = static_pointer_cast<statistics::STR_likelihood_inputs>(fixed_parameter);
138 
139  // ----- compute the model values -----
140 
141  vector<double> computed_model = pp->model->operator()(pp->xx, likelihood_parameter);
142 
143 
144  // ----- estimate the Gaussian log-likelihood -----
145 
146  double LogLikelihood = 0.;
147  for (int i=0; i<pp->data->ndata(); i++)
148  LogLikelihood += pow((pp->data->data(i)-computed_model[i])/pp->data->error(i), 2);
149 
150  return -0.5*LogLikelihood;
151 }
152 
153 
154 // ============================================================================================
155 
156 
157 double statistics::LogLikelihood_Gaussian_1D_covariance (std::vector<double> &likelihood_parameter, const std::shared_ptr<void> fixed_parameter)
158 {
159  // ----- extract the parameters -----
160 
161  shared_ptr<statistics::STR_likelihood_inputs> pp = static_pointer_cast<statistics::STR_likelihood_inputs>(fixed_parameter);
162 
163 
164  // ----- compute the model values -----
165 
166  vector<double> computed_model = pp->model->operator()(pp->xx, likelihood_parameter);
167 
168  // ----- compute the difference between model and data at each bin -----
169 
170  vector<double> diff(pp->data->ndata(), 0);
171  for (int i=0; i<pp->data->ndata(); i++)
172  diff[i] = pp->data->data(i)-computed_model[i];
173 
174 
175  // ----- estimate the Gaussian log-likelihood -----
176 
177  double LogLikelihood = 0.;
178  for (int i=0; i<pp->data->ndata(); i++)
179  for (int j=0; j<pp->data->ndata(); j++)
180  LogLikelihood += diff[i]*pp->data->inverse_covariance(i, j)*diff[j];
181 
182  return -0.5*LogLikelihood;
183 }
184 
185 
186 // ============================================================================================
187 
188 
189 double statistics::LogLikelihood_Gaussian_2D_error (std::vector<double> &likelihood_parameter, const std::shared_ptr<void> fixed_parameter)
190 {
191  // ----- extract the parameters -----
192  shared_ptr<statistics::STR_likelihood_inputs> pp = static_pointer_cast<statistics::STR_likelihood_inputs>(fixed_parameter);
193 
194  // ----- compute the model values -----
195  vector<vector<double>> computed_model = pp->model->operator()(pp->xx, pp->yy, likelihood_parameter);
196 
197  // ----- estimate the Gaussian log-likelihood -----
198 
199  double LogLikelihood = 0.;
200  for (int i=0; i<pp->data->xsize(); i++)
201  for (int j=0; j<pp->data->ysize(); j++)
202  LogLikelihood += pow((pp->data->data(i, j)-computed_model[i][j])/pp->data->error(i, j), 2);
203 
204  return -0.5*LogLikelihood;
205 }
206 
207 
208 // ============================================================================================
209 
210 
211 double statistics::LogLikelihood_Poissonian_1D_ (std::vector<double> &likelihood_parameter, const std::shared_ptr<void> fixed_parameter)
212 {
213  // ----- extract the parameters -----
214  shared_ptr<statistics::STR_likelihood_inputs> pp = static_pointer_cast<statistics::STR_likelihood_inputs>(fixed_parameter);
215 
216  // ----- compute the model values -----
217  vector<double> computed_model = pp->model->operator()(pp->xx, likelihood_parameter);
218 
219  // ----- estimate the Poissonian log-likelihood -----
220 
221  double LogLikelihood = 0.;
222 
223  for (int i=0; i<pp->data->ndata(); i++)
224  LogLikelihood += pp->data->data(i)*cbl::Ln(computed_model[i],1.e-50)-computed_model[i]-gsl_sf_lnfact(int(pp->data->data(i)));
225 
226  return LogLikelihood;
227 }
228 
229 
230 // ============================================================================================
231 
232 
233 double statistics::LogLikelihood_Poissonian_2D_ (std::vector<double> &likelihood_parameter, const std::shared_ptr<void> fixed_parameter)
234 {
235  // ----- extract the parameters -----
236  shared_ptr<statistics::STR_likelihood_inputs> pp = static_pointer_cast<statistics::STR_likelihood_inputs>(fixed_parameter);
237 
238  // ----- compute the model values -----
239  vector<vector<double>> computed_model = pp->model->operator()(pp->xx, pp->yy, likelihood_parameter);
240 
241  // ----- estimate the Poissonian log-likelihood -----
242 
243  double LogLikelihood = 0.;
244 
245  for (int i=0; i<pp->data->xsize(); i++)
246  for (int j=0; j<pp->data->ysize(); j++)
247  LogLikelihood += pp->data->data(i,j)*cbl::Ln(computed_model[i][j],1.e-50)-computed_model[i][j]-gsl_sf_lnfact(int(pp->data->data(i, j)));
248 
249  return LogLikelihood;
250 }
251 
Likelihood function.
@ _2D_extra_
2D dataset with extra information
@ _1D_extra_
1D dataset with extra information
double LogLikelihood_Gaussian_1D_covariance(std::vector< double > &likelihood_parameter, const std::shared_ptr< void > input)
function to compute the gaussian loglikelihood
double LogLikelihood_Gaussian_1D_error(std::vector< double > &likelihood_parameter, const std::shared_ptr< void > input)
function to compute the Gaussian log-likelihood
double LogLikelihood_Poissonian_1D_(std::vector< double > &likelihood_parameter, const std::shared_ptr< void > input)
function to compute the poissonian loglikelihood
double LogLikelihood_1D_interpolated(std::vector< double > &likelihood_parameter, const std::shared_ptr< void > input)
function to compute the loglikelihood on a grid
double LogLikelihood_Poissonian_2D_(std::vector< double > &likelihood_parameter, const std::shared_ptr< void > input)
function to compute the poissonian loglikelihood
double LogLikelihood_2D_interpolated(std::vector< double > &likelihood_parameter, const std::shared_ptr< void > input)
function to compute the loglikelihood on a grid
double LogLikelihood_Gaussian_2D_error(std::vector< double > &likelihood_parameter, const std::shared_ptr< void > input)
function to compute the gaussian loglikelihood model with one parameter
The global namespace of the CosmoBolognaLib
Definition: CAMB.h:38
std::vector< T > different_elements(const std::vector< T > vect_input)
get the unique elements of a std::vector
Definition: Kernel.h:1349
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
T Ln(const T val, const double fact=0.9)
natural logarithm
Definition: Kernel.h:937
std::shared_ptr< data::Data > data
data containers
std::vector< double > xx
x position where the model is computed
std::vector< double > weights1D
weight for the bin - 1D
STR_likelihood_inputs(const std::shared_ptr< data::Data > input_data, const std::shared_ptr< Model > input_model, const std::vector< size_t > input_x_index={0, 2}, const int input_w_index=-1)
constructor
std::vector< double > yy
y position where the model is computed
std::vector< std::vector< double > > weights2D
weight for the bin - 2D