1 #include <../../nrnconf.h>
18 #include <InterViews/glyph.h>
19 #include <InterViews/hit.h>
20 #include <InterViews/event.h>
21 #include <InterViews/color.h>
22 #include <InterViews/brush.h>
23 #include <InterViews/window.h>
24 #include <InterViews/printer.h>
25 #include <InterViews/label.h>
26 #include <InterViews/font.h>
27 #include <InterViews/background.h>
28 #include <InterViews/style.h>
30 #include <IV-look/kit.h>
42 #include "utils/logger.hpp"
46 #define M_PI 3.14159265358979323846
50 #define FWrite(arg1, arg2, arg3, arg4) \
51 if (fwrite(arg1, arg2, arg3, arg4) != arg3) { \
53 #define FRead(arg1, arg2, arg3, arg4) \
54 if (fread(arg1, arg2, arg3, arg4) != arg3) { \
89 int BYTESWAP_FLAG = 0;
90 #define BYTESWAP(_X__, _TYPE__) \
91 if (BYTESWAP_FLAG == 1) { \
92 _IN__ = (char*) &(_X__); \
93 for (_II__ = 0; _II__ < sizeof(_TYPE__); _II__++) { \
94 _OUT__[_II__] = _IN__[sizeof(_TYPE__) - _II__ - 1]; \
96 (_X__) = *((_TYPE__*) &_OUT__); \
117 Object** (*nrnpy_vec_to_python_p_)(
void*);
118 Object** (*nrnpy_vec_as_numpy_helper_)(int,
double*);
128 #define MAX_FIT_PARAMS 20
130 #define TWO_BYTE_HIGH 65535.
131 #define ONE_BYTE_HIGH 255.
132 #define ONE_BYTE_HALF 128.
138 return ((a) <= (b)) ? (((a) == (b)) ? 0 : -1) : 1;
155 : vec_(l, fill_value) {
194 return (
const char**) &x->
label_;
220 GraphMarkItem(
Glyph* g)
222 virtual ~GraphMarkItem(){};
232 double fill_value = 0.;
240 vec =
new Vect(
n, fill_value, o);
245 vec = (*nrnpy_vec_from_python_p_)(
new Vect(0, 0, o));
248 vec =
new Vect(0, 0, o);
273 return v->buffer_size();
315 return v->temp_objvar();
328 #if !defined(USEMATRIX) || USEMATRIX == 0
329 #include "../windll/dll.h"
332 void load_ocmatrix() {
333 struct DLL* dll =
NULL;
336 dll = dll_load(
buf.c_str());
338 Pfri mreg = (
Pfri) dll_lookup(dll,
"_Matrix_reg");
343 printf(
"No Matrix class.\n");
368 #define PUBLIC_TYPE 1
388 std::size_t size{(size_t) delta};
389 auto* y =
new Vect(size);
390 for (
int i = 0;
i < delta; ++
i) {
391 y->elem(
i) =
v->elem(
int(
i *
step + start));
393 return y->temp_objvar();
423 int x_max = vp->
size() - 1;
428 start = int(
chkarg(2, 0, x_max));
429 end = int(
chkarg(3, start, x_max));
431 s = (
void*) (&vp->
elem(start));
432 const char* x = (
const char*)
s;
441 int n = end - start + 1;
443 return (
double) fwrite(x,
sizeof(
double),
n,
fp);
472 short* xs = (
short*) malloc(
n * (
unsigned)
sizeof(short));
474 for (
i = 0;
i <
n; ++
i) {
475 vp->
elem(
i) = double(xs[
i]);
487 float* xf = (
float*) malloc(
n * (
unsigned)
sizeof(float));
489 for (
i = 0;
i <
n; ++
i) {
490 vp->
elem(
i) = double(xf[
i]);
498 unsigned short* xi = (
unsigned short*) malloc(
n * (
unsigned)
sizeof(
unsigned short));
499 FRead(xi,
sizeof(
unsigned short),
n,
fp);
500 for (
i = 0;
i <
n; ++
i) {
501 vp->
elem(
i) = double(xi[
i]);
509 char* xc = (
char*) malloc(
n * (
unsigned)
sizeof(char));
511 for (
i = 0;
i <
n; ++
i) {
512 vp->
elem(
i) = double(xc[
i]);
550 double min, max, r, sf, sub, intermed;
554 int* xi = (
int*) malloc(
n *
sizeof(
int));
555 for (
i = 0;
i <
n; ++
i) {
556 xi[
i] = (int) (vp->
elem(
i));
565 s = (
void*) (&(vp->
elem(0)));
573 float* xf = (
float*) malloc(
n * (
unsigned)
sizeof(float));
574 for (
i = 0;
i <
n; ++
i) {
575 xf[
i] = float(vp->
elem(
i));
585 auto minmax = std::minmax_element(vp->
begin(), vp->
end());
587 max = *minmax.second;
594 unsigned short* xi = (
unsigned short*) malloc(
n * (
unsigned)
sizeof(
unsigned short));
595 for (
i = 0;
i <
n; ++
i) {
596 intermed = (vp->
elem(
i) - min) * sf;
597 xi[
i] = (
unsigned short) intermed;
603 FWrite(&min,
sizeof(
double), 1,
fp);
605 FWrite(x,
sizeof(
unsigned short),
n,
fp);
613 auto minmax = std::minmax_element(vp->
begin(), vp->
end());
615 max = *minmax.second;
623 char* xc = (
char*) malloc(
n * (
unsigned)
sizeof(char));
624 for (
i = 0;
i <
n; ++
i) {
625 xc[
i] = char(((vp->
elem(
i) - min) * sf) - sub);
631 FWrite(&min,
sizeof(
double), 1,
fp);
643 void*
s = (
void*) (vp->
data());
663 if (type < 1 || type > 5) {
671 if (type < 1 || type > 5) {
687 int* xi = (
int*) malloc(
n *
sizeof(
int));
689 for (
i = 0;
i <
n; ++
i) {
691 vp->
elem(
i) = double(xi[
i]);
699 if (BYTESWAP_FLAG == 1) {
700 for (
i = 0;
i <
n; ++
i) {
708 float* xf = (
float*) malloc(
n * (
unsigned)
sizeof(float));
710 for (
i = 0;
i <
n; ++
i) {
712 vp->
elem(
i) = double(xf[
i]);
720 FRead(&sf,
sizeof(
double), 1,
fp);
721 FRead(&min,
sizeof(
double), 1,
fp);
725 unsigned short* xi = (
unsigned short*) malloc(
n * (
unsigned)
sizeof(
unsigned short));
726 FRead(xi,
sizeof(
unsigned short),
n,
fp);
727 for (
i = 0;
i <
n; ++
i) {
729 vp->
elem(
i) = double(xi[
i] / sf + min);
737 FRead(&sf,
sizeof(
double), 1,
fp);
738 FRead(&min,
sizeof(
double), 1,
fp);
741 char* xc = (
char*) malloc(
n * (
unsigned)
sizeof(char));
744 for (
i = 0;
i <
n; ++
i) {
745 vp->
elem(
i) = double((xc[
i] + add) / sf + min);
758 int top = x->
size() - 1;
762 const char* format =
"%g\t";
764 int extra_newline = 1;
780 if (
ifarg(next_arg)) {
781 start = int(
chkarg(next_arg, 0, top));
782 end = int(
chkarg(next_arg + 1, start, top));
786 for (
int i = start;
i <= end;
i++) {
789 fprintf(f->
file(),
"\n");
791 for (
int i = start;
i <= end;
i++) {
793 if (extra_newline && !((
i - start + 1) % 5)) {
802 return double(end - start + 1);
822 }
else if (
ifarg(3)) {
825 }
else if (
ifarg(2)) {
831 }
else if (x->
size()) {
839 while ((
n < 0 ||
i <
n) && !f->
eof()) {
842 for (
j = 1;
j <
c;
j++) {
856 for (
j =
c;
j < nc;
j++) {
898 for (
j = 1;
j <
c;
j++) {
912 for (
j =
c;
j < nc;
j++) {
925 "A number was provided instead of a pointer.\nDid you forget an _ref_ "
926 "(Python) or an & (HOC)?");
946 double* y = vp->
data();
961 }
else if (
narg() == 4) {
971 n = std::min(
n, vp2->
size());
972 for (
i = 0;
i <
n; ++
i) {
979 double interval = *
getarg(2);
980 for (
i = 0;
i <
n; ++
i) {
981 gv->
add(
i * interval,
988 for (
i = 0;
i <
n; ++
i) {
1022 size =
chkarg(4, 0.1, 100.);
1023 const ivColor* color = g->
color();
1024 const ivBrush* brush = g->
brush();
1031 if (vp2->
size() <
n)
1035 if (vp3->
size() <
n)
1038 for (
int i = 0;
i <
n; ++
i) {
1059 auto n = vp->
size();
1071 }
else if (
narg() == 4) {
1082 n = std::min(
n, vp2->
size());
1083 for (
i = 0;
i <
n; ++
i)
1087 double interval = *
getarg(2);
1088 for (
i = 0;
i <
n; ++
i)
1093 for (
i = 0;
i <
n; ++
i)
1121 style = char(
chkarg(3, 0, 10));
1126 size =
chkarg(4, 0.1, 100.);
1127 const ivColor* color = g->
color();
1130 const ivBrush* brush = g->
brush();
1138 for (
i = 0;
i <
n; ++
i) {
1144 double interval = *
getarg(2);
1145 for (
i = 0;
i <
n; ++
i) {
1146 g->
mark(
i * interval, vp->
elem(
i), style, size, color, brush);
1158 double high =
chkarg(2, low, 1e99);
1159 double width =
chkarg(3, 0, high - low);
1167 int n = int(
floor((high - low) / width)) + 2;
1169 std::fill(y->
begin(), y->
end(), 0.);
1172 for (
i = 0;
i < x->
size(); ++
i) {
1173 int ind = int(
floor((x->
elem(
i) - low) / width)) + 1;
1174 if (ind >= 0 && ind < y->size()) {
1175 y->
elem(ind) += 1.0;
1186 double start = *
getarg(2);
1187 int size = int(*
getarg(3));
1189 double high = start +
step * size;
1194 if (hv->
size() != size)
1196 std::fill(hv->
begin(), hv->
end(), 0.);
1197 for (
int i = 0;
i <
data->size();
i++) {
1199 if (ind >= 0 && ind < hv->size())
1213 double high =
chkarg(2, low, 1e99);
1222 std::fill(w->
begin(), w->
end(), 1);
1234 for (
int i = 0;
i < x->
size();
i++) {
1235 double xv = int((x->
elem(
i) - low) /
step);
1237 double arg = -(
j - xv) * (
j - xv) / (2. * svar);
1253 double start = *
getarg(2);
1254 int size = int(*
getarg(3));
1264 hoc_execerror(
"Vector.smhist: weight Vector must be same size as source Vector.", 0);
1276 int g2 = int(
sqrt(10 * svar));
1280 while (
n < size + g)
1283 double*
gauss = (
double*) calloc(
n, (
unsigned)
sizeof(double));
1285 for (
i = 0;
i <= g2;
i++)
1287 for (
i = 1;
i <= g2;
i++)
1291 double* series = (
double*) calloc(
n, (
unsigned)
sizeof(double));
1293 double high = start +
n *
step;
1295 for (
i = 0;
i <
data->size();
i++) {
1296 if (
data->elem(
i) >= start &&
data->elem(
i) < high) {
1301 for (
i = 0;
i <
data->size();
i++) {
1302 if (
data->elem(
i) >= start &&
data->elem(
i) < high) {
1303 series[int((
data->elem(
i) - start) /
step)] += 1.;
1309 double* ans = (
double*) calloc(2 *
n, (
unsigned)
sizeof(double));
1315 if (v1->
size() != size)
1317 std::fill(v1->
begin(), v1->
end(), 0.);
1318 for (
i = 0;
i < size;
i++)
1337 int top = x->
size();
1340 for (
int i = 0;
i < y->
size();
i++) {
1341 yv = int(y->
elem(
i));
1342 if ((yv < top) && (yv >= 0)) {
1354 return double(x->
size());
1368 return vec_.capacity();
1425 for (
j = 0;
j < m; ++
j) {
1445 for (
j = 0;
j < m; ++
j) {
1455 int i,
j,
n, start, end;
1463 for (
i = start,
j = end + 1;
j <
n; ++
i, ++
j) {
1474 for (
int i = 0;
i < x->
size();
i++) {
1487 int top = x->
size() - 1;
1497 int ns = srcind->
size();
1501 if (destind->
size() < ns) {
1502 ns = destind->
size();
1505 for (
int i = 0;
i < ns; ++
i) {
1508 if (ix >= 0 && iy >= 0 && ix < nx && iy < ny) {
1513 if (y->
size() < nx) {
1516 for (
int i = 0;
i < ns; ++
i) {
1518 if (
ii >= 0 &&
ii < nx) {
1527 deststart = int(*
getarg(2));
1530 deststart = int(*
getarg(2));
1531 srcstart = int(
chkarg(3, 0, top));
1532 srcend = int(
chkarg(4, -1, top));
1537 }
else if (
ifarg(3)) {
1538 srcstart = int(
chkarg(2, 0, top));
1539 srcend = int(
chkarg(3, -1, top));
1544 }
else if (srcend < srcstart) {
1545 hoc_execerror(
"Vector.copy: src_end arg smaller than src_start", 0);
1547 int size = (srcend - srcstart) / srcinc;
1549 size += deststart + 1;
1550 if (y->
size() < size) {
1552 }
else if (y->
size() > size && !
ifarg(2)) {
1556 for (
i = srcstart,
j = deststart;
i <= srcend;
i += srcinc,
j += destinc) {
1564 auto* x =
static_cast<Vect*
>(
v);
1565 std::size_t start{};
1566 std::size_t end{x->
size()};
1568 start =
chkarg(1, 0, x->size() - 1);
1571 end =
chkarg(2, start, x->size() - 1) + 1.0;
1574 ssize_t delta = end - start;
1575 return new_vect(x, delta, start, 1);
1604 for (
i = 0;
i <
n; ++
i) {
1613 for (
i = 0;
i <
n;
i++)
1614 y->
elem(
i) = (double) si[
i].
i;
1626 ((
Vect*) ((*r)->u.this_pointer))->label(((
Vect*)
v)->label_);
1635 int flag, is,
id, nd, ns;
1648 for (
id = 0;
id < nd && xd->
elem(
id) <= xs->
elem(0); ++
id) {
1652 for (is = 1; is < ns &&
id < nd; ++is) {
1653 if (xs->
elem(is) <= xs->
elem(is - 1)) {
1656 while (xd->
elem(
id) <= xs->
elem(is)) {
1657 thet = (xd->
elem(
id) - xs->
elem(is - 1)) / (xs->
elem(is) - xs->
elem(is - 1));
1658 yd->
elem(
id) = (1. - thet) * (ys->
elem(is - 1)) + thet * (ys->
elem(is));
1666 for (;
id < nd; ++
id) {
1682 src =
new Vect(*dest);
1705 if (!strcmp(op,
"==")) {
1706 for (
i = 0;
i <
n;
i++) {
1713 }
else if (!strcmp(op,
"!=")) {
1714 for (
i = 0;
i <
n;
i++) {
1719 }
else if (!strcmp(op,
">")) {
1720 for (
i = 0;
i <
n;
i++) {
1725 }
else if (!strcmp(op,
"<")) {
1726 for (
i = 0;
i <
n;
i++) {
1731 }
else if (!strcmp(op,
">=")) {
1732 for (
i = 0;
i <
n;
i++) {
1737 }
else if (!strcmp(op,
"<=")) {
1738 for (
i = 0;
i <
n;
i++) {
1743 }
else if (!strcmp(op,
"()")) {
1745 for (
i = 0;
i <
n;
i++) {
1750 }
else if (!strcmp(op,
"[]")) {
1752 for (
i = 0;
i <
n;
i++) {
1757 }
else if (!strcmp(op,
"[)")) {
1759 for (
i = 0;
i <
n;
i++) {
1764 }
else if (!strcmp(op,
"(]")) {
1766 for (
i = 0;
i <
n;
i++) {
1772 hoc_execerror(
"Vector",
"Invalid comparator in .where()\n");
1784 double value, value2;
1793 if (!strcmp(op,
"==")) {
1794 for (
i = 0;
i <
n;
i++) {
1799 }
else if (!strcmp(op,
"!=")) {
1800 for (
i = 0;
i <
n;
i++) {
1805 }
else if (!strcmp(op,
">")) {
1806 for (
i = 0;
i <
n;
i++) {
1811 }
else if (!strcmp(op,
"<")) {
1812 for (
i = 0;
i <
n;
i++) {
1817 }
else if (!strcmp(op,
">=")) {
1818 for (
i = 0;
i <
n;
i++) {
1823 }
else if (!strcmp(op,
"<=")) {
1824 for (
i = 0;
i <
n;
i++) {
1829 }
else if (!strcmp(op,
"()")) {
1831 for (
i = 0;
i <
n;
i++) {
1836 }
else if (!strcmp(op,
"[]")) {
1838 for (
i = 0;
i <
n;
i++) {
1843 }
else if (!strcmp(op,
"[)")) {
1845 for (
i = 0;
i <
n;
i++) {
1850 }
else if (!strcmp(op,
"(]")) {
1852 for (
i = 0;
i <
n;
i++) {
1858 hoc_execerror(
"Vector",
"Invalid comparator in .indwhere()\n");
1867 int i, iarg, m = 0, flag;
1869 double value, value2;
1879 if (!strcmp(op,
"==")) {
1880 for (
i = 0;
i <
n;
i++) {
1885 }
else if (!strcmp(op,
"!=")) {
1886 for (
i = 0;
i <
n;
i++) {
1891 }
else if (!strcmp(op,
">")) {
1892 for (
i = 0;
i <
n;
i++) {
1897 }
else if (!strcmp(op,
"<")) {
1898 for (
i = 0;
i <
n;
i++) {
1903 }
else if (!strcmp(op,
">=")) {
1904 for (
i = 0;
i <
n;
i++) {
1909 }
else if (!strcmp(op,
"<=")) {
1910 for (
i = 0;
i <
n;
i++) {
1915 }
else if (!strcmp(op,
"()")) {
1917 for (
i = 0;
i <
n;
i++) {
1922 }
else if (!strcmp(op,
"[]")) {
1924 for (
i = 0;
i <
n;
i++) {
1929 }
else if (!strcmp(op,
"[)")) {
1931 for (
i = 0;
i <
n;
i++) {
1936 }
else if (!strcmp(op,
"(]")) {
1938 for (
i = 0;
i <
n;
i++) {
1944 hoc_execerror(
"Vector",
"Invalid comparator in .indvwhere()\n");
1954 auto* x =
static_cast<Vect*
>(
v);
1955 std::size_t start{};
1956 std::size_t end{x->
size()};
1958 start =
chkarg(2, 0, x->size() - 1);
1959 end =
chkarg(3, start, x->size() - 1) + 1.0;
1961 std::fill(x->begin() + start, x->begin() + end, *
getarg(1));
1962 return x->temp_objvar();
1972 double end = double(
n - 1);
1979 chkarg(3, std::min(start - end, end - start), std::max(start - end, end - start));
1983 }
else if (xn < 0) {
1989 }
else if (
ifarg(2)) {
1996 for (
int i = 0;
i <
n;
i++) {
2007 int top = x->
size() - 1;
2011 start = int(
chkarg(2, 0, top));
2012 end = int(
chkarg(3, start, top));
2014 for (
int i = start;
i <= end;
i++)
2024 int top = x->
size() - 1;
2028 start = int(
chkarg(2, 0, top));
2029 end = int(
chkarg(3, start, top));
2031 for (
int i = start;
i <= end;
i++)
2039 int top = x->
size() - 1;
2044 hoc_execerror(
"Too many parameters to apply method.",
nullptr);
2047 start = int(
chkarg(2, 0, top));
2048 end = int(
chkarg(3, start, top));
2061 for (
int i = start;
i <= end;
i++) {
2067 for (
int i = start;
i <= end;
i++) {
2071 hoc_execerror(
"apply: first argument must be a HOC string or a Python callable",
nullptr);
2079 int top = x->
size() - 1;
2083 start = int(
chkarg(3, 0, top));
2084 end = int(
chkarg(4, start, top));
2093 for (
int i = start;
i <= end;
i++) {
2103 if (x->
size() == 0) {
2106 int x_max = x->
size() - 1;
2108 int start = int(
chkarg(1, 0, x_max));
2109 int end = int(
chkarg(2, start, x_max));
2110 return *std::min_element(x->
begin() + start, x->
begin() + end + 1);
2112 return *std::min_element(x->
begin(), x->
end());
2118 if (x->
size() == 0) {
2121 int x_max = x->
size() - 1;
2124 int start = int(
chkarg(1, 0, x_max));
2125 int end = int(
chkarg(2, start, x_max));
2126 return std::min_element(x->
begin() + start, x->
begin() + end + 1) - x->
begin() + start;
2134 if (x->
size() == 0) {
2137 int x_max = x->
size() - 1;
2139 int start = int(
chkarg(1, 0, x_max));
2140 int end = int(
chkarg(2, start, x_max));
2141 return *std::max_element(x->
begin() + start, x->
begin() + end + 1);
2143 return *std::max_element(x->
begin(), x->
end());
2149 if (x->
size() == 0) {
2152 int x_max = x->
size() - 1;
2155 int start = int(
chkarg(1, 0, x_max));
2156 int end = int(
chkarg(2, start, x_max));
2157 return std::max_element(x->
begin() + start, x->
begin() + end + 1) - x->
begin();
2165 int x_max = x->
size() - 1;
2167 int start = int(
chkarg(1, 0, x_max));
2168 int end = int(
chkarg(2, start, x_max));
2169 return std::accumulate(x->
begin() + start, x->
begin() + end + 1, 0.);
2171 return std::accumulate(x->
begin(), x->
end(), 0.);
2177 int x_max = x->
size() - 1;
2179 int start = int(
chkarg(1, 0, x_max));
2180 int end = int(
chkarg(2, start, x_max));
2181 return std::inner_product(x->
begin() + start, x->
begin() + end + 1, x->
begin() + start, 0.);
2183 return std::inner_product(x->
begin(), x->
end(), x->
begin(), 0.);
2189 int x_max = x->
size() - 1;
2191 int start = int(
chkarg(1, 0, x_max));
2192 int end = int(
chkarg(2, start, x_max));
2193 if (end - start < 1) {
2196 const double sum = std::accumulate(x->
begin() + start, x->
begin() + end + 1, 0.0);
2197 return sum / end - start + 1;
2199 if (x->
size() < 1) {
2202 const double sum = std::accumulate(x->
begin(), x->
end(), 0.0);
2203 return sum / x->
size();
2209 int x_max = x->
size() - 1;
2211 int start = int(
chkarg(1, 0, x_max));
2212 int end = int(
chkarg(2, start, x_max));
2213 if (end - start < 1) {
2218 if (x->
size() < 2) {
2227 int x_max = x->
size() - 1;
2229 int start = int(
chkarg(1, 0, x_max));
2230 int end = int(
chkarg(2, start, x_max));
2231 if (end - start < 1) {
2236 if (x->
size() < 2) {
2245 int x_max = x->
size() - 1;
2247 int start = int(
chkarg(1, 0, x_max));
2248 int end = int(
chkarg(2, start, x_max));
2249 if (end - start < 1) {
2254 if (x->
size() < 2) {
2271 int size = x->
size();
2272 if (size > y->
size() || !size) {
2276 if (size > w->
size()) {
2279 for (
int i = 0;
i < size;
i++) {
2281 err += diff * diff * w->
elem(
i);
2284 for (
int i = 0;
i < size;
i++) {
2296 return std::inner_product(x->
begin(), x->
end(), y->
begin(), 0.);
2310 for (
i = 0;
i <
n; ++
i) {
2319 std::for_each(x->
begin(), x->
end(), [](
double& d) { d += *getarg(1); });
2324 hoc_execerror(
"Vector",
"Vector argument to .add() wrong size\n");
2336 std::for_each(x->
begin(), x->
end(), [](
double& d) { d -= *getarg(1); });
2341 hoc_execerror(
"Vector",
"Vector argument to .sub() wrong size\n");
2352 std::for_each(x->
begin(), x->
end(), [](
double& d) { d *= *getarg(1); });
2357 hoc_execerror(
"Vector",
"Vector argument to .mult() wrong size\n");
2372 std::for_each(x->
begin(), x->
end(), [](
double& d) { d /= *getarg(1); });
2378 hoc_execerror(
"Vector",
"Vector argument to .div() wrong size\n");
2392 auto minmax = std::minmax_element(x->
begin(), x->
end());
2393 double min = *minmax.first;
2394 double max = *minmax.second;
2395 double r = max - min;
2398 std::for_each(x->
begin(), x->
end(), [&](
double& d) {
2413 if (
n != y->
size()) {
2416 for (
i = 0;
i <
n; ++
i) {
2458 #define SIMPLEX_MAXN 1e+300
2459 #define SIMPLEX_INORM 1.2
2467 #define SIMPLEX_ALPHA 2.0
2468 #define SIMPLEX_BETA 1.4
2469 #define SIMPLEX_GAMMA 0.7
2470 #define SIMPLEX_DELTA 0.3
2487 double dexp,
t, amp1, tau1, amp2, tau2;
2489 if (!strcmp(fcn,
"exp2")) {
2491 hoc_execerror(
"Vector",
".fit(\"exp2\") requires amp1,tau1,amp2,tau2");
2497 for (
i = 0;
i < x->
size();
i++) {
2500 guess = dexp - y->
elem(
i);
2501 sq_err += guess * guess;
2503 }
else if (!strcmp(fcn,
"charging")) {
2505 hoc_execerror(
"Vector",
".fit(\"charging\") requires amp1,tau1,amp2,tau2");
2511 for (
i = 0;
i < x->
size();
i++) {
2514 guess = dexp - y->
elem(
i);
2515 sq_err += guess * guess;
2517 }
else if (!strcmp(fcn,
"exp1")) {
2524 for (
i = 0;
i < x->
size();
i++) {
2527 guess = dexp - y->
elem(
i);
2528 sq_err += guess * guess;
2530 }
else if (!strcmp(fcn,
"line")) {
2532 hoc_execerror(
"Vector",
".fit(\"line\") requires slope,intercept");
2534 for (
i = 0;
i < x->
size();
i++) {
2536 sq_err += guess * guess;
2538 }
else if (!strcmp(fcn,
"quad")) {
2540 hoc_execerror(
"Vector",
".fit(\"quad\") requires ax^2+bx+c");
2542 for (
i = 0;
i < x->
size();
i++) {
2544 sq_err += guess * guess;
2547 for (
i = 0;
i < x->
size();
i++) {
2551 for (
int j = 0;
j <
n;
j++)
2555 sq_err += guess * guess;
2558 return sq_err / x->
size();
2593 evortex = (
double*) calloc(
n + 1, (
unsigned)
sizeof(double));
2594 gvortex = (
double*) calloc(
n, (
unsigned)
sizeof(double));
2595 vortex = (
double*) calloc(
n * (
n + 1), (unsigned)
sizeof(
double));
2596 nvortex = (
double*) calloc(
n * 4, (
unsigned)
sizeof(double));
2598 if (0 == evortex || 0 == gvortex || 0 == vortex || 0 == nvortex) {
2599 Printf(
"allocation error in simplex()\n");
2606 for (
i = 0;
i <
n + 1;
i++) {
2607 for (
j = 0;
j <
n;
j++) {
2608 vortex[
i *
n +
j] =
p[
j];
2616 for (
i = 0;
i <
n + 1;
i++)
2620 emin = emax = evortex[0];
2622 for (
i = 0;
i <
n + 1;
i++) {
2634 for (
i = 0;
i <
n;
i++)
2636 for (
i = 0;
i <
n + 1;
i++)
2637 for (
j = 0;
j <
n;
j++)
2638 gvortex[
j] += vortex[
i *
n +
j];
2639 for (
i = 0;
i <
n;
i++)
2640 gvortex[
i] = (gvortex[
i] - vortex[emaxp *
n +
i]) /
n;
2644 for (
i = 0;
i <
n;
i++)
2647 if (fv1 < evortex[emaxp]) {
2652 for (
i = 0;
i <
n;
i++)
2656 if (fv1 < evortex[emaxp]) {
2661 for (
i = 0;
i <
n;
i++)
2665 if (fv1 < evortex[emaxp]) {
2670 for (
i = 0;
i <
n;
i++)
2674 if (fv1 < evortex[emaxp]) {
2686 for (
i = 0;
i <
n;
i++)
2687 vortex[emaxp *
n +
i] = nvortex[ptr *
n +
i];
2688 evortex[emaxp] = fv1;
2698 for (
i = 0;
i <
n + 1;
i++) {
2699 if (evortex[
i] < emin) {
2705 for (
i = 0;
i <
n;
i++)
2706 p[
i] = vortex[eminp *
n +
i];
2727 for (
int i = 0;
i < trial;
i++) {
2762 hoc_execerror(
"Vector",
"Indep argument to .fit() wrong size\n");
2786 for (
i = 0;
i <
n;
i++) {
2790 if (!strcmp(fcn,
"exp2")) {
2791 for (
i = 0;
i < x->
size();
i++) {
2795 }
else if (!strcmp(fcn,
"charging")) {
2796 for (
i = 0;
i < x->
size();
i++) {
2800 }
else if (!strcmp(fcn,
"exp1")) {
2801 for (
i = 0;
i < x->
size();
i++) {
2804 }
else if (!strcmp(fcn,
"line")) {
2805 for (
i = 0;
i < x->
size();
i++) {
2808 }
else if (!strcmp(fcn,
"quad")) {
2809 for (
i = 0;
i < x->
size();
i++) {
2813 for (
i = 0;
i < x->
size();
i++) {
2815 for (
int j = 0;
j <
n;
j++)
2845 int v1n = v1->
size();
2846 int v2n = v2->
size();
2847 int m = (v1n > v2n) ? v1n : v2n;
2852 double* d1 = (
double*) calloc(
n, (
unsigned)
sizeof(double));
2854 for (
i = 0;
i < v1n; ++
i)
2856 double* d2 = (
double*) calloc(
n, (
unsigned)
sizeof(double));
2857 for (
i = 0;
i < v2n; ++
i)
2859 double* ans = (
double*) calloc(
n, (
unsigned)
sizeof(double));
2863 if (v3->
size() !=
n)
2865 for (
i = 0;
i <
n; ++
i)
2889 isign = (int) (*
getarg(3));
2894 int v1n = v1->
size();
2895 int v2n = v2->
size();
2896 int m = (v1n > v2n) ? v1n : v2n;
2901 double*
data = (
double*) calloc(
n, (
unsigned)
sizeof(double));
2903 for (
i = 0;
i < v1n; ++
i)
2910 double* respns = (
double*) calloc(
n, (
unsigned)
sizeof(double));
2911 for (
i = 0;
i < v2n;
i++)
2914 double* ans = (
double*) calloc(2 *
n, (
unsigned)
sizeof(double));
2918 if (v3->
size() !=
n)
2920 for (
i = 0;
i <
n; ++
i)
2924 free((
char*) respns);
2941 int dc = v1->
size();
2953 int k = int(
ceil((
double(dc) / m - 1.) / 2.));
2954 int n = (2 *
k + 1) * m;
2956 double*
data = (
double*) calloc(
n, (
unsigned)
sizeof(double));
2957 for (
int i = 0;
i < dc; ++
i)
2960 if (ans->
size() < m)
2986 int v1n = v1->
size();
2987 int v2n = v2->
size();
2988 int m = (v1n > v2n) ? v1n : v2n;
2993 double*
data = (
double*) calloc(
n, (
unsigned)
sizeof(double));
2995 for (
i = 0;
i < v1n; ++
i)
2998 double* filter = (
double*) calloc(
n, (
unsigned)
sizeof(double));
2999 for (
i = 0;
i < v2n;
i++)
3002 double* ans = (
double*) calloc(2 *
n, (
unsigned)
sizeof(double));
3008 if (v3->
size() !=
n)
3010 for (
i = 0;
i <
n; ++
i)
3014 free((
char*) filter);
3037 inv = int(
chkarg(iarg, -1, 1));
3040 int v1n = v1->
size();
3045 double*
data = (
double*) calloc(
n, (
unsigned)
sizeof(double));
3047 for (
i = 0;
i < v1n; ++
i)
3049 if (v3->
size() !=
n)
3070 double thresh = *
getarg(2);
3074 bin = int(
chkarg(3, 0, 1e6));
3076 int n = v1->
size() / bin;
3077 if (ans->
size() !=
n)
3079 std::fill(ans->
begin(), ans->
end(), 0.);
3084 for (
int i = 0;
i <
n;
i++) {
3085 for (
int j = 0;
j < bin;
j++) {
3087 if (v1->
elem(
k) >= thresh && !firing) {
3090 }
else if (firing && v1->
elem(
k) < thresh) {
3113 r =
n - (std::abs(r) %
n);
3120 double* hold = (
double*) calloc(
n, (
unsigned)
sizeof(double));
3124 for (
i = 0;
i < rc;
i++)
3125 hold[
i + r] = a->
elem(
i);
3126 for (
i = 0;
i < r;
i++)
3127 hold[
i] = a->
elem(
i + rc);
3130 for (
i = 0;
i < rc;
i++)
3131 hold[
i + r] = a->
elem(
i);
3132 for (
i = 0;
i < r;
i++)
3135 for (
i = 0;
i < r;
i++)
3136 hold[
i] = a->
elem(
i + rc);
3137 for (
i = r;
i <
n;
i++)
3141 for (
i = 0;
i <
n;
i++)
3161 hoc_execerror(
"Can't take derivative of Vector with less than two points", 0);
3163 if (ans->
size() !=
n)
3172 sym = int(
chkarg(iarg++, 1, 2));
3182 for (
int i = 1;
i <
n - 1;
i++) {
3188 for (
int i = 0;
i <
n - 1;
i++) {
3211 if (ans->
size() !=
n)
3219 for (
int i = 1;
i <
n;
i++) {
3234 int n =
data->size();
3235 int pre = int(
chkarg(3, 0,
n - 1));
3238 if (avg->
size() != m)
3240 int l = trig->
size();
3243 std::fill(avg->
begin(), avg->
end(), 0.);
3245 for (
int i = 0;
i < l;
i++) {
3246 int tr = int(trig->
elem(
i));
3249 if (tr >= pre && tr <
n -
post) {
3251 for (
int j = -pre;
j <
post;
j++) {
3256 std::for_each(avg->
begin(), avg->
end(), [&](
double& d) { d /= trcount; });
3265 int w0,
w1, wlen,
i, flag, iarg = 1;
3271 if (ans->
size() !=
n)
3278 double* res = (
double*) calloc(
n, (
unsigned)
sizeof(double));
3279 for (
i = 0;
i <
n;
i++) {
3284 std::vector<double> window(v1->
begin() + w0, v1->
begin() + wlen);
3285 std::sort(window.begin(), window.end());
3286 res[
i] = window[wlen / 2];
3289 if (ans->
size() !=
n)
3291 for (
i = 0;
i <
n;
i++) {
3304 int n = ans->
size();
3310 std::sort(sorted->
begin(), sorted->
end());
3316 median = (sorted->
elem(n2 - 1) + sorted->
elem(n2)) / 2.;
3318 median = sorted->
elem(n2);
3327 std::sort(ans->
begin(), ans->
end());
3341 int n = ans->
size();
3342 double freq = *
getarg(1);
3348 double period = 2 *
PI / 1000 * freq * dx;
3350 for (
int i = 0;
i <
n;
i++) {
3367 if (ans->
size() !=
n)
3370 for (
int i = 0;
i <
n;
i++) {
3387 if (ans->
size() !=
n)
3390 for (
int i = 0;
i <
n;
i++) {
3404 int f = int(*
getarg(iarg));
3405 int n = v1->
size() / f;
3406 if (ans->
size() !=
n)
3409 for (
int i = 0;
i <
n;
i++) {
3411 for (
int j = 0;
j < f;
j++) {
3429 int n = int(v1->
size() * f);
3433 for (
int i = 0;
i <
n;
i++)
3435 ans->
vec().swap(temp->
vec());
3449 double trials =
chkarg(3, 0, 9e99);
3451 int n = int(v1->
size());
3455 for (
int i = 0;
i <
n;
i++) {
3460 if (
i + fj <
n - 1) {
3472 ans->
vec().swap(temp->
vec());
3484 int n = stim->
size();
3486 double dt =
chkarg(2, 1e-99, 9e99);
3499 double i = 0,
v,
ref = 0;
3503 for (
int t = 0;
t <
n - 1;
t++) {
3506 if (
v >= th &&
ref <= 0) {
3509 V->
elem(
t + 1) = res;
3533 if (ans->
size() !=
n)
3537 for (
int i = 0;
i <
n;
i++) {
3538 if (ans->
elem(
i) == 0) {
3539 hoc_execerror(
"Vector",
"Invalid comparator in .where()\n");
3544 }
else if (
p == 0) {
3545 for (
int i = 0;
i <
n;
i++) {
3548 }
else if (
p == 0.5) {
3549 for (
int i = 0;
i <
n;
i++) {
3552 }
else if (
p == 1) {
3553 for (
int i = 0;
i <
n;
i++) {
3556 }
else if (
p == 2) {
3557 for (
int i = 0;
i <
n;
i++) {
3561 for (
int i = 0;
i <
n;
i++) {
3579 if (ans->
size() !=
n)
3582 for (
int i = 0;
i <
n;
i++) {
3599 if (ans->
size() !=
n)
3602 for (
int i = 0;
i <
n;
i++) {
3619 if (ans->
size() !=
n)
3622 for (
int i = 0;
i <
n;
i++) {
3639 if (ans->
size() !=
n)
3642 for (
int i = 0;
i <
n;
i++) {
3666 int n =
data->size();
3667 int m =
index->size();
3668 if (ans->
size() != m)
3671 for (
int i = 0;
i < m;
i++) {
3673 if (
j >= 0 &&
j <
n) {
3691 Vect* vec = (*nrnpy_vec_from_python_p_)(
v);
3754 {
nullptr,
nullptr}};
3830 {
nullptr,
nullptr}};
3834 {
nullptr,
nullptr}};
3854 s->arayinfo->sub[0] = vp->
size();
3872 #if defined(WIN32) && !defined(USEMATRIX)
3877 int nrn_mlh_gsort(
double* vec,
int* base_ptr,
int total_elems,
int (*cmp)(
double,
double)) {
3878 std::sort(base_ptr, base_ptr + total_elems, [&](
int a,
int b) {
3879 return cmp(vec[a], vec[b]) < 0;
const Brush * brush(int) const
const Color * color(int) const
virtual void save(std::ostream &, Coord, Coord)
void brush(const Brush *)
void color(const Color *)
void line(Coord x, Coord y)
virtual GlyphIndex glyph_index(const Glyph *)
void begin_line(const char *s=NULL)
void mark(Coord x, Coord y, char style='+', float size=12, const Color *=NULL, const Brush *=NULL)
GLabel * label(float x, float y, const char *s, int fixtype, float scale, float x_align, float y_align, const Color *)
virtual void erase(Scene *, GlyphIndex, int erase_type)
void add(float, neuron::container::data_handle< double >)
IvocVect(Object *obj=NULL)
auto begin() const -> std::vector< double >::const_iterator
double const * data() const
std::vector< double > vec_
auto end() const -> std::vector< double >::const_iterator
std::vector< double > & vec()
static bool eq(T x, T y, T e)
virtual void append(Glyph *)
virtual Glyph * component(GlyphIndex) const
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 *)
HocReturnType hoc_return_type_code
constexpr auto reverse(T &&iterable)
double chkarg(int, double low, double high)
void nrngsl_realft(double *data, unsigned long n, int direction)
void nrn_correl(double *x, double *y, unsigned long n, double *z)
void nrn_nrc2gsl(double *x, double *y, unsigned long n)
void nrn_convlv(double *data, unsigned long n, double *respns, unsigned long m, int isign, double *ans)
void nrn_spctrm(double *data, double *psd, int setsize, int numsegpairs)
void nrn_gsl2nrc(double *x, double *y, unsigned long n)
int vector_capacity(IvocVect *v)
int hoc_is_object_arg(int narg)
double hoc_call_func(Symbol *s, int narg)
Object ** hoc_temp_objvar(Symbol *symtemp, void *v)
void vector_resize(IvocVect *v, int n)
int vector_instance_px(void *v, double **px)
IvocVect * vector_new2(IvocVect *v)
void hoc_pushpx(double *d)
IvocVect * vector_new(int n, Object *o)
int vector_arg_px(int, double **)
void vector_set_label(Vect *v, char *s)
Symbol * hoc_install(const char *, int, double, Symlist **)
double * vector_vec(IvocVect *v)
int hoc_is_str_arg(int narg)
int hoc_argtype(int narg)
double hoc_call_objfunc(Symbol *s, int narg, Object *ob)
void install_vector_method(const char *name, double(*f)(void *))
int hoc_is_double_arg(int narg)
void check_obj_type(Object *obj, const char *type_name)
void vector_append(Vect *v, double x)
IvocVect * vector_arg(int i)
Object ** vector_temp_objvar(Vect *v)
Object ** vector_pobj(IvocVect *v)
double * hoc_pgetarg(int narg)
int vector_buffer_size(IvocVect *v)
Symbol * hoc_lookup(const char *)
IvocVect * vector_new1(int n)
void vector_delete(Vect *v)
char * vector_get_label(Vect *v)
int nrn_mlh_gsort(double *vec, int *base_ptr, int total_elems, int(*cmp)(double, double))
#define TRY_GUI_REDIRECT_METHOD_ACTUAL_OBJ(name, sym, v)
Object ** hoc_objgetarg(int)
double * ivoc_vector_ptr(Object *o, int index)
static Object ** v_c(void *v)
static Object ** v_append(void *v)
static double v_scale(void *v1)
static Object ** v_sort(void *v)
static Object ** v_record(void *v)
static Object ** v_ploterr(void *v)
static double v_contains(void *v)
static Object ** v_sqrt(void *v)
static Object ** v_indgen(void *v)
static Object ** v_resample(void *v)
static Object ** v_sortindex(void *v)
static Object ** v_deriv(void *v)
#define FWrite(arg1, arg2, arg3, arg4)
static Member_func v_members[]
static double v_fwrite(void *v)
static void steer_x(void *v)
int cmpfcn(double a, double b)
static double v_fit(void *v)
Object ** v_as_numpy(void *v)
static Object ** v_fft(void *v)
Object ** new_vect(Vect *v, ssize_t delta, ssize_t start, ssize_t step)
static double v_stderr(void *v)
static Object ** v_index(void *v)
static Object ** v_line(void *v)
static int possible_srcvec(Vect *&src, Vect *dest, int &flag)
static Object ** v_at(void *v)
static Object ** v_ind(void *v)
static double v_buffer_size(void *v)
int ivoc_vector_size(Object *o)
static double v_eq(void *v1)
static Object ** v_insert(void *v)
static double v_sum(void *v)
static Object ** v_tanh(void *v)
static Object ** v_hist(void *v)
static Object ** v_set(void *v)
static Object ** v_smhist(void *v)
static Object ** v_medfltr(void *v)
static double v_sumsq(void *v)
static double v_trigavg(void *v)
static const char ** v_label(void *v)
static Object ** v_mark(void *v)
static Object ** v_sumgauss(void *v)
static double v_max(void *v)
#define FRead(arg1, arg2, arg3, arg4)
static Object ** v_integral(void *v)
static Object ** v_add(void *v1)
static Object ** v_sub(void *v1)
static double simplex(double *p, int n, Vect *x, Vect *y, char *fcn)
static Object ** v_correl(void *v)
static double dmaxint_
As all parameters are passed from hoc as double, we need to calculate max integer that can fit into d...
double(* nrnpy_call_func)(Object *, double)
static Object ** v_pow(void *v)
Object **(* nrnpy_vec_as_numpy_helper_)(int, double *)
static double v_min(void *v)
static double v_size(void *v)
static double v_meansqerr(void *v1)
static int sort_index_cmp(const void *a, const void *b)
static double eval_error(double *p, int n, Vect *x, Vect *y, char *fcn)
static Object ** v_spctrm(void *v)
static double v_median(void *v)
static Object ** v_fill(void *v)
static double v_dot(void *v1)
static double v_var(void *v)
static Object ** v_plot(void *v)
static double eval(double *p, int n, Vect *x, Vect *y, char *fcn)
static double v_indwhere(void *v)
static Object ** v_abs(void *v)
static double v_vread(void *v)
Object **(* nrnpy_vec_to_python_p_)(void *)
static Object ** v_rebin(void *v)
static Object ** v_reverse(void *v)
static const char * nullstr
static double v_scantil(void *v)
static double v_get(void *v)
Object ** v_from_python(void *v)
static Object ** v_log(void *v)
void nrn_vecsim_remove(void *)
static Object ** v_copy(void *v)
double call_simplex(double *p, int n, Vect *x, Vect *y, char *fcn, int trial)
static double v_min_ind(void *v)
Symlist * hoc_top_level_symlist
static Object ** v_setrand(void *v)
static double v_stdev(void *v)
static Object ** v_addrand(void *v)
static double v_fread(void *v)
static Object ** v_cl(void *v)
static Object ** v_play(void *v)
static double v_reduce(void *v)
static Object ** v_sin(void *v)
static Object ** v_apply(void *v)
static Object ** v_convlv(void *v)
static void same_err(const char *s, Vect *x, Vect *y)
void nrn_vecsim_add(void *, bool)
int hoc_araypt(Symbol *, int)
static int possible_destvec(int arg, Vect *&dest)
static Object ** v_psth(void *v)
static double v_scanf(void *v)
static Object ** v_remove(void *v)
static Object ** v_from_double(void *v)
static Object ** v_filter(void *v)
static double v_max_ind(void *v)
static Object ** v_div(void *v1)
static double v_mag(void *v1)
static Object ** v_inf(void *x)
static Object ** v_resize(void *v)
static Object ** v_floor(void *v)
static double v_printf(void *v)
static Member_ret_obj_func v_retobj_members[]
static Object ** v_mul(void *v1)
static Object ** v_spikebin(void *v)
static double v_mean(void *v)
static Object ** v_log10(void *v)
static Object ** v_where(void *v)
static Object ** v_clear(void *v)
static Object ** v_histogram(void *v)
#define BYTESWAP(_X__, _TYPE__)
Object ** v_to_python(void *v)
static Object ** v_interpolate(void *v)
static void * v_cons(Object *o)
IvocVect *(* nrnpy_vec_from_python_p_)(void *)
static Member_ret_str_func v_retstr_members[]
static double v_play_remove(void *v)
static Object ** v_indvwhere(void *v)
static Object ** v_rotate(void *v)
static void v_destruct(void *v)
static double v_vwrite(void *v)
void notify_freed_val_array(double *p, size_t size)
double var(InputIterator begin, InputIterator end)
double stdDev(InputIterator begin, InputIterator end)
double hoc_Sqrt(double x)
phase
Reading phase number.
fixed_vector< double > IvocVect
void hoc_execerror(const char *s1, const char *s2)
constexpr do_not_search_t do_not_search
data_handle< T > transform(data_handle< T > handle, Transform type)
int const size_t const size_t n
#define MUTCONSTRUCT(mkmut)
HOC interpreter function declarations (included by hocdec.h)
static double post(void *v)
static double ref(void *v)
#define BinaryMode(ocfile)
Object ** hoc_temp_objptr(Object *)
double integral(F f, double a, double b, int n)
int Printf(const char *fmt, Args... args)