51 GSLQuasiRandomEngine::GSLQuasiRandomEngine() :
58 GSLQuasiRandomEngine::GSLQuasiRandomEngine( GSLQRngWrapper * rng) :
59 fQRng(new GSLQRngWrapper(*rng) )
63 GSLQuasiRandomEngine::GSLQuasiRandomEngine(
const GSLQuasiRandomEngine & eng) :
64 fQRng(new GSLQRngWrapper(*eng.fQRng) )
67 GSLQuasiRandomEngine::~GSLQuasiRandomEngine() {
69 if (fQRng) Terminate();
73 GSLQuasiRandomEngine & GSLQuasiRandomEngine::operator=(
const GSLQuasiRandomEngine & eng) {
74 if (
this == &eng)
return *
this;
78 fQRng =
new GSLQRngWrapper(*eng.fQRng);
83 void GSLQuasiRandomEngine::Initialize(
unsigned int dimension) {
86 if (!fQRng) fQRng =
new GSLQRngWrapper();
87 fQRng->Allocate(dimension);
90 void GSLQuasiRandomEngine::Terminate() {
99 double GSLQuasiRandomEngine::operator() ()
const {
103 assert(fQRng->Dimension() == 1);
105 gsl_qrng_get(fQRng->Rng(), &x );
109 bool GSLQuasiRandomEngine::operator() (
double * x)
const {
112 int status = gsl_qrng_get(fQRng->Rng(), x );
113 return (status == 0);
116 bool GSLQuasiRandomEngine::Skip(
unsigned int n)
const {
118 std::vector<double> xtmp(fQRng->Dimension() );
120 for (
unsigned int i = 0; i < n; ++i ) {
121 status |= gsl_qrng_get(fQRng->Rng(), &xtmp[0] );
126 bool GSLQuasiRandomEngine::GenerateArray(
double * begin,
double * end )
const {
130 for (
double * itr = begin; itr != end; itr+=fQRng->Dimension() ) {
131 status |= gsl_qrng_get(fQRng->Rng(), itr );
137 std::string GSLQuasiRandomEngine::Name()
const {
141 assert(fQRng->Rng() != 0);
142 const char * name = gsl_qrng_name( fQRng->Rng() );
143 if (!name)
return std::string();
144 return std::string( name);
147 unsigned int GSLQuasiRandomEngine::Size()
const {
151 return gsl_qrng_size( fQRng->Rng() );
154 unsigned int GSLQuasiRandomEngine::NDim()
const {
158 return fQRng->Dimension();
170 GSLQRngSobol::GSLQRngSobol() : GSLQuasiRandomEngine()
172 SetType(
new GSLQRngWrapper(gsl_qrng_sobol));
177 GSLQRngNiederreiter2::GSLQRngNiederreiter2() : GSLQuasiRandomEngine()
179 SetType(
new GSLQRngWrapper(gsl_qrng_niederreiter_2) );