NEURON
matrix.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 #include "classreg.h"
3 
4 #include <stdio.h>
5 #include <math.h>
6 #include "code.h"
7 #include "ocmatrix.h"
8 #include "oc2iv.h"
9 #include "parse.hpp"
10 #include "ivocvect.h"
11 
12 #include "utils/logger.hpp"
13 
14 #define EPS hoc_epsilon
15 Symbol* nrn_matrix_sym; // also used in oc/hoc_oop.cpp
16 
17 extern double hoc_scan(FILE*);
18 extern Object** hoc_temp_objptr(Object*);
19 
20 static void check_domain(int i, int j) {
21  if (i > j || i < 0) {
22  auto const tmp = "index=" + std::to_string(i) + " max_index=" + std::to_string(j) + "\n";
23  hoc_execerror("Matrix index out of range:", tmp.c_str());
24  }
25 }
26 
27 static void check_capac(int i, int j) {
28  if (i != j) {
29  hoc_execerror("wrong size for Matrix or Vector operation", 0);
30  }
31 }
32 
34  Object* ob = *hoc_objgetarg(i);
35  if (!ob || ob->ctemplate != nrn_matrix_sym->u.ctemplate) {
36  check_obj_type(ob, "Matrix");
37  }
38  return (Matrix*) (ob->u.this_pointer);
39 }
40 
41 static Object** temp_objvar(Matrix* m) {
42  Object** po;
43  if (m->obj_) {
44  po = hoc_temp_objptr(m->obj_);
45  } else {
46  po = hoc_temp_objvar(nrn_matrix_sym, (void*) m);
47  m->obj_ = *po;
48  }
49  return po;
50 }
51 
52 static double m_nrow(void* v) {
54  Matrix* m = (Matrix*) v;
55  return (double) m->nrow();
56 }
57 
58 static double m_ncol(void* v) {
60  Matrix* m = (Matrix*) v;
61  return (double) m->ncol();
62 }
63 
64 static double m_setval(void* v) {
65  Matrix* m = (Matrix*) v;
66  int i = (int) chkarg(1, 0, m->nrow() - 1);
67  int j = (int) chkarg(2, 0, m->ncol() - 1);
68  double val = *getarg(3);
69  m->coeff(i, j) = val;
70  return val;
71 }
72 
73 static double m_getval(void* v) {
74  Matrix* m = (Matrix*) v;
75  int i, j;
76  i = (int) chkarg(1, 0, m->nrow() - 1);
77  j = (int) chkarg(2, 0, m->ncol() - 1);
78  return m->getval(i, j);
79 }
80 
81 static double m_sprowlen(void* v) {
82  Matrix* m = (Matrix*) v;
83  int i;
85  i = (int) chkarg(1, 0, m->nrow() - 1);
86  return double(m->sprowlen(i));
87 }
88 
89 static double m_spgetrowval(void* v) {
90  Matrix* m = (Matrix*) v;
91  int i, jx, j;
92  double x;
93  i = (int) chkarg(1, 0, m->nrow() - 1);
94  jx = (int) chkarg(2, 0, m->sprowlen(i) - 1);
95  x = m->spgetrowval(i, jx, &j);
96  if (ifarg(3)) {
97  *hoc_pgetarg(3) = double(j);
98  }
99  return x;
100 }
101 
102 static double m_printf(void* v) {
103  Matrix* m = (Matrix*) v;
104  int i, j, nrow = m->nrow(), ncol = m->ncol();
105  const char* f1 = " %-8.3g";
106  const char* f2 = "\n";
107  if (ifarg(1)) {
108  f1 = gargstr(1);
109  }
110  if (ifarg(2)) {
111  f2 = gargstr(2);
112  }
113  for (i = 0; i < nrow; ++i) {
114  for (j = 0; j < ncol; ++j) {
115  Printf(f1, m->getval(i, j));
116  }
117  Printf("%s", f2);
118  }
119  return 0.;
120 }
121 
122 static double m_fprint(void* v) {
123  Matrix* m = (Matrix*) v;
124  int i, j, nrow = m->nrow(), ncol = m->ncol();
125  int ia = 1;
126  bool pr_size = true;
127  const char* f1 = " %-8.3g";
128  const char* f2 = "\n";
129  if (hoc_is_double_arg(ia)) {
130  pr_size = ((int) chkarg(ia, 0, 1) == 1) ? true : false;
131  ++ia;
132  }
133  FILE* f = hoc_obj_file_arg(ia);
134  if (ifarg(ia + 1)) {
135  f1 = gargstr(ia + 1);
136  }
137  if (ifarg(ia + 2)) {
138  f2 = gargstr(ia + 2);
139  }
140  if (pr_size) {
141  fprintf(f, "%d %d\n", nrow, ncol);
142  }
143  for (i = 0; i < nrow; ++i) {
144  for (j = 0; j < ncol; ++j) {
145  fprintf(f, f1, m->getval(i, j));
146  }
147  fprintf(f, "%s", f2);
148  }
149  return 0.;
150 }
151 
152 static double m_scanf(void* v) {
153  // file assumed to be an array of numbers. Numbers in rows
154  // are contiguous in the stream.
155  // first two numbers are nrow and ncol unless
156  // arguments 2 and 3 specify them
157  Matrix* m = (Matrix*) v;
158  FILE* f = hoc_obj_file_arg(1);
159  int i, j, nrow, ncol;
160  if (ifarg(2)) {
161  nrow = (int) chkarg(2, 1, 1e9);
162  ncol = (int) chkarg(3, 1, 1e9);
163  } else {
164  nrow = (int) hoc_scan(f);
165  ncol = (int) hoc_scan(f);
166  }
167  m->resize(nrow, ncol);
168  for (i = 0; i < nrow; ++i)
169  for (j = 0; j < ncol; ++j) {
170  m->coeff(i, j) = hoc_scan(f);
171  }
172  return 0.;
173 }
174 
175 static Object** m_resize(void* v) {
176  Matrix* m = (Matrix*) v;
177  m->resize((int) (chkarg(1, 1., 1e9) + EPS), (int) (chkarg(2, 1., 1e9) + EPS));
178  return temp_objvar(m);
179 }
180 
181 static Object** m_mulv(void* v) {
182  Matrix* m = (Matrix*) v;
183  Vect* vin = vector_arg(1);
184  Vect* vout;
185  bool f = false;
186  if (ifarg(2)) {
187  vout = vector_arg(2);
188  } else {
189 #ifdef WIN32
190  vout = vector_new(m->nrow());
191 #else
192  vout = new Vect(m->nrow());
193 #endif
194  }
195  if (vin == vout) {
196  f = true;
197 #ifdef WIN32
198  vin = vector_new2(vin);
199 #else
200  vin = new Vect(*vin);
201 #endif
202  }
203 #ifdef WIN32
204  check_capac(vector_capacity(vin), m->ncol());
205  vector_resize(vout, m->nrow());
206 #else
207  check_capac(vin->size(), m->ncol());
208  vout->resize(m->nrow());
209 #endif
210  m->mulv(vin, vout);
211  if (f) {
212 #ifdef WIN32
213  vector_delete(vin);
214 #else
215  delete vin;
216 #endif
217  }
218 #ifdef WIN32
219  return vector_temp_objvar(vout);
220 #else
221  return vout->temp_objvar();
222 #endif
223 }
224 
225 
226 static Matrix* get_out_mat(Matrix* mat, int n, int m, int i, const char* mes = NULL);
227 
228 static Matrix* get_out_mat(Matrix* mat, int n, int m, int i, const char* mes) {
229  Matrix* out;
230  if (ifarg(i)) {
231  out = matrix_arg(i);
232  } else {
233  out = Matrix::instance(n, m, Matrix::MFULL);
234  out->obj_ = NULL;
235  }
236  if (mat == out && mes) {
237  hoc_execerror(mes, " matrix operation cannot be done in place");
238  }
239  return out;
240 }
241 
242 static Matrix* get_out_mat(Matrix* m, int i, const char* mes = NULL) {
243  return get_out_mat(m, m->nrow(), m->ncol(), i, mes);
244 }
245 
246 static Object** m_add(void* v) {
247  Matrix* m = (Matrix*) v;
248  Matrix* out;
249  out = m;
250  if (ifarg(2)) {
251  out = matrix_arg(2);
252  }
253  m->add(matrix_arg(1), out);
254  return temp_objvar(out);
255 }
256 
257 static Object** m_bcopy(void* v) {
258  Matrix* m = (Matrix*) v;
259  Matrix* out;
260  int i0, j0, m0, n0, i1, j1, i;
261  i0 = (int) chkarg(1, 0, m->nrow() - 1);
262  j0 = (int) chkarg(2, 0, m->ncol() - 1);
263  m0 = (int) chkarg(3, 1, m->nrow() - i0);
264  n0 = (int) chkarg(4, 1, m->ncol() - j0);
265  if (ifarg(5) && hoc_is_double_arg(5)) {
266  i1 = (int) chkarg(5, 0, 1e9);
267  j1 = (int) chkarg(6, 0, 1e9);
268  i = 7;
269  } else {
270  i1 = 0;
271  j1 = 0;
272  i = 5;
273  }
274  out = get_out_mat(m, m0, n0, i);
275  m->bcopy(out, i0, j0, m0, n0, i1, j1);
276  return temp_objvar(out);
277 }
278 
279 static Object** m_mulm(void* v) {
280  Matrix* m = (Matrix*) v;
281  Matrix *in, *out;
282  in = matrix_arg(1);
283  if (ifarg(2)) {
284  out = matrix_arg(2);
285  } else {
286  out = Matrix::instance(m->nrow(), in->ncol(), Matrix::MFULL);
287  }
288  if (in == out || m == out) {
289  hoc_execerror("matrix multiplication cannot be done in place", 0);
290  }
291  out->resize(m->nrow(), in->ncol());
292  check_domain(m->ncol(), in->nrow());
293  m->mulm(in, out);
294  return temp_objvar(out);
295 }
296 
297 static Object** m_c(void* v) {
298  Matrix* m = (Matrix*) v;
299  Matrix* out = get_out_mat(m, 1);
300  m->copy(out);
301  return temp_objvar(out);
302 }
303 
304 static Object** m_transpose(void* v) {
305  Matrix* m = (Matrix*) v;
306  Matrix* out = get_out_mat(m, 1);
307  out->resize(m->ncol(), m->nrow());
308  m->transpose(out);
309  return temp_objvar(out);
310 }
311 
312 static Object** m_symmeig(void* v) {
313  Matrix* m = (Matrix*) v;
314  Matrix* out = matrix_arg(1);
315  Object** p;
316  out->resize(m->nrow(), m->ncol());
317  Vect* vout;
318 #ifdef WIN32
319  vout = vector_new(m->nrow());
320  p = vector_temp_objvar(vout);
321 #else
322  vout = new Vect(m->nrow());
323  p = vout->temp_objvar();
324 #endif
325  m->symmeigen(out, vout);
326  return p;
327 }
328 
329 static Object** m_svd(void* vv) {
330  Matrix* m = (Matrix*) vv;
331  Matrix *u = NULL, *v = NULL;
332  if (ifarg(2)) {
333  u = matrix_arg(1);
334  v = matrix_arg(2);
335  u->resize(m->nrow(), m->nrow());
336  v->resize(m->ncol(), m->ncol());
337  }
338  Object** p;
339  Vect* d;
340  int dsize = m->nrow() < m->ncol() ? m->nrow() : m->ncol();
341 #ifdef WIN32
342  d = vector_new(dsize);
343  p = vector_temp_objvar(d);
344 #else
345  d = new Vect(dsize);
346  p = d->temp_objvar();
347 #endif
348  m->svd1(u, v, d);
349  return p;
350 }
351 
352 static Object** m_muls(void* v) {
353  Matrix* m = (Matrix*) v;
354  Matrix* out;
355  out = m;
356  if (ifarg(2)) {
357  out = matrix_arg(2);
358  }
359  m->muls(*getarg(1), out);
360  return temp_objvar(out);
361 }
362 
363 static Object** m_getrow(void* v) {
364  Matrix* m = (Matrix*) v;
365  int k = (int) chkarg(1, 0, m->nrow() - 1);
366  Vect* vout;
367  if (ifarg(2)) {
368  vout = vector_arg(2);
369 #ifdef WIN32
370  vector_resize(vout, m->ncol());
371 #else
372  vout->resize(m->ncol());
373 #endif
374  } else {
375 #ifdef WIN32
376  vout = vector_new(m->ncol());
377 #else
378  vout = new Vect(m->ncol());
379 #endif
380  }
381  m->getrow(k, vout);
382 #ifdef WIN32
383  return vector_temp_objvar(vout);
384 #else
385  return vout->temp_objvar();
386 #endif
387 }
388 
389 static Object** m_getcol(void* v) {
390  Matrix* m = (Matrix*) v;
391  int k = (int) chkarg(1, 0, m->ncol() - 1);
392  Vect* vout;
393  if (ifarg(2)) {
394  vout = vector_arg(2);
395 #ifdef WIN32
396  vector_resize(vout, m->nrow());
397 #else
398  vout->resize(m->nrow());
399 #endif
400  } else {
401 #ifdef WIN32
402  vout = vector_new(m->nrow());
403 #else
404  vout = new Vect(m->nrow());
405 #endif
406  }
407  m->getcol(k, vout);
408 #ifdef WIN32
409  return vector_temp_objvar(vout);
410 #else
411  return vout->temp_objvar();
412 #endif
413 }
414 
415 static Object** m_setrow(void* v) {
416  Matrix* m = (Matrix*) v;
417  int k = (int) chkarg(1, 0, m->nrow() - 1);
418  if (hoc_is_double_arg(2)) {
419  m->setrow(k, *getarg(2));
420  } else {
421  Vect* in = vector_arg(2);
422 #ifdef WIN32
423  check_domain(vector_capacity(in), m->ncol());
424 #else
425  check_domain(in->size(), m->ncol());
426 #endif
427  m->setrow(k, in);
428  }
429  return temp_objvar(m);
430 }
431 
432 static Object** m_setcol(void* v) {
433  Matrix* m = (Matrix*) v;
434  int k = (int) chkarg(1, 0, m->ncol() - 1);
435  if (hoc_is_double_arg(2)) {
436  m->setcol(k, *getarg(2));
437  } else {
438  Vect* in = vector_arg(2);
439 #ifdef WIN32
440  check_domain(vector_capacity(in), m->nrow());
441 #else
442  check_domain(in->size(), m->nrow());
443 #endif
444  m->setcol(k, in);
445  }
446  return temp_objvar(m);
447 }
448 
449 static Object** m_setdiag(void* v) {
450  Matrix* m = (Matrix*) v;
451  int k = (int) chkarg(1, -(m->nrow() - 1), m->ncol() - 1);
452  if (hoc_is_double_arg(2)) {
453  m->setdiag(k, *getarg(2));
454  } else {
455  Vect* in = vector_arg(2);
456 #ifdef WIN32
457  check_domain(vector_capacity(in), m->nrow());
458 #else
459  check_domain(in->size(), m->nrow());
460 #endif
461  m->setdiag(k, in);
462  }
463  return temp_objvar(m);
464 }
465 
466 static Object** m_getdiag(void* v) {
467  Matrix* m = (Matrix*) v;
468  int k = (int) chkarg(1, -(m->nrow() - 1), m->ncol() - 1);
469  Vect* vout;
470  if (ifarg(2)) {
471  vout = vector_arg(2);
472 #ifdef WIN32
473  vector_resize(vout, m->nrow());
474 #else
475  vout->resize(m->nrow());
476 #endif
477  } else {
478 #ifdef WIN32
479  vout = vector_new(m->nrow());
480 #else
481  vout = new Vect(m->nrow());
482 #endif
483  }
484  m->getdiag(k, vout);
485 #ifdef WIN32
486  return vector_temp_objvar(vout);
487 #else
488  return vout->temp_objvar();
489 #endif
490 }
491 
492 static Object** m_zero(void* v) {
493  Matrix* m = (Matrix*) v;
494  m->zero();
495  return temp_objvar(m);
496 }
497 
498 static Object** m_ident(void* v) {
499  Matrix* m = (Matrix*) v;
500  m->ident();
501  return temp_objvar(m);
502 }
503 
504 static Object** m_exp(void* v) {
505  Matrix* m = (Matrix*) v;
506  Matrix* out = get_out_mat(m, 1, "exponentiation");
507  m->exp(out);
508  return temp_objvar(out);
509 }
510 
511 static Object** m_pow(void* v) {
512  Matrix* m = (Matrix*) v;
513  int k = (int) chkarg(1, 0., 100.);
514  Matrix* out = get_out_mat(m, 2, "raising to a power");
515  m->pow(k, out);
516  return temp_objvar(out);
517 }
518 
519 static Object** m_inverse(void* v) {
520  Matrix* m = (Matrix*) v;
521  Matrix* out = get_out_mat(m, 1);
522  m->inverse(out);
523  return temp_objvar(out);
524 }
525 
526 static double m_det(void* v) {
527  Matrix* m = (Matrix*) v;
528  int e;
529  double a = m->det(&e);
530  double* pe = hoc_pgetarg(1);
531  *pe = double(e);
532  return a;
533 }
534 
535 static Object** m_solv(void* v) {
536  Matrix* m = (Matrix*) v;
537  check_capac(m->nrow(), m->ncol());
538  Vect* vin = vector_arg(1);
539 #ifdef WIN32
540  check_capac(vector_capacity(vin), m->ncol());
541 #else
542  check_capac(vin->size(), m->ncol());
543 #endif
544  Vect* vout = NULL;
545  bool f = false;
546  bool use_lu = false;
547  // args 2 and 3 are optional [vout, use previous LU factorization]
548  // and in either order
549  for (int i = 2; i <= 3; ++i) {
550  if (ifarg(i)) {
551  if (hoc_is_object_arg(i)) {
552  if (vout) {
553  }
554  vout = vector_arg(i);
555  } else {
556  use_lu = ((int) (*getarg(i))) ? true : false;
557  }
558  }
559  }
560  if (!vout) {
561 #ifdef WIN32
562  vout = vector_new(m->nrow());
563 #else
564  vout = new Vect(m->nrow());
565 #endif
566  }
567 #ifdef WIN32
568  vector_resize(vout, m->ncol());
569 #else
570  vout->resize(m->ncol());
571 #endif
572  if (vin == vout) {
573  f = true;
574 #ifdef WIN32
575  vin = vector_new2(vin);
576 #else
577  vin = new Vect(*vin);
578 #endif
579  }
580  m->solv(vin, vout, use_lu);
581  if (f) {
582 #ifdef WIN32
583  vector_delete(vin);
584 #else
585  delete vin;
586 #endif
587  }
588 #ifdef WIN32
589  return vector_temp_objvar(vout);
590 #else
591  return vout->temp_objvar();
592 #endif
593 }
594 
595 static Object** m_set(void* v) {
596  Matrix* m = (Matrix*) v;
597  int i, j, nrow = m->nrow(), ncol = m->ncol();
598  int k;
599  for (k = 0, i = 0; i < nrow; ++i) {
600  for (j = 0; j < ncol; ++j) {
601  m->coeff(i, j) = *getarg(++k);
602  }
603  }
604  return temp_objvar(m);
605 }
606 
607 static Object** m_to_vector(void* v) {
608  Matrix* m = (Matrix*) v;
609  Vect* vout;
610  int i, j, k;
611  int nrow = m->nrow();
612  int ncol = m->ncol();
613  if (ifarg(1)) {
614  vout = vector_arg(1);
615  vector_resize(vout, nrow * ncol);
616  } else {
617  vout = vector_new(nrow * ncol);
618  }
619  k = 0;
620  double* ve = vector_vec(vout);
621  for (j = 0; j < ncol; ++j)
622  for (i = 0; i < nrow; ++i) {
623  ve[k++] = m->getval(i, j);
624  }
625  return vector_temp_objvar(vout);
626 }
627 
628 static Object** m_from_vector(void* v) {
629  Matrix* m = (Matrix*) v;
630  Vect* vout;
631  int i, j, k;
632  int nrow = m->nrow();
633  int ncol = m->ncol();
634  vout = vector_arg(1);
635  check_capac(nrow * ncol, vector_capacity(vout));
636  k = 0;
637  double* ve = vector_vec(vout);
638  for (j = 0; j < ncol; ++j)
639  for (i = 0; i < nrow; ++i) {
640  m->coeff(i, j) = ve[k++];
641  }
642  return temp_objvar(m);
643 }
644 
645 static Member_func m_members[] = {
646  // returns double scalar
647  {"x", m_nrow}, // will be changed below
648  {"nrow", m_nrow},
649  {"ncol", m_ncol},
650  {"getval", m_getval},
651  {"setval", m_setval},
652  {"sprowlen", m_sprowlen},
653  {"spgetrowval", m_spgetrowval},
654  {"det", m_det},
655 
656  {"printf", m_printf},
657  {"fprint", m_fprint},
658  {"scanf", m_scanf},
659  {nullptr, nullptr}};
660 
662  // returns Vector
663  {"mulv", m_mulv},
664  {"getrow", m_getrow},
665  {"getcol", m_getcol},
666  {"getdiag", m_getdiag},
667  {"solv", m_solv},
668  {"symmeig", m_symmeig},
669  {"svd", m_svd},
670  // returns Matrix
671  {"c", m_c},
672  {"add", m_add},
673  {"bcopy", m_bcopy},
674  {"resize", m_resize},
675  {"mulm", m_mulm},
676  {"muls", m_muls},
677  {"setrow", m_setrow},
678  {"setcol", m_setcol},
679  {"setdiag", m_setdiag},
680  {"zero", m_zero},
681  {"ident", m_ident},
682  {"exp", m_exp},
683  {"pow", m_pow},
684  {"inverse", m_inverse},
685  {"transpose", m_transpose},
686  {"set", m_set},
687  {"to_vector", m_to_vector},
688  {"from_vector", m_from_vector},
689  {nullptr, nullptr}};
690 
691 static void* m_cons(Object* o) {
692  int i = 1, j = 1, storage_type = Matrix::MFULL;
693  if (ifarg(1))
694  i = int(chkarg(1, 1, 1e10) + EPS);
695  if (ifarg(2))
696  j = int(chkarg(2, 1, 1e10) + EPS);
697  if (ifarg(3))
698  storage_type = int(chkarg(3, 1, 3));
699  Matrix* m = Matrix::instance(i, j, storage_type);
700  m->obj_ = o;
701  return m;
702 }
703 
704 static void m_destruct(void* v) {
705  // supposed to notify freed val array here.
706  // printf("Matrix deleted\n");
707  delete (Matrix*) v;
708 }
709 
710 static void steer_x(void* v) {
711  Matrix* m = (Matrix*) v;
712  int i1, i2;
713  Symbol* s = hoc_spop();
714  if (!hoc_stack_type_is_ndim()) {
715  hoc_execerr_ext("Array dimension of Matrix.x is 2");
716  }
717  hoc_pop_ndim();
718  i2 = (int) (hoc_xpop() + EPS);
719  i1 = (int) (hoc_xpop() + EPS);
720  check_domain(i1, m->nrow() - 1);
721  check_domain(i2, m->ncol() - 1);
722  hoc_pushpx(m->mep(i1, i2));
723 }
724 
725 
726 #if WIN32 && !USEMATRIX
727 void Matrix_reg();
728 #endif
729 
730 void Matrix_reg() {
731  class2oc("Matrix", m_cons, m_destruct, m_members, m_retobj_members, nullptr);
732  nrn_matrix_sym = hoc_lookup("Matrix");
733  // now make the x variable an actual double
735  sx->type = VAR;
736  sx->arayinfo = (Arrayinfo*) hoc_Emalloc(sizeof(Arrayinfo) + 2 * sizeof(int));
737  sx->arayinfo->refcount = 1;
738  sx->arayinfo->a_varn = NULL;
739  sx->arayinfo->nsub = 2;
740  sx->arayinfo->sub[0] = 1;
741  sx->arayinfo->sub[1] = 1;
743 }
size_t size() const
Definition: ivocvect.h:42
Object ** temp_objvar()
Definition: ivocvect.cpp:349
void resize(size_t n)
Definition: ivocvect.h:46
Object * obj_
Definition: ocmatrix.h:158
virtual double det(int *e) const
Definition: ocmatrix.h:139
@ MFULL
Definition: ocmatrix.h:20
virtual void mulm(Matrix *in, Matrix *out) const
Definition: ocmatrix.h:70
virtual void transpose(Matrix *out)
Definition: ocmatrix.h:130
virtual int nrow() const
Definition: ocmatrix.h:48
virtual void ident()
Definition: ocmatrix.h:109
virtual void pow(int, Matrix *out) const
Definition: ocmatrix.h:115
virtual double spgetrowval(int i, int jindx, int *j) const
Definition: ocmatrix.h:147
virtual void setcol(int, Vect *in)
Definition: ocmatrix.h:91
virtual void getcol(int, Vect *out) const
Definition: ocmatrix.h:82
virtual void resize(int, int)
Definition: ocmatrix.h:56
virtual double & coeff(int i, int j)
Definition: ocmatrix.h:34
virtual void svd1(Matrix *u, Matrix *v, Vect *d) const
Definition: ocmatrix.h:136
static OcMatrix * instance(int nrow, int ncol, int type=MFULL)
Definition: ocmatrix.cpp:27
virtual void exp(Matrix *out) const
Definition: ocmatrix.h:112
void mulv(Vect &in, Vect &out) const
Definition: ocmatrix.h:64
virtual int sprowlen(int) const
Definition: ocmatrix.h:143
virtual void copy(Matrix *out) const
Definition: ocmatrix.h:124
virtual void setrow(int, Vect *in)
Definition: ocmatrix.h:88
virtual void add(Matrix *, Matrix *out) const
Definition: ocmatrix.h:76
virtual int ncol() const
Definition: ocmatrix.h:52
double * mep(int i, int j)
Definition: ocmatrix.h:26
virtual void inverse(Matrix *out) const
Definition: ocmatrix.h:118
virtual void getdiag(int, Vect *out) const
Definition: ocmatrix.h:85
virtual void muls(double, Matrix *out) const
Definition: ocmatrix.h:73
virtual void solv(Vect *vin, Vect *vout, bool use_lu)
Definition: ocmatrix.h:121
virtual void zero()
Definition: ocmatrix.h:106
virtual void getrow(int, Vect *out) const
Definition: ocmatrix.h:79
virtual double getval(int i, int j) const
Definition: ocmatrix.h:44
virtual void setdiag(int, Vect *in)
Definition: ocmatrix.h:94
virtual void bcopy(Matrix *mout, int i0, int j0, int n0, int m0, int i1, int j1) const
Definition: ocmatrix.h:127
virtual void symmeigen(Matrix *mout, Vect *vout) const
Definition: ocmatrix.h:133
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
Symbol * hoc_table_lookup(const char *, Symlist *)
Definition: symbol.cpp:48
char * gargstr(int narg)
Definition: code2.cpp:227
HocReturnType hoc_return_type_code
Definition: code.cpp:42
#define v
Definition: md1redef.h:11
#define i
Definition: md1redef.h:19
double chkarg(int, double low, double high)
Definition: code2.cpp:626
static RNG::key_type k
Definition: nrnran123.cpp:9
int hoc_is_object_arg(int narg)
Definition: code.cpp:876
double hoc_xpop()
Definition: code.cpp:903
void hoc_execerr_ext(const char *fmt,...)
printf style specification of hoc_execerror message.
Definition: fileio.cpp:828
Object ** hoc_temp_objvar(Symbol *symtemp, void *v)
Definition: hoc_oop.cpp:484
void vector_resize(IvocVect *v, int n)
Definition: ivocvect.cpp:302
IvocVect * vector_new2(IvocVect *v)
Definition: ivocvect.cpp:293
void hoc_pushpx(double *d)
Definition: code.cpp:834
std::FILE * hoc_obj_file_arg(int i)
Definition: ocfile.cpp:47
bool hoc_stack_type_is_ndim()
Definition: code.cpp:314
int hoc_is_double_arg(int narg)
Definition: code.cpp:864
void check_obj_type(Object *obj, const char *type_name)
Definition: hoc_oop.cpp:2098
IvocVect * vector_arg(int i)
Definition: ivocvect.cpp:265
int hoc_pop_ndim()
Definition: code.cpp:933
Object ** vector_temp_objvar(Vect *v)
Definition: ivocvect.cpp:314
Symbol * hoc_spop()
Definition: code.cpp:928
double * hoc_pgetarg(int narg)
Definition: oc_ansi.h:253
Symbol * hoc_lookup(const char *)
Definition: symbol.cpp:59
void vector_delete(Vect *v)
Definition: ivocvect.cpp:262
#define getarg
Definition: hocdec.h:17
Object ** hoc_objgetarg(int)
Definition: code.cpp:1614
IvocVect Vect
Definition: ivocvect.h:134
double * vector_vec(IvocVect *v)
Definition: ivocvect.cpp:19
IvocVect * vector_new(int n)
Definition: ivocvect.cpp:13
void hoc_execerror(const char *s1, const char *s2)
Definition: nrnoc_aux.cpp:39
int vector_capacity(IvocVect *v)
Definition: ivocvect.cpp:16
void * hoc_Emalloc(size_t)
Definition: nrnoc_aux.cpp:80
std::string to_string(const T &obj)
int const size_t const size_t n
Definition: nrngsl.h:10
size_t p
size_t j
s
Definition: multisend.cpp:521
int ifarg(int)
Definition: code.cpp:1607
#define NULL
Definition: spdefs.h:105
static double m_fprint(void *v)
Definition: matrix.cpp:122
void Matrix_reg()
Definition: matrix.cpp:730
static double m_printf(void *v)
Definition: matrix.cpp:102
static double m_scanf(void *v)
Definition: matrix.cpp:152
static void * m_cons(Object *o)
Definition: matrix.cpp:691
static void m_destruct(void *v)
Definition: matrix.cpp:704
static void steer_x(void *v)
Definition: matrix.cpp:710
static double m_det(void *v)
Definition: matrix.cpp:526
static Member_func m_members[]
Definition: matrix.cpp:645
static Object ** temp_objvar(Matrix *m)
Definition: matrix.cpp:41
static Object ** m_pow(void *v)
Definition: matrix.cpp:511
static Object ** m_symmeig(void *v)
Definition: matrix.cpp:312
static Matrix * get_out_mat(Matrix *mat, int n, int m, int i, const char *mes=NULL)
Definition: matrix.cpp:228
static Object ** m_getcol(void *v)
Definition: matrix.cpp:389
static Object ** m_setcol(void *v)
Definition: matrix.cpp:432
static Object ** m_mulm(void *v)
Definition: matrix.cpp:279
static double m_spgetrowval(void *v)
Definition: matrix.cpp:89
static double m_ncol(void *v)
Definition: matrix.cpp:58
static Object ** m_from_vector(void *v)
Definition: matrix.cpp:628
static Object ** m_zero(void *v)
Definition: matrix.cpp:492
static double m_nrow(void *v)
Definition: matrix.cpp:52
static Object ** m_setrow(void *v)
Definition: matrix.cpp:415
#define EPS
Definition: matrix.cpp:14
static Object ** m_exp(void *v)
Definition: matrix.cpp:504
static Object ** m_getdiag(void *v)
Definition: matrix.cpp:466
static double m_setval(void *v)
Definition: matrix.cpp:64
static Object ** m_getrow(void *v)
Definition: matrix.cpp:363
Object ** hoc_temp_objptr(Object *)
Definition: code.cpp:151
static Object ** m_bcopy(void *v)
Definition: matrix.cpp:257
static Object ** m_setdiag(void *v)
Definition: matrix.cpp:449
static double m_sprowlen(void *v)
Definition: matrix.cpp:81
static Object ** m_set(void *v)
Definition: matrix.cpp:595
static Object ** m_solv(void *v)
Definition: matrix.cpp:535
static Object ** m_to_vector(void *v)
Definition: matrix.cpp:607
static void check_domain(int i, int j)
Definition: matrix.cpp:20
static Object ** m_c(void *v)
Definition: matrix.cpp:297
static Object ** m_ident(void *v)
Definition: matrix.cpp:498
static Object ** m_mulv(void *v)
Definition: matrix.cpp:181
static Object ** m_svd(void *vv)
Definition: matrix.cpp:329
Matrix * matrix_arg(int i)
Definition: matrix.cpp:33
static Object ** m_transpose(void *v)
Definition: matrix.cpp:304
static Object ** m_resize(void *v)
Definition: matrix.cpp:175
Symbol * nrn_matrix_sym
Definition: matrix.cpp:15
static Object ** m_muls(void *v)
Definition: matrix.cpp:352
static Object ** m_add(void *v)
Definition: matrix.cpp:246
static void check_capac(int i, int j)
Definition: matrix.cpp:27
double hoc_scan(FILE *)
Definition: fileio.cpp:280
static Object ** m_inverse(void *v)
Definition: matrix.cpp:519
static double m_getval(void *v)
Definition: matrix.cpp:73
static Member_ret_obj_func m_retobj_members[]
Definition: matrix.cpp:661
unsigned * a_varn
Definition: hocdec.h:60
int nsub
Definition: hocdec.h:61
int refcount
Definition: hocdec.h:62
int sub[1]
Definition: hocdec.h:63
Definition: hocdec.h:173
void * this_pointer
Definition: hocdec.h:178
cTemplate * ctemplate
Definition: hocdec.h:180
union Object::@47 u
Definition: model.h:47
union Symbol::@28 u
short type
Definition: model.h:48
cTemplate * ctemplate
Definition: hocdec.h:126
Arrayinfo * arayinfo
Definition: hocdec.h:130
Symlist * symtable
Definition: hocdec.h:148
void(* steer)(void *)
Definition: hocdec.h:160
int Printf(const char *fmt, Args... args)
Definition: logger.hpp:18