2 #include <unordered_map>
37 #if defined(HAVE_DLFCN_H)
44 void**
c = (
void**) sym;
73 if (strcmp(
name,
"secondorder") == 0) {
75 }
else if (strcmp(
name,
"Random123_global_index") == 0) {
77 }
else if (strcmp(
name,
"_nrnunit_use_legacy_") == 0) {
90 for (; sp; sp = sp->
next) {
97 val =
new double[size];
98 for (
int i = 0;
i < a->
sub[0]; ++
i) {
107 val[0] = *sp->
u.
pval;
135 for (
int i = 0;
i < nc->
cnt_; ++
i) {
136 nc->
weight_[
i] = weights[ith][iw[ith]++];
165 }
else if (
type == 0) {
208 std::vector<int>& netcon_negsrcgid_tid) {
248 int vdata_offset = 0;
249 tml_index =
new int[nmech];
250 ml_nodecount =
new int[nmech];
252 for (
size_t j = 0;
j < mla.size(); ++
j) {
253 int type = mla[
j].first;
260 if (ds[psz] == -4 || ds[psz] == -6 || ds[psz] == -7 || ds[psz] == 0) {
267 nvdata = vdata_offset;
279 int*& v_parent_index,
296 for (
int i = 0;
i < nt.
end; ++
i) {
312 diamvec =
new double[nt.
end];
314 for (
int i = 0;
i < nt.
end; ++
i) {
335 std::vector<int>& pointer2type) {
342 int type = mlai.first;
345 bool copy =
data ? true :
false;
362 for (
int i = 0;
i <
n; ++
i) {
367 for (
int i = 0;
i < nn; ++
i) {
383 for (
int i = 0;
i < nn; ++
i) {
400 double*& output_threshold,
401 int*& netcon_pnttype,
402 int*& netcon_pntindex,
410 output_vindex =
new int[cg.
n_presyn];
427 weights =
new double[nweight];
429 for (
int i = 0;
i <
n; ++
i) {
431 for (
int j = 0;
j < nc->
cnt_; ++
j) {
436 delays =
new double[
n];
437 for (
int i = 0;
i <
n; ++
i) {
452 for (
size_t i = 0;
i < mla.size(); ++
i) {
484 iArray =
new int[icnt];
487 dArray =
new double[dcnt];
533 std::vector<int>& pointer2type) {
540 for (
int j = 0;
j < sz; ++
j) {
544 const int seman = semantics[
j];
555 pointer2type.push_back(etype);
556 }
else if (etype == -1) {
563 }
else if (etype == -9) {
565 }
else if (etype > 0 && etype < 1000) {
567 }
else if (etype > 1000 && etype < 2000) {
570 }
else if (etype == -2) {
572 }
else if (etype == -4) {
573 pdata[jj] = ml_vdata_offset + eindex;
575 }
else if (etype == -6) {
576 pdata[jj] = ml_vdata_offset + eindex;
578 }
else if (etype == -7) {
579 pdata[jj] = ml_vdata_offset + eindex;
642 for (
int i = 0;
i <
fp->count(); ++
i) {
648 indices.push_back(
i);
682 double* pd = vp->
pd_;
691 if (pd >= ml->
data[0] && pd < (ml->
data[0] + nn)) {
693 ix = (pd - ml->
data[0]);
730 for (
int i = 0;
i <
fp->count(); ++
i) {
746 int triggered = wc->
flag_ ? 1 : 0;
748 (*cb)(tid, pnttype, pntindex, watch_index, triggered);
802 std::unordered_map<
NetCon*, std::vector<size_t>>& netcon2intdata,
803 std::unordered_map<
PreSyn*, std::vector<size_t>>& presyn2intdata,
804 std::unordered_map<
double*, std::vector<size_t>>& weight2intdata) {
807 double tdeliver = tqi->
t_;
809 core_te->
td.push_back(tdeliver);
821 size_t iloc = core_te->
intdata.size();
822 core_te->
intdata.push_back(-1);
825 netcon2intdata[nc].push_back(iloc);
851 size_t iloc_wt = core_te->
intdata.size();
853 weight2intdata[wt].push_back(iloc_wt);
855 core_te->
intdata.push_back(-1);
860 core_te->
intdata.push_back((movable && *movable == tqi) ? 1 : 0);
861 if (movable && *movable == tqi) {
862 assert(pnt_movable && *pnt_movable == tqi);
871 bool skip = (ps->
nt_ && (ps->
nt_->
id != tid)) ? true :
false;
874 skip = (!ps->
nt_ && tid != 0) ?
true : skip;
877 core_te->
type.pop_back();
878 core_te->
td.pop_back();
898 size_t iloc = core_te->
intdata.size();
899 core_te->
intdata.push_back(-1);
900 presyn2intdata[ps].push_back(iloc);
912 core_te->
td.pop_back();
913 core_te->
type.pop_back();
917 "WARNING: CVode.event(...) for delivery at time step nearest %g discarded. "
918 "CoreNEURON cannot presently handle interpreter events (rank %d, thread %d).\n",
944 std::unordered_map<NetCon*, std::vector<size_t>> netcon2intdata;
945 std::unordered_map<PreSyn*, std::vector<size_t>> presyn2intdata;
946 std::unordered_map<double*, std::vector<size_t>> weight2intdata;
960 set_info(tqi, tid, core_te, netcon2intdata, presyn2intdata, weight2intdata);
966 set_info(tqi, tid, core_te, netcon2intdata, presyn2intdata, weight2intdata);
973 for (
int i = 0;
i < cg.n_netcon; ++
i) {
975 auto iter = netcon2intdata.find(nc);
976 if (iter != netcon2intdata.end()) {
977 for (
auto iloc: iter->second) {
984 #define NRN_SENTINAL 100000000000
985 for (
int i = 0;
i < cg.n_presyn; ++
i) {
987 auto iter = presyn2intdata.find(ps);
988 if (iter != presyn2intdata.end()) {
991 for (
auto iloc: iter->second) {
999 for (
auto& iter: presyn2intdata) {
1006 for (
int i = 0;
i < cg.n_netcon; ++
i) {
1009 auto iter = weight2intdata.find(wt);
1010 if (iter != weight2intdata.end()) {
1011 for (
auto iloc: iter->second) {
1075 *movable_arg = (
void*) old_movable_arg;
1107 double* weight =
NULL;
1126 if (presyns_flag_true.empty()) {
1137 if (presyns_flag_true.erase(index_v)) {
1139 if (presyns_flag_true.empty()) {
1165 presyns_flag_true.insert(index_v);
1178 for (
size_t i = 0;
i < wi.size(); ++
i) {
1182 for (
auto watch_item: active_watch_items) {
1183 int watch_index = watch_item.first;
1184 bool above_thresh = watch_item.second;
1192 pd + watch_begin, wc->
c_, watch_index - watch_begin, wc->
pnt_, r++, wc->
nrflag_);
1193 wc->
flag_ = above_thresh ? 1 : 0;
1212 if (strcmp(
memb_func[
i].sym->name,
"PatternStim") == 0) {
std::vector< MlWithArtItem > MlWithArt
std::pair< int, Memb_list * > MlWithArtItem
TQItem * first()
Iterate in ascending bin order starting at current bin.
static void clean_deferred_netcons()
static std::vector< NetCon ** > deferred_netcons
static void clear_artdata2index()
static int nrncore_pntindex_for_queue(double *d, int tid, int type)
static void defer_clean_netcons(CellGroup *)
static void clean_art(CellGroup *)
std::vector< int > netcon_negsrcgid_tid
static Deferred_Type2ArtMl deferred_type2artml_
DatumIndices * datumindices
virtual void send(double deliverytime, NetCvode *, NrnThread *)
virtual void send(double sendtime, NetCvode *, NrnThread *)
PlayRecList * fixed_play_
TQItem * atomic_dq(double til)
IvocVect * discon_indices_
double(* c_)(Point_process *)
VEC * cgs(MTX_FN A, void *A_params, VEC *b, VEC *r0, double tol, VEC *x)
sprintf(buf, " if (secondorder) {\n" " int _i;\n" " for (_i = 0; _i < %d; ++_i) {\n" " _p[_slist%d[_i]] += dt*_p[_dlist%d[_i]];\n" " }}\n", numeqn, listnum, listnum)
DLFCN_NOINLINE DLFCN_EXPORT void * dlsym(void *handle, const char *name)
void hoc_execerror(const char *, const char *)
double * hoc_val_pointer(const char *s)
Symbol * hoc_lookup(const char *)
Symlist * hoc_built_in_symlist
int vector_capacity(Vect *v)
double * vector_vec(Vect *v)
#define ITERATE(itm, lst)
char * emalloc(unsigned n)
#define DiscreteEventType
#define PlayRecordEventType
void _nrn_watch_activate(Datum *, double(*)(Point_process *), int, Point_process *, int, double)
int * nrn_prop_param_size_
short * nrn_is_artificial_
void nrn2core_transfer_WatchCondition(WatchCondition *wc, void(*cb)(int, int, int, int, int))
getting one item at a time from nrn2core_transfer_WATCH
void nrnthread_group_ids(int *grp)
NrnCoreTransferEvents * nrn2core_transfer_tqueue(int tid)
int nrnthread_dat2_corepointer_mech(int tid, int type, int &icnt, int &dcnt, int *&iArray, double *&dArray)
void core2nrn_NetCon_event(int tid, double td, size_t nc_index)
Called from CoreNEURON core2nrn_tqueue_item.
int nrnthread_dat2_3(int tid, int nweight, int *&output_vindex, double *&output_threshold, int *&netcon_pnttype, int *&netcon_pntindex, double *&weights, double *&delays)
static void core2nrn_SelfEvent_helper(int tid, double td, int tar_type, int tar_index, double flag, double *weight, int is_movable)
void map_coreneuron_callbacks(void *handle)
Populate function pointers by mapping function pointers for callback.
void * get_global_dbl_item(void *p, const char *&name, int &size, double *&val)
void nrn2core_PreSyn_flag(int tid, std::set< int > &presyns_flag_true)
static std::map< int, int > type2movable
int nrnthread_dat2_1(int tid, int &ngid, int &n_real_gid, int &nnode, int &ndiam, int &nmech, int *&tml_index, int *&ml_nodecount, int &nidata, int &nvdata, int &nweight)
int * datum2int(int type, Memb_list *ml, NrnThread &nt, CellGroup &cg, DatumIndices &di, int ml_vdata_offset, std::vector< int > &pointer2type)
void core2nrn_SelfEvent_event(int tid, double td, int tar_type, int tar_index, double flag, size_t nc_index, int is_movable)
int nrnthread_dat2_vecplay(int tid, std::vector< int > &indices)
void core2nrn_SelfEvent_event_noweight(int tid, double td, int tar_type, int tar_index, double flag, int is_movable)
static void setup_type2semantics()
int nrnthread_dat2_vecplay_inst(int tid, int i, int &vptype, int &mtype, int &ix, int &sz, double *&yvec, double *&tvec, int &last_index, int &discon_index, int &ubound_index)
void core2nrn_vecplay_events()
start the vecplay events
void core2nrn_PreSyn_flag(int tid, std::set< int > presyns_flag_true)
void write_memb_mech_types_direct(std::ostream &s)
int nrnthread_dat2_mech(int tid, size_t i, int dsz_inst, int *&nodeindices, double *&data, int *&pdata, std::vector< int > &pointer2type)
int nrnthread_dat1(int tid, int &n_presyn, int &n_netcon, int *&output_gid, int *&netcon_srcgid, std::vector< int > &netcon_negsrcgid_tid)
void nrnthreads_all_weights_return(std::vector< double * > &weights)
Copy weights from all coreneuron::NrnThread to NetCon instances.
void * nrn_patternstim_info_ref(Datum *)
int get_global_int_item(const char *name)
int nrnthread_dat2_corepointer(int tid, int &n)
void core2nrn_watch_activate(int tid, int type, int watch_begin, Core2NrnWatchInfo &wi)
void core2nrn_vecplay(int tid, int i, int last_index, int discon_index, int ubound_index)
getting one item at a time from CoreNEURON
int nrnthread_dat2_2(int tid, int *&v_parent_index, double *&a, double *&b, double *&area, double *&v, double *&diamvec)
bbcore_write_t * nrn_bbcore_write_
int core2nrn_corepointer_mech(int tid, int type, int icnt, int dcnt, int *iArray, double *dArray)
static int patternstim_type
TQueue * net_cvode_instance_event_queue(NrnThread *)
NetCvode * net_cvode_instance
size_t nrnthreads_type_return(int type, int tid, double *&data, double **&mdata)
Return location for CoreNEURON to copy data into.
void nrn2core_patternstim(void **info)
bbcore_write_t * nrn_bbcore_read_
double nrn_ion_charge(Symbol *)
void * nrn_interthread_enqueue(NrnThread *)
void core2nrn_clear_queues(double time)
Initialize queues before transfer Probably aleady clear, but if binq then must be initialized to time...
static void set_info(TQItem *tqi, int tid, NrnCoreTransferEvents *core_te, std::unordered_map< NetCon *, std::vector< size_t >> &netcon2intdata, std::unordered_map< PreSyn *, std::vector< size_t >> &presyn2intdata, std::unordered_map< double *, std::vector< size_t >> &weight2intdata)
static core2nrn_callback_t cnbs[]
std::vector< Core2NrnWatchInfoItem > Core2NrnWatchInfo
std::vector< std::pair< int, bool > > Core2NrnWatchInfoItem
double * contiguous_art_data(double **data, int nitem, int szitem)
const char * bbcore_write_version
int nrn_dblpntr2nrncore(double *pd, NrnThread &nt, int &type, int &index)
int const size_t const size_t n
void nrn_net_send(void **, double *, Point_process *, double, double)
NrnWatchAllocateFunc_t * nrn_watch_allocate_
void(*)(double *, int *, int *, int *, double *, Datum *, Datum *, NrnThread *) bbcore_write_t
uint32_t nrnran123_get_globalindex()
std::vector< double > dbldata
std::vector< int > intdata
Represent main neuron object computed by single thread.
_nrn_Fast_Imem * _nrn_fast_imem
struct NrnThreadMembList * next
HocStruct cTemplate * ctemplate
#define VecPlayContinuousType