7 #ifndef ROOT_Math_MixMaxEngineImpl
8 #define ROOT_Math_MixMaxEngineImpl
13 #elif (ROOT_MM_N==240)
14 namespace mixmax_240 {
15 #elif (ROOT_MM_N==256)
16 namespace mixmax_256 {
22 #define __thread __declspec(thread)
35 using namespace mixmax_17;
36 #elif (ROOT_MM_N==240)
37 using namespace mixmax_240;
38 #elif (ROOT_MM_N==256)
39 using namespace mixmax_256;
50 class MixMaxEngineImpl {
52 MixMaxEngineImpl(uint64_t) {
53 std::cerr <<
"MixMaxEngineImpl - These template parameters are not supported for MixMaxEngine" << std::endl;
55 ~MixMaxEngineImpl() {}
56 void SetSeed(uint64_t) { }
57 double Rndm() {
return -1; }
58 double IntRndm() {
return 0; }
59 void SetState(
const std::vector<uint64_t> &) { }
60 void GetState(std::vector<uint64_t> &) { }
61 int Counter() {
return -1; }
62 void SetCounter(
int) {}
68 class MixMaxEngineImpl<ROOT_MM_N> {
69 rng_state_t * fRngState;
72 typedef MixMaxEngine<ROOT_MM_N,0>::StateInt_t StateInt_t;
73 typedef MixMaxEngine<ROOT_MM_N,0>::Result_t Result_t;
75 MixMaxEngineImpl(uint64_t seed) {
76 fRngState = rng_alloc();
82 void SetSeedFast(Result_t seed) {
83 seed_spbox(fRngState, seed);
85 void SetSeed(Result_t seed) {
87 seed_uniquestream(fRngState, 0, 0, (uint32_t)(seed>>32), (uint32_t)seed );
90 return get_next_float(fRngState);
94 return get_next(fRngState);
96 void SetState(
const std::vector<StateInt_t> & state) {
97 if (fRngState) rng_free(fRngState);
98 fRngState = rng_copy(const_cast<StateInt_t*>(state.data()) );
100 void GetState(std::vector<StateInt_t> & state)
const {
103 for (
int i = 0; i < n; ++i)
104 state[i] = fRngState->V[i];
109 int Counter()
const {
110 return fRngState->counter;
112 void SetCounter(
int val) {
113 fRngState->counter = val;
120 void RndmArray(
int n,
double * array) {
121 fill_array(fRngState, n, array);
123 void ReadState(
const char filename[] ) {
124 read_state(fRngState, filename);
127 void Branch(uint32_t * seedvec) {
128 branch_inplace(fRngState, seedvec);