#include "Halton.h" #include "Timer/PerfTimer.h" #define PREGENERATE_HALTON 0 namespace GtpVisibilityPreprocessor { PerfTimer haltonTimer; // global halton generator Halton2 halton2; float Halton2::_invBases[2]; float Halton<1>::_invBases[1]; float Halton<2>::_invBases[2]; float Halton<3>::_invBases[3]; float Halton<4>::_invBases[4]; float Halton<5>::_invBases[5]; float Halton<6>::_invBases[6]; Halton<1> dummmyHalton1(true); Halton<2> dummmyHalton2(true); Halton<3> dummmyHalton3(true); Halton<4> dummmyHalton4(true); Halton<5> dummmyHalton5(true); Halton<6> dummmyHalton6(true); int HaltonSequence::sPregeneratedDim = 0; int HaltonSequence::sPregeneratedNumber = 0; float *HaltonSequence::sPregeneratedValues = NULL; #if PREGENERATE_HALTON // pregenerate first 100k numbers for 6 dimensions static HaltonSequence staticHalton(6, 200000); #endif // special construtor for pregenerating static halton sequences HaltonSequence::HaltonSequence(const int dim, const int number) { sPregeneratedDim = 0; sPregeneratedNumber = 0; sPregeneratedValues = new float[number*dim]; float *p = sPregeneratedValues; int i; for (i=0; i < number; i++, p+=dim) { GetNext(dim, p); } sPregeneratedDim = dim; sPregeneratedNumber = number; } void HaltonSequence::GetNext(const int dimensions, float *p) { // haltonTimer.Entry(); #if PREGENERATE_HALTON if (index <= sPregeneratedNumber && dimensions <= sPregeneratedDim) { float *pp = sPregeneratedValues + (sPregeneratedDim*(index-1)); for (int i=0; i < dimensions; i++) p[i] = pp[i]; } else #endif { for (int i=0; i < dimensions; i++) p[i] = (float)GetNumber(i+1); } GenerateNext(); // haltonTimer.Exit(); } }