NEURON
nmodlrandom.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 
3 /*
4 HOC wrapper object for NMODL NEURON block RANDOM variables to give a HOC
5 pointprocess.ranvar.method(...)
6 sec.ranvar_mech(x).method(...)
7 and Python
8 poinprocess.ranvar.method(...)
9 sec(x).mech.ranvar.method(...)
10 syntax
11 */
12 
13 #include <section.h>
14 #include <parse.hpp>
15 #include <nrnran123.h>
16 #include <classreg.h>
17 #include <gui-redirect.h>
18 
19 struct NMODLRandom {
23  return (nrnran123_State*) hr_.get<void*>();
24  }
25  void chk() {
26  if (!prop_id_) {
27  hoc_execerr_ext("NMODLRandom wrapped handle is not valid");
28  }
29  }
32 };
33 
35 #undef dmaxuint
36 #define dmaxuint 4294967295.
37 
38 static Object** set_ids(void* v) { // return this NMODLRandom instance
39  NMODLRandom* r = (NMODLRandom*) v;
40  r->chk();
41  uint32_t id[3];
42  for (int i = 0; i < 3; ++i) {
43  id[i] = (uint32_t) (chkarg(i + 1, 0., dmaxuint));
44  }
45  nrnran123_setids(r->r(), id[0], id[1], id[2]);
47 }
48 
49 static Object** get_ids(void* v) { // return a Vector of size 3.
50  NMODLRandom* r = (NMODLRandom*) v;
51  r->chk();
52  uint32_t id[3]{};
53  nrnran123_getids3(r->r(), id, id + 1, id + 2);
54  IvocVect* vec = vector_new1(3);
55  double* data = vector_vec(vec);
56  for (int i = 0; i < 3; ++i) {
57  data[i] = double(id[i]);
58  }
59  return vector_temp_objvar(vec);
60 }
61 
62 static Object** set_seq(void* v) { // return this NModlRandom instance
63  NMODLRandom* r = (NMODLRandom*) v;
64  r->chk();
65  double seq = *getarg(1);
66  nrnran123_setseq(r->r(), seq);
68 }
69 
70 static double get_seq(void* v) { // return the 34 bits (seq*4 + which) as double
71  NMODLRandom* r = (NMODLRandom*) v;
72  r->chk();
73  uint32_t seq;
74  char which;
75  nrnran123_getseq(r->r(), &seq, &which);
76  return double(seq) * 4.0 + which;
77 }
78 
79 static double uniform(void* v) {
80  NMODLRandom* r = (NMODLRandom*) v;
81  r->chk();
82  return nrnran123_uniform(r->r());
83 }
84 
85 static Member_func members[] = {{"get_seq", get_seq}, {"uniform", uniform}, {nullptr, nullptr}};
86 
87 static Member_ret_obj_func retobj_members[] = {{"set_ids", set_ids},
88  {"get_ids", get_ids},
89  {"set_seq", set_seq},
90  {nullptr, nullptr}};
91 
92 static void* nmodlrandom_cons(Object*) {
93  NMODLRandom* r = new NMODLRandom(nullptr);
94  return r;
95 }
96 
97 static void nmodlrandom_destruct(void* v) {
98  NMODLRandom* r = (NMODLRandom*) v;
99  delete r;
100 }
101 
103  class2oc(
104  "NMODLRandom", nmodlrandom_cons, nmodlrandom_destruct, members, retobj_members, nullptr);
105  if (!nmodlrandom_sym) {
106  nmodlrandom_sym = hoc_lookup("NMODLRandom");
108  }
109 }
110 
112  auto* const pnt = static_cast<Point_process*>(v);
113  if (!pnt->prop) {
114  if (nrn_inpython_ == 1) { /* python will handle the error */
115  hoc_warning("point process not located in a section", nullptr);
116  nrn_inpython_ = 2;
117  return {};
118  } else {
119  hoc_execerror("point process not located in a section", nullptr);
120  }
121  }
122 
123  return nrn_nmodlrandom_wrap(pnt->prop, sym);
124 }
125 
127  assert(sym->type == RANGEOBJ && sym->subtype == NMODLRANDOM);
128  auto& datum = prop->dparam[sym->u.rng.index];
129  assert(datum.holds<void*>());
130 
131  NMODLRandom* r = new NMODLRandom(nullptr);
132  r->hr_ = datum;
133  r->prop_id_ = prop->id();
135  return wrap;
136 }
void class2oc(const char *, ctor_f *cons, dtor_f *destruct, Member_func *, Member_ret_obj_func *, Member_ret_str_func *)
Definition: hoc_oop.cpp:1631
#define v
Definition: md1redef.h:11
#define i
Definition: md1redef.h:19
#define prop
Definition: md1redef.h:38
double chkarg(int, double low, double high)
Definition: code2.cpp:626
double nrnran123_uniform(nrnran123_State *s)
Definition: nrnran123.cpp:128
void nrnran123_getids3(nrnran123_State *s, std::uint32_t *id1, std::uint32_t *id2, std::uint32_t *id3)
Definition: nrnran123.cpp:97
void nrnran123_setseq(nrnran123_State *s, std::uint32_t seq, char which)
Set a Random123 sequence for a sequnece ID and which selector.
Definition: nrnran123.cpp:55
void nrnran123_setids(nrnran123_State *s, std::uint32_t id1, std::uint32_t id2, std::uint32_t id3)
Definition: nrnran123.cpp:104
void nrnran123_getseq(nrnran123_State *s, std::uint32_t *seq, char *which)
Get sequence number and selector from an nrnran123_State object.
Definition: nrnran123.cpp:50
#define NMODLRANDOM
Definition: modl.h:226
void hoc_execerr_ext(const char *fmt,...)
printf style specification of hoc_execerror message.
Definition: fileio.cpp:828
Object * nrn_nmodlrandom_wrap(Prop *prop, Symbol *sym)
Object * nrn_pntproc_nmodlrandom_wrap(void *v, Symbol *sym)
Object * hoc_new_object(Symbol *symtemp, void *v)
Definition: hoc_oop.cpp:450
Object ** vector_temp_objvar(Vect *v)
Definition: ivocvect.cpp:314
Symbol * hoc_lookup(const char *)
Definition: symbol.cpp:59
Object * nrn_get_gui_redirect_obj()
Definition: hoc_oop.cpp:644
#define assert(ex)
Definition: hocassrt.h:24
#define getarg
Definition: hocdec.h:17
#define RANGEOBJ
Definition: model.h:124
double * vector_vec(IvocVect *v)
Definition: ivocvect.cpp:19
IvocVect * vector_new1(int n)
Definition: ivocvect.cpp:26
void hoc_execerror(const char *s1, const char *s2)
Definition: nrnoc_aux.cpp:39
void hoc_warning(const char *s1, const char *s2)
Definition: nrnoc_aux.cpp:44
#define dmaxuint
Definition: nmodlrandom.cpp:36
static Member_func members[]
Definition: nmodlrandom.cpp:85
static Object ** set_seq(void *v)
Definition: nmodlrandom.cpp:62
static Symbol * nmodlrandom_sym
Definition: nmodlrandom.cpp:34
static double uniform(void *v)
Definition: nmodlrandom.cpp:79
static Object ** get_ids(void *v)
Definition: nmodlrandom.cpp:49
static double get_seq(void *v)
Definition: nmodlrandom.cpp:70
void NMODLRandom_reg()
static void * nmodlrandom_cons(Object *)
Definition: nmodlrandom.cpp:92
static Member_ret_obj_func retobj_members[]
Definition: nmodlrandom.cpp:87
static void nmodlrandom_destruct(void *v)
Definition: nmodlrandom.cpp:97
static Object ** set_ids(void *v)
Definition: nmodlrandom.cpp:38
int nrn_inpython_
Definition: hoc.cpp:52
Object ** hoc_temp_objptr(Object *)
Definition: code.cpp:151
nrnran123_State * r()
Definition: nmodlrandom.cpp:22
NMODLRandom(Object *)
Definition: nmodlrandom.cpp:20
neuron::container::non_owning_identifier_without_container prop_id_
Definition: nmodlrandom.cpp:31
neuron::container::generic_data_handle hr_
Definition: nmodlrandom.cpp:30
Definition: hocdec.h:173
A point process is computed just like regular mechanisms.
Definition: section_fwd.hpp:77
Definition: section.h:231
Definition: model.h:47
union Symbol::@28 u
struct Symbol::@45::@46 rng
short type
Definition: model.h:48
long subtype
Definition: model.h:49
Non-template stable handle to a generic value.
T get() const
Explicit conversion to any T.
A non-owning permutation-stable identifier for an entry in a container.