CosmoBolognaLib
Free Software C++/Python libraries for cosmological calculations
LikelihoodParameters.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 
34 #include "LikelihoodParameters.h"
35 
36 using namespace std;
37 
38 using namespace cbl;
39 
40 
41 // ============================================================================================
42 
43 
45 {
46  set_parameters(m_nparameters, m_parameter_type, m_parameter_name);
47 }
48 
49 // ============================================================================================
50 
51 
53 {
54  string stat;
55 
56  switch (m_parameter_type[p]) {
57  case statistics::ParameterType::_Base_:
58  if (m_parameter_isFixed[p])
59  stat = "FIXED";
60  else
61  stat = "FREE";
62  break;
63 
64  case statistics::ParameterType::_Correlated_:
65  stat = "FREE";
66  break;
67 
68  case statistics::ParameterType::_Derived_:
69  stat = "OUTPUT";
70  break;
71 
72  default:
73  ErrorCBL("no such kind of parameter!", "status", "LikelihoodParameters.cpp");
74  }
75 
76  return stat;
77 }
78 
79 
80 // ============================================================================================
81 
82 
84 {
85  vector<string> stat;
86  for (size_t i=0; i<m_nparameters; i++) {
87  switch (m_parameter_type[i]) {
88  case statistics::ParameterType::_Base_:
89  if (m_parameter_isFixed[i])
90  stat.push_back("FIXED");
91  else
92  stat.push_back("FREE");
93  break;
94 
95  case statistics::ParameterType::_Correlated_:
96  stat.push_back("FREE");
97  break;
98 
99  case statistics::ParameterType::_Derived_:
100  stat.push_back("OUTPUT");
101  break;
102 
103  default:
104  ErrorCBL("no such kind of parameter!", "status", "LikelihoodParameters.cpp");
105  }
106  }
107  return stat;
108 }
109 
110 
111 // ============================================================================================
112 
113 
114 vector<double> cbl::statistics::LikelihoodParameters::full_parameter (const vector<double> parameter_value) const
115 {
116  if (parameter_value.size() == m_nparameters_free) {
117  vector<double> all_parameter(m_nparameters, 0);
118 
119  for(size_t i=0; i<m_nparameters_free; i++)
120  all_parameter[m_free_parameter[i]] = parameter_value[i];
121 
122  for(size_t i=0; i<m_nparameters_fixed; i++)
123  all_parameter[m_fixed_parameter[i]] = m_parameter_fixed_value[m_fixed_parameter[i]];
124 
125  for(size_t i=0; i<m_nparameters_derived; i++)
126  all_parameter[m_derived_parameter[i]] = 0.;
127 
128  return all_parameter;
129  }
130  else if (parameter_value.size()==m_nparameters)
131  return parameter_value;
132  else
133  ErrorCBL("the size of the vector of free parameters is incorrect!", "full_parameters", "LikelihoodParameters.cpp");
134 
135  vector<double> vv;
136  return vv;
137 }
138 
139 
140 // ============================================================================================
141 
142 
144 {
145  m_nparameters_free = 0;
146  m_nparameters_fixed = 0;
147  m_nparameters_base = 0;
148  m_nparameters_derived = 0;
149 
150  m_base_parameter.erase(m_base_parameter.begin(), m_base_parameter.end());
151  m_fixed_parameter.erase(m_fixed_parameter.begin(), m_fixed_parameter.end());
152  m_free_parameter.erase(m_free_parameter.begin(), m_free_parameter.end());
153  m_derived_parameter.erase(m_derived_parameter.begin(), m_derived_parameter.end());
154 
155  for (size_t i=0; i<m_nparameters; i++) {
156  switch (m_parameter_type[i]) {
157  case statistics::ParameterType::_Base_:
158  if (m_parameter_isFixed[i]) {
159  m_nparameters_fixed ++;
160  m_fixed_parameter.push_back(i);
161  }
162  else {
163  m_nparameters_free ++;
164  m_free_parameter.push_back(i);
165  }
166  m_nparameters_base ++;
167  m_base_parameter.push_back(i);
168  break;
169 
170  case statistics::ParameterType::_Correlated_:
171  if (m_parameter_isFixed[i]) WarningMsgCBL(m_parameter_name[i]+" set free since is a correlated parameter! ", "m_set_parameter_type", "LikelihoodParameters.cpp");
172  m_nparameters_free ++;
173  m_free_parameter.push_back(i);
174  m_nparameters_correlated ++;
175  m_nparameters_base ++;
176  m_base_parameter.push_back(i);
177  break;
178 
179  case statistics::ParameterType::_Derived_:
180  m_nparameters_derived ++;
181  m_derived_parameter.push_back(i);
182  break;
183 
184  default:
185  ErrorCBL("no such kind of parameter!", "m_set_parameter_type", "LikelihoodParameters.cpp");
186  }
187  }
188 }
189 
190 
191 // ============================================================================================
192 
193 
194 cbl::statistics::LikelihoodParameters::LikelihoodParameters (const size_t nparameters, std::vector<ParameterType> parameterTypes, std::vector<std::string> parameterNames)
195 {
196  set_parameters(nparameters, parameterTypes, parameterNames);
197 }
198 
199 
200 // ============================================================================================
201 
202 
204 {
205  return m_nparameters_free;
206 }
207 
208 
209 // ============================================================================================
210 
211 
213 {
214  return m_nparameters_fixed;
215 }
216 
217 
218 // ============================================================================================
219 
220 
221 void cbl::statistics::LikelihoodParameters::set_parameters (const size_t nparameters, std::vector<ParameterType> parameterTypes, std::vector<std::string> parameterNames)
222 {
223  //Check parameterTypes size
224 
225  if (nparameters==0)
226  ErrorCBL("nparameters must be >0!", "set_parameters", "LikelihoodParameters.cpp");
227 
228  if ((parameterTypes.size()!=nparameters) && (parameterTypes.size()!=0))
229  ErrorCBL("the size of parameterTypes is incorrect!", "set_parameters", "LikelihoodParameters.cpp");
230 
231  if ((parameterNames.size()!=nparameters) && (parameterNames.size()!=0))
232  ErrorCBL("the size of parameterNames is incorrect!", "set_parameters", "LikelihoodParameters.cpp");
233 
234 
235  if ((parameterTypes.size()==nparameters) && (parameterNames.size()==nparameters)) {
236  m_nparameters=nparameters;
237  m_parameter_type = parameterTypes;
238  m_parameter_name = parameterNames;
239  }
240  else if ((parameterTypes.size()==0) && (parameterNames.size()==0)) {
241  m_nparameters=nparameters;
242  vector<ParameterType> pTypes(m_nparameters);
243  vector<string> pNames(m_nparameters);
244  for(size_t i=0; i<m_nparameters; i++) {
245  pTypes[i] = ParameterType::_Base_;
246  pNames[i] = "par_"+conv(i+1, par::fINT);
247  }
248  m_parameter_type = pTypes;
249  m_parameter_name = pNames;
250  }
251  else if ((parameterTypes.size()==nparameters) && (parameterNames.size()==0)) {
252  m_nparameters=nparameters;
253  vector<string> pNames(m_nparameters);
254  for(size_t i=0; i<m_nparameters; i++)
255  pNames[i] = "par_"+conv(i+1, par::fINT);
256 
257  m_parameter_type = parameterTypes;
258  m_parameter_name = pNames;
259  }
260  else if ((parameterTypes.size()==0) && (parameterNames.size()==0)) {
261  m_nparameters=nparameters;
262  vector<ParameterType> pTypes(m_nparameters);
263  for(size_t i=0; i<m_nparameters; i++)
264  pTypes[i] = ParameterType::_Base_;
265 
266  m_parameter_type = pTypes;
267  m_parameter_name = parameterNames;
268  }
269 
270  m_parameter_bestfit_value.erase(m_parameter_bestfit_value.begin(), m_parameter_bestfit_value.end());
271  m_parameter_isFixed.resize(m_nparameters, false);
272  m_parameter_fixed_value.resize(m_nparameters, 0);
273  m_set_parameter_type();
274 }
275 
276 
277 // ============================================================================================
278 
279 
281 {
282  switch (m_parameter_type[p]) {
283 
284  case ParameterType::_Base_:
285  m_parameter_isFixed[p] = false;
286  m_set_parameter_type();
287  break;
288 
289  case ParameterType::_Correlated_:
290  WarningMsgCBL(m_parameter_name[p]+" is a correlated parameter!", "free", "LikelihoodParameters.cpp");
291  break;
292 
293  case ParameterType::_Derived_:
294  WarningMsgCBL(m_parameter_name[p]+" is a derived parameter!", "free", "LikelihoodParameters.cpp");
295  break;
296 
297  default:
298  ErrorCBL("no such kind of parameter!", "free", "LikelihoodParameters.cpp");
299  }
300 }
301 
302 
303 // ============================================================================================
304 
305 
306 void cbl::statistics::LikelihoodParameters::fix (const int p, const double value)
307 {
308  switch (m_parameter_type[p]) {
309 
310  case statistics::ParameterType::_Base_:
311  m_parameter_isFixed[p]=true;
312  m_parameter_fixed_value[p] = value;
313  m_set_parameter_type();
314  break;
315 
316  case statistics::ParameterType::_Correlated_:
317  WarningMsgCBL(m_parameter_name[p]+" is a correlated parameter!", "fix", "LikelihoodParameters.cpp");
318  break;
319 
320  case statistics::ParameterType::_Derived_:
321  WarningMsgCBL(m_parameter_name[p]+" is a derived parameter!", "fix", "LikelihoodParameters.cpp");
322  break;
323 
324  default:
325  ErrorCBL("no such kind of parameter!", "fix", "LikelihoodParameters.cpp");
326  }
327 }
328 
329 
330 // ============================================================================================
331 
332 
334 {
335  fix(p, m_parameter_bestfit_value[p]);
336 }
337 
338 
339 // ============================================================================================
340 
341 
343 {
344  if (m_parameter_bestfit_value.size() == 0)
345  ErrorCBL("the best-fit values have not been computed!", "bestfit_value", "LikelihoodParameters.cpp");
346 
347  return m_parameter_bestfit_value[p];
348 }
349 
350 // ============================================================================================
351 
352 
354 {
355  if (m_parameter_bestfit_value.size()==0)
356  ErrorCBL("the best-fit values have not been computed!", "bestfit_value", "LikelihoodParameters.cpp");
357 
358  return m_parameter_bestfit_value;
359 }
360 
361 
362 // ============================================================================================
363 
364 
365 void cbl::statistics::LikelihoodParameters::set_bestfit_values (const vector<double> bestfit_value)
366 {
367  if (bestfit_value.size() != m_nparameters)
368  ErrorCBL("the size of the input vector is incorrect!", "set_bestfit_values", "LikelihoodParameters.cpp");
369 
370  m_parameter_bestfit_value.erase(m_parameter_bestfit_value.begin(), m_parameter_bestfit_value.end());
371  for (size_t i=0; i<m_nparameters; i++)
372  m_parameter_bestfit_value.push_back(bestfit_value[i]);
373 }
374 
375 
376 // ============================================================================================
377 
378 
380 {
381  if (m_parameter_bestfit_value.size() == m_nparameters) {
382  for (size_t i=0; i<m_nparameters; i++) {
383 
384  switch (m_parameter_type[i]) {
385  case statistics::ParameterType::_Base_:
386  if (m_parameter_isFixed[i])
387  coutCBL << "Parameter: " << par::col_yellow << m_parameter_name[i] << par::col_default << " --> status: " << par::col_purple << "FIXED" << endl;
388  else
389  coutCBL << "Parameter: " << par::col_yellow << m_parameter_name[i] << par::col_default << " --> status: " << par::col_green << "FREE" << endl;
390  break;
391 
392  case statistics::ParameterType::_Correlated_:
393  coutCBL << "Parameter: " << par::col_yellow << m_parameter_name[i] << par::col_default << " --> status: " << par::col_green << "FREE" << endl;
394  break;
395 
396  case statistics::ParameterType::_Derived_:
397  coutCBL << "Parameter: " << par::col_yellow << m_parameter_name[i] << par::col_default << " --> status: " << par::col_bred << "OUTPUT" << endl;
398  break;
399 
400  default:
401  ErrorCBL("no such kind of parameter!", "write_bestfit_info", "LikelihoodParameters.cpp");
402  }
403 
404  Print(m_parameter_bestfit_value[i], 5, 10, "value = ", "\n", true, std::cout);
405  cout << endl;
406  }
407  }
408  else
409  ErrorCBL("the best-fit values have not been computed!", "write_bestfit_info", "LikelihoodParameters.cpp");
410 
411 }
#define coutCBL
CBL print message.
Definition: Kernel.h:734
The class LikelihoodParameters.
std::vector< double > bestfit_value() const override
get the protected member m_value
void free(const int p) override
set m_fixed to false;
void fix(const int p, const double value) override
fix the parameter at the input value;
std::vector< std::string > status() const
return all the model parameter status
void set_bestfit_values(const std::vector< double > bestfit_value) override
set the protected member m_bestfit_value
void m_set_parameter_type() override
private member to set the parameter types
LikelihoodParameters()=default
default constructor
void reset() override
reset the parameter vectors
void write_bestfit_info() override
write the best fit info
void fix_at_bestfit(const int p) override
fix the parameter at the bestfit value, contained in m_bestfit_value;
std::vector< double > full_parameter(const std::vector< double > parameter_value) const override
return all the model parameter
size_t nparameters_fixed() const override
return the number of fixed parameters
size_t nparameters_free() const override
return the number of free parameters
void set_parameters(const size_t nparameters, std::vector< ParameterType > parameterTypes, std::vector< std::string > parameterNames) override
set the parameter
static const std::string col_green
green colour (used when printing something on the screen)
Definition: Constants.h:309
static const std::string col_default
default colour (used when printing something on the screen)
Definition: Constants.h:297
static const std::string col_yellow
yellow colour (used when printing something on the screen)
Definition: Constants.h:315
static const std::string col_bred
bold high intensty red colour (used when printing something on the screen)
Definition: Constants.h:303
static const std::string col_purple
purple colour (used when printing something on the screen)
Definition: Constants.h:318
static const char fINT[]
conversion symbol for: int -> std::string
Definition: Constants.h:121
The global namespace of the CosmoBolognaLib
Definition: CAMB.h:38
std::string conv(const T val, const char *fact)
convert a number to a std::string
Definition: Kernel.h:903
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
Definition: Kernel.h:1142
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
void WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message
Definition: Kernel.h:747