NEURON
nrnran123.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 #include <inttypes.h>
3 #include <nrnran123.h>
4 #include <hocdec.h>
5 #include <stdlib.h>
6 #include <math.h>
7 #include <Random123/philox.h>
8 
9 static const double SHIFT32 = 1.0 / 4294967297.0; /* 1/(2^32 + 1) */
10 
11 static philox4x32_key_t k={{0}};
12 
14  philox4x32_ctr_t c;
15  philox4x32_ctr_t r;
16  char which_;
17 };
18 
20  k.v[0] = gix;
21 }
22 
23 /* if one sets the global, one should reset all the stream sequences. */
25  return k.v[0];
26 }
27 
29  return nrnran123_newstream3(id1, id2, 0);
30 }
33  s = (nrnran123_State*)ecalloc(sizeof(nrnran123_State), 1);
34  s->c.v[1] = id3;
35  s->c.v[2] = id1;
36  s->c.v[3] = id2;
37  nrnran123_setseq(s, 0, 0);
38  return s;
39 }
40 
42  free(s);
43 }
44 
45 extern "C" void nrnran123_getseq(nrnran123_State* s, uint32_t* seq, char* which) {
46  *seq = s->c.v[0];
47  *which = s->which_;
48 }
49 
50 extern "C" void nrnran123_setseq(nrnran123_State* s, uint32_t seq, char which) {
51  if (which > 3 || which < 0) {
52  s->which_ = 0;
53  }else{
54  s->which_ = which;
55  }
56  s->c.v[0] = seq;
57  s->r = philox4x32(s->c, k);
58 }
59 
60 extern "C" void nrnran123_getids(nrnran123_State* s, uint32_t* id1, uint32_t* id2) {
61  *id1 = s->c.v[2];
62  *id2 = s->c.v[3];
63 }
64 
65 extern "C" void nrnran123_getids3(nrnran123_State* s, uint32_t* id1, uint32_t* id2, uint32_t* id3) {
66  *id3 = s->c.v[1];
67  *id1 = s->c.v[2];
68  *id2 = s->c.v[3];
69 }
70 
72  uint32_t rval;
73  char which = s->which_;
74  assert (which < 4);
75  rval = s->r.v[which++];
76  if (which > 3) {
77  which = 0;
78  s->c.v[0]++;
79  s->r = philox4x32(s->c, k);
80  }
81  s->which_ = which;
82  return rval;
83 }
84 
85 extern "C" double nrnran123_dblpick(nrnran123_State* s) {
87 }
88 
89 extern "C" double nrnran123_negexp(nrnran123_State* s) {
90  /* min 2.3283064e-10 to max 22.18071 */
91  return -log(nrnran123_dblpick(s));
92 }
93 
94 /* At cost of a cached value we could compute two at a time. */
95 /* But that would make it difficult to transfer to coreneuron for t > 0 */
96 extern "C" double nrnran123_normal(nrnran123_State* s) {
97  double w, x, y;
98  double u1, u2;
99  do {
100  u1 = nrnran123_dblpick(s);
101  u2 = nrnran123_dblpick(s);
102  u1 = 2.*u1 - 1.;
103  u2 = 2.*u2 - 1.;
104  w = (u1*u1) + (u2*u2);
105  } while( w > 1 );
106 
107  y = sqrt( (-2.*log(w))/w);
108  x = u1*y;
109  return x;
110 }
111 
113  return nrnran123_iran3(seq, id1, id2, 0);
114 }
117  philox4x32_ctr_t c;
118  c.v[0] = seq;
119  c.v[1] = id3;
120  c.v[2] = id1;
121  c.v[3] = id2;
122  philox4x32_ctr_t r = philox4x32(c, k);
123  a.v[0] = r.v[0];
124  a.v[1] = r.v[1];
125  a.v[2] = r.v[2];
126  a.v[3] = r.v[3];
127  return a;
128 }
129 
131  /* 0 to 2^32-1 transforms to double value in open (0,1) interval */
132  /* min 2.3283064e-10 to max (1 - 2.3283064e-10) */
133  return ((double)u + 1.0) * SHIFT32;
134 }
void * ecalloc(size_t n, size_t size)
Definition: symbol.cpp:221
#define assert(ex)
Definition: hocassrt.h:26
double nrnran123_negexp(nrnran123_State *s)
Definition: nrnran123.cpp:89
void nrnran123_deletestream(nrnran123_State *s)
Definition: nrnran123.cpp:41
nrnran123_State * nrnran123_newstream(uint32_t id1, uint32_t id2)
Definition: nrnran123.cpp:28
#define philox4x32(c, k)
Definition: philox.h:352
log
Definition: extdef.h:3
void nrnran123_getids3(nrnran123_State *s, uint32_t *id1, uint32_t *id2, uint32_t *id3)
Definition: nrnran123.cpp:65
nrnran123_State * nrnran123_newstream3(uint32_t id1, uint32_t id2, uint32_t id3)
Definition: nrnran123.cpp:31
void nrnran123_getseq(nrnran123_State *s, uint32_t *seq, char *which)
Definition: nrnran123.cpp:45
static philox4x32_key_t k
Definition: nrnran123.cpp:11
void nrnran123_setseq(nrnran123_State *s, uint32_t seq, char which)
Definition: nrnran123.cpp:50
uint32_t nrnran123_ipick(nrnran123_State *s)
Definition: nrnran123.cpp:71
_CONST char * s
Definition: system.cpp:74
void nrnran123_getids(nrnran123_State *s, uint32_t *id1, uint32_t *id2)
Definition: nrnran123.cpp:60
uint32_t v[4]
Definition: nrnran123.h:32
nrnran123_array4x32 nrnran123_iran3(uint32_t seq, uint32_t id1, uint32_t id2, uint32_t id3)
Definition: nrnran123.cpp:115
philox4x32_ctr_t r
Definition: nrnran123.cpp:15
sqrt
Definition: extdef.h:3
double nrnran123_dblpick(nrnran123_State *s)
Definition: nrnran123.cpp:85
void nrnran123_set_globalindex(uint32_t gix)
Definition: nrnran123.cpp:19
philox4x32_ctr_t c
Definition: nrnran123.cpp:14
double nrnran123_uint2dbl(uint32_t u)
Definition: nrnran123.cpp:130
uint32_t nrnran123_get_globalindex()
Definition: nrnran123.cpp:24
double nrnran123_normal(nrnran123_State *s)
Definition: nrnran123.cpp:96
nrnran123_array4x32 nrnran123_iran(uint32_t seq, uint32_t id1, uint32_t id2)
Definition: nrnran123.cpp:112
uint uint32_t
static const double SHIFT32
Definition: nrnran123.cpp:9