1 #include <../../nrnconf.h>
175 #include "nrnran123.h"
182 #include <sys/stat.h>
183 #include <unordered_map>
184 #include <unordered_set>
188 #include "tqueue.hpp"
189 #include "vrecitem.h"
235 for (
int i = 0;
i < scnt[0]; ++
i) {
245 for (
int i = 0;
i < scnt[0]; ++
i) {
253 for (
int i = 0;
i <
n; ++
i) {
258 for (
int i = 0;
i <
n[0]; ++
i) {
263 for (
int i = 0;
i <
n[0]; ++
i) {
279 extern bool nrn_use_compress_;
301 #define PDEBUG printf("%s\n", dbuf)
303 #define PDEBUG f->s(dbuf, 1)
316 virtual void i(
int&
j,
int chk = 0)
override;
317 virtual void d(
int n,
double&
p)
override;
318 virtual void d(
int n,
double*
p)
override;
319 virtual void d(
int n,
double**
p)
override;
321 virtual void s(
char* cp,
int chk = 0)
override;
355 ns += strlen(cp) + 1;
364 return ni *
sizeof(int) +
nd *
sizeof(
double) +
ns;
374 virtual void i(
int&
j,
int chk = 0)
override;
375 virtual void d(
int n,
double&
p)
override;
376 virtual void d(
int n,
double*
p)
override;
377 virtual void d(
int n,
double**
p)
override;
379 virtual void s(
char* cp,
int chk = 0)
override;
384 f = fopen(fname,
"w");
391 fprintf(
f,
"%12d\n",
j);
397 for (
int i = 0;
i <
n; ++
i) {
398 fprintf(
f,
" %22.15g",
p[
i]);
403 for (
int i = 0;
i <
n; ++
i) {
404 fprintf(
f,
" %22.15g", *
p[
i]);
411 fprintf(
f,
" %22.15g\n", *h);
414 fprintf(
f,
"%s\n", cp);
424 virtual void i(
int&
j,
int chk = 0)
override;
425 virtual void d(
int n,
double&
p)
override {
428 virtual void d(
int n,
double*
p)
override;
429 virtual void d(
int n,
double**
p)
override;
431 virtual void s(
char* cp,
int chk = 0)
override;
435 virtual void skip(
int)
override;
439 f = fopen(fname,
"r");
449 int rval = fscanf(
f,
"%d\n", &
k);
457 for (
int i = 0;
i <
n; ++
i) {
463 for (
int i = 0;
i <
n; ++
i) {
484 for (
int i = 0;
i <
n; ++
i) {
493 virtual void i(
int&
j,
int chk = 0)
override;
494 virtual void d(
int n,
double&
p)
override;
495 virtual void d(
int n,
double*
p)
override;
496 virtual void d(
int n,
double**
p)
override;
498 virtual void s(
char* cp,
int chk = 0)
override;
501 virtual void cpy(
int size,
char* cp);
513 cpy(
sizeof(
int), (
char*) (&
j));
516 cpy(
sizeof(
double), (
char*) (&
d));
519 cpy(
n *
sizeof(
double), (
char*)
d);
522 for (
auto i = 0;
i <
n; ++
i) {
523 cpy(
sizeof(
double),
reinterpret_cast<char*
>(
d[
i]));
528 cpy(
sizeof(
double),
reinterpret_cast<char*
>(
static_cast<double*
>(h)));
531 cpy(strlen(cp) + 1, cp);
541 for (
int ii = 0;
ii < ns; ++
ii) {
550 virtual void i(
int&
j,
int chk = 0);
551 virtual void s(
char* cp,
int chk = 0);
556 virtual void cpy(
int size,
char* cp);
563 cpy(
sizeof(
int), (
char*) (&
k));
573 cpy(strlen(
p) + 1, cp);
580 for (
int ii = 0;
ii < ns; ++
ii) {
613 nrn_use_compress_ =
false;
645 int len = ss->
counts(&gids, &sizes);
648 for (
int i = 0;
i < len; ++
i) {
649 gidvec->
elem(
i) = double(gids[
i]);
650 sizevec->
elem(
i) = double(sizes[
i]);
660 printf(
"save_gid not implemented\n");
665 printf(
"restore_gid not implemented\n");
679 mkdir(
"bbss_out", 0770);
687 int len = ss->
counts(&gids, &sizes);
688 for (
int i = 0;
i < len; ++
i) {
704 int len, *gids, *sizes, global_size;
711 buf =
new char[global_size];
713 Sprintf(fname,
"binbufout/global.%d", global_size);
715 fwrite(
buf,
sizeof(
char), global_size, f);
719 Sprintf(fname,
"binbufout/global.size");
721 fprintf(f,
"%d\n", global_size);
724 for (
int i = 0;
i < len; ++
i) {
725 buf =
new char[sizes[
i]];
727 Sprintf(fname,
"binbufout/%d.%d", gids[
i], sizes[
i]);
729 fwrite(
buf,
sizeof(
char), sizes[
i], f);
733 Sprintf(fname,
"binbufout/%d.size", gids[
i]);
735 fprintf(f,
"%d\n", sizes[
i]);
756 (*pp_ignore_map)[pp] = 0;
780 *global_size = io.bytecnt();
782 *len = ss->
counts(gids, sizes);
812 for (
int i = 0;
i < ngroup; ++
i) {
909 int len = ss->
counts(&gids, &sizes);
910 for (
int i = 0;
i < len; ++
i) {
917 for (
int j = 0;
j < ngroup; ++
j) {
932 int len, *gids, *sizes, global_size, npiece, sz;
938 Sprintf(fname,
"binbufin/global.size");
945 Sprintf(fname,
"binbufin/global.%d", global_size);
946 f = fopen(fname,
"r");
951 nrn_assert(fread(
buf,
sizeof(
char), global_size, f) == global_size);
958 for (
int i = 0;
i < len; ++
i) {
961 Sprintf(fname,
"binbufin/%d.size", gids[
i]);
970 Sprintf(fname,
"binbufin/%d.%d", gids[
i], sz);
971 f = fopen(fname,
"r");
1010 {
nullptr,
nullptr}};
1030 nct =
s->u.ctemplate;
1049 for (
int i = 0;
i < msym->
s_varn; ++
i) {
1053 if (
ssi[im].offset < 0) {
1092 typedef std::unordered_map<Point_process*, DEList*>
PP2DE;
1183 double t1 = int(tt /
dt + 0.5 + 1e-10) *
dt;
1210 const auto& dl1iter =
pp2de->find(pp);
1211 if (dl1iter !=
pp2de->end()) {
1212 dl1 = dl1iter->second;
1213 sew =
new SEWrap(tq, dl1);
1254 cntinc = ps->
dil_.size();
1259 if (ps->
gid_ >= 0) {
1262 const auto& dliter =
src2send->find(srcid);
1264 dl = dliter->second;
1282 for (
i = 0;
i < dl->size();
i += 2) {
1283 double x =
fabs((*dl)[
i] - ts);
1291 dl->push_back(cntinc);
1292 }
else if (m > 1e-12) {
1295 (*dl)[im + 1] += cntinc;
1300 dl->push_back(cntinc);
1301 (*src2send)[srcid] = dl;
1318 const auto& dbiter =
nc2dblist->find(nc);
1321 (*nc2dblist)[nc] = db;
1323 db = dbiter->second;
1325 db->push_back(tq->
t_);
1331 const auto& dbiter =
nc2dblist->find(nc);
1334 (*nc2dblist)[nc] = db;
1336 db = dbiter->second;
1338 db->push_back(tq->
t_);
1407 const auto& delistiter =
pp2de->find(pp);
1409 if (delistiter !=
pp2de->end()) {
1410 dl1 = delistiter->second;
1446 for (
const auto& dlpair: *
pp2de) {
1447 auto dl = dlpair.second;
1448 for (; dl; dl = dl1) {
1519 int base = spgid % 10000000;
1520 if (spgid == base || !
base2spgid->count(base)) {
1521 (*base2spgid)[base] = spgid;
1555 *
gids = (
int*) malloc(gidcnt *
sizeof(
int));
1556 *cnts = (
int*) malloc(gidcnt *
sizeof(
int));
1559 printf(
"Error : Memory allocation failure in BBSaveState\n");
1569 auto base = pair.first;
1570 auto spgid = pair.second;
1571 (*gids)[gidcnt] = base;
1572 c->ni =
c->nd =
c->ns =
c->nl = 0;
1578 (*cnts)[gidcnt] =
c->bytecnt();
1656 const auto& spgiditer =
base2spgid->find(basegid);
1658 spgid = spgiditer->second;
1744 size_t last_dot =
name.rfind(
".");
1745 assert(last_dot != std::string::npos);
1747 std::string basename =
name.substr(last_dot + 1);
1748 if (sn2s.find(basename) != sn2s.end()) {
1749 hoc_execerr_ext(
"Python Section name, %s, is not unique in the Python cell",
1752 sn2s[basename] =
sec;
1768 return search->second;
1800 first = first->prev) {
1806 first = first->next;
1809 for (qsec = first; qsec != last; qsec = qsec->
next) {
1825 int i = (int) (n2s.size());
1827 for (
auto& iter: n2s) {
1828 const std::string&
name = iter.first;
1836 int indx =
sec->prop->dparam[5].get<
int>();
1855 std::unordered_set<std::string> snames;
1858 for (
i = 0;
i <
cnt; ++
i) {
1868 if (snames.find(
buf) != snames.end()) {
1873 snames.emplace(
buf);
1874 auto search = (*n2s).find(
buf);
1875 if (search != (*n2s).end()) {
1876 sec = search->second;
1902 auto sym =
sec->prop->dparam[0].get<
Symbol*>();
1907 int indx =
sec->prop->dparam[5].get<
int>();
1956 nseg =
sec->nnode - 1;
1958 for (
i = 0;
i < nseg; ++
i) {
1973 std::vector<double*> tmp{};
1975 tmp.push_back(
static_cast<double*
>(nd->
v_handle()));
1979 f->
d(
n, tmp.data());
1998 for (
i = 0,
p = nd->
prop;
p;
p =
p->next) {
2010 for (
p = nd->
prop;
p;
p =
p->next) {
2038 for (
i = 0,
p = nd->
prop;
p;
p =
p->next) {
2041 if (pp->sec ==
sec) {
2049 for (
p = nd->
prop;
p;
p =
p->next) {
2052 if (pp->sec ==
sec) {
2068 int type =
p->_type;
2080 auto const size =
ssi[
p->_type].
size;
2082 auto size_random = random_indices.size();
2083 std::vector<double*> tmp{};
2084 tmp.reserve(size + size_random);
2085 for (
auto i = 0;
i < size; ++
i) {
2086 tmp.push_back(
static_cast<double*
>(
p->param_handle_legacy(
ssi[
p->_type].
offset +
i)));
2091 std::vector<double> seq34(size_random, 0);
2092 for (
auto i = 0;
i < size_random; ++
i) {
2093 tmp.push_back(
static_cast<double*
>(&seq34[
i]));
2097 for (
auto i = 0;
i < size_random; ++
i) {
2100 auto& datum =
p->dparam[random_indices[
i]];
2103 seq34[
i] = 4.0 * double(seq) + double(which);
2106 f->
d(size + size_random, tmp.data());
2109 for (
auto i = 0;
i < size_random; ++
i) {
2110 auto& datum =
p->dparam[random_indices[
i]];
2132 double* xval =
NULL;
2144 xval =
new double[sz];
2187 const auto& dliter =
pp2de->find(pp);
2188 if (dliter ==
pp2de->end()) {
2191 dl = dliter->second;
2209 const auto& dbiter =
nc2dblist->find(nc);
2211 db = dbiter->second;
2214 for (
int i = 0;
i <
j; ++
i) {
2215 double x = (*db)[
i];
2237 for (
int i = 0;
i <
j; ++
i) {
2278 for (
int i = 0;
i <
cnt; ++
i) {
2280 double flag, tt, *w;
2292 assert(tqi && tqi->data_ &&
2294 auto* se =
static_cast<SelfEvent*
>(tqi->data_);
2302 se->movable_ = movable;
2304 if (ncindex == -1) {
2308 for (
j = 0, dl1 = dliter->second; j < ncindex; ++j, dl1 = dl1->
next) {
2332 int*
c =
new int[
np];
2334 for (
i = 0;
i <
np; ++
i) {
2336 rdispl[
i + 1] = rdispl[
i] +
c[
i];
2341 for (
i = 0;
i <
np; ++
i) {
2342 rdispl[
i + 1] = rdispl[
i] + rcnt[
i];
2349 int* rcnt =
new int[
np];
2350 int* rdispl =
new int[
np + 1];
2374 int* rcnt =
new int[
np];
2375 int* rdispl =
new int[
np + 1];
2381 tsdest =
new double[size];
2418 for (
const auto& pair: *
src2send) {
2419 ndsrctotal += pair.second->size();
2421 tssrc =
new double[ndsrctotal];
2432 for (
const auto& pair: *
src2send) {
2433 int gid = pair.first;
2436 dcnts[host] += pair.second->size();
2442 off[
i + 1] = off[
i] + cnts[
i];
2443 doff[
i + 1] = doff[
i] + dcnts[
i];
2450 for (
const auto& pair: *
src2send) {
2451 const auto dl = pair.second;
2452 int gid = pair.first;
2454 gidsrc[off[host] + cnts[host]] = gid;
2455 ndsrc[off[host] + cnts[host]++] = int(dl->size());
2456 for (
size_t i = 0;
i < dl->size(); ++
i) {
2457 tssrc[doff[host] + dcnts[host]++] = (*dl)[
i];
2460 for (
const auto& pair: *
src2send) {
2489 rdspl[
i + 1] = rdspl[
i] + rcnt[
i];
2501 int i, rsize, *rg =
NULL, *rtscnts =
NULL;
2510 rg =
new int[rsize];
2511 rtscnts =
new int[rsize];
2529 for (
i = 0;
i < rsize; ++
i) {
2532 dl->reserve(rtscnts[
i]);
2534 for (
int j = 0;
j < rtscnts[
i]; ++
j) {
2535 dl->push_back(rts[tsoff +
j]);
2538 tsoff += rtscnts[
i];
2565 std::unique_ptr<Int2DblList> m{
new Int2DblList()};
2566 m->reserve(
cnt + 1);
2570 for (
i = 0;
i <
cnt; ++
i) {
2573 const auto& dliter = m->find(gid);
2574 if (dliter != m->end()) {
2575 dl = dliter->second;
2584 for (
int k = 0;
k < tscnt;
k += 2) {
2585 double t1 =
tsdest[its++];
2586 int inccnt =
tsdest[its++];
2591 for (
int j = 0;
j < dl->size();
j += 2) {
2592 double dt =
fabs((*dl)[
j] - t1);
2594 (*dl)[
j + 1] += inccnt;
2597 }
else if (
dt < .1) {
2603 dl->push_back(inccnt);
2630 gidsrc =
new int[mcnt];
2631 tssrc_cnt =
new int[mcnt];
2632 tssrc =
new double[mdcnt];
2636 for (
const auto& pair: *m) {
2637 auto dl = pair.second;
2638 gidsrc[mcnt] = pair.first;
2639 tssrc_cnt[mcnt] = dl->size();
2640 for (
int i = 0;
i < dl->size(); ++
i) {
2641 tssrc[mdcnt++] = (*dl)[
i];
2697 i = (ps->
ssrc_ != 0 ? 1 : -1);
2701 if (output_index >= 0 &&
i == 1) {
2704 int j = (ps->
flag_ ? 1 : 0);
2726 dl = dliter->second;
2730 for (
i = 0;
i < dl->size();
i += 2) {
2733 int unc = (*dl)[
i + 1];
2775 (*queuecheck_gid2unc)[
i] = dl;
2777 for (
int j = 0;
j <
cnt;
j += 2) {
2802 for (
int j = 0;
j <
cnt;
j += 2) {
2820 auto gid = pair.first;
2821 auto dl = pair.second;
2825 dl2 = dl2iter->second;
2826 if (dl->size() == dl2->size()) {
2827 for (
int i = 0;
i < dl->size();
i += 2) {
2828 if ((
fabs((*dl)[
i] - (*dl2)[
i]) > 1e-12) || (*dl)[
i + 1] != (*dl2)[
i + 1]) {
2830 "error: gid=%d expect t=%g %d but queue contains t=%g %d "
2837 (*dl)[
i] - (*dl2)[
i]);
2841 printf(
"error: gid=%d distinct delivery times, expect %ld, actual %ld\n",
2847 printf(
"error: gid=%d expect spikes but none on queue\n", gid);
2848 for (
int i = 0;
i < dl->size() - 1;
i += 2) {
2849 printf(
" %g %d", (*dl)[
i],
int((*dl)[
i + 1]));
2855 auto gid = pair.first;
2856 auto dl2 = pair.second;
2860 dl = dliter->second;
2861 printf(
"error: gid=%d expect no spikes but some on queue\n", gid);
2862 for (
int i = 0;
i < int(dl2->size()) - 1;
i += 2) {
2863 printf(
" %g %d", (*dl)[
i],
int((*dl)[
i + 1]));
void nrn_netcon_event(NetCon *, double)
static StateStructInfo * ssi
std::unordered_map< std::string, Section * > SecName2Sec
static void scatteritems()
short * nrn_is_artificial_
void(* nrn_binq_enqueue_error_handler)(double, TQItem *)
void nrn_gidout_iter(PFIO)
std::vector< TQItem * > TQItemList
static double binq_time(double tt)
std::vector< SEWrap * > SEWrapList
static std::unique_ptr< PP2DE > pp2de
void bbss_restore_done(void *bbss)
At the end of the restore process, call this to do some extra setting up and cleanup.
static std::unordered_map< void *, SecName2Sec > pycell_name2sec_maps
static TQItemList * tq_removal_list
static std::unique_ptr< NetCon2DblList > nc2dblist
static double vector_play_init(void *v)
static SecName2Sec & pycell_name2sec_map(Object *c)
static void bbss_queuecheck()
int nrn_gid_exists(int gid)
std::unordered_map< NetCon *, DblList * > NetCon2DblList
ReceiveFunc * pnt_receive
Object * nrn_gid2obj(int gid)
static void all2allv_int2(int *scnt, int *sdispl, int *gidsrc, int *ndsrc)
static void pycell_name2sec_maps_fill()
static Member_func members[]
static std::unique_ptr< Int2DblList > queuecheck_gid2unc
void * bbss_buffer_counts(int *len, int **gids, int **sizes, int *global_size)
BBSaveState API See save_test_bin and restore_test_bin for an example of the use of this following in...
static void * cons(Object *)
static void allgatherv_helper(int cnt, int *rcnt, int *rdspl)
static void all2allv_dbl1(int *scnt, int *sdispl, double *tssrc)
void bbss_restore(void *bbss, int gid, int ngroup, char *buffer, int sz)
Call this for each item of the gids from bbss_buffer_counts, the number of buffers that were concaten...
static bool use_spikecompress_
static BBSaveState * bbss
static void spikes_on_correct_host(int cnt, int *g, int *dcnts, int tscnt, double *ts, Int2DblList *m)
std::unordered_map< int, DblList * > Int2DblList
void bbss_restore_global(void *bbss, char *buffer, int sz)
Call on all hosts with the buffer contents returned from the call to bbss_save_global.
static void pycell_name2sec_maps_clear()
static void destruct(void *v)
cTemplate ** nrn_pnt_template_
static void nrnmpi_dbl_alltoallv(const double *s, const int *scnt, const int *sdispl, double *r, int *rcnt, int *rdispl)
static void bbss_remove_delivered()
void(* ReceiveFunc)(Point_process *, double *, double)
static double save_gid(void *v)
static int ignored(Prop *p)
static double ppignore(void *v)
static double restore_gid(void *v)
static double restore_test_bin(void *v)
static void base2spgid_item(int spgid, Object *obj)
static std::unique_ptr< Int2DblList > src2send
PreSyn * nrn_gid2presyn(int gid)
std::unordered_map< int, int > Int2Int
std::vector< double > DblList
static void bbss_restore_begin()
static void nrnmpi_dbl_allgatherv(double *s, double *r, int *n, int *dspl)
void(* PFIO)(int, Object *)
static void tqcallback(const TQItem *tq, int i)
static double save(void *v)
static void nrnmpi_int_allgather(int *s, int *r, int n)
static double restore_test(void *v)
static double save_test_bin(void *v)
static std::unique_ptr< Int2Int > base2spgid
static std::unique_ptr< Int2DblList > presyn_queue
std::unordered_map< Point_process *, DEList * > PP2DE
static bool use_gidcompress_
void bbss_save_done(void *bbss)
At the end of the save process, call this to cleanup.
TQueue * net_cvode_instance_event_queue(NrnThread *)
void bbss_save(void *bbss, int gid, char *buffer, int sz)
Call this for each item of the gids from bbss_buffer_counts along with a buffer of size from the corr...
NetCvode * net_cvode_instance
static void nrnmpi_int_alltoallv(const int *s, const int *scnt, const int *sdispl, int *r, int *rcnt, int *rdispl)
static void del_presyn_info()
static void all2allv_helper(int *scnt, int *sdispl, int *rcnt, int *rdispl)
static void construct_presyn_queue()
static double save_request(void *v)
void bbss_save_global(void *bbss, char *buffer, int sz)
Call only on host 0 with a buffer of size equal to the global_size returned from the bbss_buffer_coun...
static std::unique_ptr< PointProcessMap > pp_ignore_map
Symlist * hoc_built_in_symlist
static void nrnmpi_barrier()
static double save_test(void *v)
static TQItemList * tq_presyn_fanout
static void cb_gidobj(int gid, Object *obj)
static void nrnmpi_int_allgatherv(int *s, int *r, int *n, int *dspl)
static void bbss_early(double td, TQItem *tq)
static double restore(void *v)
std::unordered_map< Point_process *, int > PointProcessMap
static int nrnmpi_int_allmax(int x)
static SEWrapList * sewrap_list
const char * secname(Section *sec)
name of section (for use in error messages)
Section * nrn_section_exists(char *name, int indx, Object *cell)
virtual void s(char *cp, int chk=0)
virtual void cpy(int size, char *cp)
virtual void i(int &j, int chk=0)
BBSS_BufferIn(char *buffer, int size)
virtual void cpy(int size, char *cp)
virtual ~BBSS_BufferOut()
virtual void i(int &j, int chk=0) override
BBSS_BufferOut(char *buffer, int size)
virtual void s(char *cp, int chk=0) override
virtual Type type() override
virtual void d(int n, double &p) override
virtual void d(int n, double &p) override
virtual void s(char *cp, int chk=0) override
virtual Type type() override
virtual void i(int &j, int chk=0) override
virtual void d(int n, double &p)=0
virtual void s(char *cp, int chk=0)=0
virtual void i(int &j, int chk=0)=0
virtual void skip(int) override
BBSS_TxtFileIn(const char *)
virtual Type type() override
virtual void i(int &j, int chk=0) override
virtual ~BBSS_TxtFileIn()
virtual void s(char *cp, int chk=0) override
virtual void d(int n, double &p) override
virtual void s(char *cp, int chk=0) override
virtual void d(int n, double &p) override
virtual ~BBSS_TxtFileOut()
virtual Type type() override
BBSS_TxtFileOut(const char *)
virtual void i(int &j, int chk=0) override
virtual void apply(BBSS_IO *io)
void node01(Section *, Node *)
void possible_presyn(int gid)
void gid2buffer(int gid, char *buffer, int size)
void netrecv_pp(Point_process *)
void section_exist_info(Section *)
int sectionsize(Section *)
void buffer2gid(int gid, char *buffer, int size)
void seccontents(Section *)
int counts(int **gids, int **counts)
virtual void pr(const char *, double t, NetCvode *)
virtual void savestate_restore(double deliverytime, NetCvode *)
void fanout(double, NetCvode *, NrnThread *)
SEWrap(const TQItem *, DEList *)
void forall_callback(void(*)(const TQItem *, int))
void class2oc(const char *, ctor_f *cons, dtor_f *destruct, Member_func *, Member_ret_obj_func *, Member_ret_str_func *)
Symbol * hoc_table_lookup(const char *, Symlist *)
void nrnran123_setseq(nrnran123_State *s, std::uint32_t seq, char which)
Set a Random123 sequence for a sequnece ID and which selector.
void nrnran123_getseq(nrnran123_State *s, std::uint32_t *seq, char *which)
Get sequence number and selector from an nrnran123_State object.
void * nrn_opaque_obj2pyobj(Object *ho)
void hoc_execerr_ext(const char *fmt,...)
printf style specification of hoc_execerror message.
size_t hoc_total_array_data(const Symbol *s, Objectdata *obd)
void hoc_pushpx(double *d)
void hoc_call_ob_proc(Object *ob, Symbol *sym, int narg)
IvocVect * vector_arg(int i)
char * hoc_object_name(Object *ob)
Symbol * hoc_lookup(const char *)
void hoc_obj_unref(Object *obj)
Point_process * ob2pntproc(Object *ob)
Object ** hoc_objgetarg(int)
#define ITERATE(itm, lst)
void nrn_spike_exchange(NrnThread *nt)
std::vector< int > & nrn_mech_random_indices(int type)
void nrn_fake_fire(int gid, double spiketime, int fake_out)
int Sprintf(char(&buf)[N], const char *fmt, Args &&... args)
Redirect sprintf to snprintf if the buffer size can be deduced.
int is_point_process(Object *)
#define nrn_assert(x)
assert()-like macro, independent of NDEBUG status
void nrn_net_send(Datum *v, double *weight, Point_process *pnt, double td, double flag)
int const size_t const size_t n
int * nrn_prop_param_size_
Object * nrn_sec2cell(Section *)
void nrnmpi_abort(int errcode)
std::vector< Memb_func > memb_func
int nrn_vartype(const Symbol *sym)
double nrn_call_mech_func(Symbol *s, int narg, Prop *p, int mechtype)
static double ref(void *v)
Represent main neuron object computed by single thread.
A point process is computed just like regular mechanisms.
struct Symbol::@45::@46 rng
Non-template stable handle to a generic value.
T get() const
Explicit conversion to any T.