38 #include "gsl/gsl_rng.h"
39 #include "gsl/gsl_randist.h"
47 extern double gsl_ran_gaussian_acr(
const gsl_rng * r,
const double sigma);
59 GSLRandomEngine::GSLRandomEngine() :
67 GSLRandomEngine::GSLRandomEngine( GSLRngWrapper * rng) :
68 fRng(new GSLRngWrapper(*rng) ),
73 GSLRandomEngine::GSLRandomEngine(
const GSLRandomEngine & eng) :
74 fRng(new GSLRngWrapper(*eng.fRng) ),
78 GSLRandomEngine::~GSLRandomEngine() {
80 if (fRng) Terminate();
84 GSLRandomEngine & GSLRandomEngine::operator=(
const GSLRandomEngine & eng) {
85 if (
this == &eng)
return *
this;
89 fRng =
new GSLRngWrapper(*eng.fRng);
90 fCurTime = eng.fCurTime;
95 void GSLRandomEngine::Initialize() {
98 if (!fRng) fRng =
new GSLRngWrapper();
102 void GSLRandomEngine::Terminate() {
111 double GSLRandomEngine::operator() ()
const {
114 return gsl_rng_uniform_pos(fRng->Rng() );
118 unsigned long GSLRandomEngine::RndmInt(
unsigned long max)
const {
120 return gsl_rng_uniform_int( fRng->Rng(), max );
123 unsigned long GSLRandomEngine::MinInt()
const {
125 return gsl_rng_min( fRng->Rng() );
128 unsigned long GSLRandomEngine::MaxInt()
const {
130 return gsl_rng_max( fRng->Rng() );
133 void GSLRandomEngine::RandomArray(
double * begin,
double * end )
const {
136 for (
double * itr = begin; itr != end; ++itr ) {
137 *itr = gsl_rng_uniform_pos(fRng->Rng() );
141 void GSLRandomEngine::SetSeed(
unsigned int seed)
const {
149 unsigned int ct =
static_cast<unsigned int>(curtime);
150 if (ct != fCurTime) {
159 gsl_rng_set(fRng->Rng(), seed );
162 std::string GSLRandomEngine::Name()
const {
166 assert ( fRng->Rng() != 0 );
167 return std::string( gsl_rng_name( fRng->Rng() ) );
170 unsigned int GSLRandomEngine::Size()
const {
174 return gsl_rng_size( fRng->Rng() );
180 double GSLRandomEngine::GaussianZig(
double sigma)
const
183 return gsl_ran_gaussian_ziggurat( fRng->Rng(), sigma);
186 double GSLRandomEngine::Gaussian(
double sigma)
const
189 return gsl_ran_gaussian( fRng->Rng(), sigma);
192 double GSLRandomEngine::GaussianRatio(
double sigma)
const
195 return gsl_ran_gaussian_ratio_method( fRng->Rng(), sigma);
199 double GSLRandomEngine::GaussianTail(
double a ,
double sigma)
const
203 return gsl_ran_gaussian_tail( fRng->Rng(), a, sigma);
206 void GSLRandomEngine::Gaussian2D(
double sigmaX,
double sigmaY,
double rho,
double &x,
double &y)
const
209 gsl_ran_bivariate_gaussian( fRng->Rng(), sigmaX, sigmaY, rho, &x, &y);
212 double GSLRandomEngine::Exponential(
double mu)
const
215 return gsl_ran_exponential( fRng->Rng(), mu);
218 double GSLRandomEngine::Cauchy(
double a)
const
221 return gsl_ran_cauchy( fRng->Rng(), a);
224 double GSLRandomEngine::Landau()
const
227 return gsl_ran_landau( fRng->Rng());
230 double GSLRandomEngine::Beta(
double a,
double b)
const
233 return gsl_ran_beta( fRng->Rng(), a, b);
236 double GSLRandomEngine::Gamma(
double a,
double b)
const
239 return gsl_ran_gamma( fRng->Rng(), a, b);
242 double GSLRandomEngine::LogNormal(
double zeta,
double sigma)
const
245 return gsl_ran_lognormal( fRng->Rng(), zeta, sigma);
248 double GSLRandomEngine::ChiSquare(
double nu)
const
251 return gsl_ran_chisq( fRng->Rng(), nu);
255 double GSLRandomEngine::FDist(
double nu1,
double nu2)
const
258 return gsl_ran_fdist( fRng->Rng(), nu1, nu2);
261 double GSLRandomEngine::tDist(
double nu)
const
264 return gsl_ran_tdist( fRng->Rng(), nu);
267 double GSLRandomEngine::Rayleigh(
double sigma)
const
270 return gsl_ran_rayleigh( fRng->Rng(), sigma);
273 double GSLRandomEngine::Logistic(
double a)
const
276 return gsl_ran_logistic( fRng->Rng(), a);
279 double GSLRandomEngine::Pareto(
double a,
double b)
const
282 return gsl_ran_pareto( fRng->Rng(), a, b);
285 void GSLRandomEngine::Dir2D(
double &x,
double &y)
const
288 gsl_ran_dir_2d( fRng->Rng(), &x, &y);
291 void GSLRandomEngine::Dir3D(
double &x,
double &y,
double &z)
const
294 gsl_ran_dir_3d( fRng->Rng(), &x, &y, &z);
297 unsigned int GSLRandomEngine::Poisson(
double mu)
const
300 return gsl_ran_poisson( fRng->Rng(), mu);
303 unsigned int GSLRandomEngine::Binomial(
double p,
unsigned int n)
const
306 return gsl_ran_binomial( fRng->Rng(), p, n);
309 unsigned int GSLRandomEngine::NegativeBinomial(
double p,
double n)
const
312 return gsl_ran_negative_binomial( fRng->Rng(), p, n);
316 std::vector<unsigned int> GSLRandomEngine::Multinomial(
unsigned int ntot,
const std::vector<double> & p )
const
319 std::vector<unsigned int> ival( p.size());
320 gsl_ran_multinomial( fRng->Rng(), p.size(), ntot, &p.front(), &ival[0]);
332 GSLRngMT::GSLRngMT() : GSLRandomEngine()
334 SetType(
new GSLRngWrapper(gsl_rng_mt19937));
340 GSLRngRanLux::GSLRngRanLux() : GSLRandomEngine()
342 SetType(
new GSLRngWrapper(gsl_rng_ranlux) );
347 GSLRngRanLuxS1::GSLRngRanLuxS1() : GSLRandomEngine()
349 SetType(
new GSLRngWrapper(gsl_rng_ranlxs1) );
354 GSLRngRanLuxS2::GSLRngRanLuxS2() : GSLRandomEngine()
356 SetType(
new GSLRngWrapper(gsl_rng_ranlxs2) );
361 GSLRngRanLuxD1::GSLRngRanLuxD1() : GSLRandomEngine()
363 SetType(
new GSLRngWrapper(gsl_rng_ranlxd1) );
368 GSLRngRanLuxD2::GSLRngRanLuxD2() : GSLRandomEngine()
370 SetType(
new GSLRngWrapper(gsl_rng_ranlxd2) );
376 GSLRngTaus::GSLRngTaus() : GSLRandomEngine()
378 SetType(
new GSLRngWrapper(gsl_rng_taus2) );
384 GSLRngGFSR4::GSLRngGFSR4() : GSLRandomEngine()
386 SetType(
new GSLRngWrapper(gsl_rng_gfsr4) );
392 GSLRngCMRG::GSLRngCMRG() : GSLRandomEngine()
394 SetType(
new GSLRngWrapper(gsl_rng_cmrg) );
400 GSLRngMRG::GSLRngMRG() : GSLRandomEngine()
402 SetType(
new GSLRngWrapper(gsl_rng_mrg) );
409 GSLRngRand::GSLRngRand() : GSLRandomEngine()
411 SetType(
new GSLRngWrapper(gsl_rng_rand) );
417 GSLRngRanMar::GSLRngRanMar() : GSLRandomEngine()
419 SetType(
new GSLRngWrapper(gsl_rng_ranmar) );
425 GSLRngMinStd::GSLRngMinStd() : GSLRandomEngine()
427 SetType(
new GSLRngWrapper(gsl_rng_minstd) );
433 GSLRngMixMax::GSLRngMixMax() : GSLRandomEngine()
435 SetType(
new GSLRngWrapper(gsl_rng_mixmax) );
440 GSLMixMaxWrapper::CreateEngine(Engine()->Rng());
442 GSLRngMixMax::~GSLRngMixMax() {
444 GSLMixMaxWrapper::FreeEngine(Engine()->Rng());