My Project  0.0.16
QUCS Mapping
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
evaluate.cpp
Go to the documentation of this file.
1 /*
2  * evaluate.cpp - the Qucs equation evaluator implementations
3  *
4  * Copyright (C) 2004-2011 Stefan Jahn <stefan@lkcc.org>
5  * Copyright (C) 2006 Gunther Kraut <gn.kraut@t-online.de>
6  *
7  * This is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This software is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this package; see the file COPYING. If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  * $Id: evaluate.cpp 1825 2011-03-11 20:42:14Z ela $
23  *
24  */
25 
26 #if HAVE_CONFIG_H
27 # include <config.h>
28 #endif
29 
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <ctype.h>
34 #include <math.h>
35 
36 #include "logging.h"
37 #include "complex.h"
38 #include "object.h"
39 #include "vector.h"
40 #include "matrix.h"
41 #include "poly.h"
42 #include "spline.h"
43 #include "fourier.h"
44 #include "receiver.h"
45 #include "constants.h"
46 #include "fspecial.h"
47 #include "circuit.h"
48 #include "range.h"
49 #include "equation.h"
50 #include "evaluate.h"
51 #include "exception.h"
52 #include "exceptionstack.h"
53 #include "strlist.h"
54 
55 using namespace eqn;
56 using namespace qucs;
57 using namespace fourier;
58 using namespace fspecial;
59 
60 // Short macros in order to obtain the correct constant value.
61 #define D(con) ((constant *) (con))->d
62 #define C(con) ((constant *) (con))->c
63 #define V(con) ((constant *) (con))->v
64 #define M(con) ((constant *) (con))->m
65 #define MV(con) ((constant *) (con))->mv
66 #define STR(con) ((constant *) (con))->s
67 #define CHR(con) ((constant *) (con))->chr
68 #define INT(con) ((int) D (con))
69 #define RNG(con) ((constant *) (con))->r
70 #define B(con) ((constant *) (con))->b
71 
72 #define A(a) ((assignment *) (a))
73 #define R(r) ((reference *) (r))
74 
75 // Argument macros.
76 #define _ARES(idx) args->getResult(idx)
77 #define _ARG(idx) args->get(idx)
78 
79 #define _D(var,idx) nr_double_t (var) = D (_ARES (idx));
80 #define _BO(var,idx) bool (var) = B (_ARES (idx));
81 #define _CX(var,idx) nr_complex_t * (var) = C (_ARES (idx));
82 #define _V(var,idx) vector * (var) = V (_ARES (idx));
83 #define _M(var,idx) matrix * (var) = M (_ARES (idx));
84 #define _MV(var,idx) matvec * (var) = MV (_ARES (idx));
85 #define _I(var,idx) int (var) = INT (_ARES (idx));
86 #define _R(var,idx) range * (var) = RNG (_ARES (idx));
87 
88 #define _ARR0(var) _R (var,0)
89 #define _ARR1(var) _R (var,1)
90 #define _ARR2(var) _R (var,2)
91 #define _ARI0(var) _I (var,0)
92 #define _ARI1(var) _I (var,1)
93 #define _ARI2(var) _I (var,2)
94 #define _ARD0(var) _D (var,0)
95 #define _ARD1(var) _D (var,1)
96 #define _ARD2(var) _D (var,2)
97 #define _ARB0(var) _BO (var,0)
98 #define _ARB1(var) _BO (var,1)
99 #define _ARB2(var) _BO (var,2)
100 #define _ARC0(var) _CX (var,0)
101 #define _ARC1(var) _CX (var,1)
102 #define _ARC2(var) _CX (var,2)
103 #define _ARM0(var) _M (var,0)
104 #define _ARM1(var) _M (var,1)
105 #define _ARM2(var) _M (var,2)
106 #define _ARV0(var) _V (var,0)
107 #define _ARV1(var) _V (var,1)
108 #define _ARV2(var) _V (var,2)
109 #define _ARMV0(var) _MV (var,0)
110 #define _ARMV1(var) _MV (var,1)
111 #define _ARMV2(var) _MV (var,2)
112 
113 // Return value definition macros.
114 #define _DEFD() constant * res = new constant (TAG_DOUBLE);
115 #define _DEFB() constant * res = new constant (TAG_BOOLEAN);
116 #define _DEFC() constant * res = new constant (TAG_COMPLEX);
117 #define _DEFV() constant * res = new constant (TAG_VECTOR);
118 #define _DEFM() constant * res = new constant (TAG_MATRIX);
119 #define _DEFMV() constant * res = new constant (TAG_MATVEC);
120 #define _DEFR() constant * res = new constant (TAG_RANGE);
121 
122 // Return value macros.
123 #define _RETD(var) res->d = (var); return res;
124 #define _RETB(var) res->b = (var); return res;
125 #define _RETC(var) res->c = new nr_complex_t (var); return res;
126 #define _RETV(var) res->v = new vector (var); return res;
127 #define _RETM(var) res->m = new matrix (var); return res;
128 #define _RETMV(var) res->mv = new matvec (var); return res;
129 #define _RETR(var) res->r = (var); return res;
130 
131 // Return value macros without arguments.
132 #define __RETC() res->c = new nr_complex_t (); return res;
133 #define __RETV() res->v = new vector (); return res;
134 #define __RETM() res->m = new matrix (); return res;
135 #define __RETMV() res->mv = new matvec (); return res;
136 
137 #define SOLVEE(idx) args->get(idx)->solvee
138 
139 // Throws a math exception.
140 #define THROW_MATH_EXCEPTION(txt) do { \
141  qucs::exception * e = new qucs::exception (EXCEPTION_MATH); \
142  e->setText (txt); throw_exception (e); } while (0)
143 
144 /* The QUCS_CONCAT macros create a new concatenated symbol for the
145  compiler in a portable way. It is essential to use these macros
146  like QUCS_CONCAT (a,b) and *not* like QUCS_CONCAT (a, b) or its
147  variants. */
148 #if defined (__STDC__) || defined (__cplusplus)
149 # define QUCS_CONCAT2(a, b) a##b
150 # define QUCS_CONCAT3(a, b, c) a##b##c
151 #else
152 # define QUCS_CONCAT2(a, b) a/* */b
153 # define QUCS_CONCAT3(a, b, c) a/* */b/* */c
154 #endif
155 
156 // The following macro is meant to be used for some simple functions.
157 #define MAKE_FUNC_DEFINITION_0(cfunc) \
158 constant * evaluate:: QUCS_CONCAT2 (cfunc,_d) (constant * args) { \
159  _ARD0 (d); \
160  _DEFD (); \
161  _RETD (cfunc (d)); \
162 } \
163 constant * evaluate:: QUCS_CONCAT2 (cfunc,_c) (constant * args) { \
164  _ARC0 (c); \
165  _DEFC (); \
166  _RETC (cfunc (*c)); \
167 } \
168 constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) { \
169  _ARV0 (v); \
170  _DEFV (); \
171  _RETV (cfunc (*v)); \
172 }
173 
174 #define MAKE_FUNC_DEFINITION_1(cfunc) \
175 constant * evaluate:: QUCS_CONCAT2 (cfunc,_d) (constant * args) { \
176  _ARD0 (d); \
177  _DEFD (); \
178  _RETD (cfunc (d)); \
179 } \
180 constant * evaluate:: QUCS_CONCAT2 (cfunc,_c) (constant * args) { \
181  _ARC0 (c); \
182  _DEFD (); \
183  res->d = cfunc (*c); return res; \
184 } \
185 constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) { \
186  _ARV0 (v); \
187  _DEFV (); \
188  _RETV (cfunc (*v)); \
189 } \
190 constant * evaluate:: QUCS_CONCAT2 (cfunc,_m) (constant * args) { \
191  _ARM0 (m); \
192  _DEFM (); \
193  _RETM (cfunc (*m)); \
194 } \
195 constant * evaluate:: QUCS_CONCAT2 (cfunc,_mv) (constant * args) {\
196  _ARMV0 (mv); \
197  _DEFMV (); \
198  _RETMV (cfunc (*mv)); \
199 }
200 
201 MAKE_FUNC_DEFINITION_0 (exp); // exponential function
202 MAKE_FUNC_DEFINITION_0 (limexp); // limited exponential function
203 MAKE_FUNC_DEFINITION_0 (sin); // sine
204 MAKE_FUNC_DEFINITION_0 (cos); // cosine
205 MAKE_FUNC_DEFINITION_0 (tan); // tangent
206 MAKE_FUNC_DEFINITION_0 (sinh); // sine hyperbolicus
207 MAKE_FUNC_DEFINITION_0 (cosh); // cosine hyperbolicus
208 MAKE_FUNC_DEFINITION_0 (tanh); // tangent hyperbolicus
209 MAKE_FUNC_DEFINITION_0 (coth); // cotangent hyperbolicus
210 MAKE_FUNC_DEFINITION_0 (sech); // secans hyperbolicus
211 MAKE_FUNC_DEFINITION_0 (cosech); // cosecans hyperbolicus
212 MAKE_FUNC_DEFINITION_0 (signum); // signum function
213 MAKE_FUNC_DEFINITION_0 (sign); // sign function
214 MAKE_FUNC_DEFINITION_0 (sinc); // sin(x)/x aka sinc function
215 MAKE_FUNC_DEFINITION_0 (sqr); // square value
216 
217 MAKE_FUNC_DEFINITION_1 (real); // real value
218 MAKE_FUNC_DEFINITION_1 (imag); // imaginary value
219 MAKE_FUNC_DEFINITION_1 (abs); // absolute value
220 
221 // ******************** unary plus *************************
223  _ARD0 (d1); _DEFD (); _RETD (d1);
224 }
225 
227  _ARC0 (c1); _DEFC (); _RETC (*c1);
228 }
229 
231  _ARV0 (v1); _DEFV (); _RETV (*v1);
232 }
233 
235  _ARM0 (m1); _DEFM (); _RETM (*m1);
236 }
237 
239  _ARMV0 (v1); _DEFMV (); _RETMV (*v1);
240 }
241 
242 // ****************** addition *****************************
244  _ARD0 (d1);
245  _ARD1 (d2);
246  _DEFD ();
247  _RETD (d1 + d2);
248 }
249 
251  _ARC0 (c1);
252  _ARC1 (c2);
253  _DEFC ();
254  _RETC (*c1 + *c2);
255 }
256 
258  _ARC0 (c1);
259  _ARD1 (d2);
260  _DEFC ();
261  _RETC (*c1 + d2);
262 }
263 
265  _ARD0 (d1);
266  _ARC1 (c2);
267  _DEFC ();
268  _RETC (d1 + *c2);
269 }
270 
272  _ARV0 (v1);
273  _ARD1 (d2);
274  _DEFV ();
275  _RETV (*v1 + d2);
276 }
277 
279  _ARD0 (d1);
280  _ARV1 (v2);
281  _DEFV ();
282  _RETV (d1 + *v2);
283 }
284 
286  _ARV0 (v1);
287  _ARC1 (c2);
288  _DEFV ();
289  _RETV (*v1 + *c2);
290 }
291 
293  _ARC0 (c1);
294  _ARV1 (v2);
295  _DEFV ();
296  _RETV (*v2 + *c1);
297 }
298 
300  _ARV0 (v1);
301  _ARV1 (v2);
302  _DEFV ();
303  _RETV (*v1 + *v2);
304 }
305 
307  _ARM0 (m1);
308  _ARM1 (m2);
309  _DEFM ();
310  _RETM (*m1 + *m2);
311 }
312 
314  _ARMV0 (v1);
315  _ARMV1 (v2);
316  _DEFMV ();
317  _RETMV (*v1 + *v2);
318 }
319 
321  _ARMV0 (v1);
322  _ARM1 (m2);
323  _DEFMV ();
324  _RETMV (*v1 + *m2);
325 }
326 
328  _ARM0 (m1);
329  _ARMV1 (v2);
330  _DEFMV ();
331  _RETMV (*m1 + *v2);
332 }
333 
335  _ARM0 (m1);
336  _ARD1 (d2);
337  _DEFM ();
338  _RETM (*m1 + d2);
339 }
340 
342  _ARD0 (d1);
343  _ARM1 (m2);
344  _DEFM ();
345  _RETM (d1 + *m2);
346 }
347 
349  _ARM0 (m1);
350  _ARC1 (c2);
351  _DEFM ();
352  _RETM (*m1 + *c2);
353 }
354 
356  _ARC0 (c1);
357  _ARM1 (m2);
358  _DEFM ();
359  _RETM (*c1 + *m2);
360 }
361 
363  _ARMV0 (m1);
364  _ARD1 (d2);
365  _DEFMV ();
366  _RETMV (*m1 + d2);
367 }
368 
370  _ARD0 (d1);
371  _ARMV1 (m2);
372  _DEFMV ();
373  _RETMV (d1 + *m2);
374 }
375 
377  _ARMV0 (m1);
378  _ARC1 (c2);
379  _DEFMV ();
380  _RETMV (*m1 + *c2);
381 }
382 
384  _ARC0 (c1);
385  _ARMV1 (m2);
386  _DEFMV ();
387  _RETMV (*c1 + *m2);
388 }
389 
391  _ARMV0 (m1);
392  _ARV1 (v2);
393  _DEFMV ();
394  _RETMV (*m1 + *v2);
395 }
396 
398  _ARV0 (v1);
399  _ARMV1 (m2);
400  _DEFMV ();
401  _RETMV (*v1 + *m2);
402 }
403 
405  char * s1 = STR (_ARES(0));
406  char * s2 = STR (_ARES(1));
407  constant * res = new constant (TAG_STRING);
408  char * p = (char *) malloc (strlen (s1) + strlen (s2) + 1);
409  strcpy (p, s1); strcat (p, s2);
410  res->s = p;
411  return res;
412 }
413 
415  char c1 = CHR (_ARES(0));
416  char * s2 = STR (_ARES(1));
417  constant * res = new constant (TAG_STRING);
418  char * p = (char *) malloc (strlen (s2) + 2);
419  p[0] = c1; strcpy (&p[1], s2);
420  res->s = p;
421  return res;
422 }
423 
425  char * s1 = STR (_ARES(0));
426  char c2 = CHR (_ARES(1));
427  constant * res = new constant (TAG_STRING);
428  char * p = (char *) malloc (strlen (s1) + 2);
429  strcpy (p, s1); p[strlen (s1)] = c2; p[strlen (s1) + 1] = '\0';
430  res->s = p;
431  return res;
432 }
433 
434 // ******************** unary minus ***************************
436  _ARD0 (d1); _DEFD (); _RETD (-d1);
437 }
438 
440  _ARC0 (c1); _DEFC (); _RETC (-*c1);
441 }
442 
444  _ARV0 (v1); _DEFV (); _RETV (-*v1);
445 }
446 
448  _ARM0 (m1); _DEFM (); _RETM (-*m1);
449 }
450 
452  _ARMV0 (v1); _DEFMV (); _RETMV (-*v1);
453 }
454 
455 // ****************** subtraction *****************************
457  _ARD0 (d1);
458  _ARD1 (d2);
459  _DEFD ();
460  _RETD (d1 - d2);
461 }
462 
464  _ARC0 (c1);
465  _ARC1 (c2);
466  _DEFC ();
467  _RETC (*c1 - *c2);
468 }
469 
471  _ARC0 (c1);
472  _ARD1 (d2);
473  _DEFC ();
474  _RETC (*c1 - d2);
475 }
476 
478  _ARD0 (d1);
479  _ARC1 (c2);
480  _DEFC ();
481  _RETC (d1 - *c2);
482 }
483 
485  _ARV0 (v1);
486  _ARD1 (d2);
487  _DEFV ();
488  _RETV (*v1 - d2);
489 }
490 
492  _ARD0 (d1);
493  _ARV1 (v2);
494  _DEFV ();
495  _RETV (d1 - *v2);
496 }
497 
499  _ARV0 (v1);
500  _ARC1 (c2);
501  _DEFV ();
502  _RETV (*v1 - *c2);
503 }
504 
506  _ARC0 (c1);
507  _ARV1 (v2);
508  _DEFV ();
509  _RETV (*c1 - *v2);
510 }
511 
513  _ARV0 (v1);
514  _ARV1 (v2);
515  _DEFV ();
516  _RETV (*v1 - *v2);
517 }
518 
520  _ARM0 (m1);
521  _ARM1 (m2);
522  _DEFM ();
523  _RETM (*m1 - *m2);
524 }
525 
527  _ARMV0 (v1);
528  _ARMV1 (v2);
529  _DEFMV ();
530  _RETMV (*v1 - *v2);
531 }
532 
534  _ARMV0 (v1);
535  _ARM1 (m2);
536  _DEFMV ();
537  _RETMV (*v1 - *m2);
538 }
539 
541  _ARM0 (m1);
542  _ARMV1 (v2);
543  _DEFMV ();
544  _RETMV (*m1 - *v2);
545 }
546 
548  _ARM0 (m1);
549  _ARD1 (d2);
550  _DEFM ();
551  _RETM (*m1 - d2);
552 }
553 
555  _ARD0 (d1);
556  _ARM1 (m2);
557  _DEFM ();
558  _RETM (d1 - *m2);
559 }
560 
562  _ARM0 (m1);
563  _ARC1 (c2);
564  _DEFM ();
565  _RETM (*m1 - *c2);
566 }
567 
569  _ARC0 (c1);
570  _ARM1 (m2);
571  _DEFM ();
572  _RETM (*c1 - *m2);
573 }
574 
576  _ARMV0 (m1);
577  _ARD1 (d2);
578  _DEFMV ();
579  _RETMV (*m1 - d2);
580 }
581 
583  _ARD0 (d1);
584  _ARMV1 (m2);
585  _DEFMV ();
586  _RETMV (d1 - *m2);
587 }
588 
590  _ARMV0 (m1);
591  _ARC1 (c2);
592  _DEFMV ();
593  _RETMV (*m1 - *c2);
594 }
595 
597  _ARC0 (c1);
598  _ARMV1 (m2);
599  _DEFMV ();
600  _RETMV (*c1 - *m2);
601 }
602 
604  _ARMV0 (m1);
605  _ARV1 (v2);
606  _DEFMV ();
607  _RETMV (*m1 - *v2);
608 }
609 
611  _ARV0 (v1);
612  _ARMV1 (m2);
613  _DEFMV ();
614  _RETMV (*v1 - *m2);
615 }
616 
617 // ****************** multiplication *************************
619  _ARD0 (d1);
620  _ARD1 (d2);
621  _DEFD ();
622  _RETD (d1 * d2);
623 }
624 
626  _ARC0 (c1);
627  _ARC1 (c2);
628  _DEFC ();
629  _RETC ((*c1) * (*c2));
630 }
631 
633  _ARC0 (c1);
634  _ARD1 (d2);
635  _DEFC ();
636  _RETC ((*c1) * d2);
637 }
638 
640  _ARD0 (d1);
641  _ARC1 (c2);
642  _DEFC ();
643  _RETC (d1 * (*c2));
644 }
645 
647  _ARV0 (v1);
648  _ARD1 (d2);
649  _DEFV ();
650  _RETV (*v1 * d2);
651  return res;
652 }
653 
655  _ARD0 (d1);
656  _ARV1 (v2);
657  _DEFV ();
658  _RETV (d1 * *v2);
659 }
660 
662  _ARV0 (v1);
663  _ARC1 (c2);
664  _DEFV ();
665  _RETV (*v1 * *c2);
666 }
667 
669  _ARC0 (c1);
670  _ARV1 (v2);
671  _DEFV ();
672  _RETV (*c1 * *v2);
673 }
674 
676  _ARV0 (v1);
677  _ARV1 (v2);
678  _DEFV ();
679  _RETV (*v1 * *v2);
680 }
681 
683  _ARM0 (m1);
684  _ARM1 (m2);
685  _DEFM ();
686  if (m1->getCols () != m2->getRows ()) {
687  THROW_MATH_EXCEPTION ("nonconformant arguments in matrix multiplication");
688  res->m = new matrix (m1->getRows (), m2->getCols ());
689  } else {
690  res->m = new matrix (*m1 * *m2);
691  }
692  return res;
693 }
694 
696  _ARM0 (m1);
697  _ARC1 (c2);
698  _DEFM ();
699  _RETM (*m1 * *c2);
700 }
701 
703  _ARC0 (c1);
704  _ARM1 (m2);
705  _DEFM ();
706  _RETM (*c1 * *m2);
707 }
708 
710  _ARM0 (m1);
711  _ARD1 (d2);
712  _DEFM ();
713  _RETM (*m1 * d2);
714 }
715 
717  _ARD0 (d1);
718  _ARM1 (m2);
719  _DEFM ();
720  _RETM (d1 * *m2);
721 }
722 
724  _ARMV0 (v1);
725  _ARMV1 (v2);
726  _DEFMV ();
727  if (v1->getCols () != v2->getRows ()) {
728  THROW_MATH_EXCEPTION ("nonconformant arguments in matrix multiplication");
729  res->mv = new matvec (v1->getSize (), v1->getRows (), v2->getCols ());
730  } else {
731  res->mv = new matvec (*v1 * *v2);
732  }
733  return res;
734 }
735 
737  _ARMV0 (v1);
738  _ARC1 (c2);
739  _DEFMV ();
740  _RETMV (*v1 * *c2);
741 }
742 
744  _ARC0 (c1);
745  _ARMV1 (v2);
746  _DEFMV ();
747  _RETMV (*c1 * *v2);
748 }
749 
751  _ARMV0 (v1);
752  _ARD1 (d2);
753  _DEFMV ();
754  _RETMV (*v1 * d2);
755 }
756 
758  _ARD0 (d1);
759  _ARMV1 (v2);
760  _DEFMV ();
761  _RETMV (d1 * *v2);
762 }
763 
765  _ARMV0 (v1);
766  _ARM1 (m2);
767  _DEFMV ();
768  if (v1->getCols () != m2->getRows ()) {
769  THROW_MATH_EXCEPTION ("nonconformant arguments in matrix multiplication");
770  res->mv = new matvec (v1->getSize (), v1->getRows (), m2->getCols ());
771  } else {
772  res->mv = new matvec (*v1 * *m2);
773  }
774  return res;
775 }
776 
778  _ARM0 (m1);
779  _ARMV1 (v2);
780  _DEFMV ();
781  if (m1->getCols () != v2->getRows ()) {
782  THROW_MATH_EXCEPTION ("nonconformant arguments in matrix multiplication");
783  res->mv = new matvec (v2->getSize (), m1->getRows (), v2->getCols ());
784  } else {
785  res->mv = new matvec (*m1 * *v2);
786  }
787  return res;
788 }
789 
791  _ARMV0 (v1);
792  _ARV1 (v2);
793  _DEFMV ();
794  _RETMV (*v1 * *v2);
795 }
796 
798  _ARV0 (v1);
799  _ARMV1 (v2);
800  _DEFMV ();
801  _RETMV (*v1 * *v2);
802 }
803 
804 // ****************** division *************************
806  _ARD0 (d1);
807  _ARD1 (d2);
808  _DEFD ();
809  if (d2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
810  _RETD (d1 / d2);
811 }
812 
814  _ARC0 (c1);
815  _ARC1 (c2);
816  _DEFC ();
817  if (*c2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
818  _RETC (*c1 / *c2);
819 }
820 
822  _ARC0 (c1);
823  _ARD1 (d2);
824  _DEFC ();
825  if (d2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
826  _RETC (*c1 / d2);
827 }
828 
830  _ARD0 (d1);
831  _ARC1 (c2);
832  _DEFC ();
833  if (*c2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
834  _RETC (d1 / *c2);
835 }
836 
838  _ARV0 (v1);
839  _ARD1 (d2);
840  _DEFV ();
841  if (d2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
842  _RETV (*v1 / d2);
843 }
844 
846  _ARD0 (d1);
847  _ARV1 (v2);
848  _DEFV ();
849  _RETV (d1 / *v2);
850 }
851 
853  _ARV0 (v1);
854  _ARC1 (c2);
855  _DEFV ();
856  if (*c2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
857  _RETV (*v1 / *c2);
858 }
859 
861  _ARC0 (c1);
862  _ARV1 (v2);
863  _DEFV ();
864  _RETV (*c1 / *v2);
865 }
866 
868  _ARV0 (v1);
869  _ARV1 (v2);
870  _DEFV ();
871  _RETV (*v1 / *v2);
872 }
873 
875  _ARM0 (m1);
876  _ARC1 (c2);
877  _DEFM ();
878  _RETM (*m1 / *c2);
879 }
880 
882  _ARM0 (m1);
883  _ARD1 (d2);
884  _DEFM ();
885  _RETM (*m1 / d2);
886 }
887 
889  _ARMV0 (v1);
890  _ARC1 (c2);
891  _DEFMV ();
892  _RETMV (*v1 / *c2);
893 }
894 
896  _ARMV0 (v1);
897  _ARD1 (d2);
898  _DEFMV ();
899  _RETMV (*v1 / d2);
900 }
901 
903  _ARMV0 (v1);
904  _ARV1 (v2);
905  _DEFMV ();
906  _RETMV (*v1 / *v2);
907 }
908 
909 // ****************** modulo *************************
911  _ARD0 (d1);
912  _ARD1 (d2);
913  _DEFD ();
914  _RETD (fmod (d1, d2));
915 }
916 
918  _ARC0 (c1);
919  _ARC1 (c2);
920  _DEFC ();
921  _RETC ((*c1) % (*c2));
922 }
923 
925  _ARC0 (c1);
926  _ARD1 (d2);
927  _DEFC ();
928  _RETC ((*c1) % d2);
929 }
930 
932  _ARD0 (d1);
933  _ARC1 (c2);
934  _DEFC ();
935  _RETC (d1 % (*c2));
936 }
937 
939  _ARV0 (v1);
940  _ARD1 (d2);
941  _DEFV ();
942  _RETV (*v1 % d2);
943 }
944 
946  _ARD0 (d1);
947  _ARV1 (v2);
948  _DEFV ();
949  _RETV (d1 % *v2);
950 }
951 
953  _ARV0 (v1);
954  _ARC1 (c2);
955  _DEFV ();
956  _RETV (*v1 % *c2);
957 }
958 
960  _ARC0 (c1);
961  _ARV1 (v2);
962  _DEFV ();
963  _RETV (*c1 % *v2);
964 }
965 
967  _ARV0 (v1);
968  _ARV1 (v2);
969  _DEFV ();
970  _RETV (*v1 % *v2);
971 }
972 
973 // ****************** power *************************
975  _ARD0 (d1);
976  _ARD1 (d2);
977  _DEFD ();
978  _RETD (pow (d1, d2));
979 }
980 
982  _ARC0 (c1);
983  _ARC1 (c2);
984  _DEFC ();
985  _RETC (pow (*c1, *c2));
986 }
987 
989  _ARC0 (c1);
990  _ARD1 (d2);
991  _DEFC ();
992  _RETC (pow (*c1, d2));
993 }
994 
996  _ARD0 (d1);
997  _ARC1 (c2);
998  _DEFC ();
999  _RETC (pow (d1, *c2));
1000 }
1001 
1003  _ARV0 (v1);
1004  _ARD1 (d2);
1005  _DEFV ();
1006  _RETV (pow (*v1, d2));
1007 }
1008 
1010  _ARD0 (d1);
1011  _ARV1 (v2);
1012  _DEFV ();
1013  _RETV (pow (d1, *v2));
1014 }
1015 
1017  _ARV0 (v1);
1018  _ARC1 (c2);
1019  _DEFV ();
1020  _RETV (pow (*v1, *c2));
1021 }
1022 
1024  _ARC0 (c1);
1025  _ARV1 (v2);
1026  _DEFV ();
1027  _RETV (pow (*c1, *v2));
1028 }
1029 
1031  _ARV0 (v1);
1032  _ARV1 (v2);
1033  _DEFV ();
1034  _RETV (pow (*v1, *v2));
1035 }
1036 
1038  _ARM0 (m1);
1039  _ARI1 (i2);
1040  _DEFM ();
1041  _RETM (pow (*m1, i2));
1042 }
1043 
1045  _ARM0 (m1);
1046  _ARC1 (c2);
1047  _DEFM ();
1048  _RETM (pow (*m1, (int) real (*c2)));
1049 }
1050 
1052  _ARMV0 (m1);
1053  _ARI1 (i2);
1054  _DEFMV ();
1055  _RETMV (pow (*m1, i2));
1056 }
1057 
1059  _ARMV0 (m1);
1060  _ARC1 (c2);
1061  _DEFMV ();
1062  _RETMV (pow (*m1, (int) real (*c2)));
1063 }
1064 
1066  _ARMV0 (m1);
1067  _ARV1 (v2);
1068  _DEFMV ();
1069  _RETMV (pow (*m1, *v2));
1070 }
1071 
1072 // ****************** hypotenuse *************************
1074  _ARD0 (d1);
1075  _ARD1 (d2);
1076  _DEFD ();
1077  _RETD (xhypot (d1, d2));
1078 }
1079 
1081  _ARC0 (c1);
1082  _ARC1 (c2);
1083  _DEFD ();
1084  _RETD (xhypot (*c1, *c2));
1085 }
1086 
1088  _ARC0 (c1);
1089  _ARD1 (d2);
1090  _DEFD ();
1091  _RETD (xhypot (*c1, d2));
1092 }
1093 
1095  _ARD0 (d1);
1096  _ARC1 (c2);
1097  _DEFD ();
1098  _RETD (xhypot (d1, *c2));
1099 }
1100 
1102  _ARV0 (v1);
1103  _ARD1 (d2);
1104  _DEFV ();
1105  _RETV (xhypot (*v1, d2));
1106 }
1107 
1109  _ARD0 (d1);
1110  _ARV1 (v2);
1111  _DEFV ();
1112  _RETV (xhypot (d1, *v2));
1113 }
1114 
1116  _ARV0 (v1);
1117  _ARC1 (c2);
1118  _DEFV ();
1119  _RETV (xhypot (*v1, *c2));
1120 }
1121 
1123  _ARC0 (c1);
1124  _ARV1 (v2);
1125  _DEFV ();
1126  _RETV (xhypot (*c1, *v2));
1127 }
1128 
1130  _ARV0 (v1);
1131  _ARV1 (v2);
1132  _DEFV ();
1133  _RETV (xhypot (*v1, *v2));
1134 }
1135 
1136 // ************** conjugate complex **********************
1138  _ARD0 (d1);
1139  _DEFD ();
1140  _RETD (d1);
1141 }
1142 
1144  _ARC0 (c1);
1145  _DEFC ();
1146  _RETC (conj (*c1));
1147 }
1148 
1150  _ARV0 (v1);
1151  _DEFV ();
1152  _RETV (conj (*v1));
1153 }
1154 
1156  _ARM0 (m);
1157  _DEFM ();
1158  _RETM (conj (*m));
1159 }
1160 
1162  _ARMV0 (mv);
1163  _DEFMV ();
1164  _RETMV (conj (*mv));
1165 }
1166 
1167 // ********** square of absolute value *****************
1169  _ARD0 (d1);
1170  _DEFD ();
1171  _RETD (d1 * d1);
1172 }
1173 
1175  _ARC0 (c1);
1176  _DEFD ();
1177  _RETD (norm (*c1));
1178 }
1179 
1181  _ARV0 (v1);
1182  _DEFV ();
1183  _RETV (norm (*v1));
1184 }
1185 
1186 // ********** phase in degrees *****************
1188  _ARD0 (d1);
1189  _DEFD ();
1190  _RETD (d1 < 0.0 ? 180.0 : 0.0);
1191 }
1192 
1194  _ARC0 (c1);
1195  _DEFD ();
1196  _RETD (deg (arg (*c1)));
1197 }
1198 
1200  _ARV0 (v1);
1201  _DEFV ();
1202  _RETV (deg (arg (*v1)));
1203 }
1204 
1206  _ARM0 (m1);
1207  _DEFM ();
1208  _RETM (deg (arg (*m1)));
1209 }
1210 
1212  _ARMV0 (v1);
1213  _DEFMV ();
1214  _RETMV (deg (arg (*v1)));
1215 }
1216 
1217 // ********** phase in radians *****************
1219  _ARD0 (d1);
1220  _DEFD ();
1221  _RETD (d1 < 0.0 ? M_PI : 0.0);
1222 }
1223 
1225  _ARC0 (c1);
1226  _DEFD ();
1227  _RETD (arg (*c1));
1228 }
1229 
1231  _ARV0 (v1);
1232  _DEFV ();
1233  _RETV (arg (*v1));
1234 }
1235 
1237  _ARM0 (m1);
1238  _DEFM ();
1239  _RETM (arg (*m1));
1240 }
1241 
1243  _ARMV0 (v1);
1244  _DEFMV ();
1245  _RETMV (arg (*v1));
1246 }
1247 
1248 // ******* unwrap phase in radians ************
1250  _ARV0 (v1);
1251  _DEFV ();
1252  _RETV (unwrap (*v1));
1253 }
1254 
1256  _ARV0 (v1);
1257  _ARD1 (d2);
1258  _DEFV ();
1259  _RETV (unwrap (*v1, fabs (d2)));
1260 }
1261 
1263  _ARV0 (v1);
1264  _ARD1 (d2);
1265  _ARD2 (d3);
1266  _DEFV ();
1267  _RETV (unwrap (*v1, fabs (d2), fabs (d3)));
1268 }
1269 
1270 // ******** radian/degree conversion **********
1272  _ARD0 (d1);
1273  _DEFD ();
1274  _RETD (rad (d1));
1275 }
1276 
1278  _ARC0 (c1);
1279  _DEFD ();
1280  _RETD (rad (real (*c1)));
1281 }
1282 
1284  _ARV0 (v1);
1285  _DEFV ();
1286  vector * v = new vector ();
1287  for (int i = 0; i < v1->getSize (); i++) v->add (rad (real (v1->get (i))));
1288  res->v = v;
1289  return res;
1290 }
1291 
1293  _ARD0 (d1);
1294  _DEFD ();
1295  _RETD (deg (d1));
1296 }
1297 
1299  _ARC0 (c1);
1300  _DEFD ();
1301  _RETD (deg (real (*c1)));
1302 }
1303 
1305  _ARV0 (v1);
1306  _DEFV ();
1307  vector * v = new vector ();
1308  for (int i = 0; i < v1->getSize (); i++) v->add (deg (real (v1->get (i))));
1309  res->v = v;
1310  return res;
1311 }
1312 
1313 // ********** voltage decibel *****************
1315  _ARD0 (d1);
1316  _DEFD ();
1317  _RETD (10.0 * log10 (fabs (d1)));
1318 }
1319 
1321  _ARC0 (c1);
1322  _DEFD ();
1323  _RETD (dB (*c1));
1324 }
1325 
1327  _ARV0 (v1);
1328  _DEFV ();
1329  _RETV (dB (*v1));
1330 }
1331 
1333  _ARM0 (m1);
1334  _DEFM ();
1335  _RETM (dB (*m1));
1336 }
1337 
1339  _ARMV0 (v1);
1340  _DEFMV ();
1341  _RETMV (dB (*v1));
1342 }
1343 
1344 // ********** square root *****************
1346  _ARD0 (d1);
1347  _DEFC ();
1348  if (d1 < 0.0)
1349  res->c = new nr_complex_t (0.0, sqrt (-d1));
1350  else
1351  res->c = new nr_complex_t (sqrt (d1));
1352  return res;
1353 }
1354 
1356  _ARC0 (c1);
1357  _DEFC ();
1358  _RETC (sqrt (*c1));
1359 }
1360 
1362  _ARV0 (v1);
1363  _DEFV ();
1364  _RETV (sqrt (*v1));
1365 }
1366 
1367 // ********** natural logarithm *****************
1369  _ARD0 (d1);
1370  _DEFC ();
1371  if (d1 < 0.0)
1372  res->c = new nr_complex_t (log (-d1), M_PI);
1373  else
1374  res->c = new nr_complex_t (log (d1));
1375  return res;
1376 }
1377 
1379  _ARC0 (c1);
1380  _DEFC ();
1381  _RETC (log (*c1));
1382 }
1383 
1385  _ARV0 (v1);
1386  _DEFV ();
1387  _RETV (log (*v1));
1388 }
1389 
1390 // ********** decimal logarithm *****************
1392  _ARD0 (d1);
1393  _DEFC ();
1394  if (d1 < 0.0)
1395  res->c = new nr_complex_t (log10 (-d1), M_PI * M_LOG10E);
1396  else
1397  res->c = new nr_complex_t (log10 (d1));
1398  return res;
1399 }
1400 
1402  _ARC0 (c1);
1403  _DEFC ();
1404  _RETC (log10 (*c1));
1405 }
1406 
1408  _ARV0 (v1);
1409  _DEFV ();
1410  _RETV (log10 (*v1));
1411 }
1412 
1413 // ********** binary logarithm *****************
1415  _ARD0 (d1);
1416  _DEFC ();
1417  if (d1 < 0.0)
1418  res->c = new nr_complex_t (log (-d1) * M_LOG2E, M_PI * M_LOG2E);
1419  else
1420  res->c = new nr_complex_t (log (d1) * M_LOG2E);
1421  return res;
1422 }
1423 
1425  _ARC0 (c1);
1426  _DEFC ();
1427  _RETC (log2 (*c1));
1428 }
1429 
1431  _ARV0 (v1);
1432  _DEFV ();
1433  _RETV (log2 (*v1));
1434 }
1435 
1436 // ************* arcus sine *********************
1438  _ARD0 (d1);
1439  _DEFD ();
1440  _RETD (asin (d1));
1441 }
1442 
1444  _ARC0 (c1);
1445  _DEFC ();
1446  _RETC (asin (*c1));
1447 }
1448 
1450  _ARV0 (v1);
1451  _DEFV ();
1452  _RETV (asin (*v1));
1453 }
1454 
1455 // ************* arcus cosine ******************
1457  _ARD0 (d1);
1458  _DEFD ();
1459  _RETD (acos (d1));
1460 }
1461 
1463  _ARC0 (c1);
1464  _DEFC ();
1465  _RETC (acos (*c1));
1466 }
1467 
1469  _ARV0 (v1);
1470  _DEFV ();
1471  _RETV (acos (*v1));
1472 }
1473 
1474 // ************** arcus tangent ******************
1476  _ARD0 (d1);
1477  _DEFD ();
1478  _RETD (atan (d1));
1479 }
1480 
1482  _ARC0 (c1);
1483  _DEFC ();
1484  _RETC (atan (*c1));
1485 }
1486 
1488  _ARV0 (v1);
1489  _DEFV ();
1490  _RETV (atan (*v1));
1491 }
1492 
1493 // *************** cotangent ********************
1495  _ARD0 (d1);
1496  _DEFD ();
1497  _RETD (1.0 / tan (d1));
1498 }
1499 
1501  _ARC0 (c1);
1502  _DEFC ();
1503  _RETC (cot (*c1));
1504 }
1505 
1507  _ARV0 (v1);
1508  _DEFV ();
1509  _RETV (cot (*v1));
1510 }
1511 
1512 // ************ arcus cotangent *****************
1514  _ARD0 (d1);
1515  _DEFD ();
1516  _RETD (M_PI_2 - atan (d1));
1517 }
1518 
1520  _ARC0 (c1);
1521  _DEFC ();
1522  _RETC (acot (*c1));
1523 }
1524 
1526  _ARV0 (v1);
1527  _DEFV ();
1528  _RETV (acot (*v1));
1529 }
1530 
1531 // ***************** secans *********************
1533  _ARD0 (d1);
1534  _DEFD ();
1535  _RETD (1.0 / cos (d1));
1536 }
1537 
1539  _ARC0 (c1);
1540  _DEFC ();
1541  _RETC (1.0 / cos (*c1));
1542 }
1543 
1545  _ARV0 (v1);
1546  _DEFV ();
1547  _RETV (1.0 / cos (*v1));
1548 }
1549 
1550 // *************** arcus secans *******************
1552  _ARD0 (d1);
1553  _DEFD ();
1554  _RETD (acos (1.0 / d1));
1555 }
1556 
1558  _ARC0 (c1);
1559  _DEFC ();
1560  _RETC (acos (1.0 / *c1));
1561 }
1562 
1564  _ARV0 (v1);
1565  _DEFV ();
1566  _RETV (acos (1.0 / *v1));
1567 }
1568 
1569 // ***************** cosecans *********************
1571  _ARD0 (d1);
1572  _DEFD ();
1573  _RETD (1.0 / sin (d1));
1574 }
1575 
1577  _ARC0 (c1);
1578  _DEFC ();
1579  _RETC (1.0 / sin (*c1));
1580 }
1581 
1583  _ARV0 (v1);
1584  _DEFV ();
1585  _RETV (1.0 / sin (*v1));
1586 }
1587 
1588 // ************* arcus cosecans *******************
1590  _ARD0 (d1);
1591  _DEFD ();
1592  _RETD (asin (1.0 / d1));
1593 }
1594 
1596  _ARC0 (c1);
1597  _DEFC ();
1598  _RETC (asin (1.0 / *c1));
1599 }
1600 
1602  _ARV0 (v1);
1603  _DEFV ();
1604  _RETV (asin (1.0 / *v1));
1605 }
1606 
1607 // ********** area sine hyperbolicus **************
1609  _ARD0 (d1);
1610  _DEFD ();
1611  _RETD (log (d1 + sqrt (d1 * d1 + 1)));
1612 }
1613 
1615  _ARC0 (c1);
1616  _DEFC ();
1617  _RETC (asinh (*c1));
1618 }
1619 
1621  _ARV0 (v1);
1622  _DEFV ();
1623  _RETV (asinh (*v1));
1624 }
1625 
1626 // ********** area cosecans hyperbolicus **************
1628  _ARD0 (d1);
1629  _DEFD ();
1630  d1 = 1 / d1;
1631  _RETD (log (d1 + sqrt (d1 * d1 + 1)));
1632 }
1633 
1635  _ARC0 (c1);
1636  _DEFC ();
1637  _RETC (asinh (1.0 / *c1));
1638 }
1639 
1641  _ARV0 (v1);
1642  _DEFV ();
1643  _RETV (asinh (1 / *v1));
1644 }
1645 
1646 // ********* area cosine hyperbolicus ************
1648  _ARD0 (d1);
1649  _DEFC ();
1650  _RETC (acosh (nr_complex_t (d1)));
1651 }
1652 
1654  _ARC0 (c1);
1655  _DEFC ();
1656  _RETC (acosh (*c1));
1657 }
1658 
1660  _ARV0 (v1);
1661  _DEFV ();
1662  _RETV (acosh (*v1));
1663 }
1664 
1665 // ********* area secans hyperbolicus ***********
1667  _ARD0 (d1);
1668  _DEFC ();
1669  _RETC (asech (nr_complex_t (d1)));
1670 }
1671 
1673  _ARC0 (c1);
1674  _DEFC ();
1675  _RETC (asech (*c1));
1676 }
1677 
1679  _ARV0 (v1);
1680  _DEFV ();
1681  _RETV (asech (*v1));
1682 }
1683 
1684 // ******* area tangent hyperbolicus **********
1686  _ARD0 (d1);
1687  _DEFD ();
1688  _RETD (0.5 * log ((1.0 + d1) / (1.0 - d1)));
1689 }
1690 
1692  _ARC0 (c1);
1693  _DEFC ();
1694  _RETC (atanh (*c1));
1695 }
1696 
1698  _ARV0 (v1);
1699  _DEFV ();
1700  _RETV (atanh (*v1));
1701 }
1702 
1703 // ******* area cotangent hyperbolicus **********
1705  _ARD0 (d1);
1706  _DEFD ();
1707  _RETD (0.5 * log ((d1 + 1.0) / (d1 - 1.0)));
1708 }
1709 
1711  _ARC0 (c1);
1712  _DEFC ();
1713  _RETC (acoth (*c1));
1714 }
1715 
1717  _ARV0 (v1);
1718  _DEFV ();
1719  _RETV (acoth (*v1));
1720 }
1721 
1722 // This is the rtoz, ztor, ytor, rtoy helper macro.
1723 #define MAKE_FUNC_DEFINITION_2(cfunc) \
1724 constant * evaluate:: QUCS_CONCAT2 (cfunc,_d) (constant * args) { \
1725  _ARD0 (d); \
1726  _DEFD (); \
1727  _RETD (real (cfunc (rect (d, 0)))); \
1728 } \
1729 constant * evaluate:: QUCS_CONCAT2 (cfunc,_d_d) (constant * args) { \
1730  _ARD0 (d); \
1731  _ARD1 (z); \
1732  _DEFD (); \
1733  _RETD (real (cfunc (rect (d, 0), z))); \
1734 } \
1735 constant * evaluate:: QUCS_CONCAT2 (cfunc,_d_c) (constant * args) { \
1736  _ARD0 (d); \
1737  _ARC1 (z); \
1738  _DEFC (); \
1739  _RETC (cfunc (rect (d, 0), *z)); \
1740 } \
1741 constant * evaluate:: QUCS_CONCAT2 (cfunc,_c) (constant * args) { \
1742  _ARC0 (c); \
1743  _DEFC (); \
1744  _RETC (cfunc (*c)); \
1745 } \
1746 constant * evaluate:: QUCS_CONCAT2 (cfunc,_c_d) (constant * args) { \
1747  _ARC0 (c); \
1748  _ARD1 (z); \
1749  _DEFC (); \
1750  _RETC (cfunc (*c, z)); \
1751 } \
1752 constant * evaluate:: QUCS_CONCAT2 (cfunc,_c_c) (constant * args) { \
1753  _ARC0 (c); \
1754  _ARC1 (z); \
1755  _DEFC (); \
1756  _RETC (cfunc (*c, *z)); \
1757 } \
1758 constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) { \
1759  _ARV0 (v); \
1760  _DEFV (); \
1761  _RETV (cfunc (*v)); \
1762 } \
1763 constant * evaluate:: QUCS_CONCAT2 (cfunc,_v_d) (constant * args) { \
1764  _ARV0 (v); \
1765  _ARD1 (z); \
1766  _DEFV (); \
1767  _RETV (cfunc (*v, z)); \
1768 } \
1769 constant * evaluate:: QUCS_CONCAT2 (cfunc,_v_c) (constant * args) { \
1770  _ARV0 (v); \
1771  _ARC1 (z); \
1772  _DEFV (); \
1773  _RETV (cfunc (*v, *z)); \
1774 } \
1775 
1780 
1781 // ** convert reflexion coefficient to standing wave ratio **
1783  _ARD0 (d1);
1784  _DEFD ();
1785  _RETD ((1 + fabs (d1)) / (1 - fabs (d1)));
1786 }
1787 
1789  _ARC0 (c1);
1790  _DEFD ();
1791  _RETD ((1 + abs (*c1)) / (1 - abs (*c1)));
1792 }
1793 
1795  _ARV0 (v1);
1796  _DEFV ();
1797  res->v = new vector (v1->getSize ());
1798  for (int i = 0; i < v1->getSize (); i++)
1799  res->v->set ((1 + abs (v1->get (i))) / (1 - abs (v1->get (i))), i);
1800  return res;
1801 }
1802 
1803 // ** differentiate vector with respect to another vector **
1805  _ARV0 (v1);
1806  _ARV1 (v2);
1807  _DEFV ();
1808  _RETV (diff (*v1, *v2));
1809 }
1810 
1812  _ARV0 (v1);
1813  _ARV1 (v2);
1814  _ARI2 (i3);
1815  _DEFV ();
1816  _RETV (diff (*v1, *v2, i3));
1817 }
1818 
1819 // ***************** maximum *******************
1821  _ARD0 (d1);
1822  _DEFD ();
1823  _RETD (d1);
1824 }
1825 
1827  _ARC0 (c1);
1828  _DEFD ();
1829  if (fabs (arg (*c1)) < M_PI_2)
1830  res->d = abs (*c1);
1831  else
1832  res->d = -abs (*c1);
1833  return res;
1834 }
1835 
1837  _ARV0 (v1);
1838  _DEFD ();
1839  _RETD (v1->maximum ());
1840 }
1841 
1843  _ARD0 (d1);
1844  _ARD1 (d2);
1845  _DEFD ();
1846  _RETD (MAX (d1, d2));
1847 }
1848 
1850  _ARD0 (d1);
1851  _ARC1 (c2);
1852  _DEFC ();
1853  nr_double_t a = d1;
1854  nr_double_t b = fabs (arg (*c2)) < M_PI_2 ? abs (*c2) : -abs (*c2);
1855  nr_complex_t r = a > b ? d1 : *c2;
1856  _RETC (r);
1857 }
1858 
1860  _ARC0 (c1);
1861  _ARC1 (c2);
1862  _DEFC ();
1863  nr_double_t a = fabs (arg (*c1)) < M_PI_2 ? abs (*c1) : -abs (*c1);
1864  nr_double_t b = fabs (arg (*c2)) < M_PI_2 ? abs (*c2) : -abs (*c2);
1865  nr_complex_t r = a > b ? *c1 : *c2;
1866  _RETC (r);
1867 }
1868 
1870  _ARC0 (c1);
1871  _ARD1 (d2);
1872  _DEFC ();
1873  nr_double_t a = fabs (arg (*c1)) < M_PI_2 ? abs (*c1) : -abs (*c1);
1874  nr_double_t b = d2;
1875  nr_complex_t r = a > b ? *c1 : d2;
1876  _RETC (r);
1877 }
1878 
1879 // ***************** minimum *******************
1881  _ARD0 (d1);
1882  _DEFD ();
1883  _RETD (d1);
1884 }
1885 
1887  _ARC0 (c1);
1888  _DEFD ();
1889  if (fabs (arg (*c1)) < M_PI_2)
1890  res->d = abs (*c1);
1891  else
1892  res->d = -abs (*c1);
1893  return res;
1894 }
1895 
1897  _ARV0 (v1);
1898  _DEFD ();
1899  _RETD (v1->minimum ());
1900 }
1901 
1903  _ARD0 (d1);
1904  _ARD1 (d2);
1905  _DEFD ();
1906  _RETD (MIN (d1, d2));
1907 }
1908 
1910  _ARD0 (d1);
1911  _ARC1 (c2);
1912  _DEFC ();
1913  nr_double_t a = d1;
1914  nr_double_t b = fabs (arg (*c2)) < M_PI_2 ? abs (*c2) : -abs (*c2);
1915  nr_complex_t r = a < b ? d1 : *c2;
1916  _RETC (r);
1917 }
1918 
1920  _ARC0 (c1);
1921  _ARC1 (c2);
1922  _DEFC ();
1923  nr_double_t a = fabs (arg (*c1)) < M_PI_2 ? abs (*c1) : -abs (*c1);
1924  nr_double_t b = fabs (arg (*c2)) < M_PI_2 ? abs (*c2) : -abs (*c2);
1925  nr_complex_t r = a < b ? *c1 : *c2;
1926  _RETC (r);
1927 }
1928 
1930  _ARC0 (c1);
1931  _ARD1 (d2);
1932  _DEFC ();
1933  nr_double_t a = fabs (arg (*c1)) < M_PI_2 ? abs (*c1) : -abs (*c1);
1934  nr_double_t b = d2;
1935  nr_complex_t r = a < b ? *c1 : d2;
1936  _RETC (r);
1937 }
1938 
1939 // ******************** sum **********************
1941  _ARD0 (d1);
1942  _DEFD ();
1943  _RETD (d1);
1944 }
1945 
1947  _ARC0 (c1);
1948  _DEFC ();
1949  _RETC (*c1);
1950 }
1951 
1953  _ARV0 (v1);
1954  _DEFC ();
1955  _RETC (sum (*v1));
1956 }
1957 
1958 // ****************** product ********************
1960  _ARD0 (d1);
1961  _DEFD ();
1962  _RETD (d1);
1963 }
1964 
1966  _ARC0 (c1);
1967  _DEFC ();
1968  _RETC (*c1);
1969 }
1970 
1972  _ARV0 (v1);
1973  _DEFC ();
1974  _RETC (prod (*v1));
1975 }
1976 
1977 // ******************* average *********************
1979  _ARD0 (d1);
1980  _DEFD ();
1981  _RETD (d1);
1982 }
1983 
1985  _ARC0 (c1);
1986  _DEFC ();
1987  _RETC (*c1);
1988 }
1989 
1991  _ARV0 (v1);
1992  _DEFC ();
1993  _RETC (avg (*v1));
1994 }
1995 
1996 // ******************* lengths *********************
1998  _DEFD ();
1999  _RETD (1);
2000 }
2001 
2003  _DEFD ();
2004  _RETD (1);
2005 }
2006 
2008  _ARV0 (v1);
2009  _DEFD ();
2010  _RETD (v1->getSize ());
2011 }
2012 
2014  _DEFD ();
2015  _RETD (1);
2016 }
2017 
2019  _ARV0 (mv);
2020  _DEFD ();
2021  _RETD (mv->getSize ());
2022 }
2023 
2024 // ***************** array indices *****************
2026  _ARMV0 (mv);
2027  _ARI1 (r);
2028  _ARI2 (c);
2029  _DEFV ();
2030  if (r < 1 || r > mv->getRows () || c < 1 || c > mv->getCols ()) {
2031  char txt[256];
2032  sprintf (txt, "matvec indices [%d,%d] out of bounds [1-%d,1-%d]",
2033  r, c, mv->getRows (), mv->getCols ());
2034  THROW_MATH_EXCEPTION (txt);
2035  res->v = new vector (mv->getSize ());
2036  } else {
2037  res->v = new vector (mv->get (r - 1, c - 1));
2038  }
2039  return res;
2040 }
2041 
2043  _ARMV0 (mv);
2044  _ARI1 (i);
2045  _DEFM ();
2046  if (i < 1 || i > mv->getSize ()) {
2047  char txt[256];
2048  sprintf (txt, "matvec index [%d] out of bounds [1-%d]", i, mv->getSize ());
2049  THROW_MATH_EXCEPTION (txt);
2050  res->m = new matrix (mv->getRows (), mv->getCols ());
2051  } else {
2052  res->m = new matrix (mv->get (i - 1));
2053  }
2054  return res;
2055 }
2056 
2057 /* Little helper macros for the following functionality. */
2058 #define EQUATION_HAS_DEPS(v,n) \
2059  ((v)->getDataDependencies() != NULL && \
2060  (v)->getDataDependencies()->length() >= n)
2061 #define EQUATION_DEPS(v) \
2062  ((v)->getDataDependencies() ? (v)->getDataDependencies()->length() : 1)
2063 
2064 /* This following function is used to get a subset of data entries
2065  from a data vector with certain data dependencies. */
2066 void evaluate::extract_vector (constant * args, int idx, int &skip, int &size,
2067  constant * res) {
2068  _ARV0 (v);
2069  int i = INT (_ARES (idx));
2070  int type = _ARG(idx)->getType ();
2071  vector * vres;
2072  strlist * deps = _ARES(0)->getDataDependencies ();
2073  int didx = (deps ? deps->length () : 0) - idx;
2074  int dsize = SOLVEE(0)->getDependencySize (deps, idx);
2075 
2076  // all of the data vector
2077  if (type == TAG_RANGE) {
2078  if (dsize > 1) {
2079  // dependent vectors: only ':' possible
2080  vres = new vector (*(res->v));
2081  skip *= deps ? SOLVEE(0)->getDataSize (deps->get (didx - 1)) : 1;
2082  size *= deps ? SOLVEE(0)->getDataSize (deps->get (didx)) : 1;
2083  }
2084  else {
2085  // independent vectors
2086  range * r = RNG (_ARES (idx));
2087  int i, n, k;
2088  int len = res->v->getSize ();
2089  i = (int) r->lo ();
2090  if (i < 0 || i >= len) {
2091  char txt[256];
2092  sprintf (txt, "vector index %d out of bounds [%d,%d]", i, 0, len - 1);
2093  THROW_MATH_EXCEPTION (txt);
2094  }
2095  i = (int) r->hi ();
2096  if (i < 0 || i >= len) {
2097  char txt[256];
2098  sprintf (txt, "vector index %d out of bounds [%d,%d]", i, 0, len - 1);
2099  THROW_MATH_EXCEPTION (txt);
2100  }
2101  size = 0;
2102  for (n = 0; n < len; n++) if (r->inside (n)) size++;
2103  vres = new vector (size);
2104  for (k = 0, n = 0; n < len; n++) {
2105  if (r->inside (n))
2106  vres->set (res->v->get (n), k++);
2107  }
2108  }
2109  }
2110  // a subset
2111  else {
2112  vres = new vector (dsize * size);
2113  int len = deps ? SOLVEE(0)->getDataSize (deps->get (didx)) : v->getSize ();
2114  if (i < 0 || i >= len) {
2115  char txt[256];
2116  sprintf (txt, "vector index %d (%d) out of bounds [%d,%d]",
2117  idx, i, 0, len - 1);
2118  THROW_MATH_EXCEPTION (txt);
2119  } else {
2120  int k, n;
2121  for (n = k = 0; k < dsize * size; n += skip, k++) {
2122  vres->set (res->v->get (dsize * i + n), k);
2123  }
2124  }
2125  if (deps && didx >= 0) {
2126  res->addDropDependencies (deps->get (didx));
2127  }
2128  }
2129  if (res->v != NULL) delete res->v;
2130  res->v = vres;
2131 }
2132 
2134  _ARV0 (v);
2135  _DEFV ();
2136  int skip = 1, size = 1;
2137  res->v = new vector (*v);
2138  extract_vector (args, 1, skip, size, res);
2139  return res;
2140 }
2141 
2143  _ARV0 (v);
2144  _DEFV ();
2145  int skip = 1, size = 1;
2146  res->v = new vector (*v);
2147  if (!EQUATION_HAS_DEPS (_ARES(0), 2)) {
2148  char txt[256];
2149  sprintf (txt, "invalid number of vector indices (%d > %d)", 2,
2150  EQUATION_DEPS (_ARES(0)));
2151  THROW_MATH_EXCEPTION (txt);
2152  return res;
2153  }
2154  extract_vector (args, 1, skip, size, res);
2155  extract_vector (args, 2, skip, size, res);
2156  return res;
2157 }
2158 
2160  _ARM0 (m);
2161  _ARI1 (r);
2162  _ARI2 (c);
2163  _DEFC ();
2164  if (r < 1 || r > m->getRows () || c < 1 || c > m->getCols ()) {
2165  char txt[256];
2166  sprintf (txt, "matrix indices [%d,%d] out of bounds [1-%d,1-%d]",
2167  r, c, m->getRows (), m->getCols ());
2168  THROW_MATH_EXCEPTION (txt);
2169  res->c = new nr_complex_t ();
2170  } else {
2171  res->c = new nr_complex_t (m->get (r - 1, c - 1));
2172  }
2173  return res;
2174 }
2175 
2177  char * s = STR (_ARES(0));
2178  _ARI1 (i);
2179  constant * res = new constant (TAG_CHAR);
2180  res->chr = (i >= 0 && i < (int) strlen (s)) ? s[i] : ' ';
2181  return res;
2182 }
2183 
2184 // Interpolator helper macro without number of points given.
2185 #define INTERPOL_HELPER() \
2186  constant * arg = new constant (TAG_DOUBLE); \
2187  arg->d = 64; \
2188  arg->solvee = args->getResult(0)->solvee; \
2189  arg->evaluate (); \
2190  args->append (arg);
2191 
2192 // ***************** interpolation *****************
2194  INTERPOL_HELPER();
2195  return interpolate_v_v_d (args);
2196 }
2197 
2199  _ARV0 (v1);
2200  _ARV1 (v2);
2201  _ARI2 (n);
2202  _DEFV ();
2203  if (v1->getSize () < 3) {
2204  THROW_MATH_EXCEPTION ("interpolate: number of datapoints must be greater "
2205  "than 2");
2206  res->v = new vector ();
2207  return res;
2208  }
2209  nr_double_t last = real (v2->get (v2->getSize () - 1));
2210  nr_double_t first = real (v2->get (0));
2211  constant * arg = new constant (TAG_VECTOR);
2212  arg->v = new vector (::linspace (first, last, n));
2213  arg->solvee = args->getResult(0)->solvee;
2214  arg->evaluate ();
2215  vector * val = new vector (n);
2216  spline spl (SPLINE_BC_NATURAL);
2217  spl.vectors (*v1, *v2);
2218  spl.construct ();
2219  for (int k = 0; k < arg->v->getSize (); k++) {
2220  val->set (spl.evaluate (real (arg->v->get (k))).f0, k);
2221  }
2222  res->v = val;
2223  node * gen = SOLVEE(0)->addGeneratedEquation (arg->v, "Interpolate");
2224  res->addPrepDependencies (A(gen)->result);
2225  res->dropdeps = 1;
2226  delete arg;
2227  return res;
2228 }
2229 
2230 // ***************** fourier transformations *****************
2231 #define FOURIER_HELPER_1(efunc,cfunc,isign,dep) \
2232 constant * evaluate:: QUCS_CONCAT2 (efunc,_v_v) (constant * args) { \
2233  _ARV0 (v); \
2234  _ARV1 (t); \
2235  _DEFV (); \
2236  vector * val = new vector (QUCS_CONCAT2 (cfunc,_1d) (*v)); \
2237  int k = val->getSize (); \
2238  *val = isign > 0 ? *val / k : *val * k; \
2239  res->v = val; \
2240  int n = t->getSize (); \
2241  if (k != n) { \
2242  THROW_MATH_EXCEPTION ("nonconformant vector lengths"); \
2243  return res; } \
2244  nr_double_t last = real (t->get (n - 1)); \
2245  nr_double_t first = real (t->get (0)); \
2246  nr_double_t delta = (last - first) / (n - 1); \
2247  constant * arg = new constant (TAG_VECTOR); \
2248  arg->v = new vector (::linspace (0, 1.0 / delta, n)); \
2249  arg->solvee = args->getResult(0)->solvee; \
2250  arg->evaluate (); \
2251  node * gen = SOLVEE(0)->addGeneratedEquation (arg->v, dep); \
2252  res->addPrepDependencies (A(gen)->result); \
2253  res->dropdeps = 1; \
2254  args->append (arg); \
2255  return res; \
2256 }
2257 
2258 #define FOURIER_HELPER_2(cfunc) \
2259 constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) { \
2260  _ARV0 (v); \
2261  _DEFV (); \
2262  vector * val = new vector (QUCS_CONCAT2 (cfunc,_1d) (*v)); \
2263  res->v = val; \
2264  res->dropdeps = 1; \
2265  return res; \
2266 }
2267 
2268 FOURIER_HELPER_1 (time2freq,dft,1,"Frequency");
2269 FOURIER_HELPER_1 (freq2time,idft,-1,"Time");
2270 FOURIER_HELPER_2 (fft);
2271 FOURIER_HELPER_2 (ifft);
2272 FOURIER_HELPER_2 (dft);
2273 FOURIER_HELPER_2 (idft);
2274 
2275 // Shuffles values of FFT arounds.
2277  _ARV0 (v);
2278  _DEFV ();
2279  res->v = new vector (fftshift (*v));
2280  return res;
2281 }
2282 
2283 // This is the stoz, ztos, ytos, stoy helper macro.
2284 #define MAKE_FUNC_DEFINITION_3(cfunc) \
2285 constant * evaluate:: QUCS_CONCAT2 (cfunc,_m) (constant * args) { \
2286  _ARM0 (m); \
2287  _DEFM (); \
2288  _RETM (cfunc (*m)); \
2289 } \
2290 constant * evaluate:: QUCS_CONCAT2 (cfunc,_m_d) (constant * args) { \
2291  _ARM0 (m); \
2292  _ARD1 (z); \
2293  _DEFM (); \
2294  _RETM (cfunc (*m, rect (z, 0))); \
2295 } \
2296 constant * evaluate:: QUCS_CONCAT2 (cfunc,_m_c) (constant * args) { \
2297  _ARM0 (m); \
2298  _ARC1 (z); \
2299  _DEFM (); \
2300  _RETM (cfunc (*m, *z)); \
2301 } \
2302 constant * evaluate:: QUCS_CONCAT2 (cfunc,_m_v) (constant * args) { \
2303  _ARM0 (m); \
2304  _ARV1 (z); \
2305  _DEFM (); \
2306  _RETM (cfunc (*m, *z)); \
2307 } \
2308 constant * evaluate:: QUCS_CONCAT2 (cfunc,_mv) (constant * args) { \
2309  _ARMV0 (m); \
2310  _DEFMV (); \
2311  _RETMV (cfunc (*m)); \
2312 } \
2313 constant * evaluate:: QUCS_CONCAT2 (cfunc,_mv_d) (constant * args) { \
2314  _ARMV0 (m); \
2315  _ARD1 (z); \
2316  _DEFMV (); \
2317  _RETMV (cfunc (*m, rect (z, 0))); \
2318 } \
2319 constant * evaluate:: QUCS_CONCAT2 (cfunc,_mv_c) (constant * args) { \
2320  _ARMV0 (m); \
2321  _ARC1 (z); \
2322  _DEFMV (); \
2323  _RETMV (cfunc (*m, *z)); \
2324 } \
2325 constant * evaluate:: QUCS_CONCAT2 (cfunc,_mv_v) (constant * args) { \
2326  _ARMV0 (m); \
2327  _ARV1 (z); \
2328  _DEFMV (); \
2329  _RETMV (cfunc (*m, *z)); \
2330 } \
2331 
2336 
2337 // ***************** matrix conversions *****************
2339  _ARM0 (m);
2340  _DEFM ();
2341  _RETM (ytoz (*m));
2342 }
2343 
2345  _ARMV0 (mv);
2346  _DEFMV ();
2347  _RETMV (ytoz (*mv));
2348 }
2349 
2351  _ARM0 (m);
2352  _DEFM ();
2353  _RETM (ztoy (*m));
2354 }
2355 
2357  _ARMV0 (mv);
2358  _DEFMV ();
2359  _RETMV (ztoy (*mv));
2360 }
2361 
2362 // These are stos() helpers.
2363 #define _CHKM(m) /* check square matrix */ \
2364  if (m->getCols () != m->getRows ()) { \
2365  THROW_MATH_EXCEPTION ("stos: not a square matrix"); \
2366  res->m = new matrix (m->getRows (), m->getCols ()); \
2367  return res; }
2368 #define _CHKMV(mv) /* check square matrix vector */ \
2369  if (mv->getCols () != mv->getRows ()) { \
2370  THROW_MATH_EXCEPTION ("stos: not a square matrix"); \
2371  res->mv = new matvec (mv->getSize (), mv->getRows (), mv->getCols ()); \
2372  return res; }
2373 #define _CHKMA(m,cond) \
2374  if (!(cond)) { \
2375  THROW_MATH_EXCEPTION ("stos: nonconformant arguments"); \
2376  res->m = new matrix (m->getRows (), m->getCols ()); \
2377  return res; }
2378 #define _CHKMVA(mv,cond) \
2379  if (!(cond)) { \
2380  THROW_MATH_EXCEPTION ("stos: nonconformant arguments"); \
2381  res->mv = new matvec (mv->getSize (), mv->getRows (), mv->getCols ()); \
2382  return res; }
2383 
2384 // Function -- MATRIX stos (MATRIX, DOUBLE)
2386  _ARM0 (m); _ARD1 (zref); _DEFM ();
2387  _CHKM (m);
2388  _RETM (stos (*m, zref));
2389 }
2390 
2391 // Function -- MATRIX stos (MATRIX, COMPLEX)
2393  _ARM0 (m); _ARC1 (zref); _DEFM ();
2394  _CHKM (m);
2395  _RETM (stos (*m, *zref));
2396 }
2397 
2398 // Function -- MATRIX stos (MATRIX, DOUBLE, DOUBLE)
2400  _ARM0 (m); _ARD1 (zref); _ARD2 (z0); _DEFM ();
2401  _CHKM (m);
2402  _RETM (stos (*m, zref, z0));
2403 }
2404 
2405 // Function -- MATRIX stos (MATRIX, DOUBLE, COMPLEX)
2407  _ARM0 (m); _ARD1 (zref); _ARC2 (z0); _DEFM ();
2408  _CHKM (m);
2409  _RETM (stos (*m, rect (zref, 0), *z0));
2410 }
2411 
2412 // Function -- MATRIX stos (MATRIX, COMPLEX, DOUBLE)
2414  _ARM0 (m); _ARC1 (zref); _ARD2 (z0); _DEFM ();
2415  _CHKM (m);
2416  _RETM (stos (*m, *zref, rect (z0, 0)));
2417 }
2418 
2419 // Function -- MATRIX stos (MATRIX, COMPLEX, COMPLEX)
2421  _ARM0 (m); _ARC1 (zref); _ARC2 (z0); _DEFM ();
2422  _CHKM (m);
2423  _RETM (stos (*m, *zref, *z0));
2424 }
2425 
2426 // Function -- MATRIX stos (MATRIX, VECTOR)
2428  _ARM0 (m); _ARV1 (zref); _DEFM ();
2429  _CHKM (m); _CHKMA (m, m->getRows () == zref->getSize ());
2430  _RETM (stos (*m, *zref));
2431 }
2432 
2433 // Function -- MATRIX stos (MATRIX, VECTOR, DOUBLE)
2435  _ARM0 (m); _ARV1 (zref); _ARD2 (z0); _DEFM ();
2436  _CHKM (m); _CHKMA (m, m->getRows () == zref->getSize ());
2437  _RETM (stos (*m, *zref, rect (z0, 0)));
2438 }
2439 
2440 // Function -- MATRIX stos (MATRIX, VECTOR, COMPLEX)
2442  _ARM0 (m); _ARV1 (zref); _ARC2 (z0); _DEFM ();
2443  _CHKM (m); _CHKMA (m, m->getRows () == zref->getSize ());
2444  _RETM (stos (*m, *zref, *z0));
2445 }
2446 
2447 // Function -- MATRIX stos (MATRIX, DOUBLE, VECTOR)
2449  _ARM0 (m); _ARD1 (zref); _ARV2 (z0); _DEFM ();
2450  _CHKM (m); _CHKMA (m, m->getRows () == z0->getSize ());
2451  _RETM (stos (*m, rect (zref, 0), *z0));
2452 }
2453 
2454 // Function -- MATRIX stos (MATRIX, COMPLEX, VECTOR)
2456  _ARM0 (m); _ARC1 (zref); _ARV2 (z0); _DEFM ();
2457  _CHKM (m); _CHKMA (m, m->getRows () == z0->getSize ());
2458  _RETM (stos (*m, *zref, *z0));
2459 }
2460 
2461 // Function -- MATRIX stos (MATRIX, VECTOR, VECTOR)
2463  _ARM0 (m); _ARV1 (zref); _ARV2 (z0); _DEFM ();
2464  _CHKM (m); _CHKMA (m, m->getRows () == z0->getSize () &&
2465  m->getRows () == zref->getSize ());
2466  _RETM (stos (*m, *zref, *z0));
2467 }
2468 
2469 // Function -- MATVEC stos (MATVEC, DOUBLE)
2471  _ARMV0 (mv); _ARD1 (zref); _DEFMV ();
2472  _CHKMV (mv);
2473  _RETMV (stos (*mv, zref));
2474 }
2475 
2476 // Function -- MATVEC stos (MATVEC, COMPLEX)
2478  _ARMV0 (mv); _ARC1 (zref); _DEFMV ();
2479  _CHKMV (mv);
2480  _RETMV (stos (*mv, *zref));
2481 }
2482 
2483 // Function -- MATVEC stos (MATVEC, DOUBLE, DOUBLE)
2485  _ARMV0 (mv); _ARD1 (zref); _ARD2 (z0); _DEFMV ();
2486  _CHKMV (mv);
2487  _RETMV (stos (*mv, zref, z0));
2488 }
2489 
2490 // Function -- MATVEC stos (MATVEC, DOUBLE, COMPLEX)
2492  _ARMV0 (mv); _ARD1 (zref); _ARC2 (z0); _DEFMV ();
2493  _CHKMV (mv);
2494  _RETMV (stos (*mv, rect (zref, 0), *z0));
2495 }
2496 
2497 // Function -- MATVEC stos (MATVEC, COMPLEX, DOUBLE)
2499  _ARMV0 (mv); _ARC1 (zref); _ARD2 (z0); _DEFMV ();
2500  _CHKMV (mv);
2501  _RETMV (stos (*mv, *zref, rect (z0, 0)));
2502 }
2503 
2504 // Function -- MATVEC stos (MATVEC, COMPLEX, COMPLEX)
2506  _ARMV0 (mv); _ARC1 (zref); _ARC2 (z0); _DEFMV ();
2507  _CHKMV (mv);
2508  _RETMV (stos (*mv, *zref, *z0));
2509 }
2510 
2511 // Function -- MATVEC stos (MATVEC, VECTOR)
2513  _ARMV0 (mv); _ARV1 (zref); _DEFMV ();
2514  _CHKMV (mv); _CHKMVA (mv, mv->getRows () == zref->getSize ());
2515  _RETMV (stos (*mv, *zref));
2516 }
2517 
2518 // Function -- MATVEC stos (MATVEC, VECTOR, DOUBLE)
2520  _ARMV0 (mv); _ARV1 (zref); _ARD2 (z0); _DEFMV ();
2521  _CHKMV (mv); _CHKMVA (mv, mv->getRows () == zref->getSize ());
2522  _RETMV (stos (*mv, *zref, rect (z0, 0)));
2523 }
2524 
2525 // Function -- MATVEC stos (MATVEC, VECTOR, COMPLEX)
2527  _ARMV0 (mv); _ARV1 (zref); _ARC2 (z0); _DEFMV ();
2528  _CHKMV (mv); _CHKMVA (mv, mv->getRows () == zref->getSize ());
2529  _RETMV (stos (*mv, *zref, *z0));
2530 }
2531 
2532 // Function -- MATVEC stos (MATVEC, DOUBLE, VECTOR)
2534  _ARMV0 (mv); _ARD1 (zref); _ARV2 (z0); _DEFMV ();
2535  _CHKMV (mv); _CHKMVA (mv, mv->getRows () == z0->getSize ());
2536  _RETMV (stos (*mv, rect (zref, 0), *z0));
2537 }
2538 
2539 // Function -- MATVEC stos (MATVEC, COMPLEX, VECTOR)
2541  _ARMV0 (mv); _ARC1 (zref); _ARV2 (z0); _DEFMV ();
2542  _CHKMV (mv); _CHKMVA (mv, mv->getRows () == z0->getSize ());
2543  _RETMV (stos (*mv, *zref, *z0));
2544 }
2545 
2546 // Function -- MATVEC stos (MATVEC, VECTOR, VECTOR)
2548  _ARMV0 (mv); _ARV1 (zref); _ARV2 (z0); _DEFMV ();
2549  _CHKMV (mv); _CHKMVA (mv, mv->getRows () == z0->getSize () &&
2550  mv->getRows () == zref->getSize ());
2551  _RETMV (stos (*mv, *zref, *z0));
2552 }
2553 
2555  _ARM0 (m);
2556  char f = CHR (_ARES(1));
2557  char t = CHR (_ARES(2));
2558  _DEFM ();
2559  if (m->getRows () < 2 || m->getCols () < 2) {
2560  THROW_MATH_EXCEPTION ("invalid matrix dimensions for twoport "
2561  "transformation");
2562  _RETM (*m);
2563  }
2564  _RETM (twoport (*m, toupper (f), toupper (t)));
2565 }
2566 
2568  _ARMV0 (mv);
2569  char f = CHR (_ARES(1));
2570  char t = CHR (_ARES(2));
2571  _DEFMV ();
2572  if (mv->getRows () < 2 || mv->getCols () < 2) {
2573  THROW_MATH_EXCEPTION ("invalid matrix dimensions for twoport "
2574  "transformation");
2575  _RETMV (*mv);
2576  }
2577  _RETMV (twoport (*mv, toupper (f), toupper (t)));
2578 }
2579 
2581  _ARM0 (m);
2582  _DEFM ();
2583  _RETM (inverse (*m));
2584 }
2585 
2587  _ARMV0 (mv);
2588  _DEFMV ();
2589  _RETMV (inverse (*mv));
2590 }
2591 
2593  _ARM0 (m);
2594  _DEFM ();
2595  _RETM (transpose (*m));
2596 }
2597 
2599  _ARMV0 (mv);
2600  _DEFMV ();
2601  _RETMV (transpose (*mv));
2602 }
2603 
2605  _ARM0 (m);
2606  _DEFC ();
2607  _RETC (det (*m));
2608 }
2609 
2611  _ARMV0 (mv);
2612  _DEFV ();
2613  _RETV (det (*mv));
2614 }
2615 
2617  _ARI0 (i);
2618  _DEFM ();
2619  _RETM (eye (i));
2620 }
2621 
2623  _ARM0 (m);
2624  _DEFM ();
2625  _RETM (adjoint (*m));
2626 }
2627 
2629  _ARMV0 (mv);
2630  _DEFMV ();
2631  _RETMV (adjoint (*mv));
2632 }
2633 
2634 // ***************** s-parameter stability factors *****************
2636  _ARM0 (m);
2637  _DEFD ();
2638  _RETD (rollet (*m));
2639 }
2640 
2642  _ARMV0 (mv);
2643  _DEFV ();
2644  _RETV (rollet (*mv));
2645 }
2646 
2648  _ARM0 (m);
2649  _DEFD ();
2650  nr_double_t k;
2651  k = (1 - norm (m->get (0, 0))) /
2652  (abs (m->get (1, 1) - conj (m->get (0, 0)) * det (*m)) +
2653  abs (m->get (0, 1) * m->get (1, 0)));
2654  _RETD (k);
2655 }
2656 
2658  _ARMV0 (mv);
2659  _DEFV ();
2660  vector k;
2661  k = (1 - norm (mv->get (0, 0))) /
2662  (abs (mv->get (1, 1) - conj (mv->get (0, 0)) * det (*mv)) +
2663  abs (mv->get (0, 1) * mv->get (1, 0)));
2664  _RETV (k);
2665 }
2666 
2668  _ARM0 (m);
2669  _DEFD ();
2670  nr_double_t k;
2671  k = (1 - norm (m->get (1, 1))) /
2672  (abs (m->get (0, 0) - conj (m->get (1, 1)) * det (*m)) +
2673  abs (m->get (0, 1) * m->get (1, 0)));
2674  _RETD (k);
2675 }
2676 
2678  _ARMV0 (mv);
2679  _DEFV ();
2680  vector k;
2681  k = (1 - norm (mv->get (1, 1))) /
2682  (abs (mv->get (0, 0) - conj (mv->get (1, 1)) * det (*mv)) +
2683  abs (mv->get (0, 1) * mv->get (1, 0)));
2684  _RETV (k);
2685 }
2686 
2688  _ARM0 (m);
2689  _DEFD ();
2690  _RETD (b1 (*m));
2691 }
2692 
2694  _ARMV0 (mv);
2695  _DEFV ();
2696  _RETV (b1 (*mv));
2697 }
2698 
2699 // ***************** vector creation *****************
2701  _ARD0 (start);
2702  _ARD1 (stop);
2703  _ARI2 (points);
2704  _DEFV ();
2705  if (points < 2) {
2706  THROW_MATH_EXCEPTION ("linspace: number of points must be greater than 1");
2707  res->v = new vector ();
2708  return res;
2709  }
2710  _RETV (::linspace (start, stop, points));
2711 }
2712 
2714  _ARD0 (start);
2715  _ARD1 (stop);
2716  _ARI2 (points);
2717  _DEFV ();
2718  if (points < 2) {
2719  THROW_MATH_EXCEPTION ("logspace: number of points must be greater than 1");
2720  res->v = new vector ();
2721  return res;
2722  }
2723  if (start * stop <= 0) {
2724  THROW_MATH_EXCEPTION ("logspace: invalid start/stop values");
2725  res->v = new vector (points);
2726  return res;
2727  }
2728  _RETV (::logspace (start, stop, points));
2729 }
2730 
2731 // Circle helper macro with a number of points given.
2732 #define CIRCLE_HELPER_D(argi) \
2733  int n = INT (args->getResult (argi)); \
2734  if (n < 2) { \
2735  THROW_MATH_EXCEPTION ("Circle: number of points must be greater than 1"); \
2736  _DEFV (); \
2737  res->v = new vector (); \
2738  return res; \
2739  } \
2740  constant * arg = new constant (TAG_VECTOR); \
2741  arg->v = new vector (::linspace (0, 360, n)); \
2742  arg->solvee = args->getResult(0)->solvee; \
2743  arg->evaluate (); \
2744  delete args->get(argi); \
2745  args->get((argi)-1)->setNext (NULL); \
2746  args->append (arg);
2747 
2748 // Circle helper macro with no additional argument given.
2749 #define CIRCLE_HELPER_A() \
2750  constant * arg = new constant (TAG_VECTOR); \
2751  arg->v = new vector (::linspace (0, 360, 64)); \
2752  arg->solvee = args->getResult(0)->solvee; \
2753  arg->evaluate (); \
2754  args->append (arg);
2755 
2756 // ***************** s-parameter noise circles *****************
2758  vector * Sopt = V (_ARES(0));
2759  vector * Fmin = V (_ARES(1));
2760  vector * Rn = V (_ARES(2));
2761  nr_double_t F = D (_ARES(3));
2762  vector * arc = V (_ARES(4));
2763 
2764  _DEFV ();
2765  vector N = circuit::z0 / 4 / *Rn * (F - *Fmin) * norm (1 + *Sopt);
2766  vector R = sqrt (N * N + N * (1 - norm (*Sopt))) / (1 + N);
2767  vector C = *Sopt / (1 + N);
2768  vector * circle = new vector (C.getSize () * arc->getSize ());
2769  int i, a, j; nr_complex_t v;
2770  for (i = 0, j = 0; i < C.getSize (); i++) {
2771  for (a = 0; a < arc->getSize (); a++, j++) {
2772  v = C.get (i) + R.get (i) * exp (rect (0, 1) * rad (arc->get (a)));
2773  circle->set (v, j);
2774  }
2775  }
2776 
2777  node * gen = SOLVEE(4)->addGeneratedEquation (arc, "Arcs");
2778  res->addPrepDependencies (A(gen)->result);
2779  res->v = circle;
2780  return res;
2781 }
2782 
2784  CIRCLE_HELPER_D (4);
2785  return noise_circle_d_v (args);
2786 }
2787 
2789  CIRCLE_HELPER_A ();
2790  return noise_circle_d_v (args);
2791 }
2792 
2794  vector * Sopt = V (_ARES(0));
2795  vector * Fmin = V (_ARES(1));
2796  vector * Rn = V (_ARES(2));
2797  vector * F = V (_ARES(3));
2798  vector * arc = V (_ARES(4));
2799 
2800  _DEFV ();
2801  vector * circle =
2802  new vector (Sopt->getSize () * arc->getSize () * F->getSize ());
2803  int i, a, j, f; nr_complex_t v; vector N, R, C;
2804  for (f = 0; f < F->getSize (); f++) {
2805  N = circuit::z0 / 4 / *Rn * (F->get (f) - *Fmin) * norm (1 + *Sopt);
2806  R = sqrt (N * N + N * (1 - norm (*Sopt))) / (1 + N);
2807  C = *Sopt / (1 + N);
2808  for (i = 0; i < C.getSize (); i++) {
2809  for (a = 0; a < arc->getSize (); a++) {
2810  v = C.get (i) + R.get (i) * exp (rect (0, 1) * rad (arc->get (a)));
2811  j = i * F->getSize () * arc->getSize () + f * arc->getSize () + a;
2812  circle->set (v, j);
2813  }
2814  }
2815  }
2816 
2817  node * gen;
2818  gen = SOLVEE(3)->addGeneratedEquation (F, "NF");
2819  res->addPrepDependencies (A(gen)->result);
2820  gen = SOLVEE(4)->addGeneratedEquation (arc, "Arcs");
2821  res->addPrepDependencies (A(gen)->result);
2822 
2823  res->v = circle;
2824  return res;
2825 }
2826 
2828  CIRCLE_HELPER_D (4);
2829  return noise_circle_v_v (args);
2830 }
2831 
2833  CIRCLE_HELPER_A ();
2834  return noise_circle_v_v (args);
2835 }
2836 
2837 // ***************** s-parameter stability circles *****************
2839  _ARMV0 (S);
2840  _ARV1 (arc);
2841  _DEFV ();
2842  vector D = norm (S->get (1, 1)) - norm (det (*S));
2843  vector C = (conj (S->get (1, 1)) - S->get (0, 0) * conj (det (*S))) / D;
2844  vector R = abs (S->get (0, 1)) * abs (S->get (1, 0)) / D;
2845  vector * circle = new vector (S->getSize () * arc->getSize ());
2846  int a, d, i; nr_complex_t v;
2847  for (i = 0, d = 0; i < S->getSize (); i++) {
2848  for (a = 0; a < arc->getSize (); a++, d++) {
2849  v = C.get (i) + R.get (i) * exp (rect (0, 1) * rad (arc->get (a)));
2850  circle->set (v, d);
2851  }
2852  }
2853  node * gen = SOLVEE(1)->addGeneratedEquation (arc, "Arcs");
2854  res->addPrepDependencies (A(gen)->result);
2855  res->v = circle;
2856  return res;
2857 }
2858 
2860  CIRCLE_HELPER_D (1);
2861  return stab_circle_l_v (args);
2862 }
2863 
2865  CIRCLE_HELPER_A ();
2866  return stab_circle_l_v (args);
2867 }
2868 
2870  _ARMV0 (S);
2871  _ARV1 (arc);
2872  _DEFV ();
2873  vector D = norm (S->get (0, 0)) - norm (det (*S));
2874  vector C = (conj (S->get (0, 0)) - S->get (1, 1) * conj (det (*S))) / D;
2875  vector R = abs (S->get (0, 1)) * abs (S->get (1, 0)) / D;
2876  vector * circle = new vector (S->getSize () * arc->getSize ());
2877  int a, d, i; nr_complex_t v;
2878  for (i = 0, d = 0; i < S->getSize (); i++) {
2879  for (a = 0; a < arc->getSize (); a++, d++) {
2880  v = C.get (i) + R.get (i) * exp (rect (0, 1) * rad (arc->get (a)));
2881  circle->set (v, d);
2882  }
2883  }
2884  node * gen = SOLVEE(1)->addGeneratedEquation (arc, "Arcs");
2885  res->addPrepDependencies (A(gen)->result);
2886  res->v = circle;
2887  return res;
2888 }
2889 
2891  CIRCLE_HELPER_D (1);
2892  return stab_circle_s_v (args);
2893 }
2894 
2896  CIRCLE_HELPER_A ();
2897  return stab_circle_s_v (args);
2898 }
2899 
2900 // ***************** s-parameter gain circles *****************
2902  _ARMV0 (S);
2903  _ARD1 (G);
2904  _ARV2 (arc);
2905  _DEFV ();
2906  vector g, D, c, s, k, C, R, d;
2907  D = det (*S);
2908  c = S->get (0, 0) - conj (S->get (1, 1)) * D;
2909  k = rollet (*S);
2910  s = S->get (0, 1) * S->get (1, 0);
2911  g = G / norm (S->get (1, 0));
2912  d = 1 + g * (norm (S->get (0, 0)) - norm (D));
2913  C = g * conj (c) / d;
2914  R = sqrt (1 - 2 * k * g * abs (s) + g * g * norm (s)) / abs (d);
2915 
2916  vector * circle = new vector (S->getSize () * arc->getSize ());
2917  int i, a, j; nr_complex_t v;
2918  for (i = 0, j = 0; i < C.getSize (); i++) {
2919  for (a = 0; a < arc->getSize (); a++, j++) {
2920  v = C.get (i) + R.get (i) * exp (rect (0, 1) * rad (arc->get (a)));
2921  circle->set (v, j);
2922  }
2923  }
2924 
2925  node * gen = SOLVEE(2)->addGeneratedEquation (arc, "Arcs");
2926  res->addPrepDependencies (A(gen)->result);
2927  res->v = circle;
2928  return res;
2929 }
2930 
2932  CIRCLE_HELPER_D (2);
2933  return ga_circle_d_v (args);
2934 }
2935 
2937  CIRCLE_HELPER_A ();
2938  return ga_circle_d_v (args);
2939 }
2940 
2942  _ARMV0 (S);
2943  _ARV1 (G);
2944  _ARV2 (arc);
2945  _DEFV ();
2946  vector * circle =
2947  new vector (S->getSize () * arc->getSize () * G->getSize ());
2948  int i, a, j, f; nr_complex_t v; vector g, D, c, s, k, R, C, d;
2949  D = det (*S);
2950  c = S->get (0, 0) - conj (S->get (1, 1)) * D;
2951  k = rollet (*S);
2952  s = S->get (0, 1) * S->get (1, 0);
2953  for (f = 0; f < G->getSize (); f++) {
2954  g = G->get (f) / norm (S->get (1, 0));
2955  d = 1 + g * (norm (S->get (0, 0)) - norm (D));
2956  C = g * conj (c) / d;
2957  R = sqrt (1 - 2 * k * g * abs (s) + g * g * norm (s)) / abs (d);
2958  for (i = 0; i < C.getSize (); i++) {
2959  for (a = 0; a < arc->getSize (); a++) {
2960  v = C.get (i) + R.get (i) * exp (rect (0, 1) * rad (arc->get (a)));
2961  j = i * G->getSize () * arc->getSize () + f * arc->getSize () + a;
2962  circle->set (v, j);
2963  }
2964  }
2965  }
2966 
2967  node * gen;
2968  gen = SOLVEE(1)->addGeneratedEquation (G, "Ga");
2969  res->addPrepDependencies (A(gen)->result);
2970  gen = SOLVEE(2)->addGeneratedEquation (arc, "Arcs");
2971  res->addPrepDependencies (A(gen)->result);
2972  res->v = circle;
2973  return res;
2974 }
2975 
2977  CIRCLE_HELPER_D (2);
2978  return ga_circle_v_v (args);
2979 }
2980 
2982  CIRCLE_HELPER_A ();
2983  return ga_circle_v_v (args);
2984 }
2985 
2987  _ARMV0 (S);
2988  _ARD1 (G);
2989  _ARV2 (arc);
2990  _DEFV ();
2991  vector g, D, c, s, k, C, R, d;
2992  D = det (*S);
2993  c = S->get (1, 1) - conj (S->get (0, 0)) * D;
2994  k = rollet (*S);
2995  s = S->get (0, 1) * S->get (1, 0);
2996  g = G / norm (S->get (1, 0));
2997  d = 1 + g * (norm (S->get (1, 1)) - norm (D));
2998  C = g * conj (c) / d;
2999  R = sqrt (1 - 2 * k * g * abs (s) + g * g * norm (s)) / abs (d);
3000 
3001  vector * circle = new vector (S->getSize () * arc->getSize ());
3002  int i, a, j; nr_complex_t v;
3003  for (i = 0, j = 0; i < C.getSize (); i++) {
3004  for (a = 0; a < arc->getSize (); a++, j++) {
3005  v = C.get (i) + R.get (i) * exp (rect (0, 1) * rad (arc->get (a)));
3006  circle->set (v, j);
3007  }
3008  }
3009 
3010  node * gen = SOLVEE(2)->addGeneratedEquation (arc, "Arcs");
3011  res->addPrepDependencies (A(gen)->result);
3012  res->v = circle;
3013  return res;
3014 }
3015 
3017  CIRCLE_HELPER_D (2);
3018  return gp_circle_d_v (args);
3019 }
3020 
3022  CIRCLE_HELPER_A ();
3023  return gp_circle_d_v (args);
3024 }
3025 
3027  _ARMV0 (S);
3028  _ARV1 (G);
3029  _ARV2 (arc);
3030  _DEFV ();
3031  vector * circle =
3032  new vector (S->getSize () * arc->getSize () * G->getSize ());
3033  int i, a, j, f; nr_complex_t v; vector g, D, c, s, k, R, C, d;
3034  D = det (*S);
3035  c = S->get (1, 1) - conj (S->get (0, 0)) * D;
3036  k = rollet (*S);
3037  s = S->get (0, 1) * S->get (1, 0);
3038  for (f = 0; f < G->getSize (); f++) {
3039  g = G->get (f) / norm (S->get (1, 0));
3040  d = 1 + g * (norm (S->get (1, 1)) - norm (D));
3041  C = g * conj (c) / d;
3042  R = sqrt (1 - 2 * k * g * abs (s) + g * g * norm (s)) / abs (d);
3043  for (i = 0; i < C.getSize (); i++) {
3044  for (a = 0; a < arc->getSize (); a++) {
3045  v = C.get (i) + R.get (i) * exp (rect (0, 1) * rad (arc->get (a)));
3046  j = i * G->getSize () * arc->getSize () + f * arc->getSize () + a;
3047  circle->set (v, j);
3048  }
3049  }
3050  }
3051 
3052  node * gen;
3053  gen = SOLVEE(1)->addGeneratedEquation (G, "Gp");
3054  res->addPrepDependencies (A(gen)->result);
3055  gen = SOLVEE(2)->addGeneratedEquation (arc, "Arcs");
3056  res->addPrepDependencies (A(gen)->result);
3057  res->v = circle;
3058  return res;
3059 }
3060 
3062  CIRCLE_HELPER_D (2);
3063  return gp_circle_v_v (args);
3064 }
3065 
3067  CIRCLE_HELPER_A ();
3068  return gp_circle_v_v (args);
3069 }
3070 
3071 // ***************** versus vectors *****************
3073  _ARV0 (v);
3074  _DEFV ();
3075  int i = 1;
3076  for (node * arg = args->getNext (); arg != NULL; arg = arg->getNext ()) {
3077  node * gen = arg->solvee->addGeneratedEquation (V (_ARES (i)), "Versus");
3078  res->addPrepDependencies (A(gen)->result);
3079  i++;
3080  }
3081  res->dropdeps = 1;
3082  _RETV (*v);
3083 }
3084 
3086  _ARMV0 (mv);
3087  _DEFMV ();
3088  int i = 1;
3089  for (node * arg = args->getNext (); arg != NULL; arg = arg->getNext ()) {
3090  node * gen = arg->solvee->addGeneratedEquation (V (_ARES (i)), "Versus");
3091  res->addPrepDependencies (A(gen)->result);
3092  i++;
3093  }
3094  res->dropdeps = 1;
3095  _RETMV (*mv);
3096 }
3097 
3098 // ***************** find x-value for given y-value *****************
3100  _ARV0 (v);
3101  _ARD1 (d);
3102  _DEFC ();
3103  strlist * deps = _ARG(0)->collectDataDependencies ();
3104  if (!deps || deps->length () != 1) {
3105  THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
3106  _RETC (0.0);
3107  }
3108  vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
3109  int idx, i;
3110  nr_double_t t, diff = NR_MAX;
3111  for (idx = i = 0; i < v->getSize (); i++) {
3112  t = abs (v->get (i) - d);
3113  if (t < diff) {
3114  idx = i;
3115  diff = t;
3116  }
3117  }
3118  _RETC (indep->get (idx));
3119 }
3120 
3122  _ARV0 (v);
3123  _ARC1 (c);
3124  _DEFC ();
3125  strlist * deps = _ARG(0)->collectDataDependencies ();
3126  if (!deps || deps->length () != 1) {
3127  THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
3128  _RETC (0.0);
3129  }
3130  vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
3131  int idx, i;
3132  nr_double_t t, diff = NR_MAX;
3133  for (idx = i = 0; i < v->getSize (); i++) {
3134  t = abs (v->get (i) - *c);
3135  if (t < diff) {
3136  idx = i;
3137  diff = t;
3138  }
3139  }
3140  _RETC (indep->get (idx));
3141 }
3142 
3143 // ***************** find y-value for given x-value *****************
3145  _ARV0 (v);
3146  _ARD1 (d);
3147  _DEFC ();
3148  strlist * deps = _ARG(0)->collectDataDependencies ();
3149  if (!deps || deps->length () != 1) {
3150  THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
3151  _RETC (0.0);
3152  }
3153  vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
3154  int idx, i;
3155  nr_double_t t, diff = NR_MAX;
3156  for (idx = i = 0; i < indep->getSize (); i++) {
3157  t = abs (indep->get (i) - d);
3158  if (t < diff) {
3159  idx = i;
3160  diff = t;
3161  }
3162  }
3163  _RETC (v->get (idx));
3164 }
3165 
3167  _ARV0 (v);
3168  _ARC1 (c);
3169  _DEFC ();
3170  strlist * deps = _ARG(0)->collectDataDependencies ();
3171  if (!deps || deps->length () != 1) {
3172  THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
3173  _RETC (0.0);
3174  }
3175  vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
3176  int idx, i;
3177  nr_double_t t, diff = NR_MAX;
3178  for (idx = i = 0; i < indep->getSize (); i++) {
3179  t = abs (indep->get (i) - *c);
3180  if (t < diff) {
3181  idx = i;
3182  diff = t;
3183  }
3184  }
3185  _RETC (v->get (idx));
3186 }
3187 
3188 // ***************** min, max, avg using range specification *****************
3190  _ARV0 (v);
3191  _ARR1 (r);
3192  _DEFD ();
3193  strlist * deps = _ARG(0)->collectDataDependencies ();
3194  if (!deps || deps->length () != 1) {
3195  THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
3196  _RETD (0.0);
3197  }
3198  vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
3199  nr_complex_t c;
3200  nr_double_t d, M = -NR_MAX;
3201  for (int i = 0; i < indep->getSize (); i++) {
3202  if (r->inside (real (indep->get (i)))) {
3203  c = v->get (i);
3204  d = fabs (arg (c)) < M_PI_2 ? abs (c) : -abs (c);
3205  if (d > M) M = d;
3206  }
3207  }
3208  _RETD (M);
3209 }
3210 
3212  _ARV0 (v);
3213  _ARR1 (r);
3214  _DEFD ();
3215  strlist * deps = _ARG(0)->collectDataDependencies ();
3216  if (!deps || deps->length () != 1) {
3217  THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
3218  _RETD (0.0);
3219  }
3220  vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
3221  nr_complex_t c;
3222  nr_double_t d, M = +NR_MAX;
3223  for (int i = 0; i < indep->getSize (); i++) {
3224  if (r->inside (real (indep->get (i)))) {
3225  c = v->get (i);
3226  d = fabs (arg (c)) < M_PI_2 ? abs (c) : -abs (c);
3227  if (d < M) M = d;
3228  }
3229  }
3230  _RETD (M);
3231 }
3232 
3234  _ARV0 (v);
3235  _ARR1 (r);
3236  _DEFC ();
3237  strlist * deps = _ARG(0)->collectDataDependencies ();
3238  if (!deps || deps->length () != 1) {
3239  THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
3240  _RETC (0.0);
3241  }
3242  vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
3243  nr_complex_t c = 0.0;
3244  int i, k;
3245  for (k = i = 0; i < indep->getSize (); i++) {
3246  if (r->inside (real (indep->get (i)))) {
3247  c += v->get (i);
3248  k++;
3249  }
3250  }
3251  _RETC (c / (nr_double_t) k);
3252 }
3253 
3254 // *************** range functionality *****************
3256  _ARD0 (d1);
3257  _ARD1 (d2);
3258  _DEFR ();
3259  _RETR (new range ('[', d1, d2, ']'));
3260 }
3261 
3263  _ARD1 (d2);
3264  _DEFR ();
3265  _RETR (new range ('.', d2 - 1, d2, ']'));
3266 }
3267 
3269  _ARD0 (d1);
3270  _DEFR ();
3271  _RETR (new range ('[', d1, d1 + 1, '.'));
3272 }
3273 
3275  _DEFR ();
3276  _RETR (new range ('.', 0, 0, '.'));
3277 }
3278 
3279 MAKE_FUNC_DEFINITION_0 (ceil); // ceil double->integer conversion
3280 MAKE_FUNC_DEFINITION_0 (floor); // floor double->integer conversion
3281 MAKE_FUNC_DEFINITION_0 (fix); // fix double->integer conversion
3282 MAKE_FUNC_DEFINITION_0 (step); // step function
3283 MAKE_FUNC_DEFINITION_0 (round); // round function
3284 MAKE_FUNC_DEFINITION_0 (erf); // error function
3285 MAKE_FUNC_DEFINITION_0 (erfc); // complementary error function
3286 MAKE_FUNC_DEFINITION_0 (erfinv); // inverse of error function
3287 MAKE_FUNC_DEFINITION_0 (erfcinv); // inverse of complementary error function
3288 MAKE_FUNC_DEFINITION_0 (i0); // modified bessel zero order
3289 
3290 // ******************* cumulative sum *********************
3292  _ARD0 (d1);
3293  _DEFD ();
3294  _RETD (d1);
3295 }
3296 
3298  _ARC0 (c1);
3299  _DEFC ();
3300  _RETC (*c1);
3301 }
3302 
3304  _ARV0 (v1);
3305  _DEFV ();
3306  _RETV (cumsum (*v1));
3307 }
3308 
3309 // **************** cumulative average ******************
3311  _ARD0 (d1);
3312  _DEFD ();
3313  _RETD (d1);
3314 }
3315 
3317  _ARC0 (c1);
3318  _DEFC ();
3319  _RETC (*c1);
3320 }
3321 
3323  _ARV0 (v1);
3324  _DEFV ();
3325  _RETV (cumavg (*v1));
3326 }
3327 
3328 // ******************* cumulative product *********************
3330  _ARD0 (d1);
3331  _DEFD ();
3332  _RETD (d1);
3333 }
3334 
3336  _ARC0 (c1);
3337  _DEFC ();
3338  _RETC (*c1);
3339 }
3340 
3342  _ARV0 (v1);
3343  _DEFV ();
3344  _RETV (cumprod (*v1));
3345 }
3346 
3347 // ******************* rms *********************
3349  _ARD0 (d1);
3350  _DEFD ();
3351  _RETD (fabs (d1));
3352 }
3353 
3355  _ARC0 (c1);
3356  _DEFD ();
3357  _RETD (abs (*c1));
3358 }
3359 
3361  _ARV0 (v1);
3362  _DEFD ();
3363  _RETD (v1->rms ());
3364 }
3365 
3366 // ******************* variance *********************
3368  _DEFD ();
3369  _RETD (0);
3370 }
3371 
3373  _DEFD ();
3374  _RETD (0);
3375 }
3376 
3378  _ARV0 (v1);
3379  _DEFD ();
3380  _RETD (v1->variance ());
3381 }
3382 
3383 // ******************* stddev *********************
3385  _DEFD ();
3386  _RETD (0);
3387 }
3388 
3390  _DEFD ();
3391  _RETD (0);
3392 }
3393 
3395  _ARV0 (v1);
3396  _DEFD ();
3397  _RETD (v1->stddev ());
3398 }
3399 
3400 // ********* jn (bessel function of 1st kind, nth order) ***********
3402  _ARI0 (n);
3403  _ARD1 (x);
3404  _DEFD ();
3405  _RETD (jn (n, x));
3406 }
3407 
3409  _ARI0 (n);
3410  _ARC1 (x);
3411  _DEFC ();
3412  _RETC (jn (n, *x));
3413 }
3414 
3416  _ARI0 (n);
3417  _ARV1 (x);
3418  _DEFV ();
3419  _RETV (jn (n, *x));
3420 }
3421 
3422 // ********* yn (bessel function of 2nd kind, nth order) ***********
3424  _ARI0 (n);
3425  _ARD1 (x);
3426  _DEFD ();
3427  _RETD (yn (n, x));
3428 }
3429 
3431  _ARI0 (n);
3432  _ARC1 (x);
3433  _DEFC ();
3434  _RETC (yn (n, *x));
3435 }
3436 
3438  _ARI0 (n);
3439  _ARV1 (x);
3440  _DEFV ();
3441  _RETV (yn (n, *x));
3442 }
3443 
3444 // ***************** sqr *****************
3446  _ARM0 (m1);
3447  _DEFM ();
3448  _RETM (sqr (*m1));
3449 }
3450 
3452  _ARMV0 (m1);
3453  _DEFMV ();
3454  _RETMV (sqr (*m1));
3455 }
3456 
3457 // ******************* polar *********************
3459  _ARD0 (a);
3460  _ARD1 (p);
3461  _DEFC ();
3462  _RETC (polar (a, rad (p)));
3463 }
3464 
3466  _ARC0 (a);
3467  _ARD1 (p);
3468  _DEFC ();
3469  _RETC (polar (*a, rect (rad (p), 0)));
3470 }
3471 
3473  _ARD0 (a);
3474  _ARC1 (p);
3475  _DEFC ();
3476  _RETC (polar (rect (a, 0), rad (*p)));
3477 }
3478 
3480  _ARC0 (a);
3481  _ARC1 (p);
3482  _DEFC ();
3483  _RETC (polar (*a, rad (*p)));
3484 }
3485 
3487  _ARD0 (a);
3488  _ARV1 (v);
3489  _DEFV ();
3490  _RETV (polar (rect (a, 0), rad (*v)));
3491 }
3492 
3494  _ARC0 (a);
3495  _ARV1 (v);
3496  _DEFV ();
3497  _RETV (polar (*a, rad (*v)));
3498 }
3499 
3501  _ARV0 (v);
3502  _ARD1 (p);
3503  _DEFV ();
3504  _RETV (polar (*v, rect (rad (p), 0)));
3505 }
3506 
3508  _ARV0 (v);
3509  _ARC1 (p);
3510  _DEFV ();
3511  _RETV (polar (*v, rad (*p)));
3512 }
3513 
3515  _ARV0 (a);
3516  _ARV1 (p);
3517  _DEFV ();
3518  _RETV (polar (*a, rad (*p)));
3519 }
3520 
3521 // ******************* arctan2 *********************
3523  _ARD0 (y);
3524  _ARD1 (x);
3525  _DEFD ();
3526  if ((x == 0) && (y == 0)) {
3527  THROW_MATH_EXCEPTION ("arctan2: not defined for (0,0)");
3528  _RETD (-M_PI / 2);
3529  }
3530  _RETD (atan2 (y, x));
3531 }
3532 
3534  _ARD0 (y);
3535  _ARV1 (x);
3536  _DEFV ();
3537  _RETV (atan2 (y, *x));
3538 }
3539 
3541  _ARV0 (y);
3542  _ARD1 (x);
3543  _DEFV ();
3544  _RETV (atan2 (*y, x));
3545 }
3546 
3548  _ARV0 (y);
3549  _ARV1 (x);
3550  _DEFV ();
3551  _RETV (atan2 (*y, *x));
3552 }
3553 
3554 // ******************* dbm2w *********************
3556  _ARD0 (d1);
3557  _DEFD ();
3558  _RETD (0.001 * pow (10.0, d1 / 10.0));
3559 }
3560 
3562  _ARC0 (c1);
3563  _DEFC ();
3564  _RETC (0.001 * pow (10.0, *c1 / 10.0));
3565 }
3566 
3568  _ARV0 (v1);
3569  _DEFV ();
3570  _RETV (dbm2w (*v1));
3571 }
3572 
3573 // ******************* w2dbm *********************
3575  _ARD0 (d1);
3576  _DEFD ();
3577  _RETD (10.0 * log10 (d1 / 0.001));
3578 }
3579 
3581  _ARC0 (c1);
3582  _DEFC ();
3583  _RETC (10.0 * log10 (*c1 / 0.001));
3584 }
3585 
3587  _ARV0 (v1);
3588  _DEFV ();
3589  _RETV (w2dbm (*v1));
3590 }
3591 
3592 // ********** integrate *****************
3594  _ARD0 (data);
3595  _ARD1 (incr);
3596  _DEFD ();
3597  _RETD (data * incr);
3598 }
3599 
3601  _ARC0 (data);
3602  _ARC1 (incr);
3603  _DEFC ();
3604  _RETC (*data * *incr);
3605 }
3606 
3608  _ARV0 (data);
3609  _ARD1 (incr);
3610  _DEFD ();
3611  _RETD (integrate (*data, incr));
3612 }
3613 
3615  _ARV0 (data);
3616  _ARC1 (incr);
3617  _DEFC ();
3618  _RETC (integrate (*data, *incr));
3619 }
3620 
3621 // ******************* dbm *********************
3623  _ARD0 (d1);
3624  _DEFD ();
3625  _RETD (10.0 * log10 (norm (d1) / circuit::z0 / 0.001));
3626 }
3627 
3629  _ARD0 (d1);
3630  _ARD1 (z);
3631  _DEFD ();
3632  _RETD (10.0 * log10 (norm (d1) / z / 0.001));
3633 }
3634 
3636  _ARC0 (c1);
3637  _DEFC ();
3638  _RETC (10.0 * log10 (norm (*c1) / circuit::z0 / 0.001));
3639 }
3640 
3642  _ARC0 (c1);
3643  _ARD1 (z);
3644  _DEFC ();
3645  _RETC (10.0 * log10 (norm (*c1) / z / 0.001));
3646 }
3647 
3649  _ARV0 (v1);
3650  _DEFV ();
3651  _RETV (dbm (*v1));
3652 }
3653 
3655  _ARV0 (v1);
3656  _ARD1 (z);
3657  _DEFV ();
3658  _RETV (dbm (*v1, z));
3659 }
3660 
3662  _ARD0 (d1);
3663  _ARC1 (z);
3664  _DEFC ();
3665  _RETC (10.0 * log10 (norm (d1) / conj (*z) / 0.001));
3666 }
3667 
3669  _ARC0 (c1);
3670  _ARC1 (z);
3671  _DEFC ();
3672  _RETC (10.0 * log10 (norm (*c1) / conj (*z) / 0.001));
3673 }
3674 
3676  _ARV0 (v1);
3677  _ARC1 (z);
3678  _DEFV ();
3679  _RETV (dbm (*v1, *z));
3680 }
3681 
3682 // ************** running average ****************
3684  _ARD0 (x);
3685  _ARI1 (n);
3686  _DEFV ();
3687  if (n < 1) {
3688  THROW_MATH_EXCEPTION ("runavg: number n to be averaged over must be "
3689  "larger or equal 1");
3690  __RETV ();
3691  }
3692  _RETV (runavg (rect (x, 0), n));
3693 }
3694 
3696  _ARC0 (x);
3697  _ARI1 (n);
3698  _DEFV ();
3699  if (n < 1) {
3700  THROW_MATH_EXCEPTION ("runavg: number n to be averaged over must be "
3701  "larger or equal 1");
3702  __RETV ();
3703  }
3704  _RETV (runavg (*x, n));
3705 }
3706 
3708  _ARV0 (x);
3709  _ARI1 (n);
3710  _DEFV ();
3711  if (n < 1 || n > x->getSize ()) {
3712  THROW_MATH_EXCEPTION ("runavg: number n to be averaged over must be "
3713  "larger or equal 1 and less or equal than the "
3714  "number of vector elements");
3715  __RETV ();
3716  }
3717  _RETV (runavg (*x, n));
3718 }
3719 
3720 // ********************* thermal voltage **********************
3722  _ARD0 (d1);
3723  _DEFD ();
3724  _RETD (d1 * kBoverQ);
3725 }
3726 
3728  _ARC0 (c1);
3729  _DEFC ();
3730  _RETC (*c1 * kBoverQ);
3731 }
3732 
3734  _ARV0 (v1);
3735  _DEFV ();
3736  vector * v = new vector ();
3737  for (int i = 0; i < v1->getSize (); i++) v->add (v1->get (i) * kBoverQ);
3738  res->v = v;
3739  return res;
3740 }
3741 
3742 // ************** Kaiser-Bessel derived window ****************
3744  _ARD0 (alpha);
3745  _ARI1 (size);
3746  _DEFV ();
3747  int i;
3748  nr_double_t sval = 0.0;
3749  if (size <= 0) {
3750  THROW_MATH_EXCEPTION ("kbd: vector length must be greater than zero");
3751  __RETV ();
3752  }
3753  vector v (size);
3754  for (i = 0; i < size / 2; i++) {
3755  sval += i0 (M_PI * alpha * sqrt (1.0 - sqr (4.0 * i / size - 1.0)));
3756  v (i) = sval;
3757  }
3758  // need to add one more value to the normalization factor at size/2
3759  sval += i0 (M_PI * alpha * sqrt (1.0 - sqr (4.0 * (size / 2) / size - 1.0)));
3760  // normalize the window and fill in the righthand side of the window
3761  for (i = 0; i < size / 2; i++) {
3762  v (i) = sqrt (v (i) / sval);
3763  v (size - 1 - i) = v (i);
3764  }
3765  _RETV (v);
3766 }
3767 
3769  constant * arg = new constant (TAG_DOUBLE);
3770  arg->d = 64;
3771  arg->solvee = args->getResult(0)->solvee;
3772  arg->evaluate ();
3773  args->append (arg);
3774  return kbd_d_d (args);
3775 }
3776 
3777 // ***************** if-then-else operation ****************
3779  _ARB0 (cond);
3780  _ARD1 (d1);
3781  _ARD2 (d2);
3782  _DEFD ();
3783  _RETD (cond ? d1 : d2);
3784 }
3785 
3787  _ARB0 (cond);
3788  _ARB1 (b1);
3789  _ARB2 (b2);
3790  _DEFB ();
3791  _RETB (cond ? b1 : b2);
3792 }
3793 
3795  _ARB0 (cond);
3796  _ARD1 (d1);
3797  _ARB2 (b2);
3798  _DEFD ();
3799  _RETD (cond ? d1 : (b2 ? 1.0 : 0.0));
3800 }
3801 
3803  _ARB0 (cond);
3804  _ARB1 (b1);
3805  _ARD2 (d2);
3806  _DEFD ();
3807  _RETD (cond ? (b1 ? 1.0 : 0.0) : d2);
3808 }
3809 
3811  _ARB0 (cond);
3812  int t1 = _ARG(1)->getType ();
3813  int t2 = _ARG(2)->getType ();
3814  nr_complex_t c1, c2;
3815  if (t1 == TAG_DOUBLE)
3816  c1 = D(_ARES(1));
3817  else if (t1 == TAG_COMPLEX)
3818  c1 = *C(_ARES(1));
3819  else
3820  c1 = B(_ARES(1)) ? 1.0 : 0.0;
3821  if (t2 == TAG_DOUBLE)
3822  c2 = D(_ARES(2));
3823  else if (t2 == TAG_COMPLEX)
3824  c2 = *C(_ARES(2));
3825  else
3826  c2 = B(_ARES(2)) ? 1.0 : 0.0;
3827  _DEFC ();
3828  _RETC (cond ? c1 : c2);
3829 }
3830 
3832  _ARB0 (cond);
3833  int t1 = _ARG(1)->getType ();
3834  int t2 = _ARG(2)->getType ();
3835  matrix m1, m2;
3836  switch (t1) {
3837  case TAG_DOUBLE:
3838  m1 = matrix (1); m1 (1,1) = D(_ARES(1)); break;
3839  case TAG_COMPLEX:
3840  m1 = matrix (1); m1 (1,1) = *C(_ARES(1)); break;
3841  case TAG_BOOLEAN:
3842  m1 = matrix (1); m1 (1,1) = B(_ARES(1)) ? 1.0 : 0.0; break;
3843  case TAG_MATRIX:
3844  m1 = *M(_ARES(1)); break;
3845  }
3846  switch (t2) {
3847  case TAG_DOUBLE:
3848  m2 = matrix (1); m2 (0,0) = D(_ARES(2)); break;
3849  case TAG_COMPLEX:
3850  m2 = matrix (1); m2 (0,0) = *C(_ARES(2)); break;
3851  case TAG_BOOLEAN:
3852  m2 = matrix (1); m2 (0,0) = B(_ARES(2)) ? 1.0 : 0.0; break;
3853  case TAG_MATRIX:
3854  m2 = *M(_ARES(2)); break;
3855  }
3856  _DEFM ();
3857  _RETM (cond ? m1 : m2);
3858 }
3859 
3861  _ARB0 (cond);
3862  int t1 = _ARG(1)->getType ();
3863  int t2 = _ARG(2)->getType ();
3864  vector v1, v2;
3865  switch (t1) {
3866  case TAG_DOUBLE:
3867  v1 = vector (1); v1 (0) = D(_ARES(1)); break;
3868  case TAG_COMPLEX:
3869  v1 = vector (1); v1 (0) = *C(_ARES(1)); break;
3870  case TAG_BOOLEAN:
3871  v1 = vector (1); v1 (0) = B(_ARES(1)) ? 1.0 : 0.0; break;
3872  case TAG_VECTOR:
3873  v1 = *V(_ARES(1)); break;
3874  }
3875  switch (t2) {
3876  case TAG_DOUBLE:
3877  v2 = vector (1); v2 (0) = D(_ARES(2)); break;
3878  case TAG_COMPLEX:
3879  v2 = vector (1); v2 (0) = *C(_ARES(2)); break;
3880  case TAG_BOOLEAN:
3881  v2 = vector (1); v2 (0) = B(_ARES(2)) ? 1.0 : 0.0; break;
3882  case TAG_VECTOR:
3883  v2 = *V(_ARES(2)); break;
3884  }
3885  _DEFV ();
3886  _RETV (cond ? v1 : v2);
3887 }
3888 
3890  _ARV0 (cond);
3891  int t1 = _ARG(1)->getType ();
3892  int t2 = _ARG(2)->getType ();
3893  vector v1, v2;
3894  switch (t1) {
3895  case TAG_DOUBLE:
3896  v1 = vector (1); v1 (0) = D(_ARES(1)); break;
3897  case TAG_COMPLEX:
3898  v1 = vector (1); v1 (0) = *C(_ARES(1)); break;
3899  case TAG_BOOLEAN:
3900  v1 = vector (1); v1 (0) = B(_ARES(1)) ? 1.0 : 0.0; break;
3901  case TAG_VECTOR:
3902  v1 = *V(_ARES(1)); break;
3903  }
3904  switch (t2) {
3905  case TAG_DOUBLE:
3906  v2 = vector (1); v2 (0) = D(_ARES(2)); break;
3907  case TAG_COMPLEX:
3908  v2 = vector (1); v2 (0) = *C(_ARES(2)); break;
3909  case TAG_BOOLEAN:
3910  v2 = vector (1); v2 (0) = B(_ARES(2)) ? 1.0 : 0.0; break;
3911  case TAG_VECTOR:
3912  v2 = *V(_ARES(2)); break;
3913  }
3914  _DEFV ();
3915  int i, a, b;
3916  vector * v = new vector ();
3917  for (a = b = i = 0; i < cond->getSize (); i++) {
3918  v->add (cond->get (i) != 0.0 ? v1 (a) : v2 (b));
3919  a++;
3920  b++;
3921  if (a >= v1.getSize ()) a = 0;
3922  if (b >= v2.getSize ()) b = 0;
3923  }
3924  res->v = v;
3925  return res;
3926 }
3927 
3928 // ************************** less *************************
3930  _ARD0 (d0);
3931  _ARD1 (d1);
3932  _DEFB ();
3933  _RETB (d0 < d1);
3934 }
3935 
3937  _ARD0 (d0);
3938  _ARC1 (c1);
3939  _DEFB ();
3940  _RETB (d0 < *c1);
3941 }
3942 
3944  _ARD0 (d0);
3945  _ARV1 (v1);
3946  _DEFV ();
3947  vector * v = new vector ();
3948  for (int i = 0; i < v1->getSize (); i++) {
3949  v->add (d0 < v1->get (i) ? 1.0 : 0.0);
3950  }
3951  res->v = v;
3952  return res;
3953 }
3954 
3956  _ARC0 (c0);
3957  _ARD1 (d1);
3958  _DEFB ();
3959  _RETB (*c0 < d1);
3960 }
3961 
3963  _ARC0 (c0);
3964  _ARC1 (c1);
3965  _DEFB ();
3966  _RETB (*c0 < *c1);
3967 }
3968 
3970  _ARC0 (c0);
3971  _ARV1 (v1);
3972  _DEFV ();
3973  vector * v = new vector ();
3974  for (int i = 0; i < v1->getSize (); i++) {
3975  v->add (*c0 < v1->get (i) ? 1.0 : 0.0);
3976  }
3977  res->v = v;
3978  return res;
3979 }
3980 
3982  _ARV0 (v0);
3983  _ARD1 (d1);
3984  _DEFV ();
3985  vector * v = new vector ();
3986  for (int i = 0; i < v0->getSize (); i++) {
3987  v->add (real (v0->get (i)) < d1 ? 1.0 : 0.0);
3988  }
3989  res->v = v;
3990  return res;
3991 }
3992 
3994  _ARV0 (v0);
3995  _ARC1 (c1);
3996  _DEFV ();
3997  vector * v = new vector ();
3998  for (int i = 0; i < v0->getSize (); i++) {
3999  v->add (v0->get (i) < *c1 ? 1.0 : 0.0);
4000  }
4001  res->v = v;
4002  return res;
4003 }
4004 
4006  _ARV0 (v0);
4007  _ARV1 (v1);
4008  _DEFV ();
4009  vector * v = new vector ();
4010  for (int i = 0; i < v0->getSize (); i++) {
4011  v->add (v0->get (i) < v1->get (i) ? 1.0 : 0.0);
4012  }
4013  res->v = v;
4014  return res;
4015 }
4016 
4017 // ************************* greater ***********************
4019  _ARD0 (d0);
4020  _ARD1 (d1);
4021  _DEFB ();
4022  _RETB (d0 > d1);
4023 }
4024 
4026  _ARD0 (d0);
4027  _ARC1 (c1);
4028  _DEFB ();
4029  _RETB (d0 > *c1);
4030 }
4031 
4033  _ARD0 (d0);
4034  _ARV1 (v1);
4035  _DEFV ();
4036  vector * v = new vector ();
4037  for (int i = 0; i < v1->getSize (); i++) {
4038  v->add (d0 > real (v1->get (i)) ? 1.0 : 0.0);
4039  }
4040  res->v = v;
4041  return res;
4042 }
4043 
4045  _ARC0 (c0);
4046  _ARD1 (d1);
4047  _DEFB ();
4048  _RETB (*c0 > d1);
4049 }
4050 
4052  _ARC0 (c0);
4053  _ARC1 (c1);
4054  _DEFB ();
4055  _RETB (*c0 > *c1);
4056 }
4057 
4059  _ARC0 (c0);
4060  _ARV1 (v1);
4061  _DEFV ();
4062  vector * v = new vector ();
4063  for (int i = 0; i < v1->getSize (); i++) {
4064  v->add (*c0 > v1->get (i) ? 1.0 : 0.0);
4065  }
4066  res->v = v;
4067  return res;
4068 }
4069 
4071  _ARV0 (v0);
4072  _ARD1 (d1);
4073  _DEFV ();
4074  vector * v = new vector ();
4075  for (int i = 0; i < v0->getSize (); i++) {
4076  v->add (real (v0->get (i)) > d1 ? 1.0 : 0.0);
4077  }
4078  res->v = v;
4079  return res;
4080 }
4081 
4083  _ARV0 (v0);
4084  _ARC1 (c1);
4085  _DEFV ();
4086  vector * v = new vector ();
4087  for (int i = 0; i < v0->getSize (); i++) {
4088  v->add (v0->get (i) > *c1 ? 1.0 : 0.0);
4089  }
4090  res->v = v;
4091  return res;
4092 }
4093 
4095  _ARV0 (v0);
4096  _ARV1 (v1);
4097  _DEFV ();
4098  vector * v = new vector ();
4099  for (int i = 0; i < v0->getSize (); i++) {
4100  v->add (v0->get (i) > v1->get (i) ? 1.0 : 0.0);
4101  }
4102  res->v = v;
4103  return res;
4104 }
4105 
4106 // ********************** less or equal ********************
4108  _ARD0 (d0);
4109  _ARD1 (d1);
4110  _DEFB ();
4111  _RETB (d0 <= d1);
4112 }
4113 
4115  _ARD0 (d0);
4116  _ARC1 (c1);
4117  _DEFB ();
4118  _RETB (d0 <= *c1);
4119 }
4120 
4122  _ARD0 (d0);
4123  _ARV1 (v1);
4124  _DEFV ();
4125  vector * v = new vector ();
4126  for (int i = 0; i < v1->getSize (); i++) {
4127  v->add (d0 <= real (v1->get (i)) ? 1.0 : 0.0);
4128  }
4129  res->v = v;
4130  return res;
4131 }
4132 
4134  _ARC0 (c0);
4135  _ARD1 (d1);
4136  _DEFB ();
4137  _RETB (*c0 <= d1);
4138 }
4139 
4141  _ARC0 (c0);
4142  _ARC1 (c1);
4143  _DEFB ();
4144  _RETB (*c0 <= *c1);
4145 }
4146 
4148  _ARC0 (c0);
4149  _ARV1 (v1);
4150  _DEFV ();
4151  vector * v = new vector ();
4152  for (int i = 0; i < v1->getSize (); i++) {
4153  v->add (*c0 <= v1->get (i) ? 1.0 : 0.0);
4154  }
4155  res->v = v;
4156  return res;
4157 }
4158 
4160  _ARV0 (v0);
4161  _ARD1 (d1);
4162  _DEFV ();
4163  vector * v = new vector ();
4164  for (int i = 0; i < v0->getSize (); i++) {
4165  v->add (real (v0->get (i)) <= d1 ? 1.0 : 0.0);
4166  }
4167  res->v = v;
4168  return res;
4169 }
4170 
4172  _ARV0 (v0);
4173  _ARC1 (c1);
4174  _DEFV ();
4175  vector * v = new vector ();
4176  for (int i = 0; i < v0->getSize (); i++) {
4177  v->add (v0->get (i) <= *c1 ? 1.0 : 0.0);
4178  }
4179  res->v = v;
4180  return res;
4181 }
4182 
4184  _ARV0 (v0);
4185  _ARV1 (v1);
4186  _DEFV ();
4187  vector * v = new vector ();
4188  for (int i = 0; i < v0->getSize (); i++) {
4189  v->add (v0->get (i) <= v1->get (i) ? 1.0 : 0.0);
4190  }
4191  res->v = v;
4192  return res;
4193 }
4194 
4195 // ********************* greater or equal ******************
4197  _ARD0 (d0);
4198  _ARD1 (d1);
4199  _DEFB ();
4200  _RETB (d0 >= d1);
4201 }
4202 
4204  _ARD0 (d0);
4205  _ARC1 (c1);
4206  _DEFB ();
4207  _RETB (d0 >= *c1);
4208 }
4209 
4211  _ARD0 (d0);
4212  _ARV1 (v1);
4213  _DEFV ();
4214  vector * v = new vector ();
4215  for (int i = 0; i < v1->getSize (); i++) {
4216  v->add (d0 >= real (v1->get (i)) ? 1.0 : 0.0);
4217  }
4218  res->v = v;
4219  return res;
4220 }
4221 
4223  _ARC0 (c0);
4224  _ARD1 (d1);
4225  _DEFB ();
4226  _RETB (*c0 >= d1);
4227 }
4228 
4230  _ARC0 (c0);
4231  _ARC1 (c1);
4232  _DEFB ();
4233  _RETB (*c0 >= *c1);
4234 }
4235 
4237  _ARC0 (c0);
4238  _ARV1 (v1);
4239  _DEFV ();
4240  vector * v = new vector ();
4241  for (int i = 0; i < v1->getSize (); i++) {
4242  v->add (*c0 >= v1->get (i) ? 1.0 : 0.0);
4243  }
4244  res->v = v;
4245  return res;
4246 }
4247 
4249  _ARV0 (v0);
4250  _ARD1 (d1);
4251  _DEFV ();
4252  vector * v = new vector ();
4253  for (int i = 0; i < v0->getSize (); i++) {
4254  v->add (real (v0->get (i)) >= d1 ? 1.0 : 0.0);
4255  }
4256  res->v = v;
4257  return res;
4258 }
4259 
4261  _ARV0 (v0);
4262  _ARC1 (c1);
4263  _DEFV ();
4264  vector * v = new vector ();
4265  for (int i = 0; i < v0->getSize (); i++) {
4266  v->add (v0->get (i) >= *c1 ? 1.0 : 0.0);
4267  }
4268  res->v = v;
4269  return res;
4270 }
4271 
4273  _ARV0 (v0);
4274  _ARV1 (v1);
4275  _DEFV ();
4276  vector * v = new vector ();
4277  for (int i = 0; i < v0->getSize (); i++) {
4278  v->add (v0->get (i) >= v1->get (i) ? 1.0 : 0.0);
4279  }
4280  res->v = v;
4281  return res;
4282 }
4283 
4284 // ************************** equal ************************
4286  _ARD0 (d0);
4287  _ARD1 (d1);
4288  _DEFB ();
4289  _RETB (d0 == d1);
4290 }
4291 
4293  _ARD0 (d0);
4294  _ARC1 (c1);
4295  _DEFB ();
4296  _RETB (d0 == *c1);
4297 }
4298 
4300  _ARD0 (d0);
4301  _ARV1 (v1);
4302  _DEFV ();
4303  vector * v = new vector ();
4304  for (int i = 0; i < v1->getSize (); i++) {
4305  v->add (d0 == real (v1->get (i)) ? 1.0 : 0.0);
4306  }
4307  res->v = v;
4308  return res;
4309 }
4310 
4312  _ARC0 (c0);
4313  _ARD1 (d1);
4314  _DEFB ();
4315  _RETB (*c0 == d1);
4316 }
4317 
4319  _ARC0 (c0);
4320  _ARC1 (c1);
4321  _DEFB ();
4322  _RETB (*c0 == *c1);
4323 }
4324 
4326  _ARC0 (c0);
4327  _ARV1 (v1);
4328  _DEFV ();
4329  vector * v = new vector ();
4330  for (int i = 0; i < v1->getSize (); i++) {
4331  v->add (*c0 == v1->get (i) ? 1.0 : 0.0);
4332  }
4333  res->v = v;
4334  return res;
4335 }
4336 
4338  _ARV0 (v0);
4339  _ARD1 (d1);
4340  _DEFV ();
4341  vector * v = new vector ();
4342  for (int i = 0; i < v0->getSize (); i++) {
4343  v->add (real (v0->get (i)) == d1 ? 1.0 : 0.0);
4344  }
4345  res->v = v;
4346  return res;
4347 }
4348 
4350  _ARV0 (v0);
4351  _ARC1 (c1);
4352  _DEFV ();
4353  vector * v = new vector ();
4354  for (int i = 0; i < v0->getSize (); i++) {
4355  v->add (v0->get (i) == *c1 ? 1.0 : 0.0);
4356  }
4357  res->v = v;
4358  return res;
4359 }
4360 
4362  _ARV0 (v0);
4363  _ARV1 (v1);
4364  _DEFV ();
4365  vector * v = new vector ();
4366  for (int i = 0; i < v0->getSize (); i++) {
4367  v->add (v0->get (i) == v1->get (i) ? 1.0 : 0.0);
4368  }
4369  res->v = v;
4370  return res;
4371 }
4372 
4374  _ARB0 (b0);
4375  _ARB1 (b1);
4376  _DEFB ();
4377  _RETB (b0 == b1);
4378 }
4379 
4380 // ************************ not equal **********************
4382  _ARD0 (d0);
4383  _ARD1 (d1);
4384  _DEFB ();
4385  _RETB (d0 != d1);
4386 }
4387 
4389  _ARD0 (d0);
4390  _ARC1 (c1);
4391  _DEFB ();
4392  _RETB (d0 != *c1);
4393 }
4394 
4396  _ARD0 (d0);
4397  _ARV1 (v1);
4398  _DEFV ();
4399  vector * v = new vector ();
4400  for (int i = 0; i < v1->getSize (); i++) {
4401  v->add (d0 != real (v1->get (i)) ? 1.0 : 0.0);
4402  }
4403  res->v = v;
4404  return res;
4405 }
4406 
4408  _ARC0 (c0);
4409  _ARD1 (d1);
4410  _DEFB ();
4411  _RETB (*c0 != d1);
4412 }
4413 
4415  _ARC0 (c0);
4416  _ARC1 (c1);
4417  _DEFB ();
4418  _RETB (*c0 != *c1);
4419 }
4420 
4422  _ARC0 (c0);
4423  _ARV1 (v1);
4424  _DEFV ();
4425  vector * v = new vector ();
4426  for (int i = 0; i < v1->getSize (); i++) {
4427  v->add (*c0 != v1->get (i) ? 1.0 : 0.0);
4428  }
4429  res->v = v;
4430  return res;
4431 }
4432 
4434  _ARV0 (v0);
4435  _ARD1 (d1);
4436  _DEFV ();
4437  vector * v = new vector ();
4438  for (int i = 0; i < v0->getSize (); i++) {
4439  v->add (real (v0->get (i)) != d1 ? 1.0 : 0.0);
4440  }
4441  res->v = v;
4442  return res;
4443 }
4444 
4446  _ARV0 (v0);
4447  _ARC1 (c1);
4448  _DEFV ();
4449  vector * v = new vector ();
4450  for (int i = 0; i < v0->getSize (); i++) {
4451  v->add (v0->get (i) != *c1 ? 1.0 : 0.0);
4452  }
4453  res->v = v;
4454  return res;
4455 }
4456 
4458  _ARV0 (v0);
4459  _ARV1 (v1);
4460  _DEFV ();
4461  vector * v = new vector ();
4462  for (int i = 0; i < v0->getSize (); i++) {
4463  v->add (v0->get (i) != v1->get (i) ? 1.0 : 0.0);
4464  }
4465  res->v = v;
4466  return res;
4467 }
4468 
4470  _ARB0 (b0);
4471  _ARB1 (b1);
4472  _DEFB ();
4473  _RETB (b0 != b1);
4474 }
4475 
4476 // *************************** not *************************
4478  _ARB0 (b0);
4479  _DEFB ();
4480  _RETB (!b0);
4481 }
4482 
4483 // *************************** or **************************
4485  _ARB0 (b0);
4486  _ARB1 (b1);
4487  _DEFB ();
4488  _RETB (b0 || b1);
4489 }
4490 
4491 // ************************** and **************************
4493  _ARB0 (b0);
4494  _ARB1 (b1);
4495  _DEFB ();
4496  _RETB (b0 && b1);
4497 }
4498 
4499 // ******************* random numbers **********************
4501  _DEFD ();
4502  _RETD (((nr_double_t) ::rand ()) / (nr_double_t) RAND_MAX);
4503 }
4504 
4506  static int done = 0;
4507  _ARD0 (d0);
4508  _DEFD ();
4509  if (!done) {
4510  unsigned int i0 = (unsigned int) d0;
4511  ::srand (i0);
4512  done = 1;
4513  _RETD (1.0);
4514  } else {
4515  _RETD (0.0);
4516  }
4517 }
4518 
4519 // ******************* immediate vectors *******************
4521  _DEFV ();
4522  vector * v = new vector ();
4523  for (node * arg = args; arg != NULL; arg = arg->getNext ()) {
4524  constant * c = arg->getResult ();
4525  switch (arg->getType ()) {
4526  case TAG_COMPLEX:
4527  v->add (*(c->c)); break;
4528  case TAG_DOUBLE:
4529  v->add (c->d); break;
4530  case TAG_BOOLEAN:
4531  v->add (c->b ? 1.0 : 0.0); break;
4532  case TAG_VECTOR:
4533  v->add (c->v); break;
4534  default:
4535  v->add (0.0); break;
4536  }
4537  }
4538  res->v = v;
4539  return res;
4540 }
4541 
4542 // ******************* immediate matrices ******************
4544  _DEFM ();
4545  /* create temporary list of vectors */
4546  vector * va = NULL;
4547  vector * v = new vector ();
4548  va = v;
4549  for (node * arg = args; arg != NULL; arg = arg->getNext ()) {
4550  constant * c = arg->getResult ();
4551  switch (arg->getType ()) {
4552  case TAG_COMPLEX:
4553  v->add (*(c->c)); break;
4554  case TAG_DOUBLE:
4555  v->add (c->d); break;
4556  case TAG_BOOLEAN:
4557  v->add (c->b ? 1.0 : 0.0); break;
4558  case TAG_VECTOR:
4559  v->add (c->v); break;
4560  case TAG_CHAR:
4561  if (c->chr == ';') {
4562  /* append new vector, i.e. a new matrix row */
4563  vector * vn = new vector ();
4564  v->setNext (vn);
4565  v = vn;
4566  }
4567  else v->add (0.0);
4568  break;
4569  default:
4570  v->add (0.0); break;
4571  }
4572  }
4573  /* determine matrix dimensions and create it */
4574  int r, c;
4575  for (r = 0, c = 0, v = va; v != NULL; v = (vector *) v->getNext (), r++) {
4576  if (c < v->getSize ()) c = v->getSize ();
4577  }
4578  matrix * m = new matrix (r, c);
4579  /* fill in matrix entries and delete temporary vector list */
4580  vector * vn = NULL;
4581  for (r = 0, v = va; v != NULL; v = vn, r++) {
4582  for (c = 0; c < v->getSize (); c++) {
4583  m->set (r, c, v->get (c));
4584  }
4585  vn = (vector *) v->getNext ();
4586  delete v;
4587  }
4588  /* return result matrix */
4589  res->m = m;
4590  return res;
4591 }
4592 
4593 // ********************** EMI receiver *********************
4595  _ARV0 (da);
4596  _ARV1 (dt);
4597  _DEFV ();
4598 
4599  // run receiver functionality
4600  vector * ed;
4601  if (_ARG(2)) {
4602  _ARI2 (len);
4603  ed = emi::receiver (da, dt, len);
4604  }
4605  else {
4606  ed = emi::receiver (da, dt);
4607  }
4608 
4609  // create two vectors for spectrum and frequency
4610  int rlen = ed->getSize ();
4611  vector * rvec = new vector (rlen);
4612  vector * rfeq = new vector (rlen);
4613  for (int i = 0; i < rlen; i++) {
4614  (*rvec)(i) = real (ed->get (i));
4615  (*rfeq)(i) = imag (ed->get (i));
4616  }
4617  delete ed;
4618 
4619  // put results back into equation solver
4620  node * gen = SOLVEE(0)->addGeneratedEquation (rfeq, "Frequency");
4621  res->addPrepDependencies (A(gen)->result);
4622  res->dropdeps = 1;
4623  res->v = rvec;
4624  return res;
4625 }
4626 
4627 // Include the application array.
4628 #include "applications.h"