#include <time.h>
#include <cassert>
#include "gsl/gsl_rng.h"
#include "gsl/gsl_randist.h"
#include "Math/GSLRndmEngines.h"
extern double gsl_ran_gaussian_acr( const gsl_rng * r, const double sigma);
namespace ROOT {
namespace Math {
class GSLRng {
public:
GSLRng() :
fRng(0),
fRngType(0)
{
}
GSLRng(const gsl_rng_type * type) :
fRng(0),
fRngType(type)
{
}
~GSLRng() { }
void Allocate() {
if (fRngType == 0) SetDefaultType();
fRng = gsl_rng_alloc( fRngType );
}
void Free() {
if (fRng != 0) gsl_rng_free(fRng);
fRng = 0;
}
void SetType(const gsl_rng_type * type) {
fRngType = type;
}
void SetDefaultType() {
gsl_rng_env_setup();
fRngType = gsl_rng_default;
}
inline gsl_rng * Rng() const { return fRng; }
private:
gsl_rng * fRng;
const gsl_rng_type * fRngType;
};
GSLRandomEngine::GSLRandomEngine() :
fCurTime(0)
{
fRng = new GSLRng();
}
GSLRandomEngine::~GSLRandomEngine() {
}
void GSLRandomEngine::Initialize() {
assert(fRng != 0);
fRng->Allocate();
}
void GSLRandomEngine::Terminate() {
assert(fRng != 0);
fRng->Free();
delete fRng;
fRng = 0;
}
double GSLRandomEngine::operator() () {
return gsl_rng_uniform_pos(fRng->Rng() );
}
void GSLRandomEngine::RandomArray(double * begin, double * end ) {
for ( double * itr = begin; itr != end; ++itr ) {
*itr = gsl_rng_uniform_pos(fRng->Rng() );
}
}
void GSLRandomEngine::SetSeed(unsigned int seed) {
if (seed == 0) {
time_t curtime;
time(&curtime);
unsigned int ct = static_cast<unsigned int>(curtime);
if (ct != fCurTime) {
fCurTime = ct;
std::srand(ct);
}
seed = std::rand();
}
assert(fRng);
gsl_rng_set(fRng->Rng(), seed );
}
std::string GSLRandomEngine::Name() const {
assert ( fRng != 0);
assert ( fRng->Rng() != 0 );
return std::string( gsl_rng_name( fRng->Rng() ) );
}
unsigned int GSLRandomEngine::Size() const {
assert (fRng != 0);
return gsl_rng_size( fRng->Rng() );
}
double GSLRandomEngine::GaussianZig(double sigma)
{
return gsl_ran_gaussian_ziggurat( fRng->Rng(), sigma);
}
double GSLRandomEngine::Gaussian(double sigma)
{
return gsl_ran_gaussian( fRng->Rng(), sigma);
}
double GSLRandomEngine::GaussianRatio(double sigma)
{
return gsl_ran_gaussian_ratio_method( fRng->Rng(), sigma);
}
double GSLRandomEngine::GaussianTail(double a , double sigma)
{
return gsl_ran_gaussian_tail( fRng->Rng(), a, sigma);
}
void GSLRandomEngine::Gaussian2D(double sigmaX, double sigmaY, double rho, double &x, double &y)
{
gsl_ran_bivariate_gaussian( fRng->Rng(), sigmaX, sigmaY, rho, &x, &y);
}
double GSLRandomEngine::Exponential(double mu)
{
return gsl_ran_exponential( fRng->Rng(), mu);
}
double GSLRandomEngine::Cauchy(double a)
{
return gsl_ran_cauchy( fRng->Rng(), a);
}
double GSLRandomEngine::Landau()
{
return gsl_ran_landau( fRng->Rng());
}
double GSLRandomEngine::Gamma(double a, double b)
{
return gsl_ran_gamma( fRng->Rng(), a, b);
}
double GSLRandomEngine::LogNormal(double zeta, double sigma)
{
return gsl_ran_lognormal( fRng->Rng(), zeta, sigma);
}
double GSLRandomEngine::ChiSquare(double nu)
{
return gsl_ran_chisq( fRng->Rng(), nu);
}
double GSLRandomEngine::FDist(double nu1, double nu2)
{
return gsl_ran_fdist( fRng->Rng(), nu1, nu2);
}
double GSLRandomEngine::tDist(double nu)
{
return gsl_ran_tdist( fRng->Rng(), nu);
}
void GSLRandomEngine::Dir2D(double &x, double &y)
{
gsl_ran_dir_2d( fRng->Rng(), &x, &y);
}
void GSLRandomEngine::Dir3D(double &x, double &y, double &z)
{
gsl_ran_dir_3d( fRng->Rng(), &x, &y, &z);
}
unsigned int GSLRandomEngine::Poisson(double mu)
{
return gsl_ran_poisson( fRng->Rng(), mu);
}
unsigned int GSLRandomEngine::Binomial(double p, unsigned int n)
{
return gsl_ran_binomial( fRng->Rng(), p, n);
}
std::vector<unsigned int> GSLRandomEngine::Multinomial( unsigned int ntot, const std::vector<double> & p )
{
unsigned int * narray = new unsigned int(p.size() );
gsl_ran_multinomial( fRng->Rng(), p.size(), ntot, &p.front(), narray);
std::vector<unsigned int> ival( narray, narray+p.size());
return ival;
}
GSLRngMT::GSLRngMT() :
GSLRandomEngine(new GSLRng(gsl_rng_mt19937) )
{}
GSLRngRanLux::GSLRngRanLux() :
GSLRandomEngine(new GSLRng(gsl_rng_ranlux) )
{}
GSLRngRanLux2::GSLRngRanLux2() :
GSLRandomEngine(new GSLRng(gsl_rng_ranlxs2) )
{}
GSLRngRanLux48::GSLRngRanLux48() :
GSLRandomEngine(new GSLRng(gsl_rng_ranlxd2) )
{}
GSLRngTaus::GSLRngTaus() :
GSLRandomEngine(new GSLRng(gsl_rng_taus2) )
{}
GSLRngGFSR4::GSLRngGFSR4() :
GSLRandomEngine(new GSLRng(gsl_rng_gfsr4) )
{}
GSLRngCMRG::GSLRngCMRG() :
GSLRandomEngine(new GSLRng(gsl_rng_cmrg) )
{}
GSLRngMRG::GSLRngMRG() :
GSLRandomEngine(new GSLRng(gsl_rng_mrg) )
{}
GSLRngRand::GSLRngRand() :
GSLRandomEngine(new GSLRng(gsl_rng_rand) )
{}
GSLRngRanMar::GSLRngRanMar() :
GSLRandomEngine(new GSLRng(gsl_rng_ranmar) )
{}
GSLRngMinStd::GSLRngMinStd() :
GSLRandomEngine(new GSLRng(gsl_rng_minstd) )
{}
}
}
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.