00001
00031 #ifndef DSFMT_H
00032 #define DSFMT_H
00033
00034 #include <stdio.h>
00035 #include <assert.h>
00036
00037 #if !defined(DSFMT_MEXP)
00038 #ifdef __GNUC__
00039 #warning "DSFMT_MEXP is not defined. I assume DSFMT_MEXP is 19937."
00040 #endif
00041 #define DSFMT_MEXP 19937
00042 #endif
00043
00044
00045
00046
00047
00048
00051 #define DSFMT_N ((DSFMT_MEXP - 128) / 104 + 1)
00052
00054 #define DSFMT_N32 (DSFMT_N * 4)
00055
00057 #define DSFMT_N64 (DSFMT_N * 2)
00058
00059 #if !defined(DSFMT_BIG_ENDIAN)
00060 # if defined(__BYTE_ORDER) && defined(__BIG_ENDIAN)
00061 # if __BYTE_ORDER == __BIG_ENDIAN
00062 # define DSFMT_BIG_ENDIAN 1
00063 # endif
00064 # elif defined(_BYTE_ORDER) && defined(_BIG_ENDIAN)
00065 # if _BYTE_ORDER == _BIG_ENDIAN
00066 # define DSFMT_BIG_ENDIAN 1
00067 # endif
00068 # elif defined(__BYTE_ORDER__) && defined(__BIG_ENDIAN__)
00069 # if __BYTE_ORDER__ == __BIG_ENDIAN__
00070 # define DSFMT_BIG_ENDIAN 1
00071 # endif
00072 # elif defined(BYTE_ORDER) && defined(BIG_ENDIAN)
00073 # if BYTE_ORDER == BIG_ENDIAN
00074 # define DSFMT_BIG_ENDIAN 1
00075 # endif
00076 # elif defined(__BIG_ENDIAN) || defined(_BIG_ENDIAN) \
00077 || defined(__BIG_ENDIAN__) || defined(BIG_ENDIAN)
00078 # define DSFMT_BIG_ENDIAN 1
00079 # endif
00080 #endif
00081
00082 #if defined(DSFMT_BIG_ENDIAN) && defined(__amd64)
00083 # undef DSFMT_BIG_ENDIAN
00084 #endif
00085
00086 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
00087 # include <inttypes.h>
00088 #elif defined(_MSC_VER) || defined(__BORLANDC__)
00089 # if !defined(DSFMT_UINT32_DEFINED) && !defined(SFMT_UINT32_DEFINED)
00090 typedef unsigned int uint32_t;
00091 typedef unsigned __int64 uint64_t;
00092 # define UINT64_C(v) (v ## ui64)
00093 # define DSFMT_UINT32_DEFINED
00094 # if !defined(inline)
00095 # define inline __inline
00096 # endif
00097 # endif
00098 #else
00099 # include <inttypes.h>
00100 # if !defined(inline)
00101 # if defined(__GNUC__)
00102 # define inline __inline__
00103 # else
00104 # define inline
00105 # endif
00106 # endif
00107 #endif
00108
00109 #ifndef PRIu64
00110 # if defined(_MSC_VER) || defined(__BORLANDC__)
00111 # define PRIu64 "I64u"
00112 # define PRIx64 "I64x"
00113 # else
00114 # define PRIu64 "llu"
00115 # define PRIx64 "llx"
00116 # endif
00117 #endif
00118
00119 #ifndef UINT64_C
00120 # define UINT64_C(v) (v ## ULL)
00121 #endif
00122
00123
00124
00125
00126 #if defined(HAVE_ALTIVEC)
00127 # if !defined(__APPLE__)
00128 # include <altivec.h>
00129 # endif
00130
00131 union W128_T {
00132 vector unsigned int s;
00133 uint64_t u[2];
00134 uint32_t u32[4];
00135 double d[2];
00136 };
00137
00138 #elif defined(HAVE_SSE2)
00139 # include <emmintrin.h>
00140
00142 union W128_T {
00143 __m128i si;
00144 __m128d sd;
00145 uint64_t u[2];
00146 uint32_t u32[4];
00147 double d[2];
00148 };
00149 #else
00150
00151 union W128_T {
00152 uint64_t u[2];
00153 uint32_t u32[4];
00154 double d[2];
00155 };
00156 #endif
00157
00159 typedef union W128_T w128_t;
00160
00162 struct DSFMT_T {
00163 w128_t status[DSFMT_N + 1];
00164 int idx;
00165 };
00166 typedef struct DSFMT_T dsfmt_t;
00167
00169 extern dsfmt_t dsfmt_global_data;
00171 extern const int dsfmt_global_mexp;
00172
00173 void dsfmt_gen_rand_all(dsfmt_t *dsfmt);
00174 void dsfmt_fill_array_open_close(dsfmt_t *dsfmt, double array[], int size);
00175 void dsfmt_fill_array_close_open(dsfmt_t *dsfmt, double array[], int size);
00176 void dsfmt_fill_array_open_open(dsfmt_t *dsfmt, double array[], int size);
00177 void dsfmt_fill_array_close1_open2(dsfmt_t *dsfmt, double array[], int size);
00178 void dsfmt_chk_init_gen_rand(dsfmt_t *dsfmt, uint32_t seed, int mexp);
00179 void dsfmt_chk_init_by_array(dsfmt_t *dsfmt, uint32_t init_key[],
00180 int key_length, int mexp);
00181 const char *dsfmt_get_idstring(void);
00182 int dsfmt_get_min_array_size(void);
00183
00184 #if defined(__GNUC__)
00185 # define DSFMT_PRE_INLINE inline static
00186 # define DSFMT_PST_INLINE __attribute__((always_inline))
00187 #elif defined(_MSC_VER) && _MSC_VER >= 1200
00188 # define DSFMT_PRE_INLINE __forceinline static
00189 # define DSFMT_PST_INLINE
00190 #else
00191 # define DSFMT_PRE_INLINE inline static
00192 # define DSFMT_PST_INLINE
00193 #endif
00194 DSFMT_PRE_INLINE uint32_t dsfmt_genrand_uint32(dsfmt_t *dsfmt) DSFMT_PST_INLINE;
00195 DSFMT_PRE_INLINE double dsfmt_genrand_close1_open2(dsfmt_t *dsfmt)
00196 DSFMT_PST_INLINE;
00197 DSFMT_PRE_INLINE double dsfmt_genrand_close_open(dsfmt_t *dsfmt)
00198 DSFMT_PST_INLINE;
00199 DSFMT_PRE_INLINE double dsfmt_genrand_open_close(dsfmt_t *dsfmt)
00200 DSFMT_PST_INLINE;
00201 DSFMT_PRE_INLINE double dsfmt_genrand_open_open(dsfmt_t *dsfmt)
00202 DSFMT_PST_INLINE;
00203 DSFMT_PRE_INLINE uint32_t dsfmt_gv_genrand_uint32(void) DSFMT_PST_INLINE;
00204 DSFMT_PRE_INLINE double dsfmt_gv_genrand_close1_open2(void) DSFMT_PST_INLINE;
00205 DSFMT_PRE_INLINE double dsfmt_gv_genrand_close_open(void) DSFMT_PST_INLINE;
00206 DSFMT_PRE_INLINE double dsfmt_gv_genrand_open_close(void) DSFMT_PST_INLINE;
00207 DSFMT_PRE_INLINE double dsfmt_gv_genrand_open_open(void) DSFMT_PST_INLINE;
00208 DSFMT_PRE_INLINE void dsfmt_gv_fill_array_open_close(double array[], int size)
00209 DSFMT_PST_INLINE;
00210 DSFMT_PRE_INLINE void dsfmt_gv_fill_array_close_open(double array[], int size)
00211 DSFMT_PST_INLINE;
00212 DSFMT_PRE_INLINE void dsfmt_gv_fill_array_open_open(double array[], int size)
00213 DSFMT_PST_INLINE;
00214 DSFMT_PRE_INLINE void dsfmt_gv_fill_array_close1_open2(double array[], int size)
00215 DSFMT_PST_INLINE;
00216 DSFMT_PRE_INLINE void dsfmt_gv_init_gen_rand(uint32_t seed) DSFMT_PST_INLINE;
00217 DSFMT_PRE_INLINE void dsfmt_gv_init_by_array(uint32_t init_key[],
00218 int key_length) DSFMT_PST_INLINE;
00219 DSFMT_PRE_INLINE void dsfmt_init_gen_rand(dsfmt_t *dsfmt, uint32_t seed)
00220 DSFMT_PST_INLINE;
00221 DSFMT_PRE_INLINE void dsfmt_init_by_array(dsfmt_t *dsfmt, uint32_t init_key[],
00222 int key_length) DSFMT_PST_INLINE;
00223
00232 inline static uint32_t dsfmt_genrand_uint32(dsfmt_t *dsfmt) {
00233 uint32_t r;
00234 uint64_t *psfmt64 = &dsfmt->status[0].u[0];
00235
00236 if (dsfmt->idx >= DSFMT_N64) {
00237 dsfmt_gen_rand_all(dsfmt);
00238 dsfmt->idx = 0;
00239 }
00240 r = psfmt64[dsfmt->idx++] & 0xffffffffU;
00241 return r;
00242 }
00243
00253 inline static double dsfmt_genrand_close1_open2(dsfmt_t *dsfmt) {
00254 double r;
00255 double *psfmt64 = &dsfmt->status[0].d[0];
00256
00257 if (dsfmt->idx >= DSFMT_N64) {
00258 dsfmt_gen_rand_all(dsfmt);
00259 dsfmt->idx = 0;
00260 }
00261 r = psfmt64[dsfmt->idx++];
00262 return r;
00263 }
00264
00272 inline static uint32_t dsfmt_gv_genrand_uint32(void) {
00273 return dsfmt_genrand_uint32(&dsfmt_global_data);
00274 }
00275
00283 inline static double dsfmt_gv_genrand_close1_open2(void) {
00284 return dsfmt_genrand_close1_open2(&dsfmt_global_data);
00285 }
00286
00295 inline static double dsfmt_genrand_close_open(dsfmt_t *dsfmt) {
00296 return dsfmt_genrand_close1_open2(dsfmt) - 1.0;
00297 }
00298
00306 inline static double dsfmt_gv_genrand_close_open(void) {
00307 return dsfmt_gv_genrand_close1_open2() - 1.0;
00308 }
00309
00318 inline static double dsfmt_genrand_open_close(dsfmt_t *dsfmt) {
00319 return 2.0 - dsfmt_genrand_close1_open2(dsfmt);
00320 }
00321
00329 inline static double dsfmt_gv_genrand_open_close(void) {
00330 return 2.0 - dsfmt_gv_genrand_close1_open2();
00331 }
00332
00341 inline static double dsfmt_genrand_open_open(dsfmt_t *dsfmt) {
00342 double *dsfmt64 = &dsfmt->status[0].d[0];
00343 union {
00344 double d;
00345 uint64_t u;
00346 } r;
00347
00348 if (dsfmt->idx >= DSFMT_N64) {
00349 dsfmt_gen_rand_all(dsfmt);
00350 dsfmt->idx = 0;
00351 }
00352 r.d = dsfmt64[dsfmt->idx++];
00353 r.u |= 1;
00354 return r.d - 1.0;
00355 }
00356
00364 inline static double dsfmt_gv_genrand_open_open(void) {
00365 return dsfmt_genrand_open_open(&dsfmt_global_data);
00366 }
00367
00379 inline static void dsfmt_gv_fill_array_close1_open2(double array[], int size) {
00380 dsfmt_fill_array_close1_open2(&dsfmt_global_data, array, size);
00381 }
00382
00395 inline static void dsfmt_gv_fill_array_open_close(double array[], int size) {
00396 dsfmt_fill_array_open_close(&dsfmt_global_data, array, size);
00397 }
00398
00411 inline static void dsfmt_gv_fill_array_close_open(double array[], int size) {
00412 dsfmt_fill_array_close_open(&dsfmt_global_data, array, size);
00413 }
00414
00427 inline static void dsfmt_gv_fill_array_open_open(double array[], int size) {
00428 dsfmt_fill_array_open_open(&dsfmt_global_data, array, size);
00429 }
00430
00437 inline static void dsfmt_init_gen_rand(dsfmt_t *dsfmt, uint32_t seed) {
00438 dsfmt_chk_init_gen_rand(dsfmt, seed, DSFMT_MEXP);
00439 }
00440
00447 inline static void dsfmt_gv_init_gen_rand(uint32_t seed) {
00448 dsfmt_init_gen_rand(&dsfmt_global_data, seed);
00449 }
00450
00458 inline static void dsfmt_init_by_array(dsfmt_t *dsfmt, uint32_t init_key[],
00459 int key_length) {
00460 dsfmt_chk_init_by_array(dsfmt, init_key, key_length, DSFMT_MEXP);
00461 }
00462
00471 inline static void dsfmt_gv_init_by_array(uint32_t init_key[], int key_length) {
00472 dsfmt_init_by_array(&dsfmt_global_data, init_key, key_length);
00473 }
00474
00475 #if !defined(DSFMT_DO_NOT_USE_OLD_NAMES)
00476 DSFMT_PRE_INLINE const char *get_idstring(void) DSFMT_PST_INLINE;
00477 DSFMT_PRE_INLINE int get_min_array_size(void) DSFMT_PST_INLINE;
00478 DSFMT_PRE_INLINE void init_gen_rand(uint32_t seed) DSFMT_PST_INLINE;
00479 DSFMT_PRE_INLINE void init_by_array(uint32_t init_key[], int key_length)
00480 DSFMT_PST_INLINE;
00481 DSFMT_PRE_INLINE double genrand_close1_open2(void) DSFMT_PST_INLINE;
00482 DSFMT_PRE_INLINE double genrand_close_open(void) DSFMT_PST_INLINE;
00483 DSFMT_PRE_INLINE double genrand_open_close(void) DSFMT_PST_INLINE;
00484 DSFMT_PRE_INLINE double genrand_open_open(void) DSFMT_PST_INLINE;
00485 DSFMT_PRE_INLINE void fill_array_open_close(double array[], int size)
00486 DSFMT_PST_INLINE;
00487 DSFMT_PRE_INLINE void fill_array_close_open(double array[], int size)
00488 DSFMT_PST_INLINE;
00489 DSFMT_PRE_INLINE void fill_array_open_open(double array[], int size)
00490 DSFMT_PST_INLINE;
00491 DSFMT_PRE_INLINE void fill_array_close1_open2(double array[], int size)
00492 DSFMT_PST_INLINE;
00493
00499 inline static const char *get_idstring(void) {
00500 return dsfmt_get_idstring();
00501 }
00502
00508 inline static int get_min_array_size(void) {
00509 return dsfmt_get_min_array_size();
00510 }
00511
00517 inline static void init_gen_rand(uint32_t seed) {
00518 dsfmt_gv_init_gen_rand(seed);
00519 }
00520
00527 inline static void init_by_array(uint32_t init_key[], int key_length) {
00528 dsfmt_gv_init_by_array(init_key, key_length);
00529 }
00530
00537 inline static double genrand_close1_open2(void) {
00538 return dsfmt_gv_genrand_close1_open2();
00539 }
00540
00547 inline static double genrand_close_open(void) {
00548 return dsfmt_gv_genrand_close_open();
00549 }
00550
00557 inline static double genrand_open_close(void) {
00558 return dsfmt_gv_genrand_open_close();
00559 }
00560
00567 inline static double genrand_open_open(void) {
00568 return dsfmt_gv_genrand_open_open();
00569 }
00570
00580 inline static void fill_array_open_close(double array[], int size) {
00581 dsfmt_gv_fill_array_open_close(array, size);
00582 }
00583
00593 inline static void fill_array_close_open(double array[], int size) {
00594 dsfmt_gv_fill_array_close_open(array, size);
00595 }
00596
00606 inline static void fill_array_open_open(double array[], int size) {
00607 dsfmt_gv_fill_array_open_open(array, size);
00608 }
00609
00618 inline static void fill_array_close1_open2(double array[], int size) {
00619 dsfmt_gv_fill_array_close1_open2(array, size);
00620 }
00621 #endif
00622
00623 #endif