00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00035 #include "rng.h"
00036 #include <cstring>
00037 #include <iostream>
00038 #include "arts.h"
00039 #include "messages.h"
00043 Rng::Rng()
00044 {
00045 r = gsl_rng_alloc (gsl_rng_mt19937);
00046 }
00047
00048
00052 Rng::~Rng()
00053 {
00054 gsl_rng_free (r);
00055 }
00056
00061 void Rng::seed(unsigned long int n)
00062 {
00063 seed_no=n;
00064 gsl_rng_set(r,seed_no);
00065 }
00066
00067
00071 double Rng::draw()
00072 {
00073 return gsl_rng_uniform (r);
00074 }
00075
00076
00080 unsigned long int Rng::showseed()
00081 {
00082 return seed_no;
00083 }
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 static inline unsigned long int mt_get (void *vstate);
00145 static double mt_get_double (void *vstate);
00146 static void mt_set (void *state, unsigned long int s);
00147
00148 #define N 624
00149 #define M 397
00150
00151
00152 static const unsigned long UPPER_MASK = 0x80000000UL;
00153
00154
00155 static const unsigned long LOWER_MASK = 0x7fffffffUL;
00156
00157 typedef struct
00158 {
00159 unsigned long mt[N];
00160 int mti;
00161 }
00162 mt_state_t;
00163
00164 static inline unsigned long
00165 mt_get (void *vstate)
00166 {
00167 mt_state_t *state = (mt_state_t *) vstate;
00168
00169 unsigned long k ;
00170 unsigned long int *const mt = state->mt;
00171
00172 #define MAGIC(y) (((y)&0x1) ? 0x9908b0dfUL : 0)
00173
00174 if (state->mti >= N)
00175 {
00176 int kk;
00177
00178 for (kk = 0; kk < N - M; kk++)
00179 {
00180 unsigned long y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
00181 mt[kk] = mt[kk + M] ^ (y >> 1) ^ MAGIC(y);
00182 }
00183 for (; kk < N - 1; kk++)
00184 {
00185 unsigned long y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
00186 mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ MAGIC(y);
00187 }
00188
00189 {
00190 unsigned long y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
00191 mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ MAGIC(y);
00192 }
00193
00194 state->mti = 0;
00195 }
00196
00197
00198
00199 k = mt[state->mti];
00200 k ^= (k >> 11);
00201 k ^= (k << 7) & 0x9d2c5680UL;
00202 k ^= (k << 15) & 0xefc60000UL;
00203 k ^= (k >> 18);
00204
00205 state->mti++;
00206
00207 return k;
00208 }
00209
00210 static double
00211 mt_get_double (void * vstate)
00212 {
00213 return (double)mt_get (vstate) / 4294967296.0 ;
00214 }
00215
00216 static void
00217 mt_set (void *vstate, unsigned long int s)
00218 {
00219 mt_state_t *state = (mt_state_t *) vstate;
00220 int i;
00221
00222 if (s == 0)
00223 s = 4357;
00224
00225 state->mt[0]= s & 0xffffffffUL;
00226
00227 for (i = 1; i < N; i++)
00228 {
00229
00230
00231
00232 state->mt[i] =
00233 (1812433253UL * (state->mt[i-1] ^ (state->mt[i-1] >> 30)) + i);
00234
00235 state->mt[i] &= 0xffffffffUL;
00236 }
00237
00238 state->mti = i;
00239 }
00240
00241
00242
00243 static const gsl_rng_type mt_type =
00244 {"mt19937",
00245 0xffffffffUL,
00246 0,
00247 sizeof (mt_state_t),
00248 &mt_set,
00249 &mt_get,
00250 &mt_get_double};
00251
00252
00253 const gsl_rng_type *gsl_rng_mt19937 = &mt_type;
00254 unsigned long int gsl_rng_default_seed = 0;
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276 #define N1 100
00277
00278 const gsl_rng_type * gsl_rng_generator_types[N1];
00279
00280 #define ADD(t) {if (i==N1) abort(); gsl_rng_generator_types[i] = (t); i++; };
00281
00282 const gsl_rng_type **
00283 gsl_rng_types_setup (void)
00284 {
00285 int i = 0;
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299 ADD(gsl_rng_mt19937);
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 ADD(0);
00349
00350 return gsl_rng_generator_types;
00351 }
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377 FILE * gsl_stream = NULL ;
00378 gsl_stream_handler_t * gsl_stream_handler = NULL;
00379
00380 void
00381 gsl_stream_printf (const char *label, const char *file, int line,
00382 const char *reason)
00383 {
00384 if (gsl_stream == NULL)
00385 {
00386 gsl_stream = stderr;
00387 }
00388 if (gsl_stream_handler)
00389 {
00390 (*gsl_stream_handler) (label, file, line, reason);
00391 return;
00392 }
00393 fprintf (gsl_stream, "gsl: %s:%d: %s: %s\n", file, line, label, reason);
00394
00395 }
00396
00397 gsl_stream_handler_t *
00398 gsl_set_stream_handler (gsl_stream_handler_t * new_handler)
00399 {
00400 gsl_stream_handler_t * previous_handler = gsl_stream_handler;
00401 gsl_stream_handler = new_handler;
00402 return previous_handler;
00403 }
00404
00405 FILE *
00406 gsl_set_stream (FILE * new_stream)
00407 {
00408 FILE * previous_stream;
00409 if (gsl_stream == NULL) {
00410 gsl_stream = stderr;
00411 }
00412 previous_stream = gsl_stream;
00413 gsl_stream = new_stream;
00414 return previous_stream;
00415 }
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438 #include <cstddef>
00439 #include <cstdlib>
00440 #include <cstdio>
00441
00442
00443
00444
00445 gsl_error_handler_t * gsl_error_handler = NULL;
00446
00447 static void no_error_handler (const char *reason, const char *file, int line, int gsl_errno);
00448
00449 void
00450 gsl_error (const char * reason, const char * file, int line, int gsl_errno)
00451 {
00452 if (gsl_error_handler)
00453 {
00454 (*gsl_error_handler) (reason, file, line, gsl_errno);
00455 return ;
00456 }
00457
00458 gsl_stream_printf ("ERROR", file, line, reason);
00459
00460 fprintf (stderr, "Default GSL error handler invoked.\n");
00461 abort ();
00462 }
00463
00464 gsl_error_handler_t *
00465 gsl_set_error_handler (gsl_error_handler_t * new_handler)
00466 {
00467 gsl_error_handler_t * previous_handler = gsl_error_handler;
00468 gsl_error_handler = new_handler;
00469 return previous_handler;
00470 }
00471
00472
00473 gsl_error_handler_t *
00474 gsl_set_error_handler_off (void)
00475 {
00476 gsl_error_handler_t * previous_handler = gsl_error_handler;
00477 gsl_error_handler = no_error_handler;
00478 return previous_handler;
00479 }
00480
00481 static void
00482 no_error_handler (const char *reason _U_, const char *file _U_, int line _U_, int gsl_errno _U_)
00483 {
00484
00485 return;
00486 }
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511 gsl_rng *
00512 gsl_rng_alloc (const gsl_rng_type * T)
00513 {
00514
00515 gsl_rng *r = (gsl_rng *) malloc (sizeof (gsl_rng));
00516
00517 if (r == 0)
00518 {
00519 GSL_ERROR_VAL ("failed to allocate space for rng struct",
00520 GSL_ENOMEM, 0);
00521 };
00522
00523 r->state = malloc (T->size);
00524
00525 if (r->state == 0)
00526 {
00527 free (r);
00528
00529 GSL_ERROR_VAL ("failed to allocate space for rng state",
00530 GSL_ENOMEM, 0);
00531 };
00532
00533 r->type = T;
00534
00535 gsl_rng_set (r, gsl_rng_default_seed);
00536
00537 return r;
00538 }
00539
00540 int
00541 gsl_rng_memcpy (gsl_rng * dest, const gsl_rng * src)
00542 {
00543 if (dest->type != src->type)
00544 {
00545 GSL_ERROR ("generators must be of the same type", GSL_EINVAL);
00546 }
00547
00548 memcpy (dest->state, src->state, src->type->size);
00549
00550 return GSL_SUCCESS;
00551 }
00552
00553 gsl_rng *
00554 gsl_rng_clone (const gsl_rng * q)
00555 {
00556 gsl_rng *r = (gsl_rng *) malloc (sizeof (gsl_rng));
00557
00558 if (r == 0)
00559 {
00560 GSL_ERROR_VAL ("failed to allocate space for rng struct",
00561 GSL_ENOMEM, 0);
00562 };
00563
00564 r->state = malloc (q->type->size);
00565
00566 if (r->state == 0)
00567 {
00568 free (r);
00569
00570 GSL_ERROR_VAL ("failed to allocate space for rng state",
00571 GSL_ENOMEM, 0);
00572 };
00573
00574 r->type = q->type;
00575
00576 memcpy (r->state, q->state, q->type->size);
00577
00578 return r;
00579 }
00580
00581 void
00582 gsl_rng_set (const gsl_rng * r, unsigned long int seed)
00583 {
00584 (r->type->set) (r->state, seed);
00585 }
00586
00587 #ifndef HIDE_INLINE_STATIC
00588 unsigned long int
00589 gsl_rng_get (const gsl_rng * r)
00590 {
00591 return (r->type->get) (r->state);
00592 }
00593
00594 double
00595 gsl_rng_uniform (const gsl_rng * r)
00596 {
00597 return (r->type->get_double) (r->state);
00598 }
00599
00600 double
00601 gsl_rng_uniform_pos (const gsl_rng * r)
00602 {
00603 double x ;
00604 do
00605 {
00606 x = (r->type->get_double) (r->state) ;
00607 }
00608 while (x == 0) ;
00609
00610 return x ;
00611 }
00612
00613 unsigned long int
00614 gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)
00615 {
00616 unsigned long int offset = r->type->min;
00617 unsigned long int range = r->type->max - offset;
00618 unsigned long int scale = range / n;
00619 unsigned long int k;
00620
00621 if (n > range)
00622 {
00623 GSL_ERROR_VAL ("n exceeds maximum value of generator",
00624 GSL_EINVAL, 0) ;
00625 }
00626
00627 do
00628 {
00629 k = (((r->type->get) (r->state)) - offset) / scale;
00630 }
00631 while (k >= n);
00632
00633 return k;
00634 }
00635 #endif
00636
00637 unsigned long int
00638 gsl_rng_max (const gsl_rng * r)
00639 {
00640 return r->type->max;
00641 }
00642
00643 unsigned long int
00644 gsl_rng_min (const gsl_rng * r)
00645 {
00646 return r->type->min;
00647 }
00648
00649 const char *
00650 gsl_rng_name (const gsl_rng * r)
00651 {
00652 return r->type->name;
00653 }
00654
00655 size_t
00656 gsl_rng_size (const gsl_rng * r)
00657 {
00658 return r->type->size;
00659 }
00660
00661 void *
00662 gsl_rng_state (const gsl_rng * r)
00663 {
00664 return r->state;
00665 }
00666
00667 void
00668 gsl_rng_print_state (const gsl_rng * r)
00669 {
00670 size_t i;
00671 unsigned char *p = (unsigned char *) (r->state);
00672 const size_t n = r->type->size;
00673
00674 for (i = 0; i < n; i++)
00675 {
00676
00677 printf ("%.2x", *(p + i));
00678 }
00679
00680 }
00681
00682 void
00683 gsl_rng_free (gsl_rng * r)
00684 {
00685 free (r->state);
00686 free (r);
00687 }