Rosetta
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
mt19937.hh
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file numeric/random/mt19937.hh
11 /// @brief Mersenne Twister 19937 random number generator
12 /// @author Ian W. Davis
13 ///
14 /// @details Implementation of the Mersenne Twister random number generator
15 /// with "19937" parameters. Copied and pasted into wrapper class from the
16 /// inventor's C code available from:
17 ///
18 /// http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
19 ///
20 /// It's BSD licensed so we can incorporate and redistribute it freely. I
21 /// choose the "dSFMT" code, which is oriented toward generating doubles
22 /// instead of ints and is highly optimized for modern processors, although I
23 /// omitted the specializations for SSE2 and Altivec that are present in the
24 /// original for ease of compilation. (On my machine it's still 7% faster than
25 /// ran3, although random number generation is NOT the slow step in Rosetta!)
26 /// This is dSFMT version 1.2.1, the most current as of Nov 2007.
27 ///
28 /// The Mersenne Twister is a fairly high quality, fairly fast, and widely used
29 /// pseudo-random number generator. It has many parameter sets, which differ
30 /// in the amount of storage they require for their state, but 19937 is the
31 /// most used.
32 ///
33 /// The major advantage over ran3 is that mt19937 can be seeded from any 32-bit
34 /// value, so up to ~4 billion unique simulation trajectories are possible.
35 /// (In fact, it can be seeded from an array of values instead, leading to even
36 /// more possibilities.) Although I can't find documentation, I understand from
37 /// David Baker that ran3 can only accept seeds in the range from approx. -1
38 /// million to -4 million, meaning that only ~3 million unique simulations are
39 /// possible. This sometimes causes problems for jobs running on BOINC, where
40 /// jobs are distributed over many, many processors. Also, ran3 has a period
41 /// length of (2**55)-1, whereas mt19937 has a period of (2**19937)-1, although
42 /// I kind of doubt we're ever really running up against that limitation.
43 ///
44 /// Boost.Random has an implementation also, and says this about it:
45 ///
46 /// cycle length: (2**19937) - 1
47 /// good uniform distribution in up to 623 dimensions
48 /// It is recommended as the default random number generator.
49 ///
50 /// The GNU Scientific Library has an implementation also, and says this about it:
51 ///
52 /// The MT19937 generator of Makoto Matsumoto and Takuji Nishimura is a variant
53 /// of the twisted generalized feedback shift-register algorithm, and is known
54 /// as the Mersenne Twister generator. It has a Mersenne prime period of
55 /// 2^19937 - 1 (about 10^6000) and is equi-distributed in 623 dimensions. It
56 /// has passed the DIEHARD statistical tests. It uses 624 words of state per
57 /// generator and is comparable in speed to the other generators.
58 ///
59 /// See Makoto Matsumoto and Takuji Nishimura, Mersenne Twister: A
60 /// 623-dimensionally equidistributed uniform pseudorandom number
61 /// generator. ACM Transactions on Modeling and Computer Simulation, Vol.
62 /// 8, No. 1 (Jan. 1998), Pages 3-30
63 
64 
65 #ifndef INCLUDED_numeric_random_mt19937_hh
66 #define INCLUDED_numeric_random_mt19937_hh
67 
70 #include <cstring>
71 #include <iostream>
72 
73 /**
74 * @file dSFMT.h
75 *
76 * @brief double precision SIMD oriented Fast Mersenne Twister(dSFMT)
77 * pseudorandom number generator based on IEEE 754 format.
78 *
79 * @author Mutsuo Saito (Hiroshima University)
80 * @author Makoto Matsumoto (Hiroshima University)
81 *
82 * Copyright (C) 2007 Mutsuo Saito, Makoto Matsumoto and Hiroshima
83 * University. All rights reserved.
84 *
85 * The new BSD License is applied to this software.
86 * see LICENSE.txt
87 *
88 * @note We assume that your system has inttypes.h. If your system
89 * doesn't have inttypes.h, you have to typedef uint32_t and uint64_t,
90 * and you have to define PRIu64 and PRIx64 in this file as follows:
91 * @verbatim
92 typedef unsigned int uint32_t
93 typedef unsigned long long uint64_t
94 #define PRIu64 "llu"
95 #define PRIx64 "llx"
96 @endverbatim
97 * uint32_t must be exactly 32-bit unsigned integer type (no more, no
98 * less), and uint64_t must be exactly 64-bit unsigned integer type.
99 * PRIu64 and PRIx64 are used for printf function to print 64-bit
100 * unsigned int and 64-bit unsigned int in hexadecimal format.
101 */
102 
103 
104 #include <stdio.h>
105 
106 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
107 #include <inttypes.h>
108 #elif defined(_MSC_VER) || defined(__BORLANDC__)
109 typedef unsigned int uint32_t;
110 typedef unsigned long long uint64_t;
111 #define inline __inline
112 #else
113  #include <inttypes.h>
114 #if defined(__GNUC__)
115  #define inline __inline__
116 #else
117  #define inline
118 #endif
119 #endif
120 
121 #ifndef PRIu64
122 #if defined(_MSC_VER) || defined(__BORLANDC__)
123 #define PRIu64 "I64u"
124 #define PRIx64 "I64x"
125 #else
126  #define PRIu64 "llu"
127  #define PRIx64 "llx"
128 #endif
129 #endif
130 
131 #ifndef UINT64_C
132 #define UINT64_C(v) (v ## ULL)
133 #endif
134 
135 
136 #define DSFMT_MEXP 19937
137 /*-----------------
138 BASIC DEFINITIONS
139 -----------------*/
140 /** Mersenne Exponent. The period of the sequence
141 * is a multiple of 2^DSFMT_MEXP-1.
142 * #define DSFMT_MEXP 19937 */
143 /** DSFMT generator has an internal state array of 128-bit integers,
144 * and N is its size. */
145 #define DSFMT_N (DSFMT_MEXP / 104)
146 /** N32 is the size of internal state array when regarded as an array
147 * of 32-bit integers.*/
148 #define DSFMT_N32 (DSFMT_N * 4)
149 /** N64 is the size of internal state array when regarded as an array
150 * of 64-bit integers.*/
151 #define DSFMT_N64 (DSFMT_N * 2)
152 
153 /*----------------------
154 the parameters of SFMT
155 following definitions are in dSFMT-paramsXXXX.h file.
156 ----------------------*/
157 /** the pick up position of the array.
158 #define DSFMT_POS1 122
159 */
160 
161 /** the parameter of shift left as four 32-bit registers.
162 #define DSFMT_SL1 18
163 */
164 
165 /** the parameter of shift left as one 128-bit register.
166 * The 128-bit integer is shifted by (SL2 * 8) bits.
167 #define DSFMT_SL2 1
168 */
169 
170 /** the parameter of shift right as four 32-bit registers.
171 #define DSFMT_SR1 11
172 */
173 
174 /** the parameter of shift right as one 128-bit register.
175 * The 128-bit integer is shifted by (SL2 * 8) bits.
176 #define DSFMT_SR2 1
177 */
178 
179 /** A bitmask, used in the recursion. These parameters are introduced
180 * to break symmetry of SIMD.
181 #define DSFMT_MSK1 (uint64_t)0xdfffffefULL
182 #define DSFMT_MSK2 (uint64_t)0xddfecb7fULL
183 */
184 
185 /** These definitions are part of a 128-bit period certification vector.
186 #define DSFMT_PCV1 UINT64_C(0x00000001)
187 #define DSFMT_PCV2 UINT64_C(0x00000000)
188 */
189 
190 #define DSFMT_LOW_MASK UINT64_C(0x000FFFFFFFFFFFFF)
191 #define DSFMT_LOW_MASK32_1 0x000fffffU
192 #define DSFMT_LOW_MASK32_2 0xffffffffU
193 #define DSFMT_HIGH_CONST UINT64_C(0x3FF0000000000000)
194 #define DSFMT_HIGH_CONST32 0x3ff00000U
195 
196 
197 #define DSFMT_POS1 36
198 #define DSFMT_SL1 29
199 #define DSFMT_SL2 1
200 #define DSFMT_SR1 7
201 #define DSFMT_SR2 16
202 #define DSFMT_MSK1 UINT64_C(0x57fbfffdffff575f)
203 #define DSFMT_MSK2 UINT64_C(0xffff6febffffffee)
204 #define DSFMT_MSK32_1 0x57fbfffdU
205 #define DSFMT_MSK32_2 0xffff575fU
206 #define DSFMT_MSK32_3 0xffff6febU
207 #define DSFMT_MSK32_4 0xffffffeeU
208 #define DSFMT_PCV1 UINT64_C(0x0000000000000001)
209 #define DSFMT_PCV2 UINT64_C(0x000ec8f3d0b00000)
210 #define DSFMT_IDSTR \
211  "dDSFMT-19937:36-29-1-7-16:57fbfffdffff575f-ffff6febffffffee"
212 
213 
214 /*------------------------------------------
215 128-bit SIMD like data type for standard C
216 ------------------------------------------*/
217 /** 128-bit data structure */
218 union W128_T {
221  double d[2];
222  };
223 
224 /** 128-bit data type */
225 typedef union W128_T w128_t;
226 
227 namespace numeric {
228 namespace random {
229 
230 
231 /*----------------
232 STATIC FUNCTIONS
233 ----------------*/
234 inline static void lshift128(w128_t *out, const w128_t *in, int shift);
235 inline static uint32_t ini_func1(uint32_t x);
236 inline static uint32_t ini_func2(uint32_t x);
237 inline static int sformat_idxof(int i);
238 
239 
240 /**
241 * This function simulate a 32-bit array index overlapped to 64-bit
242 * array of LITTLE ENDIAN in BIG ENDIAN machine.
243 */
244 //
245 // defined(__amd64) seems to be wrong here - commented out for now.
246 //
247 //#if (defined(__BIG_ENDIAN__) || defined(BIG_ENDIAN)) && !defined(__amd64)
248 
249 #if (defined(__BIG_ENDIAN__) || defined(BIG_ENDIAN))
250 inline static int sformat_idxof(int i) {
251  return i ^ 1;
252 }
253 #else
254 inline static int sformat_idxof(int i) {
255  return i;
256 }
257 #endif
258 
259 /**
260 * This function simulates SIMD 128-bit left shift by the standard C.
261 * The 128-bit integer given in \b in is shifted by (shift * 8) bits.
262 * This function simulates the LITTLE ENDIAN SIMD.
263 * @param out the output of this function
264 * @param in the 128-bit data to be shifted
265 * @param shift the shift value
266 */
267 inline static void lshift128(w128_t *out, const w128_t *in, int shift) {
268  out->u[0] = in->u[0] << (shift * 8);
269  out->u[1] = in->u[1] << (shift * 8);
270  out->u[1] |= in->u[0] >> (64 - shift * 8);
271 }
272 
273 /**
274 * This function represents the recursion formula.
275 * @param r output
276 * @param a a 128-bit part of the internal state array
277 * @param b a 128-bit part of the internal state array
278 * @param c a 128-bit part of the internal state array
279 * @param lung a 128-bit part of the internal state array
280 */
281 inline static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c,
282  w128_t *lung) {
283  w128_t x;
284 
285  lshift128(&x, a, DSFMT_SL2);
286  r->u[0] = a->u[0] ^ x.u[0] ^ ((b->u[0] >> DSFMT_SR1) & DSFMT_MSK1)
287  ^ (c->u[0] >> DSFMT_SR2) ^ (c->u[0] << DSFMT_SL1) ^ lung->u[1];
288  r->u[1] = a->u[1] ^ x.u[1] ^ ((b->u[1] >> DSFMT_SR1) & DSFMT_MSK2)
289  ^ (c->u[1] >> DSFMT_SR2) ^ (c->u[1] << DSFMT_SL1) ^ lung->u[0];
290  r->u[0] &= DSFMT_LOW_MASK;
291  r->u[1] &= DSFMT_LOW_MASK;
292  lung->u[0] ^= r->u[0];
293  lung->u[1] ^= r->u[1];
294  r->u[0] |= DSFMT_HIGH_CONST;
295  r->u[1] |= DSFMT_HIGH_CONST;
296 }
297 
298 /**
299 * This function represents a function used in the initialization
300 * by init_by_array
301 * @param x 32-bit integer
302 * @return 32-bit integer
303 */
305  return (x ^ (x >> 27)) * (uint32_t)1664525UL;
306 }
307 
308 /**
309 * This function represents a function used in the initialization
310 * by init_by_array
311 * @param x 32-bit integer
312 * @return 32-bit integer
313 */
315  return (x ^ (x >> 27)) * (uint32_t)1566083941UL;
316 }
317 
318 
319 /// @brief
320 ///
321 /// @details
322 ///
323 class mt19937_RG : public uniform_RG
324 {
325 public:
326 
328  {
329  psformat64 = &sformat[0].d[0];
331  }
332  virtual ~mt19937_RG() {}
333 
334  /// @brief Set seed and state
335  inline void setSeed(int const iseed)
336  {
337  iseed_ = iseed;
338  uint32_t seed = (uint32_t) iseed;
339  int i;
340  uint32_t *psformat;
341 
342  psformat = &sformat[0].u32[0];
343  psformat[sformat_idxof(0)] = seed;
344  for ( i = 1; i < (DSFMT_N + 1) * 4; i++ ) {
345  psformat[sformat_idxof(i)] = 1812433253UL
346  * (psformat[sformat_idxof(i - 1)]
347  ^ (psformat[sformat_idxof(i - 1)] >> 30)) + i;
348  }
349  initial_mask();
353  }
354 
355  /// @brief Set seed and state
356  void setSeed( std::string const & ) { assert( false ); } //< Not implemented yet!
357 
358  inline int getSeed() {
359  return iseed_;
360  }
361 
362  inline double getRandom()
363  {
364  //This function generates and returns double precision pseudorandom
365  //number which distributes uniformly in the range [1, 2). This is
366  //the primitive and faster than generating numbers in other ranges.
367  //init_gen_rand() or init_by_array() must be called before this
368  //function.
369  //@return double precision floating point pseudorandom number
370 
371  double r;
372 
373  assert(is_sformat_initialized);
374 
375  if ( sformat_idx >= DSFMT_N * 2 ) {
376  gen_rand_all();
377  sformat_idx = 0;
378  }
379  r = psformat64[sformat_idx++];
380  return r - 1.0; // to be on [0,1)
381  }
382 
383  /// @brief Serializes generator state to stream losslessly.
384  virtual void saveState(std::ostream & out)
385  {
386  out << " " << is_sformat_initialized;
387  out << " " << sformat_idx;
388  // psformat64 is a pointer to a memory location and is never modified
389  // it should NOT be serialized or restored
390  for ( int i = 0; i < DSFMT_N+1; ++i ) {
391  out << " " << sformat[i].u[0] << " " << sformat[i].u[1];
392  }
393  }
394 
395  /// @brief Deserializes generator state from stream losslessly.
396  virtual void restoreState(std::istream & in)
397  {
399  in >> sformat_idx;
400  // psformat64 is a pointer to a memory location and is never modified
401  // it should NOT be serialized or restored
402  for ( int i = 0; i < DSFMT_N+1; ++i ) {
403  in >> sformat[i].u[0] >> sformat[i].u[1];
404  }
405  }
406 
407 protected:
408  /**
409  * This function initializes the internal state array to fit the IEEE
410  * 754 format.
411  */
412  void initial_mask(void) {
413  int i;
414  uint64_t *psformat;
415 
416  psformat = &sformat[0].u[0];
417  for ( i = 0; i < (DSFMT_N + 1) * 2; i++ ) {
418  psformat[i] = (psformat[i] & DSFMT_LOW_MASK) | DSFMT_HIGH_CONST;
419  }
420  }
421 
422  /**
423  * This function certificate the period of 2^{DSFMT_MEXP}-1.
424  */
426  int i, j;
427  uint64_t pcv[2] = {DSFMT_PCV1, DSFMT_PCV2};
428  uint64_t inner;
429  uint64_t new_lung[2];
430  //uint64_t work;
431  uint64_t fix[2];
432 
433  fix[0] = (((DSFMT_HIGH_CONST >> DSFMT_SR1) & DSFMT_MSK2)
435  fix[1] = (((DSFMT_HIGH_CONST >> DSFMT_SR1) & DSFMT_MSK1)
437  fix[0] = fix[0] ^ (DSFMT_HIGH_CONST >> (64 - 8 * DSFMT_SL2));
438  new_lung[0] = sformat[DSFMT_N].u[0] ^ fix[0];
439  new_lung[1] = sformat[DSFMT_N].u[1] ^ fix[1];
440  inner = new_lung[0] & pcv[0];
441  inner ^= new_lung[1] & pcv[1];
442  for ( i = 32; i > 0; i >>= 1 ) {
443  inner ^= inner >> i;
444  }
445  inner &= 1;
446  /* check OK */
447  if ( inner == 1 ) {
448  return;
449  }
450  /* check NG, and modification */
451  for ( i = 0; i < 2; i++ ) {
452  uint64_t work = 1;
453  for ( j = 0; j < 52; j++ ) {
454  if ( (work & pcv[i]) != 0 ) {
455  sformat[DSFMT_N].u[i] ^= work;
456  return;
457  }
458  work = work << 1;
459  }
460  }
461  }
462 
463  /**
464  * This function initializes the internal state array,
465  * with an array of 32-bit integers used as the seeds
466  * @param init_key the array of 32-bit integers, used as a seed.
467  * @param key_length the length of init_key.
468  */
469  void init_by_array(uint32_t init_key[], int key_length) {
470  int i, j, count;
471  uint32_t r;
472  uint32_t *psformat32;
473  int lag;
474  int mid;
475  int size = (DSFMT_N + 1) * 4; /* pulmonary */
476 
477 
478  if ( size >= 623 ) {
479  lag = 11;
480  } else if ( size >= 68 ) {
481  lag = 7;
482  } else if ( size >= 39 ) {
483  lag = 5;
484  } else {
485  lag = 3;
486  }
487  mid = (size - lag) / 2;
488 
489  psformat32 = &sformat[0].u32[0];
490  memset(sformat, 0x8b, sizeof(sformat));
491  if ( key_length + 1 > size ) {
492  count = key_length + 1;
493  } else {
494  count = size;
495  }
496  r = ini_func1(psformat32[sformat_idxof(0)] ^ psformat32[sformat_idxof(mid % size)]
497  ^ psformat32[sformat_idxof((size - 1) % size)]);
498  psformat32[sformat_idxof(mid % size)] += r;
499  r += key_length;
500  psformat32[sformat_idxof((mid + lag) % size)] += r;
501  psformat32[sformat_idxof(0)] = r;
502  i = 1;
503  count--;
504  for ( i = 1, j = 0; (j < count) && (j < key_length); j++ ) {
505  r = ini_func1(psformat32[sformat_idxof(i)]
506  ^ psformat32[sformat_idxof((i + mid) % size)]
507  ^ psformat32[sformat_idxof((i + size - 1) % size)]);
508  psformat32[sformat_idxof((i + mid) % size)] += r;
509  r += init_key[j] + i;
510  psformat32[sformat_idxof((i + mid + lag) % size)] += r;
511  psformat32[sformat_idxof(i)] = r;
512  i = (i + 1) % size;
513  }
514  for ( ; j < count; j++ ) {
515  r = ini_func1(psformat32[sformat_idxof(i)]
516  ^ psformat32[sformat_idxof((i + mid) % size)]
517  ^ psformat32[sformat_idxof((i + size - 1) % size)]);
518  psformat32[sformat_idxof((i + mid) % size)] += r;
519  r += i;
520  psformat32[sformat_idxof((i + mid + lag) % size)] += r;
521  psformat32[sformat_idxof(i)] = r;
522  i = (i + 1) % size;
523  }
524  for ( j = 0; j < size; j++ ) {
525  r = ini_func2(psformat32[sformat_idxof(i)]
526  + psformat32[sformat_idxof((i + mid) % size)]
527  + psformat32[sformat_idxof((i + size - 1) % size)]);
528  psformat32[sformat_idxof((i + mid) % size)] ^= r;
529  r -= i;
530  psformat32[sformat_idxof((i + mid + lag) % size)] ^= r;
531  psformat32[sformat_idxof(i)] = r;
532  i = (i + 1) % size;
533  }
534  initial_mask();
538  }
539 
540  /**
541  * This function fills the internal state array with double precision
542  * floating point pseudorandom numbers of the IEEE 754 format.
543  */
544  inline void gen_rand_all(void) {
545  int i;
546  w128_t lung;
547 
548  lung = sformat[DSFMT_N];
549  do_recursion(&sformat[0], &sformat[0], &sformat[DSFMT_POS1], &sformat[DSFMT_N -1], &lung);
550  for ( i = 1; i < DSFMT_N - DSFMT_POS1; i++ ) {
551  do_recursion(&sformat[i], &sformat[i], &sformat[i + DSFMT_POS1], &sformat[i - 1],
552  &lung);
553  }
554  for ( ; i < DSFMT_N; i++ ) {
555  do_recursion(&sformat[i], &sformat[i], &sformat[i + DSFMT_POS1 - DSFMT_N],
556  &sformat[i - 1], &lung);
557  }
558  sformat[DSFMT_N] = lung;
559  }
560 
561 private:
562  /** The integer used to seed the RNG. */
563  int iseed_;
564  /** the 128-bit internal state array */
566  /** the double pointer to the 128-bit internal state array */
567  double *psformat64;// = &sformat[0].d[0];
568  /** index counter to the internal state array as double */
570  /** a flag: it is 0 if and only if the internal state is not yet
571  * initialized. */
573 
574 }; // mt19937_RG
575 
576 
577 } // namespace random
578 } // namespace numeric
579 
580 #endif // INCLUDED_numeric_random_mt19937_HH
#define DSFMT_PCV1
Definition: mt19937.hh:208
Uniform random number generator.
Definition: uniform.hh:38
static int sformat_idxof(int i)
Definition: mt19937.hh:254
BooleanOptionKey const in
#define DSFMT_HIGH_CONST
Definition: mt19937.hh:193
StringVectorOptionKey const fix
w128_t sformat[DSFMT_N+1]
Definition: mt19937.hh:565
dictionary size
Definition: amino_acids.py:44
ReferenceCount base class – dispatch class.
#define DSFMT_MSK2
Definition: mt19937.hh:203
#define DSFMT_LOW_MASK
Definition: mt19937.hh:190
static uint32_t ini_func2(uint32_t x)
Definition: mt19937.hh:314
def x
#define DSFMT_MSK1
Definition: mt19937.hh:202
#define DSFMT_PCV2
Definition: mt19937.hh:209
Uniform random number generator.
void setSeed(int const iseed)
Set seed and state.
Definition: mt19937.hh:335
uint32_t u32[4]
Definition: mt19937.hh:220
virtual void saveState(std::ostream &out)
Serializes generator state to stream losslessly.
Definition: mt19937.hh:384
#define DSFMT_N
Definition: mt19937.hh:145
#define DSFMT_SR2
Definition: mt19937.hh:201
uint64_t u[2]
Definition: mt19937.hh:219
#define DSFMT_POS1
Definition: mt19937.hh:197
virtual void restoreState(std::istream &in)
Deserializes generator state from stream losslessly.
Definition: mt19937.hh:396
UINT64 uint64_t
Definition: types.hh:27
UINT32 uint32_t
Definition: types.hh:25
void setSeed(std::string const &)
Set seed and state.
Definition: mt19937.hh:356
#define DSFMT_SR1
Definition: mt19937.hh:200
static void lshift128(w128_t *out, const w128_t *in, int shift)
Definition: mt19937.hh:267
static uint32_t ini_func1(uint32_t x)
Definition: mt19937.hh:304
#define DSFMT_N64
Definition: mt19937.hh:151
static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c, w128_t *lung)
Definition: mt19937.hh:281
#define DSFMT_SL2
Definition: mt19937.hh:199
void init_by_array(uint32_t init_key[], int key_length)
Definition: mt19937.hh:469
double d[2]
Definition: mt19937.hh:221
IntegerOptionKey const j
#define DSFMT_SL1
Definition: mt19937.hh:198