123 template <
typename T>
142 T* data_orig =
new T[
n];
143 for (
int i = 0;
i <
n; ++
i) {
147 for (
int icnt = 0; icnt <
cnt; ++icnt) {
148 for (
int isz = 0; isz < sz; ++isz) {
152 data[ip] = data_orig[
i];
160 int* pinv =
new int[
n];
161 for (
int i = 0;
i <
n; ++
i) {
169 for (
int i = 0;
i <
n; ++
i) {
189 static std::vector<int> type_hints;
191 static int full_search(
NrnThread& nt,
double* pd) {
196 if (pd >= ml->
data && pd < ml->
data +
n) {
200 for (
int type_hint: type_hints) {
201 if (
type < type_hint) {
206 type_hints.insert(type_hints.begin() +
i,
type);
216 double* pd = nt._data +
i;
217 assert(pd >= nt._actual_v);
218 if (pd < nt._actual_area) {
226 for (
int type: type_hints) {
228 if (pd >= ml->
data) {
230 if (pd < ml->
data +
n) {
234 return full_search(nt, pd);
238 return full_search(nt, pd);
263 for (
int i = 0;
i < psz; ++
i) {
264 int s = semantics[
i];
266 int area0 = nt._actual_area - nt._data;
267 int* p_target = nt._permute;
268 for (
int iml = 0; iml <
cnt; ++iml) {
276 int ix = *pd - area0;
278 int ixnew = p_target[ix];
281 }
else if (
s == -9) {
282 int diam0 = nt._actual_diam - nt._data;
283 int* p_target = nt._permute;
284 for (
int iml = 0; iml <
cnt; ++iml) {
292 int ix = *pd - diam0;
294 int ixnew = p_target[ix];
297 }
else if (
s == -5) {
300 for (
int iml = 0; iml <
cnt; ++iml) {
304 int v0 = nt._actual_v - nt._data;
305 int* e_target = nt._permute;
308 int ixnew = e_target[ix];
310 }
else if (etype > 0) {
313 int edata0 = eml->
data - nt._data;
317 int* e_permute = eml->_permute;
318 int i_ecnt, i_esz, padded_ecnt;
319 int ix = *pd - edata0;
327 i_ecnt = ix % padded_ecnt;
328 i_esz = ix / padded_ecnt;
330 int i_ecnt_new = e_permute ? e_permute[i_ecnt] : i_ecnt;
331 int ix_new =
nrn_i_layout(i_ecnt_new, ecnt, i_esz, esz, elayout);
332 *pd = ix_new + edata0;
341 int edata0 = eml->
data - nt._data;
344 int* e_permute = eml->_permute;
345 for (
int iml = 0; iml <
cnt; ++iml) {
347 int ix = *pd - edata0;
349 int i_ecnt, i_esz, padded_ecnt;
357 i_ecnt = ix % padded_ecnt;
358 i_esz = ix / padded_ecnt;
360 int i_ecnt_new = e_permute[i_ecnt];
361 int ix_new =
nrn_i_layout(i_ecnt_new, ecnt, i_esz, esz, elayout);
362 *pd = ix_new + edata0;
368 void node_permute(
int* vec,
int n,
int*
permute) {
369 for (
int i = 0;
i <
n; ++
i) {
379 for (
int i = 0;
i < vec_size; ++
i) {
404 update_pdata_values(ml,
type, nt);
409 static void pr(
const char*
s,
int* x,
int n) {
411 for (
int i = 0;
i <
n; ++
i) {
417 static void pr(
const char*
s,
double* x,
int n) {
419 for (
int i = 0;
i <
n; ++
i) {
432 if (a.first < b.first) {
434 }
else if (a.first == b.first) {
435 if (a.second < b.second) {
447 std::vector<std::pair<int, int>>
vi(
n);
448 for (
int i = 0;
i <
n; ++
i) {
449 vi[
i].first = values[
i];
454 int* sort_indices =
new int[
n];
456 std::vector<int> sort_indices(
n);
458 for (
int i = 0;
i <
n; ++
i) {
459 sort_indices[
i] =
vi[
i].second;
auto & get_memb_func(size_t idx)
auto & get_prop_dparam_size()
auto & get_mech_data_layout()
auto & get_is_artificial()
auto & get_prop_param_size()
bool nrn_semantics_is_ion(int i)
int nrn_semantics_ion_type(int i)
THIS FILE IS AUTO GENERATED DONT MODIFY IT.
int nrn_i_layout(int icnt, int cnt, int isz, int sz, int layout)
This function return the index in a flat array of a matrix coordinate (icnt, isz).
int * inverse_permute(int *p, int n)
int nrn_soa_padded_size(int cnt, int layout)
calculate size after padding for specific memory layout
static int permute(int i, NrnThread &nt)
In mechanism libraries, cannot use auto const token = nrn_ensure_model_data_are_sorted(); because the...
void permute_nodeindices(Memb_list *ml, int *permute)
void permute_ml(Memb_list *ml, int type, NrnThread &nt)
void permute_data(double *vec, int n, int *p)
static void invert_permute(int *p, int n)
std::vector< int > nrn_index_sort(int *values, int n)
static bool nrn_index_sort_cmp(const std::pair< int, int > &a, const std::pair< int, int > &b)
void update_parent_index(int *vec, int vec_size, const std::vector< int > &permute)
void sort_ml(Memb_list *ml)
void permute_ptr(int *vec, int n, int *p)
int type_of_ntdata(NrnThread &, int index, bool reset)
#define nrn_assert(x)
assert()-like macro, independent of NDEBUG status
int const size_t const size_t n
static void pr(N_Vector x)
void forward_permute(std::vector< T > &data, const std::vector< int > &perm)
void vi(double *p1, double *p2, double v1, double v2, double *out)
A view into a set of mechanism instances.
std::vector< double * > data()
Get a vector of double* representing the model data.
Represent main neuron object computed by single thread.
struct NrnThreadMembList * next