CosmoBolognaLib
Free Software C++/Python libraries for cosmological calculations
RandomNumbers.h
Go to the documentation of this file.
1 /********************************************************************
2  * Copyright (C) 2010 by Federico Marulli *
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 #ifndef __RANNUM__
35 #define __RANNUM__
36 
37 
38 #include "FFTlog.h"
39 
40 
41 // =====================================================================================
42 
43 
44 namespace cbl {
45 
50  typedef std::function<double(double, std::shared_ptr<void>, std::vector<double>)> distribution_func;
51 
57  typedef std::function<double(std::vector<double>, std::shared_ptr<void>)> nDim_distribution_func;
58 
66  namespace random {
67 
78  {
79  protected:
80 
82  std::mt19937_64 m_generator;
83 
85  int m_seed;
86 
88  double m_MinVal;
89 
91  double m_MaxVal;
92 
93  public:
94 
99  RandomNumbers () = default;
100 
108  RandomNumbers (const int seed, const double MinVal = par::defaultDouble, const double MaxVal = -par::defaultDouble);
109 
115  virtual ~RandomNumbers () = default;
116 
117 
122  virtual double operator () () = 0;
123 
128  void set_seed (const int seed);
129 
135  void set_range (const double MinVal, const double MaxVal);
136 
141  void set_value (const double value)
142  { (void)value; ErrorCBL("error!", "set_value", "RandomNumbers.h"); }
143 
148  virtual void set_mean (const double mean)
149  { (void)mean; ErrorCBL("error!", "set_mean", "RandomNumbers.h"); }
150 
156  virtual void set_mean_sigma (const double mean, const double sigma)
157  { (void)mean; (void)sigma; ErrorCBL("error!", "set_mean_sigma", "RandomNumbers.h"); }
158 
164  virtual void set_discrete_values (const std::vector<double> values, const std::vector<double> weights)
165  { (void)values; (void)weights; ErrorCBL("error!", "set_discrete_values", "RandomNumbers.h"); }
166 
172  virtual void set_interpolated_distribution (const std::vector<double> values, const std::vector<double> weights)
173  { (void)values; (void)weights; ErrorCBL("error!", "set_interpolated_distribution", "RandomNumbers.h"); }
174 
186  virtual void set_custom_distribution (const distribution_func func, const std::shared_ptr<void> modelInput, const std::vector<double> parameter)
187  { (void)func; (void)modelInput; (void)parameter; ErrorCBL("error!", "set_custom_distribution", "RandomNumbers.h"); }
188 
189  };
190 
202  {
203  protected:
204 
206  double m_value;
207 
208  public:
209 
214  ConstantRandomNumbers (const double value) : RandomNumbers(1)
215  {
216  m_value = value;
217  }
218 
222  ~ConstantRandomNumbers () = default;
223 
228  void set_value(const double value)
229  { m_value = value; }
230 
235  double operator () ()
236  {
237  return m_value;
238  }
239 
240  };
241 
242 
254  {
255  protected:
256 
258  std::shared_ptr<std::uniform_real_distribution<double>> m_distribution;
259 
260  public:
261 
268  UniformRandomNumbers (double MinVal, const double MaxVal, const int seed);
269 
275  ~UniformRandomNumbers () = default;
276 
281  double operator () ();
282  };
283 
284 
296  {
297  protected:
298 
300  std::shared_ptr<std::uniform_int_distribution<int>> m_distribution;
301 
302  public:
303 
312  UniformRandomNumbers_Int (double MinVal, const double MaxVal, const int seed);
313 
320 
325  double operator () ();
326  };
327 
328 
340  {
341 
342  protected:
343 
345  double m_mean;
346 
348  std::shared_ptr<std::poisson_distribution<int> > m_distribution;
349 
350  public:
351 
359  PoissonRandomNumbers (const double mean, const int seed, const double MinVal = par::defaultDouble, const double MaxVal = -par::defaultDouble);
360 
366  ~PoissonRandomNumbers () = default;
367 
373  void set_mean (const double mean);
374 
379  double operator () ();
380  };
381 
382 
393  {
394 
395  protected:
396 
398  double m_mean;
399 
401  double m_sigma;
402 
404  std::shared_ptr<std::normal_distribution<double>> m_distribution;
405 
406  public:
407 
416  NormalRandomNumbers (const double mean, const double sigma, const int seed, const double MinVal = par::defaultDouble, const double MaxVal = -par::defaultDouble);
417 
423  ~NormalRandomNumbers () = default;
424 
431  void set_mean_sigma (const double mean, const double sigma);
432 
437  double operator () ();
438  };
439 
440 
452  {
453 
454  protected:
455 
457  std::vector<double> m_values;
458 
460  std::vector<double> m_weights;
461 
463  std::shared_ptr<std::discrete_distribution<int>> m_distribution;
464 
465  public:
466 
476  DiscreteRandomNumbers (const std::vector<double> values, const std::vector<double> weights, const int seed, const double MinVal = par::defaultDouble, const double MaxVal = -par::defaultDouble);
477 
484 
491  void set_discrete_values (const std::vector<double> values, const std::vector<double> weights);
492 
497  double operator () ();
498 
499  };
500 
501 
513  {
514 
515  protected:
516 
518  std::shared_ptr<UniformRandomNumbers> m_uniform_generator;
519 
521  std::shared_ptr<glob::FuncGrid> m_distribution;
522 
523  public:
524 
533  DistributionRandomNumbers (const std::vector<double> xx, const std::vector<double> distribution_function, const std::string interpolation_method, const int seed);
534 
541 
547  void set_seed (const int seed);
548 
556  void set_interpolated_distribution (const std::vector<double> xx, const std::vector<double> distribution_function, const std::string interpolation_method);
557 
562  double operator () ();
563  };
564 
576  {
577 
578  protected:
579 
581  std::shared_ptr<UniformRandomNumbers> m_uniform_generator;
582 
585 
587  std::vector<double> m_func_parameter;
588 
590  std::shared_ptr<void> m_func_modelInput;
591 
594 
595  public:
596 
616  CustomDistributionRandomNumbers (const distribution_func func, const std::shared_ptr<void> modelInput, const std::vector<double> parameter, const int seed, const double MinVal = par::defaultDouble, const double MaxVal = -par::defaultDouble);
617 
624 
630  void set_seed (const int seed);
631 
645  void set_custom_distribution (const distribution_func func, const std::shared_ptr<void> modelInput, const std::vector<double> parameter);
646 
651  double operator () ();
652 
653  };
654 
655  }
656 }
657 
658 #endif
Wrapper for fftlog wripper.
The class ConstantRandomNumbers.
~ConstantRandomNumbers()=default
default destructor
double operator()()
extract number from the distribution
ConstantRandomNumbers(const double value)
constructor
void set_value(const double value)
set the value for constant distribution
The class CustomDistributionRandomNumbers.
double m_normalization
the distribution normalization
std::shared_ptr< void > m_func_modelInput
pointer to the data possibly used to construct the probability the distribution function
std::vector< double > m_func_parameter
parameters of the probability distribution function
void set_seed(const int seed)
set the random number generator seed
CustomDistributionRandomNumbers(const distribution_func func, const std::shared_ptr< void > modelInput, const std::vector< double > parameter, const int seed, const double MinVal=par::defaultDouble, const double MaxVal=-par::defaultDouble)
constructor
double operator()()
extract number from the distribution
std::shared_ptr< UniformRandomNumbers > m_uniform_generator
Uniform random number generator.
distribution_func m_func
the probability distribution function
~CustomDistributionRandomNumbers()=default
default destructor
void set_custom_distribution(const distribution_func func, const std::shared_ptr< void > modelInput, const std::vector< double > parameter)
set parameters for interpolated distribution
The class DiscreteRandomNumbers.
std::shared_ptr< std::discrete_distribution< int > > m_distribution
discrete distribution
DiscreteRandomNumbers(const std::vector< double > values, const std::vector< double > weights, const int seed, const double MinVal=par::defaultDouble, const double MaxVal=-par::defaultDouble)
constructor
void set_discrete_values(const std::vector< double > values, const std::vector< double > weights)
set parameters for Discrete distribution
~DiscreteRandomNumbers()=default
default destructor
std::vector< double > m_values
discrete values
std::vector< double > m_weights
weights for the values
double operator()()
extract number from the distribution
The class DistributionRandomNumbers.
std::shared_ptr< glob::FuncGrid > m_distribution
interpolated distribution
~DistributionRandomNumbers()=default
default destructor
DistributionRandomNumbers(const std::vector< double > xx, const std::vector< double > distribution_function, const std::string interpolation_method, const int seed)
constructor
std::shared_ptr< UniformRandomNumbers > m_uniform_generator
Uniform random number generator.
void set_seed(const int seed)
set the random number generator seed
double operator()()
extract number from the distribution
void set_interpolated_distribution(const std::vector< double > xx, const std::vector< double > distribution_function, const std::string interpolation_method)
set parameters for interpolated distribution
The class NormalRandomNumbers.
std::shared_ptr< std::normal_distribution< double > > m_distribution
normal distributionnormal distributionnormal distributionnormal distribution
double operator()()
extract number from the distribution
void set_mean_sigma(const double mean, const double sigma)
set parameters for Normal distribution
~NormalRandomNumbers()=default
default destructor
NormalRandomNumbers(const double mean, const double sigma, const int seed, const double MinVal=par::defaultDouble, const double MaxVal=-par::defaultDouble)
constructor
double m_sigma
standard deviation
The class PoissonRandomNumbers.
void set_mean(const double mean)
set the mean for Poisson distribution
PoissonRandomNumbers(const double mean, const int seed, const double MinVal=par::defaultDouble, const double MaxVal=-par::defaultDouble)
constructor
std::shared_ptr< std::poisson_distribution< int > > m_distribution
Poisson distribution.
double operator()()
extract number from the distribution
~PoissonRandomNumbers()=default
default destructor
The class RandomNumbers.
Definition: RandomNumbers.h:78
void set_seed(const int seed)
set the random number generator seed
double m_MinVal
minimum value to generate
Definition: RandomNumbers.h:88
virtual void set_interpolated_distribution(const std::vector< double > values, const std::vector< double > weights)
set the parameters for the interpolated distribution
virtual void set_custom_distribution(const distribution_func func, const std::shared_ptr< void > modelInput, const std::vector< double > parameter)
set parameters for interpolated distribution
virtual ~RandomNumbers()=default
default destructor
RandomNumbers()=default
default constructor
void set_value(const double value)
set the value for constant distribution
std::mt19937_64 m_generator
pseudo-random numbers generator
Definition: RandomNumbers.h:82
double m_MaxVal
maximum value to generate
Definition: RandomNumbers.h:91
virtual double operator()()=0
extract number from the distribution
void set_range(const double MinVal, const double MaxVal)
set the range for the random number extraction
virtual void set_mean_sigma(const double mean, const double sigma)
set parameters for Normal distribution
virtual void set_mean(const double mean)
set the mean for Poisson distribution
virtual void set_discrete_values(const std::vector< double > values, const std::vector< double > weights)
set parameters for Discrete distribution
The class UniformRandomNumbers_Int.
UniformRandomNumbers_Int(double MinVal, const double MaxVal, const int seed)
constructor
double operator()()
extract number from the distribution
~UniformRandomNumbers_Int()=default
default destructor
std::shared_ptr< std::uniform_int_distribution< int > > m_distribution
uniform distribution
The class UniformRandomNumbers.
std::shared_ptr< std::uniform_real_distribution< double > > m_distribution
uniform distribution
UniformRandomNumbers(double MinVal, const double MaxVal, const int seed)
constructor
double operator()()
extract number from the distribution
~UniformRandomNumbers()=default
default destructor
static const double defaultDouble
default double value
Definition: Constants.h:348
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
std::function< double(std::vector< double >, std::shared_ptr< void >)> nDim_distribution_func
distribution function used for a n-dimensional distribution
Definition: RandomNumbers.h:57
std::function< double(double, std::shared_ptr< void >, std::vector< double >)> distribution_func
generic distribution function
Definition: RandomNumbers.h:50