29 #ifndef CLHEP_MIXMAX_H_ 30 #define CLHEP_MIXMAX_H_ 1 35 #define USE_INLINE_ASM YES 52 typedef unsigned long long int myuint;
109 myuint
apply_bigskip(myuint* Vout, myuint* Vin, myID_t clusterID, myID_t machineID, myID_t runID, myID_t streamID );
118 #define M61 2305843009213693951ULL 124 #define MERSBASE M61 //xSUFF(M61) 125 #define MOD_PAYNE(k) ((((k)) & MERSBASE) + (((k)) >> BITS) ) // slightly faster than my old way, ok for addition 126 #define MOD_REM(k) ((k) % MERSBASE ) // latest Intel CPU is supposed to do this in one CPU cycle, but on my machines it seems to be 20% slower than the best tricks 127 #define MOD_MERSENNE(k) MOD_PAYNE(k) 129 #define INV_MERSBASE (0.43368086899420177360298E-18L) 136 #define SPECIAL 487013230256099064ULL // s=487013230256099064, m=1 -- good old MIXMAX 137 #define MOD_MULSPEC(k) fmodmulM61( 0, SPECIAL , (k) ); 166 #ifndef __MIXMAX_C // c++ can put code into header files, why cant we? (with the inline declaration, should be safe from duplicate-symbol error) 168 #define get_next(X) GET_BY_MACRO(X) 169 #define get_next_float(X) get_next_float_BY_MACRO(X) 190 #if defined(__x86_64__) && defined(__SSE__) && defined(__AVX__) && defined(USE_INLINE_ASM) 192 __asm__ __volatile__(
"pxor %0, %0;" 207 #define ARRAY_INDEX_OUT_OF_BOUNDS 0xFF01 208 #define SEED_WAS_ZERO 0xFF02 209 #define ERROR_READING_STATE_FILE 0xFF03 210 #define ERROR_READING_STATE_COUNTER 0xFF04 211 #define ERROR_READING_STATE_CHECKSUM 0xFF05 219 #ifdef HOOKUP_GSL // if you need to use mixmax through GSL, pass -DHOOKUP_GSL=1 to the compiler 221 #include <gsl/gsl_rng.h> 222 unsigned long gsl_get_next(
void *vstate);
223 double gsl_get_next_float(
void *vstate);
224 void seed_for_gsl(
void *vstate,
unsigned long seed);
226 static const gsl_rng_type mixmax_type =
236 unsigned long gsl_get_next(
void *vstate) {
241 double gsl_get_next_float(
void *vstate) {
246 void seed_for_gsl(
void *vstate,
unsigned long seed){
251 const gsl_rng_type *gsl_rng_ran3 = &mixmax_type;
258 #endif // closing CLHEP_MIXMAX_H_
void print_state(rng_state_t *X)
myuint GET_BY_MACRO(rng_state_t *X)
myuint get_next(rng_state_t *X)
void seed_vielbein(rng_state_t *X, unsigned int i)
int rng_free(rng_state_t *X)
myuint fmodmulM61(myuint cum, myuint s, myuint a)
void seed_uniquestream(rng_state_t *X, myID_t clusterID, myID_t machineID, myID_t runID, myID_t streamID)
int iterate(rng_state_t *X)
void seed_spbox(rng_state_t *X, myuint seed)
myuint modmulM61(myuint s, myuint a)
double get_next_float(rng_state_t *X)
rng_state_t * rng_alloc()
rng_state_t * rng_copy(myuint *Y)
myuint apply_bigskip(myuint *Vout, myuint *Vin, myID_t clusterID, myID_t machineID, myID_t runID, myID_t streamID)
myuint iterate_raw_vec(myuint *Y, myuint sumtotOld)
void iterate_and_fill_array(rng_state_t *X, double *array)
void branch_inplace(rng_state_t *Xin, myID_t *ID)
myuint precalc(rng_state_t *X)
myuint modadd(myuint foo, myuint bar)
void fill_array(rng_state_t *X, unsigned int n, double *array)
double get_next_float_BY_MACRO(rng_state_t *X)
void read_state(rng_state_t *X, const char filename[])
struct rng_state_st rng_state_t