LCOV - code coverage report
Current view: top level - src - evaluate.cpp (source / functions) Hit Total Coverage
Test: qucs-core-0.0.19 Code Coverage Lines: 136 2925 4.6 %
Date: 2015-01-05 16:01:02 Functions: 31 654 4.7 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 113 6977 1.6 %

           Branch data     Line data    Source code
       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$
      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 <cmath>
      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 qucs;
      56                 :            : using namespace qucs::eqn;
      57                 :            : using namespace qucs::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) qucs::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 _RETD_QUCS(var) res->d = (qucs::var); return res;
     125                 :            : #define _RETD_STD(var) res->d = (std::var); return res;
     126                 :            : #define _RETD_SPECIAL(var) res->d = (fspecial::var); return res;
     127                 :            : #define _RETB(var) res->b = (var); return res;
     128                 :            : #define _RETC(var) res->c = new nr_complex_t (var); return res;
     129                 :            : #define _RETV(var) res->v = new qucs::vector (var); return res;
     130                 :            : #define _RETM(var) res->m = new matrix (var); return res;
     131                 :            : #define _RETMV(var) res->mv = new matvec (var); return res;
     132                 :            : #define _RETR(var) res->r = (var); return res;
     133                 :            : 
     134                 :            : // Return value macros without arguments.
     135                 :            : #define __RETC() res->c = new nr_complex_t (); return res;
     136                 :            : #define __RETV() res->v = new qucs::vector (); return res;
     137                 :            : #define __RETM() res->m = new matrix (); return res;
     138                 :            : #define __RETMV() res->mv = new matvec (); return res;
     139                 :            : 
     140                 :            : #define SOLVEE(idx) args->get(idx)->solvee
     141                 :            : 
     142                 :            : // Throws a math exception.
     143                 :            : #define THROW_MATH_EXCEPTION(txt) do { \
     144                 :            :   qucs::exception * e = new qucs::exception (EXCEPTION_MATH); \
     145                 :            :   e->setText (txt); throw_exception (e); } while (0)
     146                 :            : 
     147                 :            : /* The QUCS_CONCAT macros create a new concatenated symbol for the
     148                 :            :    compiler in a portable way.  It is essential to use these macros
     149                 :            :    like QUCS_CONCAT (a,b) and *not* like QUCS_CONCAT (a, b) or its
     150                 :            :    variants. */
     151                 :            : #if defined (__STDC__) || defined (__cplusplus)
     152                 :            : # define QUCS_CONCAT2(a, b) a##b
     153                 :            : # define QUCS_CONCAT3(a, b, c) a##b##c
     154                 :            : #else
     155                 :            : # define QUCS_CONCAT2(a, b) a/* */b
     156                 :            : # define QUCS_CONCAT3(a, b, c) a/* */b/* */c
     157                 :            : #endif
     158                 :            : 
     159                 :            : // The following macro is meant to be used for some simple functions.
     160                 :            : #define MAKE_FUNC_DEFINITION_0(cfunc) \
     161                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_d) (constant * args) { \
     162                 :            :   _ARD0 (d);                                                      \
     163                 :            :   _DEFD ();                                                       \
     164                 :            :   _RETD (cfunc (d));                                              \
     165                 :            : }                                                                 \
     166                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_c) (constant * args) { \
     167                 :            :   _ARC0 (c);                                                      \
     168                 :            :   _DEFC ();                                                       \
     169                 :            :   _RETC (cfunc (*c));                                             \
     170                 :            : }                                                                 \
     171                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) { \
     172                 :            :   _ARV0 (v);                                                      \
     173                 :            :   _DEFV ();                                                       \
     174                 :            :   _RETV (cfunc (*v));                                             \
     175                 :            : }
     176                 :            : 
     177                 :            : // The following macro is meant to be used for some simple functions,
     178                 :            : // which must explicitly use the double function from the std namespace
     179                 :            : #define MAKE_FUNC_DEFINITION_0_STD(cfunc) \
     180                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_d) (constant * args) { \
     181                 :            :   _ARD0 (d);                                                      \
     182                 :            :   _DEFD ();                                                       \
     183                 :            :   _RETD_STD (cfunc (d));                                                  \
     184                 :            : }                                                                 \
     185                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_c) (constant * args) { \
     186                 :            :   _ARC0 (c);                                                      \
     187                 :            :   _DEFC ();                                                       \
     188                 :            :   _RETC (cfunc (*c));                                             \
     189                 :            : }                                                                 \
     190                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) { \
     191                 :            :   _ARV0 (v);                                                      \
     192                 :            :   _DEFV ();                                                       \
     193                 :            :   _RETV (cfunc (*v));                                             \
     194                 :            : }
     195                 :            : 
     196                 :            : // The following macro is meant to be used for some simple functions,
     197                 :            : // which must explicitly use the double function from the qucs namespace
     198                 :            : #define MAKE_FUNC_DEFINITION_0_QUCS(cfunc) \
     199                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_d) (constant * args) { \
     200                 :            :   _ARD0 (d);                                                      \
     201                 :            :   _DEFD ();                                                       \
     202                 :            :   _RETD_QUCS (cfunc (d));                                                 \
     203                 :            : }                                                                 \
     204                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_c) (constant * args) { \
     205                 :            :   _ARC0 (c);                                                      \
     206                 :            :   _DEFC ();                                                       \
     207                 :            :   _RETC (cfunc (*c));                                             \
     208                 :            : }                                                                 \
     209                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) { \
     210                 :            :   _ARV0 (v);                                                      \
     211                 :            :   _DEFV ();                                                       \
     212                 :            :   _RETV (cfunc (*v));                                             \
     213                 :            : }
     214                 :            : 
     215                 :            : // The following macro is meant to be used for some simple functions,
     216                 :            : // which must explicitly use the double function from the fspecial namespace
     217                 :            : #define MAKE_FUNC_DEFINITION_0_SPECIAL(cfunc) \
     218                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_d) (constant * args) { \
     219                 :            :   _ARD0 (d);                                                      \
     220                 :            :   _DEFD ();                                                       \
     221                 :            :   _RETD_SPECIAL (cfunc (d));                                              \
     222                 :            : }                                                                 \
     223                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_c) (constant * args) { \
     224                 :            :   _ARC0 (c);                                                      \
     225                 :            :   _DEFC ();                                                       \
     226                 :            :   _RETC (cfunc (*c));                                             \
     227                 :            : }                                                                 \
     228                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) { \
     229                 :            :   _ARV0 (v);                                                      \
     230                 :            :   _DEFV ();                                                       \
     231                 :            :   _RETV (cfunc (*v));                                             \
     232                 :            : }
     233                 :            : 
     234                 :            : #define MAKE_FUNC_DEFINITION_1(cfunc) \
     235                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_d) (constant * args) { \
     236                 :            :   _ARD0 (d);                                                      \
     237                 :            :   _DEFD ();                                                       \
     238                 :            :   _RETD (cfunc (d));                                              \
     239                 :            : }                                                                 \
     240                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_c) (constant * args) { \
     241                 :            :   _ARC0 (c);                                                      \
     242                 :            :   _DEFD ();                                                       \
     243                 :            :   res->d = cfunc (*c); return res;                             \
     244                 :            : }                                                                 \
     245                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) { \
     246                 :            :   _ARV0 (v);                                                      \
     247                 :            :   _DEFV ();                                                       \
     248                 :            :   _RETV (cfunc (*v));                                             \
     249                 :            : }                                                                 \
     250                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_m) (constant * args) { \
     251                 :            :   _ARM0 (m);                                                      \
     252                 :            :   _DEFM ();                                                       \
     253                 :            :   _RETM (cfunc (*m));                                             \
     254                 :            : }                                                                 \
     255                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_mv) (constant * args) {\
     256                 :            :   _ARMV0 (mv);                                                    \
     257                 :            :   _DEFMV ();                                                      \
     258                 :            :   _RETMV (cfunc (*mv));                                           \
     259                 :            : }
     260                 :            : 
     261 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0 (exp);    // exponential function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     262 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0 (limexp); // limited exponential function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     263 [ +  - ][ +  - ]:          9 : MAKE_FUNC_DEFINITION_0 (sin);    // sine
         [ +  - ][ #  # ]
         [ #  # ][ #  # ]
     264 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0 (cos);    // cosine
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     265 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0 (tan);    // tangent
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     266 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0 (sinh);   // sine hyperbolicus
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     267 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0 (cosh);   // cosine hyperbolicus
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     268 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0 (tanh);   // tangent hyperbolicus
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     269 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_QUCS (coth);   // cotangent hyperbolicus
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     270 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_QUCS (sech);   // secans hyperbolicus
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     271 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_QUCS (cosech); // cosecans hyperbolicus
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     272 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_QUCS (signum); // signum function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     273 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_QUCS (sign);   // sign function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     274 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_QUCS (sinc);   // sin(x)/x aka sinc function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     275 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0 (sqr);    // square value
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     276                 :            : 
     277 [ #  # ][ #  # ]:          1 : MAKE_FUNC_DEFINITION_1 (real);   // real value
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
         [ +  - ][ #  # ]
                 [ #  # ]
     278 [ #  # ][ #  # ]:          1 : MAKE_FUNC_DEFINITION_1 (imag);   // imaginary value
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
         [ +  - ][ #  # ]
                 [ #  # ]
     279 [ #  # ][ #  # ]:         26 : MAKE_FUNC_DEFINITION_1 (abs);    // absolute value
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
         [ +  - ][ #  # ]
                 [ #  # ]
     280                 :            : 
     281                 :            : // ******************** unary plus *************************
     282                 :          0 : constant * evaluate::plus_d (constant * args) {
     283         [ #  # ]:          0 :   _ARD0 (d1); _DEFD (); _RETD (d1);
     284                 :            : }
     285                 :            : 
     286                 :          0 : constant * evaluate::plus_c (constant * args) {
     287         [ #  # ]:          0 :   _ARC0 (c1); _DEFC (); _RETC (*c1);
     288                 :            : }
     289                 :            : 
     290                 :          0 : constant * evaluate::plus_v (constant * args) {
     291 [ #  # ][ #  # ]:          0 :   _ARV0 (v1); _DEFV (); _RETV (*v1);
     292                 :            : }
     293                 :            : 
     294                 :          0 : constant * evaluate::plus_m (constant * args) {
     295 [ #  # ][ #  # ]:          0 :   _ARM0 (m1); _DEFM (); _RETM (*m1);
     296                 :            : }
     297                 :            : 
     298                 :          0 : constant * evaluate::plus_mv (constant * args) {
     299 [ #  # ][ #  # ]:          0 :   _ARMV0 (v1); _DEFMV (); _RETMV (*v1);
     300                 :            : }
     301                 :            : 
     302                 :            : // ****************** addition *****************************
     303                 :        101 : constant * evaluate::plus_d_d (constant * args) {
     304                 :        101 :   _ARD0 (d1);
     305                 :        101 :   _ARD1 (d2);
     306         [ +  - ]:        101 :   _DEFD ();
     307                 :        101 :   _RETD (d1 + d2);
     308                 :            : }
     309                 :            : 
     310                 :          0 : constant * evaluate::plus_c_c (constant * args) {
     311                 :          0 :   _ARC0 (c1);
     312                 :          0 :   _ARC1 (c2);
     313         [ #  # ]:          0 :   _DEFC ();
     314         [ #  # ]:          0 :   _RETC (*c1 + *c2);
     315                 :            : }
     316                 :            : 
     317                 :          0 : constant * evaluate::plus_c_d (constant * args) {
     318         [ #  # ]:          0 :   _ARC0 (c1);
     319         [ #  # ]:          0 :   _ARD1 (d2);
     320 [ #  # ][ #  # ]:          0 :   _DEFC ();
     321         [ #  # ]:          0 :   _RETC (*c1 + d2);
     322                 :            : }
     323                 :            : 
     324                 :          0 : constant * evaluate::plus_d_c (constant * args) {
     325         [ #  # ]:          0 :   _ARD0 (d1);
     326         [ #  # ]:          0 :   _ARC1 (c2);
     327 [ #  # ][ #  # ]:          0 :   _DEFC ();
     328         [ #  # ]:          0 :   _RETC (d1 + *c2);
     329                 :            : }
     330                 :            : 
     331                 :          1 : constant * evaluate::plus_v_d (constant * args) {
     332                 :          1 :   _ARV0 (v1);
     333                 :          1 :   _ARD1 (d2);
     334         [ +  - ]:          1 :   _DEFV ();
     335 [ +  - ][ +  - ]:          1 :   _RETV (*v1 + d2);
     336                 :            : }
     337                 :            : 
     338                 :          0 : constant * evaluate::plus_d_v (constant * args) {
     339                 :          0 :   _ARD0 (d1);
     340                 :          0 :   _ARV1 (v2);
     341         [ #  # ]:          0 :   _DEFV ();
     342 [ #  # ][ #  # ]:          0 :   _RETV (d1 + *v2);
     343                 :            : }
     344                 :            : 
     345                 :          0 : constant * evaluate::plus_v_c (constant * args) {
     346                 :          0 :   _ARV0 (v1);
     347                 :          0 :   _ARC1 (c2);
     348         [ #  # ]:          0 :   _DEFV ();
     349 [ #  # ][ #  # ]:          0 :   _RETV (*v1 + *c2);
     350                 :            : }
     351                 :            : 
     352                 :          0 : constant * evaluate::plus_c_v (constant * args) {
     353                 :          0 :   _ARC0 (c1);
     354                 :          0 :   _ARV1 (v2);
     355         [ #  # ]:          0 :   _DEFV ();
     356 [ #  # ][ #  # ]:          0 :   _RETV (*v2 + *c1);
     357                 :            : }
     358                 :            : 
     359                 :          2 : constant * evaluate::plus_v_v (constant * args) {
     360                 :          2 :   _ARV0 (v1);
     361                 :          2 :   _ARV1 (v2);
     362         [ +  - ]:          2 :   _DEFV ();
     363 [ +  - ][ +  - ]:          2 :   _RETV (*v1 + *v2);
         [ +  - ][ +  - ]
     364                 :            : }
     365                 :            : 
     366                 :          0 : constant * evaluate::plus_m_m (constant * args) {
     367                 :          0 :   _ARM0 (m1);
     368                 :          0 :   _ARM1 (m2);
     369         [ #  # ]:          0 :   _DEFM ();
     370 [ #  # ][ #  # ]:          0 :   _RETM (*m1 + *m2);
         [ #  # ][ #  # ]
     371                 :            : }
     372                 :            : 
     373                 :          0 : constant * evaluate::plus_mv_mv (constant * args) {
     374                 :          0 :   _ARMV0 (v1);
     375                 :          0 :   _ARMV1 (v2);
     376         [ #  # ]:          0 :   _DEFMV ();
     377 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 + *v2);
         [ #  # ][ #  # ]
     378                 :            : }
     379                 :            : 
     380                 :          0 : constant * evaluate::plus_mv_m (constant * args) {
     381                 :          0 :   _ARMV0 (v1);
     382                 :          0 :   _ARM1 (m2);
     383         [ #  # ]:          0 :   _DEFMV ();
     384 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 + *m2);
         [ #  # ][ #  # ]
     385                 :            : }
     386                 :            : 
     387                 :          0 : constant * evaluate::plus_m_mv (constant * args) {
     388                 :          0 :   _ARM0 (m1);
     389                 :          0 :   _ARMV1 (v2);
     390         [ #  # ]:          0 :   _DEFMV ();
     391 [ #  # ][ #  # ]:          0 :   _RETMV (*m1 + *v2);
         [ #  # ][ #  # ]
     392                 :            : }
     393                 :            : 
     394                 :          0 : constant * evaluate::plus_m_d (constant * args) {
     395                 :          0 :   _ARM0 (m1);
     396                 :          0 :   _ARD1 (d2);
     397         [ #  # ]:          0 :   _DEFM ();
     398 [ #  # ][ #  # ]:          0 :   _RETM (*m1 + d2);
     399                 :            : }
     400                 :            : 
     401                 :          0 : constant * evaluate::plus_d_m (constant * args) {
     402                 :          0 :   _ARD0 (d1);
     403                 :          0 :   _ARM1 (m2);
     404         [ #  # ]:          0 :   _DEFM ();
     405 [ #  # ][ #  # ]:          0 :   _RETM (d1 + *m2);
     406                 :            : }
     407                 :            : 
     408                 :          0 : constant * evaluate::plus_m_c (constant * args) {
     409                 :          0 :   _ARM0 (m1);
     410                 :          0 :   _ARC1 (c2);
     411         [ #  # ]:          0 :   _DEFM ();
     412 [ #  # ][ #  # ]:          0 :   _RETM (*m1 + *c2);
     413                 :            : }
     414                 :            : 
     415                 :          0 : constant * evaluate::plus_c_m (constant * args) {
     416                 :          0 :   _ARC0 (c1);
     417                 :          0 :   _ARM1 (m2);
     418         [ #  # ]:          0 :   _DEFM ();
     419 [ #  # ][ #  # ]:          0 :   _RETM (*c1 + *m2);
     420                 :            : }
     421                 :            : 
     422                 :          0 : constant * evaluate::plus_mv_d (constant * args) {
     423                 :          0 :   _ARMV0 (m1);
     424                 :          0 :   _ARD1  (d2);
     425         [ #  # ]:          0 :   _DEFMV ();
     426 [ #  # ][ #  # ]:          0 :   _RETMV (*m1 + d2);
     427                 :            : }
     428                 :            : 
     429                 :          0 : constant * evaluate::plus_d_mv (constant * args) {
     430                 :          0 :   _ARD0  (d1);
     431                 :          0 :   _ARMV1 (m2);
     432         [ #  # ]:          0 :   _DEFMV ();
     433 [ #  # ][ #  # ]:          0 :   _RETMV (d1 + *m2);
     434                 :            : }
     435                 :            : 
     436                 :          0 : constant * evaluate::plus_mv_c (constant * args) {
     437                 :          0 :   _ARMV0 (m1);
     438                 :          0 :   _ARC1  (c2);
     439         [ #  # ]:          0 :   _DEFMV ();
     440 [ #  # ][ #  # ]:          0 :   _RETMV (*m1 + *c2);
     441                 :            : }
     442                 :            : 
     443                 :          0 : constant * evaluate::plus_c_mv (constant * args) {
     444                 :          0 :   _ARC0  (c1);
     445                 :          0 :   _ARMV1 (m2);
     446         [ #  # ]:          0 :   _DEFMV ();
     447 [ #  # ][ #  # ]:          0 :   _RETMV (*c1 + *m2);
     448                 :            : }
     449                 :            : 
     450                 :          0 : constant * evaluate::plus_mv_v (constant * args) {
     451                 :          0 :   _ARMV0 (m1);
     452                 :          0 :   _ARV1  (v2);
     453         [ #  # ]:          0 :   _DEFMV ();
     454 [ #  # ][ #  # ]:          0 :   _RETMV (*m1 + *v2);
         [ #  # ][ #  # ]
     455                 :            : }
     456                 :            : 
     457                 :          0 : constant * evaluate::plus_v_mv (constant * args) {
     458                 :          0 :   _ARV0  (v1);
     459                 :          0 :   _ARMV1 (m2);
     460         [ #  # ]:          0 :   _DEFMV ();
     461 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 + *m2);
         [ #  # ][ #  # ]
     462                 :            : }
     463                 :            : 
     464                 :          0 : constant * evaluate::plus_s_s (constant * args) {
     465                 :          0 :   char * s1 = STR (_ARES(0));
     466                 :          0 :   char * s2 = STR (_ARES(1));
     467         [ #  # ]:          0 :   constant * res = new constant (TAG_STRING);
     468                 :          0 :   char * p = (char *) malloc (strlen (s1) + strlen (s2) + 1);
     469                 :          0 :   strcpy (p, s1); strcat (p, s2);
     470                 :          0 :   res->s = p;
     471                 :          0 :   return res;
     472                 :            : }
     473                 :            : 
     474                 :          0 : constant * evaluate::plus_c_s (constant * args) {
     475                 :          0 :   char   c1 = CHR (_ARES(0));
     476                 :          0 :   char * s2 = STR (_ARES(1));
     477         [ #  # ]:          0 :   constant * res = new constant (TAG_STRING);
     478                 :          0 :   char * p = (char *) malloc (strlen (s2) + 2);
     479                 :          0 :   p[0] = c1; strcpy (&p[1], s2);
     480                 :          0 :   res->s = p;
     481                 :          0 :   return res;
     482                 :            : }
     483                 :            : 
     484                 :          0 : constant * evaluate::plus_s_c (constant * args) {
     485                 :          0 :   char * s1 = STR (_ARES(0));
     486                 :          0 :   char   c2 = CHR (_ARES(1));
     487         [ #  # ]:          0 :   constant * res = new constant (TAG_STRING);
     488                 :          0 :   char * p = (char *) malloc (strlen (s1) + 2);
     489                 :          0 :   strcpy (p, s1); p[strlen (s1)] = c2; p[strlen (s1) + 1] = '\0';
     490                 :          0 :   res->s = p;
     491                 :          0 :   return res;
     492                 :            : }
     493                 :            : 
     494                 :            : // ******************** unary minus ***************************
     495                 :        202 : constant * evaluate::minus_d (constant * args) {
     496         [ +  - ]:        202 :   _ARD0 (d1); _DEFD (); _RETD (-d1);
     497                 :            : }
     498                 :            : 
     499                 :          0 : constant * evaluate::minus_c (constant * args) {
     500         [ #  # ]:          0 :   _ARC0 (c1); _DEFC (); _RETC (-*c1);
     501                 :            : }
     502                 :            : 
     503                 :         10 : constant * evaluate::minus_v (constant * args) {
     504 [ +  - ][ +  - ]:         10 :   _ARV0 (v1); _DEFV (); _RETV (-*v1);
     505                 :            : }
     506                 :            : 
     507                 :          0 : constant * evaluate::minus_m (constant * args) {
     508 [ #  # ][ #  # ]:          0 :   _ARM0 (m1); _DEFM (); _RETM (-*m1);
     509                 :            : }
     510                 :            : 
     511                 :          0 : constant * evaluate::minus_mv (constant * args) {
     512 [ #  # ][ #  # ]:          0 :   _ARMV0 (v1); _DEFMV (); _RETMV (-*v1);
     513                 :            : }
     514                 :            : 
     515                 :            : // ****************** subtraction *****************************
     516                 :        107 : constant * evaluate::minus_d_d (constant * args) {
     517                 :        107 :   _ARD0 (d1);
     518                 :        107 :   _ARD1 (d2);
     519         [ +  - ]:        107 :   _DEFD ();
     520                 :        107 :   _RETD (d1 - d2);
     521                 :            : }
     522                 :            : 
     523                 :          0 : constant * evaluate::minus_c_c (constant * args) {
     524                 :          0 :   _ARC0 (c1);
     525                 :          0 :   _ARC1 (c2);
     526         [ #  # ]:          0 :   _DEFC ();
     527         [ #  # ]:          0 :   _RETC (*c1 - *c2);
     528                 :            : }
     529                 :            : 
     530                 :          0 : constant * evaluate::minus_c_d (constant * args) {
     531         [ #  # ]:          0 :   _ARC0 (c1);
     532         [ #  # ]:          0 :   _ARD1 (d2);
     533 [ #  # ][ #  # ]:          0 :   _DEFC ();
     534         [ #  # ]:          0 :   _RETC (*c1 - d2);
     535                 :            : }
     536                 :            : 
     537                 :          0 : constant * evaluate::minus_d_c (constant * args) {
     538         [ #  # ]:          0 :   _ARD0 (d1);
     539         [ #  # ]:          0 :   _ARC1 (c2);
     540 [ #  # ][ #  # ]:          0 :   _DEFC ();
     541         [ #  # ]:          0 :   _RETC (d1 - *c2);
     542                 :            : }
     543                 :            : 
     544                 :         14 : constant * evaluate::minus_v_d (constant * args) {
     545                 :         14 :   _ARV0 (v1);
     546                 :         14 :   _ARD1 (d2);
     547         [ +  - ]:         14 :   _DEFV ();
     548 [ +  - ][ +  - ]:         14 :   _RETV (*v1 - d2);
     549                 :            : }
     550                 :            : 
     551                 :          0 : constant * evaluate::minus_d_v (constant * args) {
     552                 :          0 :   _ARD0 (d1);
     553                 :          0 :   _ARV1 (v2);
     554         [ #  # ]:          0 :   _DEFV ();
     555 [ #  # ][ #  # ]:          0 :   _RETV (d1 - *v2);
     556                 :            : }
     557                 :            : 
     558                 :          0 : constant * evaluate::minus_v_c (constant * args) {
     559                 :          0 :   _ARV0 (v1);
     560                 :          0 :   _ARC1 (c2);
     561         [ #  # ]:          0 :   _DEFV ();
     562 [ #  # ][ #  # ]:          0 :   _RETV (*v1 - *c2);
     563                 :            : }
     564                 :            : 
     565                 :          0 : constant * evaluate::minus_c_v (constant * args) {
     566                 :          0 :   _ARC0 (c1);
     567                 :          0 :   _ARV1 (v2);
     568         [ #  # ]:          0 :   _DEFV ();
     569 [ #  # ][ #  # ]:          0 :   _RETV (*c1 - *v2);
     570                 :            : }
     571                 :            : 
     572                 :         18 : constant * evaluate::minus_v_v (constant * args) {
     573                 :         18 :   _ARV0 (v1);
     574                 :         18 :   _ARV1 (v2);
     575         [ +  - ]:         18 :   _DEFV ();
     576 [ +  - ][ +  - ]:         18 :   _RETV (*v1 - *v2);
         [ +  - ][ +  - ]
     577                 :            : }
     578                 :            : 
     579                 :          0 : constant * evaluate::minus_m_m (constant * args) {
     580                 :          0 :   _ARM0 (m1);
     581                 :          0 :   _ARM1 (m2);
     582         [ #  # ]:          0 :   _DEFM ();
     583 [ #  # ][ #  # ]:          0 :   _RETM (*m1 - *m2);
         [ #  # ][ #  # ]
     584                 :            : }
     585                 :            : 
     586                 :          0 : constant * evaluate::minus_mv_mv (constant * args) {
     587                 :          0 :   _ARMV0 (v1);
     588                 :          0 :   _ARMV1 (v2);
     589         [ #  # ]:          0 :   _DEFMV ();
     590 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 - *v2);
         [ #  # ][ #  # ]
     591                 :            : }
     592                 :            : 
     593                 :          0 : constant * evaluate::minus_mv_m (constant * args) {
     594                 :          0 :   _ARMV0 (v1);
     595                 :          0 :   _ARM1 (m2);
     596         [ #  # ]:          0 :   _DEFMV ();
     597 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 - *m2);
         [ #  # ][ #  # ]
     598                 :            : }
     599                 :            : 
     600                 :          0 : constant * evaluate::minus_m_mv (constant * args) {
     601                 :          0 :   _ARM0 (m1);
     602                 :          0 :   _ARMV1 (v2);
     603         [ #  # ]:          0 :   _DEFMV ();
     604 [ #  # ][ #  # ]:          0 :   _RETMV (*m1 - *v2);
         [ #  # ][ #  # ]
     605                 :            : }
     606                 :            : 
     607                 :          0 : constant * evaluate::minus_m_d (constant * args) {
     608                 :          0 :   _ARM0 (m1);
     609                 :          0 :   _ARD1 (d2);
     610         [ #  # ]:          0 :   _DEFM ();
     611 [ #  # ][ #  # ]:          0 :   _RETM (*m1 - d2);
     612                 :            : }
     613                 :            : 
     614                 :          0 : constant * evaluate::minus_d_m (constant * args) {
     615                 :          0 :   _ARD0 (d1);
     616                 :          0 :   _ARM1 (m2);
     617         [ #  # ]:          0 :   _DEFM ();
     618 [ #  # ][ #  # ]:          0 :   _RETM (d1 - *m2);
     619                 :            : }
     620                 :            : 
     621                 :          0 : constant * evaluate::minus_m_c (constant * args) {
     622                 :          0 :   _ARM0 (m1);
     623                 :          0 :   _ARC1 (c2);
     624         [ #  # ]:          0 :   _DEFM ();
     625 [ #  # ][ #  # ]:          0 :   _RETM (*m1 - *c2);
     626                 :            : }
     627                 :            : 
     628                 :          0 : constant * evaluate::minus_c_m (constant * args) {
     629                 :          0 :   _ARC0 (c1);
     630                 :          0 :   _ARM1 (m2);
     631         [ #  # ]:          0 :   _DEFM ();
     632 [ #  # ][ #  # ]:          0 :   _RETM (*c1 - *m2);
     633                 :            : }
     634                 :            : 
     635                 :          0 : constant * evaluate::minus_mv_d (constant * args) {
     636                 :          0 :   _ARMV0 (m1);
     637                 :          0 :   _ARD1  (d2);
     638         [ #  # ]:          0 :   _DEFMV ();
     639 [ #  # ][ #  # ]:          0 :   _RETMV (*m1 - d2);
     640                 :            : }
     641                 :            : 
     642                 :          0 : constant * evaluate::minus_d_mv (constant * args) {
     643                 :          0 :   _ARD0  (d1);
     644                 :          0 :   _ARMV1 (m2);
     645         [ #  # ]:          0 :   _DEFMV ();
     646 [ #  # ][ #  # ]:          0 :   _RETMV (d1 - *m2);
     647                 :            : }
     648                 :            : 
     649                 :          0 : constant * evaluate::minus_mv_c (constant * args) {
     650                 :          0 :   _ARMV0 (m1);
     651                 :          0 :   _ARC1  (c2);
     652         [ #  # ]:          0 :   _DEFMV ();
     653 [ #  # ][ #  # ]:          0 :   _RETMV (*m1 - *c2);
     654                 :            : }
     655                 :            : 
     656                 :          0 : constant * evaluate::minus_c_mv (constant * args) {
     657                 :          0 :   _ARC0  (c1);
     658                 :          0 :   _ARMV1 (m2);
     659         [ #  # ]:          0 :   _DEFMV ();
     660 [ #  # ][ #  # ]:          0 :   _RETMV (*c1 - *m2);
     661                 :            : }
     662                 :            : 
     663                 :          0 : constant * evaluate::minus_mv_v (constant * args) {
     664                 :          0 :   _ARMV0 (m1);
     665                 :          0 :   _ARV1  (v2);
     666         [ #  # ]:          0 :   _DEFMV ();
     667 [ #  # ][ #  # ]:          0 :   _RETMV (*m1 - *v2);
         [ #  # ][ #  # ]
     668                 :            : }
     669                 :            : 
     670                 :          0 : constant * evaluate::minus_v_mv (constant * args) {
     671                 :          0 :   _ARV0  (v1);
     672                 :          0 :   _ARMV1 (m2);
     673         [ #  # ]:          0 :   _DEFMV ();
     674 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 - *m2);
         [ #  # ][ #  # ]
     675                 :            : }
     676                 :            : 
     677                 :            : // ****************** multiplication *************************
     678                 :         30 : constant * evaluate::times_d_d (constant * args) {
     679                 :         30 :   _ARD0 (d1);
     680                 :         30 :   _ARD1 (d2);
     681         [ +  - ]:         30 :   _DEFD ();
     682                 :         30 :   _RETD (d1 * d2);
     683                 :            : }
     684                 :            : 
     685                 :          0 : constant * evaluate::times_c_c (constant * args) {
     686                 :          0 :   _ARC0 (c1);
     687                 :          0 :   _ARC1 (c2);
     688         [ #  # ]:          0 :   _DEFC ();
     689         [ #  # ]:          0 :   _RETC ((*c1) * (*c2));
     690                 :            : }
     691                 :            : 
     692                 :          0 : constant * evaluate::times_c_d (constant * args) {
     693         [ #  # ]:          0 :   _ARC0 (c1);
     694         [ #  # ]:          0 :   _ARD1 (d2);
     695 [ #  # ][ #  # ]:          0 :   _DEFC ();
     696         [ #  # ]:          0 :   _RETC ((*c1) * d2);
     697                 :            : }
     698                 :            : 
     699                 :          7 : constant * evaluate::times_d_c (constant * args) {
     700         [ +  - ]:          7 :   _ARD0 (d1);
     701         [ +  - ]:          7 :   _ARC1 (c2);
     702 [ +  - ][ +  - ]:          7 :   _DEFC ();
     703         [ +  - ]:          7 :   _RETC (d1 * (*c2));
     704                 :            : }
     705                 :            : 
     706                 :          0 : constant * evaluate::times_v_d (constant * args) {
     707                 :          0 :   _ARV0 (v1);
     708                 :          0 :   _ARD1 (d2);
     709         [ #  # ]:          0 :   _DEFV ();
     710 [ #  # ][ #  # ]:          0 :   _RETV (*v1 * d2);
     711                 :            :   return res;
     712                 :            : }
     713                 :            : 
     714                 :         21 : constant * evaluate::times_d_v (constant * args) {
     715                 :         21 :   _ARD0 (d1);
     716                 :         21 :   _ARV1 (v2);
     717         [ +  - ]:         21 :   _DEFV ();
     718 [ +  - ][ +  - ]:         21 :   _RETV (d1 * *v2);
     719                 :            : }
     720                 :            : 
     721                 :          0 : constant * evaluate::times_v_c (constant * args) {
     722                 :          0 :   _ARV0 (v1);
     723                 :          0 :   _ARC1 (c2);
     724         [ #  # ]:          0 :   _DEFV ();
     725 [ #  # ][ #  # ]:          0 :   _RETV (*v1 * *c2);
     726                 :            : }
     727                 :            : 
     728                 :          0 : constant * evaluate::times_c_v (constant * args) {
     729                 :          0 :   _ARC0 (c1);
     730                 :          0 :   _ARV1 (v2);
     731         [ #  # ]:          0 :   _DEFV ();
     732 [ #  # ][ #  # ]:          0 :   _RETV (*c1 * *v2);
     733                 :            : }
     734                 :            : 
     735                 :          0 : constant * evaluate::times_v_v (constant * args) {
     736                 :          0 :   _ARV0 (v1);
     737                 :          0 :   _ARV1 (v2);
     738         [ #  # ]:          0 :   _DEFV ();
     739 [ #  # ][ #  # ]:          0 :   _RETV (*v1 * *v2);
         [ #  # ][ #  # ]
     740                 :            : }
     741                 :            : 
     742                 :          0 : constant * evaluate::times_m_m (constant * args) {
     743                 :          0 :   _ARM0 (m1);
     744                 :          0 :   _ARM1 (m2);
     745         [ #  # ]:          0 :   _DEFM ();
     746         [ #  # ]:          0 :   if (m1->getCols () != m2->getRows ()) {
     747         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("nonconformant arguments in matrix multiplication");
     748         [ #  # ]:          0 :     res->m = new matrix (m1->getRows (), m2->getCols ());
     749                 :            :   } else {
     750 [ #  # ][ #  # ]:          0 :     res->m = new matrix (*m1 * *m2);
         [ #  # ][ #  # ]
     751                 :            :   }
     752                 :          0 :   return res;
     753                 :            : }
     754                 :            : 
     755                 :          0 : constant * evaluate::times_m_c (constant * args) {
     756                 :          0 :   _ARM0 (m1);
     757                 :          0 :   _ARC1 (c2);
     758         [ #  # ]:          0 :   _DEFM ();
     759 [ #  # ][ #  # ]:          0 :   _RETM (*m1 * *c2);
     760                 :            : }
     761                 :            : 
     762                 :          0 : constant * evaluate::times_c_m (constant * args) {
     763                 :          0 :   _ARC0 (c1);
     764                 :          0 :   _ARM1 (m2);
     765         [ #  # ]:          0 :   _DEFM ();
     766 [ #  # ][ #  # ]:          0 :   _RETM (*c1 * *m2);
     767                 :            : }
     768                 :            : 
     769                 :          0 : constant * evaluate::times_m_d (constant * args) {
     770                 :          0 :   _ARM0 (m1);
     771                 :          0 :   _ARD1 (d2);
     772         [ #  # ]:          0 :   _DEFM ();
     773 [ #  # ][ #  # ]:          0 :   _RETM (*m1 * d2);
     774                 :            : }
     775                 :            : 
     776                 :          0 : constant * evaluate::times_d_m (constant * args) {
     777                 :          0 :   _ARD0 (d1);
     778                 :          0 :   _ARM1 (m2);
     779         [ #  # ]:          0 :   _DEFM ();
     780 [ #  # ][ #  # ]:          0 :   _RETM (d1 * *m2);
     781                 :            : }
     782                 :            : 
     783                 :          0 : constant * evaluate::times_mv_mv (constant * args) {
     784                 :          0 :   _ARMV0 (v1);
     785                 :          0 :   _ARMV1 (v2);
     786         [ #  # ]:          0 :   _DEFMV ();
     787         [ #  # ]:          0 :   if (v1->getCols () != v2->getRows ()) {
     788         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("nonconformant arguments in matrix multiplication");
     789         [ #  # ]:          0 :     res->mv = new matvec (v1->getSize (), v1->getRows (), v2->getCols ());
     790                 :            :   } else {
     791 [ #  # ][ #  # ]:          0 :     res->mv = new matvec (*v1 * *v2);
         [ #  # ][ #  # ]
     792                 :            :   }
     793                 :          0 :   return res;
     794                 :            : }
     795                 :            : 
     796                 :          0 : constant * evaluate::times_mv_c (constant * args) {
     797                 :          0 :   _ARMV0 (v1);
     798                 :          0 :   _ARC1 (c2);
     799         [ #  # ]:          0 :   _DEFMV ();
     800 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 * *c2);
     801                 :            : }
     802                 :            : 
     803                 :          0 : constant * evaluate::times_c_mv (constant * args) {
     804                 :          0 :   _ARC0 (c1);
     805                 :          0 :   _ARMV1 (v2);
     806         [ #  # ]:          0 :   _DEFMV ();
     807 [ #  # ][ #  # ]:          0 :   _RETMV (*c1 * *v2);
     808                 :            : }
     809                 :            : 
     810                 :          0 : constant * evaluate::times_mv_d (constant * args) {
     811                 :          0 :   _ARMV0 (v1);
     812                 :          0 :   _ARD1 (d2);
     813         [ #  # ]:          0 :   _DEFMV ();
     814 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 * d2);
     815                 :            : }
     816                 :            : 
     817                 :          0 : constant * evaluate::times_d_mv (constant * args) {
     818                 :          0 :   _ARD0 (d1);
     819                 :          0 :   _ARMV1 (v2);
     820         [ #  # ]:          0 :   _DEFMV ();
     821 [ #  # ][ #  # ]:          0 :   _RETMV (d1 * *v2);
     822                 :            : }
     823                 :            : 
     824                 :          0 : constant * evaluate::times_mv_m (constant * args) {
     825                 :          0 :   _ARMV0 (v1);
     826                 :          0 :   _ARM1 (m2);
     827         [ #  # ]:          0 :   _DEFMV ();
     828         [ #  # ]:          0 :   if (v1->getCols () != m2->getRows ()) {
     829         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("nonconformant arguments in matrix multiplication");
     830         [ #  # ]:          0 :     res->mv = new matvec (v1->getSize (), v1->getRows (), m2->getCols ());
     831                 :            :   } else {
     832 [ #  # ][ #  # ]:          0 :     res->mv = new matvec (*v1 * *m2);
         [ #  # ][ #  # ]
     833                 :            :   }
     834                 :          0 :   return res;
     835                 :            : }
     836                 :            : 
     837                 :          0 : constant * evaluate::times_m_mv (constant * args) {
     838                 :          0 :   _ARM0 (m1);
     839                 :          0 :   _ARMV1 (v2);
     840         [ #  # ]:          0 :   _DEFMV ();
     841         [ #  # ]:          0 :   if (m1->getCols () != v2->getRows ()) {
     842         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("nonconformant arguments in matrix multiplication");
     843         [ #  # ]:          0 :     res->mv = new matvec (v2->getSize (), m1->getRows (), v2->getCols ());
     844                 :            :   } else {
     845 [ #  # ][ #  # ]:          0 :     res->mv = new matvec (*m1 * *v2);
         [ #  # ][ #  # ]
     846                 :            :   }
     847                 :          0 :   return res;
     848                 :            : }
     849                 :            : 
     850                 :          0 : constant * evaluate::times_mv_v (constant * args) {
     851                 :          0 :   _ARMV0 (v1);
     852                 :          0 :   _ARV1 (v2);
     853         [ #  # ]:          0 :   _DEFMV ();
     854 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 * *v2);
         [ #  # ][ #  # ]
     855                 :            : }
     856                 :            : 
     857                 :          0 : constant * evaluate::times_v_mv (constant * args) {
     858                 :          0 :   _ARV0 (v1);
     859                 :          0 :   _ARMV1 (v2);
     860         [ #  # ]:          0 :   _DEFMV ();
     861 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 * *v2);
         [ #  # ][ #  # ]
     862                 :            : }
     863                 :            : 
     864                 :            : // ****************** division *************************
     865                 :        123 : constant * evaluate::over_d_d (constant * args) {
     866                 :        123 :   _ARD0 (d1);
     867                 :        123 :   _ARD1 (d2);
     868         [ +  - ]:        123 :   _DEFD ();
     869 [ -  + ][ #  # ]:        123 :   if (d2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
     870                 :        123 :   _RETD (d1 / d2);
     871                 :            : }
     872                 :            : 
     873                 :          0 : constant * evaluate::over_c_c (constant * args) {
     874                 :          0 :   _ARC0 (c1);
     875                 :          0 :   _ARC1 (c2);
     876         [ #  # ]:          0 :   _DEFC ();
     877 [ #  # ][ #  # ]:          0 :   if (*c2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
     878         [ #  # ]:          0 :   _RETC (*c1 / *c2);
     879                 :            : }
     880                 :            : 
     881                 :          0 : constant * evaluate::over_c_d (constant * args) {
     882         [ #  # ]:          0 :   _ARC0 (c1);
     883         [ #  # ]:          0 :   _ARD1 (d2);
     884 [ #  # ][ #  # ]:          0 :   _DEFC ();
     885 [ #  # ][ #  # ]:          0 :   if (d2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
         [ #  # ][ #  # ]
                 [ #  # ]
     886         [ #  # ]:          0 :   _RETC (*c1 / d2);
     887                 :            : }
     888                 :            : 
     889                 :          0 : constant * evaluate::over_d_c (constant * args) {
     890         [ #  # ]:          0 :   _ARD0 (d1);
     891         [ #  # ]:          0 :   _ARC1 (c2);
     892 [ #  # ][ #  # ]:          0 :   _DEFC ();
     893 [ #  # ][ #  # ]:          0 :   if (*c2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
         [ #  # ][ #  # ]
                 [ #  # ]
     894 [ #  # ][ #  # ]:          0 :   _RETC (d1 / *c2);
     895                 :            : }
     896                 :            : 
     897                 :          0 : constant * evaluate::over_v_d (constant * args) {
     898                 :          0 :   _ARV0 (v1);
     899                 :          0 :   _ARD1 (d2);
     900         [ #  # ]:          0 :   _DEFV ();
     901 [ #  # ][ #  # ]:          0 :   if (d2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
     902 [ #  # ][ #  # ]:          0 :   _RETV (*v1 / d2);
     903                 :            : }
     904                 :            : 
     905                 :          0 : constant * evaluate::over_d_v (constant * args) {
     906                 :          0 :   _ARD0 (d1);
     907                 :          0 :   _ARV1 (v2);
     908         [ #  # ]:          0 :   _DEFV ();
     909 [ #  # ][ #  # ]:          0 :   _RETV (d1 / *v2);
     910                 :            : }
     911                 :            : 
     912                 :          3 : constant * evaluate::over_v_c (constant * args) {
     913                 :          3 :   _ARV0 (v1);
     914                 :          3 :   _ARC1 (c2);
     915         [ +  - ]:          3 :   _DEFV ();
     916 [ -  + ][ #  # ]:          3 :   if (*c2 == 0.0) THROW_MATH_EXCEPTION ("division by zero");
     917 [ +  - ][ +  - ]:          3 :   _RETV (*v1 / *c2);
     918                 :            : }
     919                 :            : 
     920                 :          0 : constant * evaluate::over_c_v (constant * args) {
     921                 :          0 :   _ARC0 (c1);
     922                 :          0 :   _ARV1 (v2);
     923         [ #  # ]:          0 :   _DEFV ();
     924 [ #  # ][ #  # ]:          0 :   _RETV (*c1 / *v2);
     925                 :            : }
     926                 :            : 
     927                 :         13 : constant * evaluate::over_v_v (constant * args) {
     928                 :         13 :   _ARV0 (v1);
     929                 :         13 :   _ARV1 (v2);
     930         [ +  - ]:         13 :   _DEFV ();
     931 [ +  - ][ +  - ]:         13 :   _RETV (*v1 / *v2);
         [ +  - ][ +  - ]
     932                 :            : }
     933                 :            : 
     934                 :          0 : constant * evaluate::over_m_c (constant * args) {
     935                 :          0 :   _ARM0 (m1);
     936                 :          0 :   _ARC1 (c2);
     937         [ #  # ]:          0 :   _DEFM ();
     938 [ #  # ][ #  # ]:          0 :   _RETM (*m1 / *c2);
     939                 :            : }
     940                 :            : 
     941                 :          0 : constant * evaluate::over_m_d (constant * args) {
     942                 :          0 :   _ARM0 (m1);
     943                 :          0 :   _ARD1 (d2);
     944         [ #  # ]:          0 :   _DEFM ();
     945 [ #  # ][ #  # ]:          0 :   _RETM (*m1 / d2);
     946                 :            : }
     947                 :            : 
     948                 :          0 : constant * evaluate::over_mv_c (constant * args) {
     949                 :          0 :   _ARMV0 (v1);
     950                 :          0 :   _ARC1 (c2);
     951         [ #  # ]:          0 :   _DEFMV ();
     952 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 / *c2);
     953                 :            : }
     954                 :            : 
     955                 :          0 : constant * evaluate::over_mv_d (constant * args) {
     956                 :          0 :   _ARMV0 (v1);
     957                 :          0 :   _ARD1 (d2);
     958         [ #  # ]:          0 :   _DEFMV ();
     959 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 / d2);
     960                 :            : }
     961                 :            : 
     962                 :          0 : constant * evaluate::over_mv_v (constant * args) {
     963                 :          0 :   _ARMV0 (v1);
     964                 :          0 :   _ARV1 (v2);
     965         [ #  # ]:          0 :   _DEFMV ();
     966 [ #  # ][ #  # ]:          0 :   _RETMV (*v1 / *v2);
         [ #  # ][ #  # ]
     967                 :            : }
     968                 :            : 
     969                 :            : // ****************** modulo *************************
     970                 :          0 : constant * evaluate::modulo_d_d (constant * args) {
     971                 :          0 :   _ARD0 (d1);
     972                 :          0 :   _ARD1 (d2);
     973         [ #  # ]:          0 :   _DEFD ();
     974                 :          0 :   _RETD (std::fmod (d1, d2));
     975                 :            : }
     976                 :            : 
     977                 :          0 : constant * evaluate::modulo_c_c (constant * args) {
     978                 :          0 :   _ARC0 (c1);
     979                 :          0 :   _ARC1 (c2);
     980         [ #  # ]:          0 :   _DEFC ();
     981         [ #  # ]:          0 :   _RETC ((*c1) % (*c2));
     982                 :            : }
     983                 :            : 
     984                 :          0 : constant * evaluate::modulo_c_d (constant * args) {
     985                 :          0 :   _ARC0 (c1);
     986                 :          0 :   _ARD1 (d2);
     987         [ #  # ]:          0 :   _DEFC ();
     988         [ #  # ]:          0 :   _RETC ((*c1) % d2);
     989                 :            : }
     990                 :            : 
     991                 :          0 : constant * evaluate::modulo_d_c (constant * args) {
     992                 :          0 :   _ARD0 (d1);
     993                 :          0 :   _ARC1 (c2);
     994         [ #  # ]:          0 :   _DEFC ();
     995         [ #  # ]:          0 :   _RETC (d1 % (*c2));
     996                 :            : }
     997                 :            : 
     998                 :          0 : constant * evaluate::modulo_v_d (constant * args) {
     999                 :          0 :   _ARV0 (v1);
    1000                 :          0 :   _ARD1 (d2);
    1001         [ #  # ]:          0 :   _DEFV ();
    1002 [ #  # ][ #  # ]:          0 :   _RETV (*v1 % d2);
    1003                 :            : }
    1004                 :            : 
    1005                 :          0 : constant * evaluate::modulo_d_v (constant * args) {
    1006                 :          0 :   _ARD0 (d1);
    1007                 :          0 :   _ARV1 (v2);
    1008         [ #  # ]:          0 :   _DEFV ();
    1009 [ #  # ][ #  # ]:          0 :   _RETV (d1 % *v2);
    1010                 :            : }
    1011                 :            : 
    1012                 :          0 : constant * evaluate::modulo_v_c (constant * args) {
    1013                 :          0 :   _ARV0 (v1);
    1014                 :          0 :   _ARC1 (c2);
    1015         [ #  # ]:          0 :   _DEFV ();
    1016 [ #  # ][ #  # ]:          0 :   _RETV (*v1 % *c2);
    1017                 :            : }
    1018                 :            : 
    1019                 :          0 : constant * evaluate::modulo_c_v (constant * args) {
    1020                 :          0 :   _ARC0 (c1);
    1021                 :          0 :   _ARV1 (v2);
    1022         [ #  # ]:          0 :   _DEFV ();
    1023 [ #  # ][ #  # ]:          0 :   _RETV (*c1 % *v2);
    1024                 :            : }
    1025                 :            : 
    1026                 :          0 : constant * evaluate::modulo_v_v (constant * args) {
    1027                 :          0 :   _ARV0 (v1);
    1028                 :          0 :   _ARV1 (v2);
    1029         [ #  # ]:          0 :   _DEFV ();
    1030 [ #  # ][ #  # ]:          0 :   _RETV (*v1 % *v2);
         [ #  # ][ #  # ]
    1031                 :            : }
    1032                 :            : 
    1033                 :            : // ****************** power *************************
    1034                 :          0 : constant * evaluate::power_d_d (constant * args) {
    1035                 :          0 :   _ARD0 (d1);
    1036                 :          0 :   _ARD1 (d2);
    1037         [ #  # ]:          0 :   _DEFD ();
    1038                 :          0 :   _RETD (std::pow (d1, d2));
    1039                 :            : }
    1040                 :            : 
    1041                 :          0 : constant * evaluate::power_c_c (constant * args) {
    1042                 :          0 :   _ARC0 (c1);
    1043                 :          0 :   _ARC1 (c2);
    1044         [ #  # ]:          0 :   _DEFC ();
    1045                 :          0 :   _RETC (std::pow (*c1, *c2));
    1046                 :            : }
    1047                 :            : 
    1048                 :          0 : constant * evaluate::power_c_d (constant * args) {
    1049                 :          0 :   _ARC0 (c1);
    1050                 :          0 :   _ARD1 (d2);
    1051         [ #  # ]:          0 :   _DEFC ();
    1052         [ #  # ]:          0 :   _RETC (pow (*c1, d2));
    1053                 :            : }
    1054                 :            : 
    1055                 :          0 : constant * evaluate::power_d_c (constant * args) {
    1056                 :          0 :   _ARD0 (d1);
    1057                 :          0 :   _ARC1 (c2);
    1058         [ #  # ]:          0 :   _DEFC ();
    1059         [ #  # ]:          0 :   _RETC (pow (d1, *c2));
    1060                 :            : }
    1061                 :            : 
    1062                 :          0 : constant * evaluate::power_v_d (constant * args) {
    1063                 :          0 :   _ARV0 (v1);
    1064                 :          0 :   _ARD1 (d2);
    1065         [ #  # ]:          0 :   _DEFV ();
    1066 [ #  # ][ #  # ]:          0 :   _RETV (pow (*v1, d2));
    1067                 :            : }
    1068                 :            : 
    1069                 :          0 : constant * evaluate::power_d_v (constant * args) {
    1070                 :          0 :   _ARD0 (d1);
    1071                 :          0 :   _ARV1 (v2);
    1072         [ #  # ]:          0 :   _DEFV ();
    1073 [ #  # ][ #  # ]:          0 :   _RETV (pow (d1, *v2));
    1074                 :            : }
    1075                 :            : 
    1076                 :          0 : constant * evaluate::power_v_c (constant * args) {
    1077                 :          0 :   _ARV0 (v1);
    1078                 :          0 :   _ARC1 (c2);
    1079         [ #  # ]:          0 :   _DEFV ();
    1080 [ #  # ][ #  # ]:          0 :   _RETV (pow (*v1, *c2));
    1081                 :            : }
    1082                 :            : 
    1083                 :          0 : constant * evaluate::power_c_v (constant * args) {
    1084                 :          0 :   _ARC0 (c1);
    1085                 :          0 :   _ARV1 (v2);
    1086         [ #  # ]:          0 :   _DEFV ();
    1087 [ #  # ][ #  # ]:          0 :   _RETV (pow (*c1, *v2));
    1088                 :            : }
    1089                 :            : 
    1090                 :          0 : constant * evaluate::power_v_v (constant * args) {
    1091                 :          0 :   _ARV0 (v1);
    1092                 :          0 :   _ARV1 (v2);
    1093         [ #  # ]:          0 :   _DEFV ();
    1094 [ #  # ][ #  # ]:          0 :   _RETV (pow (*v1, *v2));
         [ #  # ][ #  # ]
    1095                 :            : }
    1096                 :            : 
    1097                 :          0 : constant * evaluate::power_m_d (constant * args) {
    1098                 :          0 :   _ARM0 (m1);
    1099                 :          0 :   _ARI1 (i2);
    1100         [ #  # ]:          0 :   _DEFM ();
    1101 [ #  # ][ #  # ]:          0 :   _RETM (pow (*m1, i2));
    1102                 :            : }
    1103                 :            : 
    1104                 :          0 : constant * evaluate::power_m_c (constant * args) {
    1105                 :          0 :   _ARM0 (m1);
    1106                 :          0 :   _ARC1 (c2);
    1107         [ #  # ]:          0 :   _DEFM ();
    1108 [ #  # ][ #  # ]:          0 :   _RETM (pow (*m1, (int) real (*c2)));
    1109                 :            : }
    1110                 :            : 
    1111                 :          0 : constant * evaluate::power_mv_d (constant * args) {
    1112                 :          0 :   _ARMV0 (m1);
    1113                 :          0 :   _ARI1  (i2);
    1114         [ #  # ]:          0 :   _DEFMV ();
    1115 [ #  # ][ #  # ]:          0 :   _RETMV (pow (*m1, i2));
    1116                 :            : }
    1117                 :            : 
    1118                 :          0 : constant * evaluate::power_mv_c (constant * args) {
    1119                 :          0 :   _ARMV0 (m1);
    1120                 :          0 :   _ARC1  (c2);
    1121         [ #  # ]:          0 :   _DEFMV ();
    1122 [ #  # ][ #  # ]:          0 :   _RETMV (pow (*m1, (int) real (*c2)));
    1123                 :            : }
    1124                 :            : 
    1125                 :          0 : constant * evaluate::power_mv_v (constant * args) {
    1126                 :          0 :   _ARMV0 (m1);
    1127                 :          0 :   _ARV1  (v2);
    1128         [ #  # ]:          0 :   _DEFMV ();
    1129 [ #  # ][ #  # ]:          0 :   _RETMV (pow (*m1, *v2));
         [ #  # ][ #  # ]
    1130                 :            : }
    1131                 :            : 
    1132                 :            : // ****************** hypotenuse *************************
    1133                 :          0 : constant * evaluate::xhypot_d_d (constant * args) {
    1134                 :          0 :   _ARD0 (d1);
    1135                 :          0 :   _ARD1 (d2);
    1136         [ #  # ]:          0 :   _DEFD ();
    1137                 :          0 :   _RETD (xhypot (d1, d2));
    1138                 :            : }
    1139                 :            : 
    1140                 :          0 : constant * evaluate::xhypot_c_c (constant * args) {
    1141                 :          0 :   _ARC0 (c1);
    1142                 :          0 :   _ARC1 (c2);
    1143         [ #  # ]:          0 :   _DEFD ();
    1144                 :          0 :   _RETD (xhypot (*c1, *c2));
    1145                 :            : }
    1146                 :            : 
    1147                 :          0 : constant * evaluate::xhypot_c_d (constant * args) {
    1148                 :          0 :   _ARC0 (c1);
    1149                 :          0 :   _ARD1 (d2);
    1150         [ #  # ]:          0 :   _DEFD ();
    1151                 :          0 :   _RETD (xhypot (*c1, d2));
    1152                 :            : }
    1153                 :            : 
    1154                 :          0 : constant * evaluate::xhypot_d_c (constant * args) {
    1155                 :          0 :   _ARD0 (d1);
    1156                 :          0 :   _ARC1 (c2);
    1157         [ #  # ]:          0 :   _DEFD ();
    1158                 :          0 :   _RETD (xhypot (d1, *c2));
    1159                 :            : }
    1160                 :            : 
    1161                 :          0 : constant * evaluate::xhypot_v_d (constant * args) {
    1162                 :          0 :   _ARV0 (v1);
    1163                 :          0 :   _ARD1 (d2);
    1164         [ #  # ]:          0 :   _DEFV ();
    1165 [ #  # ][ #  # ]:          0 :   _RETV (xhypot (*v1, d2));
    1166                 :            : }
    1167                 :            : 
    1168                 :          0 : constant * evaluate::xhypot_d_v (constant * args) {
    1169                 :          0 :   _ARD0 (d1);
    1170                 :          0 :   _ARV1 (v2);
    1171         [ #  # ]:          0 :   _DEFV ();
    1172 [ #  # ][ #  # ]:          0 :   _RETV (xhypot (d1, *v2));
    1173                 :            : }
    1174                 :            : 
    1175                 :          0 : constant * evaluate::xhypot_v_c (constant * args) {
    1176                 :          0 :   _ARV0 (v1);
    1177                 :          0 :   _ARC1 (c2);
    1178         [ #  # ]:          0 :   _DEFV ();
    1179 [ #  # ][ #  # ]:          0 :   _RETV (xhypot (*v1, *c2));
    1180                 :            : }
    1181                 :            : 
    1182                 :          0 : constant * evaluate::xhypot_c_v (constant * args) {
    1183                 :          0 :   _ARC0 (c1);
    1184                 :          0 :   _ARV1 (v2);
    1185         [ #  # ]:          0 :   _DEFV ();
    1186 [ #  # ][ #  # ]:          0 :   _RETV (xhypot (*c1, *v2));
    1187                 :            : }
    1188                 :            : 
    1189                 :          0 : constant * evaluate::xhypot_v_v (constant * args) {
    1190                 :          0 :   _ARV0 (v1);
    1191                 :          0 :   _ARV1 (v2);
    1192         [ #  # ]:          0 :   _DEFV ();
    1193 [ #  # ][ #  # ]:          0 :   _RETV (xhypot (*v1, *v2));
         [ #  # ][ #  # ]
    1194                 :            : }
    1195                 :            : 
    1196                 :            : // ************** conjugate complex **********************
    1197                 :          0 : constant * evaluate::conj_d (constant * args) {
    1198                 :          0 :   _ARD0 (d1);
    1199         [ #  # ]:          0 :   _DEFD ();
    1200                 :          0 :   _RETD (d1);
    1201                 :            : }
    1202                 :            : 
    1203                 :          0 : constant * evaluate::conj_c (constant * args) {
    1204                 :          0 :   _ARC0 (c1);
    1205         [ #  # ]:          0 :   _DEFC ();
    1206                 :          0 :   _RETC (conj (*c1));
    1207                 :            : }
    1208                 :            : 
    1209                 :          0 : constant * evaluate::conj_v (constant * args) {
    1210                 :          0 :   _ARV0 (v1);
    1211         [ #  # ]:          0 :   _DEFV ();
    1212 [ #  # ][ #  # ]:          0 :   _RETV (conj (*v1));
    1213                 :            : }
    1214                 :            : 
    1215                 :          0 : constant * evaluate::conj_m (constant * args) {
    1216                 :          0 :   _ARM0 (m);
    1217         [ #  # ]:          0 :   _DEFM ();
    1218 [ #  # ][ #  # ]:          0 :   _RETM (conj (*m));
    1219                 :            : }
    1220                 :            : 
    1221                 :          0 : constant * evaluate::conj_mv (constant * args) {
    1222                 :          0 :   _ARMV0 (mv);
    1223         [ #  # ]:          0 :   _DEFMV ();
    1224 [ #  # ][ #  # ]:          0 :   _RETMV (conj (*mv));
    1225                 :            : }
    1226                 :            : 
    1227                 :            : // ********** square of absolute value *****************
    1228                 :          0 : constant * evaluate::norm_d (constant * args) {
    1229                 :          0 :   _ARD0 (d1);
    1230         [ #  # ]:          0 :   _DEFD ();
    1231                 :          0 :   _RETD (d1 * d1);
    1232                 :            : }
    1233                 :            : 
    1234                 :          0 : constant * evaluate::norm_c (constant * args) {
    1235                 :          0 :   _ARC0 (c1);
    1236         [ #  # ]:          0 :   _DEFD ();
    1237                 :          0 :   _RETD (norm (*c1));
    1238                 :            : }
    1239                 :            : 
    1240                 :          0 : constant * evaluate::norm_v (constant * args) {
    1241                 :          0 :   _ARV0 (v1);
    1242         [ #  # ]:          0 :   _DEFV ();
    1243 [ #  # ][ #  # ]:          0 :   _RETV (norm (*v1));
    1244                 :            : }
    1245                 :            : 
    1246                 :            : // ********** phase in degrees *****************
    1247                 :          0 : constant * evaluate::phase_d (constant * args) {
    1248                 :          0 :   _ARD0 (d1);
    1249         [ #  # ]:          0 :   _DEFD ();
    1250         [ #  # ]:          0 :   _RETD (d1 < 0.0 ? 180.0 : 0.0);
    1251                 :            : }
    1252                 :            : 
    1253                 :          0 : constant * evaluate::phase_c (constant * args) {
    1254                 :          0 :   _ARC0 (c1);
    1255         [ #  # ]:          0 :   _DEFD ();
    1256                 :          0 :   _RETD (deg (arg (*c1)));
    1257                 :            : }
    1258                 :            : 
    1259                 :          4 : constant * evaluate::phase_v (constant * args) {
    1260                 :          4 :   _ARV0 (v1);
    1261         [ +  - ]:          4 :   _DEFV ();
    1262 [ +  - ][ +  - ]:          4 :   _RETV (deg (arg (*v1)));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1263                 :            : }
    1264                 :            : 
    1265                 :          0 : constant * evaluate::phase_m (constant * args) {
    1266                 :          0 :   _ARM0 (m1);
    1267         [ #  # ]:          0 :   _DEFM ();
    1268 [ #  # ][ #  # ]:          0 :   _RETM (deg (arg (*m1)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1269                 :            : }
    1270                 :            : 
    1271                 :          0 : constant * evaluate::phase_mv (constant * args) {
    1272                 :          0 :   _ARMV0 (v1);
    1273         [ #  # ]:          0 :   _DEFMV ();
    1274 [ #  # ][ #  # ]:          0 :   _RETMV (deg (arg (*v1)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1275                 :            : }
    1276                 :            : 
    1277                 :            : // ********** phase in radians *****************
    1278                 :          0 : constant * evaluate::arg_d (constant * args) {
    1279                 :          0 :   _ARD0 (d1);
    1280         [ #  # ]:          0 :   _DEFD ();
    1281         [ #  # ]:          0 :   _RETD (d1 < 0.0 ? M_PI : 0.0);
    1282                 :            : }
    1283                 :            : 
    1284                 :          0 : constant * evaluate::arg_c (constant * args) {
    1285                 :          0 :   _ARC0 (c1);
    1286         [ #  # ]:          0 :   _DEFD ();
    1287                 :          0 :   _RETD (arg (*c1));
    1288                 :            : }
    1289                 :            : 
    1290                 :          2 : constant * evaluate::arg_v (constant * args) {
    1291                 :          2 :   _ARV0 (v1);
    1292         [ +  - ]:          2 :   _DEFV ();
    1293 [ +  - ][ +  - ]:          2 :   _RETV (arg (*v1));
    1294                 :            : }
    1295                 :            : 
    1296                 :          0 : constant * evaluate::arg_m (constant * args) {
    1297                 :          0 :   _ARM0 (m1);
    1298         [ #  # ]:          0 :   _DEFM ();
    1299 [ #  # ][ #  # ]:          0 :   _RETM (arg (*m1));
    1300                 :            : }
    1301                 :            : 
    1302                 :          0 : constant * evaluate::arg_mv (constant * args) {
    1303                 :          0 :   _ARMV0 (v1);
    1304         [ #  # ]:          0 :   _DEFMV ();
    1305 [ #  # ][ #  # ]:          0 :   _RETMV (arg (*v1));
    1306                 :            : }
    1307                 :            : 
    1308                 :            : // ******* unwrap phase in radians ************
    1309                 :          2 : constant * evaluate::unwrap_v_1 (constant * args) {
    1310                 :          2 :   _ARV0 (v1);
    1311         [ +  - ]:          2 :   _DEFV ();
    1312 [ +  - ][ +  - ]:          2 :   _RETV (unwrap (*v1));
    1313                 :            : }
    1314                 :            : 
    1315                 :          0 : constant * evaluate::unwrap_v_2 (constant * args) {
    1316                 :          0 :   _ARV0 (v1);
    1317                 :          0 :   _ARD1 (d2);
    1318         [ #  # ]:          0 :   _DEFV ();
    1319 [ #  # ][ #  # ]:          0 :   _RETV (unwrap (*v1, fabs (d2)));
    1320                 :            : }
    1321                 :            : 
    1322                 :          0 : constant * evaluate::unwrap_v_3 (constant * args) {
    1323                 :          0 :   _ARV0 (v1);
    1324                 :          0 :   _ARD1 (d2);
    1325                 :          0 :   _ARD2 (d3);
    1326         [ #  # ]:          0 :   _DEFV ();
    1327 [ #  # ][ #  # ]:          0 :   _RETV (unwrap (*v1, fabs (d2), fabs (d3)));
    1328                 :            : }
    1329                 :            : 
    1330                 :            : // ******** radian/degree conversion **********
    1331                 :          0 : constant * evaluate::deg2rad_d (constant * args) {
    1332                 :          0 :   _ARD0 (d1);
    1333         [ #  # ]:          0 :   _DEFD ();
    1334                 :          0 :   _RETD (rad (d1));
    1335                 :            : }
    1336                 :            : 
    1337                 :          0 : constant * evaluate::deg2rad_c (constant * args) {
    1338                 :          0 :   _ARC0 (c1);
    1339         [ #  # ]:          0 :   _DEFD ();
    1340                 :          0 :   _RETD (rad (real (*c1)));
    1341                 :            : }
    1342                 :            : 
    1343                 :          0 : constant * evaluate::deg2rad_v (constant * args) {
    1344                 :          0 :   _ARV0 (v1);
    1345         [ #  # ]:          0 :   _DEFV ();
    1346         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    1347 [ #  # ][ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) v->add (rad (real (v1->get (i))));
    1348                 :          0 :   res->v = v;
    1349                 :          0 :   return res;
    1350                 :            : }
    1351                 :            : 
    1352                 :          0 : constant * evaluate::rad2deg_d (constant * args) {
    1353                 :          0 :   _ARD0 (d1);
    1354         [ #  # ]:          0 :   _DEFD ();
    1355                 :          0 :   _RETD (deg (d1));
    1356                 :            : }
    1357                 :            : 
    1358                 :          0 : constant * evaluate::rad2deg_c (constant * args) {
    1359                 :          0 :   _ARC0 (c1);
    1360         [ #  # ]:          0 :   _DEFD ();
    1361                 :          0 :   _RETD (deg (real (*c1)));
    1362                 :            : }
    1363                 :            : 
    1364                 :          0 : constant * evaluate::rad2deg_v (constant * args) {
    1365                 :          0 :   _ARV0 (v1);
    1366         [ #  # ]:          0 :   _DEFV ();
    1367         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    1368 [ #  # ][ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) v->add (deg (real (v1->get (i))));
    1369                 :          0 :   res->v = v;
    1370                 :          0 :   return res;
    1371                 :            : }
    1372                 :            : 
    1373                 :            : // ********** voltage decibel *****************
    1374                 :          0 : constant * evaluate::dB_d (constant * args) {
    1375                 :          0 :   _ARD0 (d1);
    1376         [ #  # ]:          0 :   _DEFD ();
    1377                 :          0 :   _RETD (10.0 * std::log10 (std::fabs (d1)));
    1378                 :            : }
    1379                 :            : 
    1380                 :          0 : constant * evaluate::dB_c (constant * args) {
    1381                 :          0 :   _ARC0 (c1);
    1382         [ #  # ]:          0 :   _DEFD ();
    1383                 :          0 :   _RETD (dB (*c1));
    1384                 :            : }
    1385                 :            : 
    1386                 :         32 : constant * evaluate::dB_v (constant * args) {
    1387                 :         32 :   _ARV0 (v1);
    1388         [ +  - ]:         32 :   _DEFV ();
    1389 [ +  - ][ +  - ]:         32 :   _RETV (dB (*v1));
    1390                 :            : }
    1391                 :            : 
    1392                 :          0 : constant * evaluate::dB_m (constant * args) {
    1393                 :          0 :   _ARM0 (m1);
    1394         [ #  # ]:          0 :   _DEFM ();
    1395 [ #  # ][ #  # ]:          0 :   _RETM (dB (*m1));
    1396                 :            : }
    1397                 :            : 
    1398                 :          0 : constant * evaluate::dB_mv (constant * args) {
    1399                 :          0 :   _ARMV0 (v1);
    1400         [ #  # ]:          0 :   _DEFMV ();
    1401 [ #  # ][ #  # ]:          0 :   _RETMV (dB (*v1));
    1402                 :            : }
    1403                 :            : 
    1404                 :            : // ********** square root *****************
    1405                 :          7 : constant * evaluate::sqrt_d (constant * args) {
    1406                 :          7 :   _ARD0 (d1);
    1407         [ +  - ]:          7 :   _DEFC ();
    1408         [ -  + ]:          7 :   if (d1 < 0.0)
    1409                 :          0 :     res->c = new nr_complex_t (0.0, std::sqrt (-d1));
    1410                 :            :   else
    1411                 :          7 :     res->c = new nr_complex_t (std::sqrt (d1));
    1412                 :          7 :   return res;
    1413                 :            : }
    1414                 :            : 
    1415                 :          0 : constant * evaluate::sqrt_c (constant * args) {
    1416                 :          0 :   _ARC0 (c1);
    1417         [ #  # ]:          0 :   _DEFC ();
    1418                 :          0 :   _RETC (std::sqrt (*c1));
    1419                 :            : }
    1420                 :            : 
    1421                 :          0 : constant * evaluate::sqrt_v (constant * args) {
    1422                 :          0 :   _ARV0 (v1);
    1423         [ #  # ]:          0 :   _DEFV ();
    1424 [ #  # ][ #  # ]:          0 :   _RETV (sqrt (*v1));
    1425                 :            : }
    1426                 :            : 
    1427                 :            : // ********** natural logarithm *****************
    1428                 :          0 : constant * evaluate::ln_d (constant * args) {
    1429                 :          0 :   _ARD0 (d1);
    1430         [ #  # ]:          0 :   _DEFC ();
    1431         [ #  # ]:          0 :   if (d1 < 0.0)
    1432                 :          0 :     res->c = new nr_complex_t (std::log (-d1), M_PI);
    1433                 :            :   else
    1434                 :          0 :     res->c = new nr_complex_t (std::log (d1));
    1435                 :          0 :   return res;
    1436                 :            : }
    1437                 :            : 
    1438                 :          0 : constant * evaluate::ln_c (constant * args) {
    1439                 :          0 :   _ARC0 (c1);
    1440         [ #  # ]:          0 :   _DEFC ();
    1441                 :          0 :   _RETC (std::log (*c1));
    1442                 :            : }
    1443                 :            : 
    1444                 :          0 : constant * evaluate::ln_v (constant * args) {
    1445                 :          0 :   _ARV0 (v1);
    1446         [ #  # ]:          0 :   _DEFV ();
    1447 [ #  # ][ #  # ]:          0 :   _RETV (log (*v1));
    1448                 :            : }
    1449                 :            : 
    1450                 :            : // ********** decimal logarithm *****************
    1451                 :          0 : constant * evaluate::log10_d (constant * args) {
    1452                 :          0 :   _ARD0 (d1);
    1453         [ #  # ]:          0 :   _DEFC ();
    1454         [ #  # ]:          0 :   if (d1 < 0.0)
    1455                 :          0 :     res->c = new nr_complex_t (std::log10 (-d1), M_PI * M_LOG10E);
    1456                 :            :   else
    1457                 :          0 :     res->c = new nr_complex_t (std::log10 (d1));
    1458                 :          0 :   return res;
    1459                 :            : }
    1460                 :            : 
    1461                 :          0 : constant * evaluate::log10_c (constant * args) {
    1462                 :          0 :   _ARC0 (c1);
    1463         [ #  # ]:          0 :   _DEFC ();
    1464                 :          0 :   _RETC (std::log10 (*c1));
    1465                 :            : }
    1466                 :            : 
    1467                 :          2 : constant * evaluate::log10_v (constant * args) {
    1468                 :          2 :   _ARV0 (v1);
    1469         [ +  - ]:          2 :   _DEFV ();
    1470 [ +  - ][ +  - ]:          2 :   _RETV (log10 (*v1));
    1471                 :            : }
    1472                 :            : 
    1473                 :            : // ********** binary logarithm *****************
    1474                 :          0 : constant * evaluate::log2_d (constant * args) {
    1475                 :          0 :   _ARD0 (d1);
    1476         [ #  # ]:          0 :   _DEFC ();
    1477         [ #  # ]:          0 :   if (d1 < 0.0)
    1478                 :          0 :     res->c = new nr_complex_t (std::log (-d1) * M_LOG2E, M_PI * M_LOG2E);
    1479                 :            :   else
    1480                 :          0 :     res->c = new nr_complex_t (std::log (d1) * M_LOG2E);
    1481                 :          0 :   return res;
    1482                 :            : }
    1483                 :            : 
    1484                 :          0 : constant * evaluate::log2_c (constant * args) {
    1485                 :          0 :   _ARC0 (c1);
    1486         [ #  # ]:          0 :   _DEFC ();
    1487         [ #  # ]:          0 :   _RETC (qucs::log2 (*c1));
    1488                 :            : }
    1489                 :            : 
    1490                 :          0 : constant * evaluate::log2_v (constant * args) {
    1491                 :          0 :   _ARV0 (v1);
    1492         [ #  # ]:          0 :   _DEFV ();
    1493 [ #  # ][ #  # ]:          0 :   _RETV (log2 (*v1));
    1494                 :            : }
    1495                 :            : 
    1496                 :            : // ************* arcus sine *********************
    1497                 :          0 : constant * evaluate::arcsin_d (constant * args) {
    1498                 :          0 :   _ARD0 (d1);
    1499         [ #  # ]:          0 :   _DEFD ();
    1500                 :          0 :   _RETD (std::asin (d1));
    1501                 :            : }
    1502                 :            : 
    1503                 :          0 : constant * evaluate::arcsin_c (constant * args) {
    1504                 :          0 :   _ARC0 (c1);
    1505         [ #  # ]:          0 :   _DEFC ();
    1506         [ #  # ]:          0 :   _RETC (asin (*c1));
    1507                 :            : }
    1508                 :            : 
    1509                 :          0 : constant * evaluate::arcsin_v (constant * args) {
    1510                 :          0 :   _ARV0 (v1);
    1511         [ #  # ]:          0 :   _DEFV ();
    1512 [ #  # ][ #  # ]:          0 :   _RETV (asin (*v1));
    1513                 :            : }
    1514                 :            : 
    1515                 :            : // ************* arcus cosine ******************
    1516                 :          0 : constant * evaluate::arccos_d (constant * args) {
    1517                 :          0 :   _ARD0 (d1);
    1518         [ #  # ]:          0 :   _DEFD ();
    1519                 :          0 :   _RETD (std::acos (d1));
    1520                 :            : }
    1521                 :            : 
    1522                 :          0 : constant * evaluate::arccos_c (constant * args) {
    1523                 :          0 :   _ARC0 (c1);
    1524         [ #  # ]:          0 :   _DEFC ();
    1525         [ #  # ]:          0 :   _RETC (qucs::acos (*c1));
    1526                 :            : }
    1527                 :            : 
    1528                 :          0 : constant * evaluate::arccos_v (constant * args) {
    1529                 :          0 :   _ARV0 (v1);
    1530         [ #  # ]:          0 :   _DEFV ();
    1531 [ #  # ][ #  # ]:          0 :   _RETV (acos (*v1));
    1532                 :            : }
    1533                 :            : 
    1534                 :            : // ************** arcus tangent ******************
    1535                 :          0 : constant * evaluate::arctan_d (constant * args) {
    1536                 :          0 :   _ARD0 (d1);
    1537         [ #  # ]:          0 :   _DEFD ();
    1538                 :          0 :   _RETD (std::atan (d1));
    1539                 :            : }
    1540                 :            : 
    1541                 :          0 : constant * evaluate::arctan_c (constant * args) {
    1542                 :          0 :   _ARC0 (c1);
    1543         [ #  # ]:          0 :   _DEFC ();
    1544         [ #  # ]:          0 :   _RETC (qucs::atan (*c1));
    1545                 :            : }
    1546                 :            : 
    1547                 :          0 : constant * evaluate::arctan_v (constant * args) {
    1548                 :          0 :   _ARV0 (v1);
    1549         [ #  # ]:          0 :   _DEFV ();
    1550 [ #  # ][ #  # ]:          0 :   _RETV (atan (*v1));
    1551                 :            : }
    1552                 :            : 
    1553                 :            : // *************** cotangent ********************
    1554                 :          0 : constant * evaluate::cot_d (constant * args) {
    1555                 :          0 :   _ARD0 (d1);
    1556         [ #  # ]:          0 :   _DEFD ();
    1557                 :          0 :   _RETD (1.0 / std::tan (d1));
    1558                 :            : }
    1559                 :            : 
    1560                 :          0 : constant * evaluate::cot_c (constant * args) {
    1561                 :          0 :   _ARC0 (c1);
    1562         [ #  # ]:          0 :   _DEFC ();
    1563         [ #  # ]:          0 :   _RETC (qucs::cot (*c1));
    1564                 :            : }
    1565                 :            : 
    1566                 :          0 : constant * evaluate::cot_v (constant * args) {
    1567                 :          0 :   _ARV0 (v1);
    1568         [ #  # ]:          0 :   _DEFV ();
    1569 [ #  # ][ #  # ]:          0 :   _RETV (cot (*v1));
    1570                 :            : }
    1571                 :            : 
    1572                 :            : // ************ arcus cotangent *****************
    1573                 :          0 : constant * evaluate::arccot_d (constant * args) {
    1574                 :          0 :   _ARD0 (d1);
    1575         [ #  # ]:          0 :   _DEFD ();
    1576                 :          0 :   _RETD (M_PI_2 - std::atan (d1));
    1577                 :            : }
    1578                 :            : 
    1579                 :          0 : constant * evaluate::arccot_c (constant * args) {
    1580                 :          0 :   _ARC0 (c1);
    1581         [ #  # ]:          0 :   _DEFC ();
    1582         [ #  # ]:          0 :   _RETC (qucs::acot (*c1));
    1583                 :            : }
    1584                 :            : 
    1585                 :          0 : constant * evaluate::arccot_v (constant * args) {
    1586                 :          0 :   _ARV0 (v1);
    1587         [ #  # ]:          0 :   _DEFV ();
    1588 [ #  # ][ #  # ]:          0 :   _RETV (acot (*v1));
    1589                 :            : }
    1590                 :            : 
    1591                 :            : // ***************** secans *********************
    1592                 :          0 : constant * evaluate::sec_d (constant * args) {
    1593                 :          0 :   _ARD0 (d1);
    1594         [ #  # ]:          0 :   _DEFD ();
    1595                 :          0 :   _RETD (1.0 / std::cos (d1));
    1596                 :            : }
    1597                 :            : 
    1598                 :          0 : constant * evaluate::sec_c (constant * args) {
    1599                 :          0 :   _ARC0 (c1);
    1600         [ #  # ]:          0 :   _DEFC ();
    1601 [ #  # ][ #  # ]:          0 :   _RETC (1.0 / std::cos (*c1));
    1602                 :            : }
    1603                 :            : 
    1604                 :          0 : constant * evaluate::sec_v (constant * args) {
    1605                 :          0 :   _ARV0 (v1);
    1606         [ #  # ]:          0 :   _DEFV ();
    1607 [ #  # ][ #  # ]:          0 :   _RETV (1.0 / qucs::cos (*v1));
         [ #  # ][ #  # ]
    1608                 :            : }
    1609                 :            : 
    1610                 :            : // *************** arcus secans *******************
    1611                 :          0 : constant * evaluate::arcsec_d (constant * args) {
    1612                 :          0 :   _ARD0 (d1);
    1613         [ #  # ]:          0 :   _DEFD ();
    1614                 :          0 :   _RETD (std::acos (1.0 / d1));
    1615                 :            : }
    1616                 :            : 
    1617                 :          0 : constant * evaluate::arcsec_c (constant * args) {
    1618                 :          0 :   _ARC0 (c1);
    1619         [ #  # ]:          0 :   _DEFC ();
    1620 [ #  # ][ #  # ]:          0 :   _RETC (acos (1.0 / *c1));
                 [ #  # ]
    1621                 :            : }
    1622                 :            : 
    1623                 :          0 : constant * evaluate::arcsec_v (constant * args) {
    1624                 :          0 :   _ARV0 (v1);
    1625         [ #  # ]:          0 :   _DEFV ();
    1626 [ #  # ][ #  # ]:          0 :   _RETV (acos (1.0 / *v1));
         [ #  # ][ #  # ]
    1627                 :            : }
    1628                 :            : 
    1629                 :            : // ***************** cosecans *********************
    1630                 :          0 : constant * evaluate::cosec_d (constant * args) {
    1631                 :          0 :   _ARD0 (d1);
    1632         [ #  # ]:          0 :   _DEFD ();
    1633                 :          0 :   _RETD (1.0 / sin (d1));
    1634                 :            : }
    1635                 :            : 
    1636                 :          0 : constant * evaluate::cosec_c (constant * args) {
    1637                 :          0 :   _ARC0 (c1);
    1638         [ #  # ]:          0 :   _DEFC ();
    1639 [ #  # ][ #  # ]:          0 :   _RETC (1.0 / sin (*c1));
                 [ #  # ]
    1640                 :            : }
    1641                 :            : 
    1642                 :          0 : constant * evaluate::cosec_v (constant * args) {
    1643                 :          0 :   _ARV0 (v1);
    1644         [ #  # ]:          0 :   _DEFV ();
    1645 [ #  # ][ #  # ]:          0 :   _RETV (1.0 / sin (*v1));
         [ #  # ][ #  # ]
    1646                 :            : }
    1647                 :            : 
    1648                 :            : // ************* arcus cosecans *******************
    1649                 :          0 : constant * evaluate::arccosec_d (constant * args) {
    1650                 :          0 :   _ARD0 (d1);
    1651         [ #  # ]:          0 :   _DEFD ();
    1652                 :          0 :   _RETD (std::asin (1.0 / d1));
    1653                 :            : }
    1654                 :            : 
    1655                 :          0 : constant * evaluate::arccosec_c (constant * args) {
    1656                 :          0 :   _ARC0 (c1);
    1657         [ #  # ]:          0 :   _DEFC ();
    1658 [ #  # ][ #  # ]:          0 :   _RETC (asin (1.0 / *c1));
                 [ #  # ]
    1659                 :            : }
    1660                 :            : 
    1661                 :          0 : constant * evaluate::arccosec_v (constant * args) {
    1662                 :          0 :   _ARV0 (v1);
    1663         [ #  # ]:          0 :   _DEFV ();
    1664 [ #  # ][ #  # ]:          0 :   _RETV (asin (1.0 / *v1));
         [ #  # ][ #  # ]
    1665                 :            : }
    1666                 :            : 
    1667                 :            : // ********** area sine hyperbolicus **************
    1668                 :          0 : constant * evaluate::arsinh_d (constant * args) {
    1669                 :          0 :   _ARD0 (d1);
    1670         [ #  # ]:          0 :   _DEFD ();
    1671                 :          0 :   _RETD (log (d1 + sqrt (d1 * d1 + 1)));
    1672                 :            : }
    1673                 :            : 
    1674                 :          0 : constant * evaluate::arsinh_c (constant * args) {
    1675                 :          0 :   _ARC0 (c1);
    1676         [ #  # ]:          0 :   _DEFC ();
    1677         [ #  # ]:          0 :   _RETC (asinh (*c1));
    1678                 :            : }
    1679                 :            : 
    1680                 :          0 : constant * evaluate::arsinh_v (constant * args) {
    1681                 :          0 :   _ARV0 (v1);
    1682         [ #  # ]:          0 :   _DEFV ();
    1683 [ #  # ][ #  # ]:          0 :   _RETV (asinh (*v1));
    1684                 :            : }
    1685                 :            : 
    1686                 :            : // ********** area cosecans hyperbolicus **************
    1687                 :          0 : constant * evaluate::arcosech_d (constant * args) {
    1688                 :          0 :   _ARD0 (d1);
    1689         [ #  # ]:          0 :   _DEFD ();
    1690                 :          0 :   d1 = 1 / d1;
    1691                 :          0 :   _RETD (log (d1 + sqrt (d1 * d1 + 1)));
    1692                 :            : }
    1693                 :            : 
    1694                 :          0 : constant * evaluate::arcosech_c (constant * args) {
    1695                 :          0 :   _ARC0 (c1);
    1696         [ #  # ]:          0 :   _DEFC ();
    1697 [ #  # ][ #  # ]:          0 :   _RETC (asinh (1.0 / *c1));
                 [ #  # ]
    1698                 :            : }
    1699                 :            : 
    1700                 :          0 : constant * evaluate::arcosech_v (constant * args) {
    1701                 :          0 :   _ARV0 (v1);
    1702         [ #  # ]:          0 :   _DEFV ();
    1703 [ #  # ][ #  # ]:          0 :   _RETV (asinh (1 / *v1));
         [ #  # ][ #  # ]
    1704                 :            : }
    1705                 :            : 
    1706                 :            : // ********* area cosine hyperbolicus ************
    1707                 :          0 : constant * evaluate::arcosh_d (constant * args) {
    1708                 :          0 :   _ARD0 (d1);
    1709         [ #  # ]:          0 :   _DEFC ();
    1710 [ #  # ][ #  # ]:          0 :   _RETC (acosh (nr_complex_t (d1)));
    1711                 :            : }
    1712                 :            : 
    1713                 :          0 : constant * evaluate::arcosh_c (constant * args) {
    1714                 :          0 :   _ARC0 (c1);
    1715         [ #  # ]:          0 :   _DEFC ();
    1716         [ #  # ]:          0 :   _RETC (acosh (*c1));
    1717                 :            : }
    1718                 :            : 
    1719                 :          0 : constant * evaluate::arcosh_v (constant * args) {
    1720                 :          0 :   _ARV0 (v1);
    1721         [ #  # ]:          0 :   _DEFV ();
    1722 [ #  # ][ #  # ]:          0 :   _RETV (acosh (*v1));
    1723                 :            : }
    1724                 :            : 
    1725                 :            : // ********* area secans hyperbolicus ***********
    1726                 :          0 : constant * evaluate::arsech_d (constant * args) {
    1727                 :          0 :   _ARD0 (d1);
    1728         [ #  # ]:          0 :   _DEFC ();
    1729 [ #  # ][ #  # ]:          0 :   _RETC (asech (nr_complex_t (d1)));
    1730                 :            : }
    1731                 :            : 
    1732                 :          0 : constant * evaluate::arsech_c (constant * args) {
    1733                 :          0 :   _ARC0 (c1);
    1734         [ #  # ]:          0 :   _DEFC ();
    1735         [ #  # ]:          0 :   _RETC (asech (*c1));
    1736                 :            : }
    1737                 :            : 
    1738                 :          0 : constant * evaluate::arsech_v (constant * args) {
    1739                 :          0 :   _ARV0 (v1);
    1740         [ #  # ]:          0 :   _DEFV ();
    1741 [ #  # ][ #  # ]:          0 :   _RETV (asech (*v1));
    1742                 :            : }
    1743                 :            : 
    1744                 :            : // ******* area tangent hyperbolicus **********
    1745                 :          0 : constant * evaluate::artanh_d (constant * args) {
    1746                 :          0 :   _ARD0 (d1);
    1747         [ #  # ]:          0 :   _DEFD ();
    1748                 :          0 :   _RETD (0.5 * log ((1.0 + d1) / (1.0 - d1)));
    1749                 :            : }
    1750                 :            : 
    1751                 :          0 : constant * evaluate::artanh_c (constant * args) {
    1752                 :          0 :   _ARC0 (c1);
    1753         [ #  # ]:          0 :   _DEFC ();
    1754         [ #  # ]:          0 :   _RETC (atanh (*c1));
    1755                 :            : }
    1756                 :            : 
    1757                 :          0 : constant * evaluate::artanh_v (constant * args) {
    1758                 :          0 :   _ARV0 (v1);
    1759         [ #  # ]:          0 :   _DEFV ();
    1760 [ #  # ][ #  # ]:          0 :   _RETV (atanh (*v1));
    1761                 :            : }
    1762                 :            : 
    1763                 :            : // ******* area cotangent hyperbolicus **********
    1764                 :          0 : constant * evaluate::arcoth_d (constant * args) {
    1765                 :          0 :   _ARD0 (d1);
    1766         [ #  # ]:          0 :   _DEFD ();
    1767                 :          0 :   _RETD (0.5 * std::log ((d1 + 1.0) / (d1 - 1.0)));
    1768                 :            : }
    1769                 :            : 
    1770                 :          0 : constant * evaluate::arcoth_c (constant * args) {
    1771                 :          0 :   _ARC0 (c1);
    1772         [ #  # ]:          0 :   _DEFC ();
    1773         [ #  # ]:          0 :   _RETC (qucs::acoth (*c1));
    1774                 :            : }
    1775                 :            : 
    1776                 :          0 : constant * evaluate::arcoth_v (constant * args) {
    1777                 :          0 :   _ARV0 (v1);
    1778         [ #  # ]:          0 :   _DEFV ();
    1779 [ #  # ][ #  # ]:          0 :   _RETV (qucs::acoth (*v1));
    1780                 :            : }
    1781                 :            : 
    1782                 :            : // This is the rtoz, ztor, ytor, rtoy helper macro.
    1783                 :            : #define MAKE_FUNC_DEFINITION_2(cfunc) \
    1784                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_d) (constant * args) {   \
    1785                 :            :   _ARD0 (d);                                                        \
    1786                 :            :   _DEFD ();                                                         \
    1787                 :            :   _RETD (real (cfunc (nr_complex_t (d, 0))));                               \
    1788                 :            : }                                                                   \
    1789                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_d_d) (constant * args) { \
    1790                 :            :   _ARD0 (d);                                                        \
    1791                 :            :   _ARD1 (z);                                                        \
    1792                 :            :   _DEFD ();                                                         \
    1793                 :            :   _RETD (real (cfunc (nr_complex_t (d, 0), z)));                            \
    1794                 :            : }                                                                   \
    1795                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_d_c) (constant * args) { \
    1796                 :            :   _ARD0 (d);                                                        \
    1797                 :            :   _ARC1 (z);                                                        \
    1798                 :            :   _DEFC ();                                                         \
    1799                 :            :   _RETC (cfunc (nr_complex_t (d, 0), *z));                                  \
    1800                 :            : }                                                                   \
    1801                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_c) (constant * args) {   \
    1802                 :            :   _ARC0 (c);                                                        \
    1803                 :            :   _DEFC ();                                                         \
    1804                 :            :   _RETC (cfunc (*c));                                               \
    1805                 :            : }                                                                   \
    1806                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_c_d) (constant * args) { \
    1807                 :            :   _ARC0 (c);                                                        \
    1808                 :            :   _ARD1 (z);                                                        \
    1809                 :            :   _DEFC ();                                                         \
    1810                 :            :   _RETC (cfunc (*c, z));                                            \
    1811                 :            : }                                                                   \
    1812                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_c_c) (constant * args) { \
    1813                 :            :   _ARC0 (c);                                                        \
    1814                 :            :   _ARC1 (z);                                                        \
    1815                 :            :   _DEFC ();                                                         \
    1816                 :            :   _RETC (cfunc (*c, *z));                                           \
    1817                 :            : }                                                                   \
    1818                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) {   \
    1819                 :            :   _ARV0 (v);                                                        \
    1820                 :            :   _DEFV ();                                                         \
    1821                 :            :   _RETV (cfunc (*v));                                               \
    1822                 :            : }                                                                   \
    1823                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_v_d) (constant * args) { \
    1824                 :            :   _ARV0 (v);                                                        \
    1825                 :            :   _ARD1 (z);                                                        \
    1826                 :            :   _DEFV ();                                                         \
    1827                 :            :   _RETV (cfunc (*v, z));                                            \
    1828                 :            : }                                                                   \
    1829                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_v_c) (constant * args) { \
    1830                 :            :   _ARV0 (v);                                                        \
    1831                 :            :   _ARC1 (z);                                                        \
    1832                 :            :   _DEFV ();                                                         \
    1833                 :            :   _RETV (cfunc (*v, *z));                                           \
    1834                 :            : }                                                                   \
    1835                 :            : 
    1836 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_2 (ztor);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1837 [ #  # ][ #  # ]:          3 : MAKE_FUNC_DEFINITION_2 (rtoz);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
         [ +  - ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1838 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_2 (ytor);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1839 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_2 (rtoy);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1840                 :            : 
    1841                 :            : // ** convert reflexion coefficient to standing wave ratio **
    1842                 :          0 : constant * evaluate::rtoswr_d (constant * args) {
    1843                 :          0 :   _ARD0 (d1);
    1844         [ #  # ]:          0 :   _DEFD ();
    1845                 :          0 :   _RETD ((1 + fabs (d1)) / (1 - fabs (d1)));
    1846                 :            : }
    1847                 :            : 
    1848                 :          0 : constant * evaluate::rtoswr_c (constant * args) {
    1849                 :          0 :   _ARC0 (c1);
    1850         [ #  # ]:          0 :   _DEFD ();
    1851                 :          0 :   _RETD ((1 + abs (*c1)) / (1 - abs (*c1)));
    1852                 :            : }
    1853                 :            : 
    1854                 :          0 : constant * evaluate::rtoswr_v (constant * args) {
    1855                 :          0 :   _ARV0 (v1);
    1856         [ #  # ]:          0 :   _DEFV ();
    1857         [ #  # ]:          0 :   res->v = new qucs::vector (v1->getSize ());
    1858         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++)
    1859 [ #  # ][ #  # ]:          0 :     res->v->set ((1 + abs (v1->get (i))) / (1 - abs (v1->get (i))), i);
    1860                 :          0 :   return res;
    1861                 :            : }
    1862                 :            : 
    1863                 :            : // ** differentiate vector with respect to another vector **
    1864                 :          2 : constant * evaluate::diff_v_2 (constant * args) {
    1865                 :          2 :   _ARV0 (v1);
    1866                 :          2 :   _ARV1 (v2);
    1867         [ +  - ]:          2 :   _DEFV ();
    1868 [ +  - ][ +  - ]:          2 :   _RETV (diff (*v1, *v2));
         [ +  - ][ +  - ]
    1869                 :            : }
    1870                 :            : 
    1871                 :          0 : constant * evaluate::diff_v_3 (constant * args) {
    1872                 :          0 :   _ARV0 (v1);
    1873                 :          0 :   _ARV1 (v2);
    1874                 :          0 :   _ARI2 (i3);
    1875         [ #  # ]:          0 :   _DEFV ();
    1876 [ #  # ][ #  # ]:          0 :   _RETV (diff (*v1, *v2, i3));
         [ #  # ][ #  # ]
    1877                 :            : }
    1878                 :            : 
    1879                 :            : // ***************** maximum *******************
    1880                 :          0 : constant * evaluate::max_d (constant * args) {
    1881                 :          0 :   _ARD0 (d1);
    1882         [ #  # ]:          0 :   _DEFD ();
    1883                 :          0 :   _RETD (d1);
    1884                 :            : }
    1885                 :            : 
    1886                 :          0 : constant * evaluate::max_c (constant * args) {
    1887                 :          0 :   _ARC0 (c1);
    1888         [ #  # ]:          0 :   _DEFD ();
    1889         [ #  # ]:          0 :   if (fabs (arg (*c1)) < M_PI_2)
    1890                 :          0 :     res->d = abs (*c1);
    1891                 :            :   else
    1892                 :          0 :     res->d = -abs (*c1);
    1893                 :          0 :   return res;
    1894                 :            : }
    1895                 :            : 
    1896                 :          0 : constant * evaluate::max_v (constant * args) {
    1897                 :          0 :   _ARV0 (v1);
    1898         [ #  # ]:          0 :   _DEFD ();
    1899                 :          0 :   _RETD (v1->maximum ());
    1900                 :            : }
    1901                 :            : 
    1902                 :          0 : constant * evaluate::max_d_d (constant * args) {
    1903                 :          0 :   _ARD0 (d1);
    1904                 :          0 :   _ARD1 (d2);
    1905         [ #  # ]:          0 :   _DEFD ();
    1906         [ #  # ]:          0 :   _RETD (MAX (d1, d2));
    1907                 :            : }
    1908                 :            : 
    1909                 :          0 : constant * evaluate::max_d_c (constant * args) {
    1910         [ #  # ]:          0 :   _ARD0 (d1);
    1911         [ #  # ]:          0 :   _ARC1 (c2);
    1912 [ #  # ][ #  # ]:          0 :   _DEFC ();
    1913                 :          0 :   nr_double_t a = d1;
    1914         [ #  # ]:          0 :   nr_double_t b = fabs (arg (*c2)) < M_PI_2 ? abs (*c2) : -abs (*c2);
    1915         [ #  # ]:          0 :   nr_complex_t r = a > b ? d1 : *c2;
    1916         [ #  # ]:          0 :   _RETC (r);
    1917                 :            : }
    1918                 :            : 
    1919                 :          0 : constant * evaluate::max_c_c (constant * args) {
    1920         [ #  # ]:          0 :   _ARC0 (c1);
    1921         [ #  # ]:          0 :   _ARC1 (c2);
    1922 [ #  # ][ #  # ]:          0 :   _DEFC ();
    1923         [ #  # ]:          0 :   nr_double_t a = fabs (arg (*c1)) < M_PI_2 ? abs (*c1) : -abs (*c1);
    1924         [ #  # ]:          0 :   nr_double_t b = fabs (arg (*c2)) < M_PI_2 ? abs (*c2) : -abs (*c2);
    1925         [ #  # ]:          0 :   nr_complex_t r = a > b ? *c1 : *c2;
    1926         [ #  # ]:          0 :   _RETC (r);
    1927                 :            : }
    1928                 :            : 
    1929                 :          0 : constant * evaluate::max_c_d (constant * args) {
    1930         [ #  # ]:          0 :   _ARC0 (c1);
    1931         [ #  # ]:          0 :   _ARD1 (d2);
    1932 [ #  # ][ #  # ]:          0 :   _DEFC ();
    1933         [ #  # ]:          0 :   nr_double_t a = fabs (arg (*c1)) < M_PI_2 ? abs (*c1) : -abs (*c1);
    1934                 :          0 :   nr_double_t b = d2;
    1935         [ #  # ]:          0 :   nr_complex_t r = a > b ? *c1 : d2;
    1936         [ #  # ]:          0 :   _RETC (r);
    1937                 :            : }
    1938                 :            : 
    1939                 :            : // ***************** minimum *******************
    1940                 :          0 : constant * evaluate::min_d (constant * args) {
    1941                 :          0 :   _ARD0 (d1);
    1942         [ #  # ]:          0 :   _DEFD ();
    1943                 :          0 :   _RETD (d1);
    1944                 :            : }
    1945                 :            : 
    1946                 :          0 : constant * evaluate::min_c (constant * args) {
    1947                 :          0 :   _ARC0 (c1);
    1948         [ #  # ]:          0 :   _DEFD ();
    1949         [ #  # ]:          0 :   if (fabs (arg (*c1)) < M_PI_2)
    1950                 :          0 :     res->d = abs (*c1);
    1951                 :            :   else
    1952                 :          0 :     res->d = -abs (*c1);
    1953                 :          0 :   return res;
    1954                 :            : }
    1955                 :            : 
    1956                 :          0 : constant * evaluate::min_v (constant * args) {
    1957                 :          0 :   _ARV0 (v1);
    1958         [ #  # ]:          0 :   _DEFD ();
    1959                 :          0 :   _RETD (v1->minimum ());
    1960                 :            : }
    1961                 :            : 
    1962                 :          0 : constant * evaluate::min_d_d (constant * args) {
    1963                 :          0 :   _ARD0 (d1);
    1964                 :          0 :   _ARD1 (d2);
    1965         [ #  # ]:          0 :   _DEFD ();
    1966         [ #  # ]:          0 :   _RETD (MIN (d1, d2));
    1967                 :            : }
    1968                 :            : 
    1969                 :          0 : constant * evaluate::min_d_c (constant * args) {
    1970         [ #  # ]:          0 :   _ARD0 (d1);
    1971         [ #  # ]:          0 :   _ARC1 (c2);
    1972 [ #  # ][ #  # ]:          0 :   _DEFC ();
    1973                 :          0 :   nr_double_t a = d1;
    1974         [ #  # ]:          0 :   nr_double_t b = fabs (arg (*c2)) < M_PI_2 ? abs (*c2) : -abs (*c2);
    1975         [ #  # ]:          0 :   nr_complex_t r = a < b ? d1 : *c2;
    1976         [ #  # ]:          0 :   _RETC (r);
    1977                 :            : }
    1978                 :            : 
    1979                 :          0 : constant * evaluate::min_c_c (constant * args) {
    1980         [ #  # ]:          0 :   _ARC0 (c1);
    1981         [ #  # ]:          0 :   _ARC1 (c2);
    1982 [ #  # ][ #  # ]:          0 :   _DEFC ();
    1983         [ #  # ]:          0 :   nr_double_t a = fabs (arg (*c1)) < M_PI_2 ? abs (*c1) : -abs (*c1);
    1984         [ #  # ]:          0 :   nr_double_t b = fabs (arg (*c2)) < M_PI_2 ? abs (*c2) : -abs (*c2);
    1985         [ #  # ]:          0 :   nr_complex_t r = a < b ? *c1 : *c2;
    1986         [ #  # ]:          0 :   _RETC (r);
    1987                 :            : }
    1988                 :            : 
    1989                 :          0 : constant * evaluate::min_c_d (constant * args) {
    1990         [ #  # ]:          0 :   _ARC0 (c1);
    1991         [ #  # ]:          0 :   _ARD1 (d2);
    1992 [ #  # ][ #  # ]:          0 :   _DEFC ();
    1993         [ #  # ]:          0 :   nr_double_t a = fabs (arg (*c1)) < M_PI_2 ? abs (*c1) : -abs (*c1);
    1994                 :          0 :   nr_double_t b = d2;
    1995         [ #  # ]:          0 :   nr_complex_t r = a < b ? *c1 : d2;
    1996         [ #  # ]:          0 :   _RETC (r);
    1997                 :            : }
    1998                 :            : 
    1999                 :            : // ******************** sum **********************
    2000                 :          0 : constant * evaluate::sum_d (constant * args) {
    2001                 :          0 :   _ARD0 (d1);
    2002         [ #  # ]:          0 :   _DEFD ();
    2003                 :          0 :   _RETD (d1);
    2004                 :            : }
    2005                 :            : 
    2006                 :          0 : constant * evaluate::sum_c (constant * args) {
    2007                 :          0 :   _ARC0 (c1);
    2008         [ #  # ]:          0 :   _DEFC ();
    2009                 :          0 :   _RETC (*c1);
    2010                 :            : }
    2011                 :            : 
    2012                 :          0 : constant * evaluate::sum_v (constant * args) {
    2013                 :          0 :   _ARV0 (v1);
    2014         [ #  # ]:          0 :   _DEFC ();
    2015 [ #  # ][ #  # ]:          0 :   _RETC (sum (*v1));
    2016                 :            : }
    2017                 :            : 
    2018                 :            : // ****************** product ********************
    2019                 :          0 : constant * evaluate::prod_d (constant * args) {
    2020                 :          0 :   _ARD0 (d1);
    2021         [ #  # ]:          0 :   _DEFD ();
    2022                 :          0 :   _RETD (d1);
    2023                 :            : }
    2024                 :            : 
    2025                 :          0 : constant * evaluate::prod_c (constant * args) {
    2026                 :          0 :   _ARC0 (c1);
    2027         [ #  # ]:          0 :   _DEFC ();
    2028                 :          0 :   _RETC (*c1);
    2029                 :            : }
    2030                 :            : 
    2031                 :          0 : constant * evaluate::prod_v (constant * args) {
    2032                 :          0 :   _ARV0 (v1);
    2033         [ #  # ]:          0 :   _DEFC ();
    2034 [ #  # ][ #  # ]:          0 :   _RETC (prod (*v1));
    2035                 :            : }
    2036                 :            : 
    2037                 :            : // ******************* average *********************
    2038                 :          0 : constant * evaluate::avg_d (constant * args) {
    2039                 :          0 :   _ARD0 (d1);
    2040         [ #  # ]:          0 :   _DEFD ();
    2041                 :          0 :   _RETD (d1);
    2042                 :            : }
    2043                 :            : 
    2044                 :          0 : constant * evaluate::avg_c (constant * args) {
    2045                 :          0 :   _ARC0 (c1);
    2046         [ #  # ]:          0 :   _DEFC ();
    2047                 :          0 :   _RETC (*c1);
    2048                 :            : }
    2049                 :            : 
    2050                 :          0 : constant * evaluate::avg_v (constant * args) {
    2051                 :          0 :   _ARV0 (v1);
    2052         [ #  # ]:          0 :   _DEFC ();
    2053 [ #  # ][ #  # ]:          0 :   _RETC (avg (*v1));
    2054                 :            : }
    2055                 :            : 
    2056                 :            : // ******************* lengths *********************
    2057                 :          0 : constant * evaluate::length_d (constant *) {
    2058         [ #  # ]:          0 :   _DEFD ();
    2059                 :          0 :   _RETD (1);
    2060                 :            : }
    2061                 :            : 
    2062                 :          0 : constant * evaluate::length_c (constant *) {
    2063         [ #  # ]:          0 :   _DEFD ();
    2064                 :          0 :   _RETD (1);
    2065                 :            : }
    2066                 :            : 
    2067                 :          0 : constant * evaluate::length_v (constant * args) {
    2068                 :          0 :   _ARV0 (v1);
    2069         [ #  # ]:          0 :   _DEFD ();
    2070                 :          0 :   _RETD (v1->getSize ());
    2071                 :            : }
    2072                 :            : 
    2073                 :          0 : constant * evaluate::length_m (constant *) {
    2074         [ #  # ]:          0 :   _DEFD ();
    2075                 :          0 :   _RETD (1);
    2076                 :            : }
    2077                 :            : 
    2078                 :          0 : constant * evaluate::length_mv (constant * args) {
    2079                 :          0 :   _ARV0 (mv);
    2080         [ #  # ]:          0 :   _DEFD ();
    2081                 :          0 :   _RETD (mv->getSize ());
    2082                 :            : }
    2083                 :            : 
    2084                 :            : // ***************** array indices *****************
    2085                 :         26 : constant * evaluate::index_mv_2 (constant * args) {
    2086                 :         26 :   _ARMV0 (mv);
    2087                 :         26 :   _ARI1 (r);
    2088                 :         26 :   _ARI2 (c);
    2089         [ +  - ]:         26 :   _DEFV ();
    2090 [ +  - ][ +  - ]:         26 :   if (r < 1 || r > mv->getRows () || c < 1 || c > mv->getCols ()) {
         [ +  - ][ -  + ]
                 [ -  + ]
    2091                 :            :     char txt[256];
    2092                 :            :     sprintf (txt, "matvec indices [%d,%d] out of bounds [1-%d,1-%d]",
    2093                 :          0 :              r, c, mv->getRows (), mv->getCols ());
    2094 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION (txt);
         [ #  # ][ #  # ]
    2095 [ #  # ][ #  # ]:          0 :     res->v = new qucs::vector (mv->getSize ());
    2096                 :            :   } else {
    2097         [ +  - ]:         26 :     res->v = new qucs::vector (mv->get (r - 1, c - 1));
    2098                 :            :   }
    2099                 :         26 :   return res;
    2100                 :            : }
    2101                 :            : 
    2102                 :          0 : constant * evaluate::index_mv_1 (constant * args) {
    2103                 :          0 :   _ARMV0 (mv);
    2104                 :          0 :   _ARI1 (i);
    2105         [ #  # ]:          0 :   _DEFM ();
    2106 [ #  # ][ #  # ]:          0 :   if (i < 1 || i > mv->getSize ()) {
                 [ #  # ]
    2107                 :            :     char txt[256];
    2108                 :          0 :     sprintf (txt, "matvec index [%d] out of bounds [1-%d]", i, mv->getSize ());
    2109 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION (txt);
         [ #  # ][ #  # ]
    2110 [ #  # ][ #  # ]:          0 :     res->m = new matrix (mv->getRows (), mv->getCols ());
    2111                 :            :   } else {
    2112         [ #  # ]:          0 :     res->m = new matrix (mv->get (i - 1));
    2113                 :            :   }
    2114                 :          0 :   return res;
    2115                 :            : }
    2116                 :            : 
    2117                 :            : /* Little helper macros for the following functionality. */
    2118                 :            : #define EQUATION_HAS_DEPS(v,n) \
    2119                 :            :   ((v)->getDataDependencies() != NULL && \
    2120                 :            :    (v)->getDataDependencies()->length() >= n)
    2121                 :            : #define EQUATION_DEPS(v) \
    2122                 :            :   ((v)->getDataDependencies() ? (v)->getDataDependencies()->length() : 1)
    2123                 :            : 
    2124                 :            : /* This following function is used to get a subset of data entries
    2125                 :            :    from a data vector with certain data dependencies. */
    2126                 :          0 : void evaluate::extract_vector (constant * args, int idx, int &skip, int &size,
    2127                 :            :                                constant * res) {
    2128                 :          0 :   _ARV0 (v);
    2129                 :          0 :   int i = INT (_ARES (idx));
    2130                 :          0 :   int type = _ARG(idx)->getType ();
    2131                 :            :   qucs::vector * vres;
    2132                 :          0 :   strlist * deps = _ARES(0)->getDataDependencies ();
    2133         [ #  # ]:          0 :   int didx = (deps ? deps->length () : 0) - idx;
    2134                 :          0 :   int dsize = SOLVEE(0)->getDependencySize (deps, idx);
    2135                 :            : 
    2136                 :            :   // all of the data vector
    2137         [ #  # ]:          0 :   if (type == TAG_RANGE) {
    2138         [ #  # ]:          0 :     if (dsize > 1) {
    2139                 :            :       // dependent vectors: only ':' possible
    2140         [ #  # ]:          0 :       vres = new qucs::vector (*(res->v));
    2141         [ #  # ]:          0 :       skip *= deps ? SOLVEE(0)->getDataSize (deps->get (didx - 1)) : 1;
    2142         [ #  # ]:          0 :       size *= deps ? SOLVEE(0)->getDataSize (deps->get (didx)) : 1;
    2143                 :            :     }
    2144                 :            :     else {
    2145                 :            :       // independent vectors
    2146                 :          0 :       range * r = RNG (_ARES (idx));
    2147                 :            :       int i, n, k;
    2148                 :          0 :       int len = res->v->getSize ();
    2149                 :          0 :       i = (int) r->lo ();
    2150 [ #  # ][ #  # ]:          0 :       if (i < 0 || i >= len) {
    2151                 :            :         char txt[256];
    2152                 :          0 :         sprintf (txt, "vector index %d out of bounds [%d,%d]", i, 0, len - 1);
    2153 [ #  # ][ #  # ]:          0 :         THROW_MATH_EXCEPTION (txt);
         [ #  # ][ #  # ]
    2154                 :            :       }
    2155                 :          0 :       i = (int) r->hi ();
    2156 [ #  # ][ #  # ]:          0 :       if (i < 0 || i >= len) {
    2157                 :            :         char txt[256];
    2158                 :          0 :         sprintf (txt, "vector index %d out of bounds [%d,%d]", i, 0, len - 1);
    2159 [ #  # ][ #  # ]:          0 :         THROW_MATH_EXCEPTION (txt);
         [ #  # ][ #  # ]
    2160                 :            :       }
    2161                 :          0 :       size = 0;
    2162 [ #  # ][ #  # ]:          0 :       for (n = 0; n < len; n++) if (r->inside (n)) size++;
    2163         [ #  # ]:          0 :       vres = new qucs::vector (size);
    2164         [ #  # ]:          0 :       for (k = 0, n = 0; n < len; n++) {
    2165         [ #  # ]:          0 :         if (r->inside (n))
    2166                 :          0 :           vres->set (res->v->get (n), k++);
    2167                 :            :       }
    2168                 :            :     }
    2169                 :            :   }
    2170                 :            :   // a subset
    2171                 :            :   else {
    2172         [ #  # ]:          0 :     vres = new qucs::vector (dsize * size);
    2173         [ #  # ]:          0 :     int len = deps ? SOLVEE(0)->getDataSize (deps->get (didx)) : v->getSize ();
    2174 [ #  # ][ #  # ]:          0 :     if (i < 0 || i >= len) {
    2175                 :            :       char txt[256];
    2176                 :            :       sprintf (txt, "vector index %d (%d) out of bounds [%d,%d]",
    2177                 :          0 :                idx, i, 0, len - 1);
    2178 [ #  # ][ #  # ]:          0 :       THROW_MATH_EXCEPTION (txt);
         [ #  # ][ #  # ]
    2179                 :            :     } else {
    2180                 :            :       int k, n;
    2181         [ #  # ]:          0 :       for (n = k = 0; k < dsize * size; n += skip, k++) {
    2182                 :          0 :         vres->set (res->v->get (dsize * i + n), k);
    2183                 :            :       }
    2184                 :            :     }
    2185 [ #  # ][ #  # ]:          0 :     if (deps && didx >= 0) {
    2186                 :          0 :       res->addDropDependencies (deps->get (didx));
    2187                 :            :     }
    2188                 :            :   }
    2189 [ #  # ][ #  # ]:          0 :   if (res->v != NULL) delete res->v;
    2190                 :          0 :   res->v = vres;
    2191                 :          0 : }
    2192                 :            : 
    2193                 :          0 : constant * evaluate::index_v_1 (constant * args) {
    2194         [ #  # ]:          0 :   _ARV0 (v);
    2195 [ #  # ][ #  # ]:          0 :   _DEFV ();
    2196                 :          0 :   int skip = 1, size = 1;
    2197 [ #  # ][ #  # ]:          0 :   res->v = new qucs::vector (*v);
    2198         [ #  # ]:          0 :   extract_vector (args, 1, skip, size, res);
    2199                 :          0 :   return res;
    2200                 :            : }
    2201                 :            : 
    2202                 :          0 : constant * evaluate::index_v_2 (constant * args) {
    2203         [ #  # ]:          0 :   _ARV0 (v);
    2204 [ #  # ][ #  # ]:          0 :   _DEFV ();
    2205                 :          0 :   int skip = 1, size = 1;
    2206 [ #  # ][ #  # ]:          0 :   res->v = new qucs::vector (*v);
    2207 [ #  # ][ #  # ]:          0 :   if (!EQUATION_HAS_DEPS (_ARES(0), 2)) {
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2208                 :            :     char txt[256];
    2209                 :            :     sprintf (txt, "invalid number of vector indices (%d > %d)", 2,
    2210 [ #  # ][ #  # ]:          0 :              EQUATION_DEPS (_ARES(0)));
         [ #  # ][ #  # ]
    2211 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION (txt);
         [ #  # ][ #  # ]
    2212                 :          0 :     return res;
    2213                 :            :   }
    2214         [ #  # ]:          0 :   extract_vector (args, 1, skip, size, res);
    2215         [ #  # ]:          0 :   extract_vector (args, 2, skip, size, res);
    2216                 :          0 :   return res;
    2217                 :            : }
    2218                 :            : 
    2219                 :          0 : constant * evaluate::index_m_2 (constant * args) {
    2220                 :          0 :   _ARM0 (m);
    2221                 :          0 :   _ARI1 (r);
    2222                 :          0 :   _ARI2 (c);
    2223         [ #  # ]:          0 :   _DEFC ();
    2224 [ #  # ][ #  # ]:          0 :   if (r < 1 || r > m->getRows () || c < 1 || c > m->getCols ()) {
         [ #  # ][ #  # ]
                 [ #  # ]
    2225                 :            :     char txt[256];
    2226                 :            :     sprintf (txt, "matrix indices [%d,%d] out of bounds [1-%d,1-%d]",
    2227                 :          0 :              r, c, m->getRows (), m->getCols ());
    2228 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION (txt);
         [ #  # ][ #  # ]
    2229         [ #  # ]:          0 :     res->c = new nr_complex_t ();
    2230                 :            :   } else {
    2231         [ #  # ]:          0 :     res->c = new nr_complex_t (m->get (r - 1, c - 1));
    2232                 :            :   }
    2233                 :          0 :   return res;
    2234                 :            : }
    2235                 :            : 
    2236                 :          0 : constant * evaluate::index_s_1 (constant * args) {
    2237                 :          0 :   char * s = STR (_ARES(0));
    2238                 :          0 :   _ARI1 (i);
    2239         [ #  # ]:          0 :   constant * res = new constant (TAG_CHAR);
    2240 [ #  # ][ #  # ]:          0 :   res->chr = (i >= 0 && i < (int) strlen (s)) ? s[i] : ' ';
    2241                 :          0 :   return res;
    2242                 :            : }
    2243                 :            : 
    2244                 :            : // Interpolator helper macro without number of points given.
    2245                 :            : #define INTERPOL_HELPER()                     \
    2246                 :            :   constant * arg = new constant (TAG_DOUBLE); \
    2247                 :            :   arg->d = 64;                                \
    2248                 :            :   arg->solvee = args->getResult(0)->solvee;   \
    2249                 :            :   arg->evaluate ();                           \
    2250                 :            :   args->append (arg);
    2251                 :            : 
    2252                 :            : // ***************** interpolation *****************
    2253                 :          0 : constant * evaluate::interpolate_v_v (constant * args) {
    2254         [ #  # ]:          0 :   INTERPOL_HELPER();
    2255                 :          0 :   return interpolate_v_v_d (args);
    2256                 :            : }
    2257                 :            : 
    2258                 :          0 : constant * evaluate::interpolate_v_v_d (constant * args) {
    2259         [ #  # ]:          0 :   _ARV0 (v1);
    2260         [ #  # ]:          0 :   _ARV1 (v2);
    2261         [ #  # ]:          0 :   _ARI2 (n);
    2262 [ #  # ][ #  # ]:          0 :   _DEFV ();
    2263 [ #  # ][ #  # ]:          0 :   if (v1->getSize () < 3) {
    2264 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION ("interpolate: number of datapoints must be greater "
         [ #  # ][ #  # ]
    2265                 :            :                           "than 2");
    2266 [ #  # ][ #  # ]:          0 :     res->v = new qucs::vector ();
    2267                 :          0 :     return res;
    2268                 :            :   }
    2269 [ #  # ][ #  # ]:          0 :   nr_double_t last  = real (v2->get (v2->getSize () - 1));
    2270         [ #  # ]:          0 :   nr_double_t first = real (v2->get (0));
    2271 [ #  # ][ #  # ]:          0 :   constant * arg = new constant (TAG_VECTOR);
    2272 [ #  # ][ #  # ]:          0 :   arg->v = new qucs::vector (qucs::linspace (first, last, n));
    2273         [ #  # ]:          0 :   arg->solvee = args->getResult(0)->solvee;
    2274         [ #  # ]:          0 :   arg->evaluate ();
    2275 [ #  # ][ #  # ]:          0 :   qucs::vector * val = new qucs::vector (n);
    2276         [ #  # ]:          0 :   spline spl (SPLINE_BC_NATURAL);
    2277 [ #  # ][ #  # ]:          0 :   spl.vectors (*v1, *v2);
         [ #  # ][ #  # ]
                 [ #  # ]
    2278         [ #  # ]:          0 :   spl.construct ();
    2279 [ #  # ][ #  # ]:          0 :   for (int k = 0; k < arg->v->getSize (); k++) {
    2280 [ #  # ][ #  # ]:          0 :     val->set (spl.evaluate (real (arg->v->get (k))).f0, k);
                 [ #  # ]
    2281                 :            :   }
    2282                 :          0 :   res->v = val;
    2283 [ #  # ][ #  # ]:          0 :   node * gen = SOLVEE(0)->addGeneratedEquation (arg->v, "Interpolate");
    2284         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    2285                 :          0 :   res->dropdeps = 1;
    2286 [ #  # ][ #  # ]:          0 :   delete arg;
    2287         [ #  # ]:          0 :   return res;
    2288                 :            : }
    2289                 :            : 
    2290                 :            : // ***************** fourier transformations *****************
    2291                 :            : #define FOURIER_HELPER_1(efunc,cfunc,isign,dep) \
    2292                 :            : constant * evaluate:: QUCS_CONCAT2 (efunc,_v_v) (constant * args) { \
    2293                 :            :   _ARV0 (v);                                                        \
    2294                 :            :   _ARV1 (t);                                                        \
    2295                 :            :   _DEFV ();                                                         \
    2296                 :            :   qucs::vector * val = new qucs::vector (QUCS_CONCAT2 (cfunc,_1d) (*v));    \
    2297                 :            :   int k = val->getSize ();                                       \
    2298                 :            :   *val = isign > 0 ? *val / k : *val * k;                        \
    2299                 :            :   res->v = val;                                                          \
    2300                 :            :   int n = t->getSize ();                                         \
    2301                 :            :   if (k != n) {                                                     \
    2302                 :            :     THROW_MATH_EXCEPTION ("nonconformant vector lengths");          \
    2303                 :            :     return res; }                                                   \
    2304                 :            :   nr_double_t last  = real (t->get (n - 1));                     \
    2305                 :            :   nr_double_t first = real (t->get (0));                         \
    2306                 :            :   nr_double_t delta = (last - first) / (n - 1);                     \
    2307                 :            :   constant * arg = new constant (TAG_VECTOR);                       \
    2308                 :            :   arg->v = new qucs::vector (qucs::linspace (0, 1.0 / delta, n));        \
    2309                 :            :   arg->solvee = args->getResult(0)->solvee;                        \
    2310                 :            :   arg->evaluate ();                                              \
    2311                 :            :   node * gen = SOLVEE(0)->addGeneratedEquation (arg->v, dep);         \
    2312                 :            :   res->addPrepDependencies (A(gen)->result);                          \
    2313                 :            :   res->dropdeps = 1;                                             \
    2314                 :            :   args->append (arg);                                                    \
    2315                 :            :   return res;                                                       \
    2316                 :            : }
    2317                 :            : 
    2318                 :            : #define FOURIER_HELPER_2(cfunc) \
    2319                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_v) (constant * args) { \
    2320                 :            :   _ARV0 (v);                                                      \
    2321                 :            :   _DEFV ();                                                       \
    2322                 :            :   qucs::vector * val = new qucs::vector (QUCS_CONCAT2 (cfunc,_1d) (*v));  \
    2323                 :            :   res->v = val;                                                        \
    2324                 :            :   res->dropdeps = 1;                                           \
    2325                 :            :   return res;                                                     \
    2326                 :            : }
    2327                 :            : 
    2328 [ +  - ][ +  - ]:          3 : FOURIER_HELPER_1 (time2freq,dft,1,"Frequency");
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ +  - ][ +  - ]
    2329 [ #  # ][ #  # ]:          0 : FOURIER_HELPER_1 (freq2time,idft,-1,"Time");
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2330 [ #  # ][ #  # ]:          0 : FOURIER_HELPER_2 (fft);
                 [ #  # ]
    2331 [ #  # ][ #  # ]:          0 : FOURIER_HELPER_2 (ifft);
                 [ #  # ]
    2332 [ #  # ][ #  # ]:          0 : FOURIER_HELPER_2 (dft);
                 [ #  # ]
    2333 [ #  # ][ #  # ]:          0 : FOURIER_HELPER_2 (idft);
                 [ #  # ]
    2334                 :            : 
    2335                 :            : // Shuffles values of FFT arounds.
    2336                 :          0 : constant * evaluate::fftshift_v (constant * args) {
    2337                 :          0 :   _ARV0 (v);
    2338         [ #  # ]:          0 :   _DEFV ();
    2339 [ #  # ][ #  # ]:          0 :   res->v = new qucs::vector (fftshift (*v));
    2340                 :          0 :   return res;
    2341                 :            : }
    2342                 :            : 
    2343                 :            : // This is the stoz, ztos, ytos, stoy helper macro.
    2344                 :            : #define MAKE_FUNC_DEFINITION_3(cfunc) \
    2345                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_m) (constant * args) {    \
    2346                 :            :   _ARM0 (m);                                                         \
    2347                 :            :   _DEFM ();                                                          \
    2348                 :            :   _RETM (cfunc (*m));                                                \
    2349                 :            : }                                                                    \
    2350                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_m_d) (constant * args) {  \
    2351                 :            :   _ARM0 (m);                                                         \
    2352                 :            :   _ARD1 (z);                                                         \
    2353                 :            :   _DEFM ();                                                          \
    2354                 :            :   _RETM (cfunc (*m, nr_complex_t (z, 0)));                                   \
    2355                 :            : }                                                                    \
    2356                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_m_c) (constant * args) {  \
    2357                 :            :   _ARM0 (m);                                                         \
    2358                 :            :   _ARC1 (z);                                                         \
    2359                 :            :   _DEFM ();                                                          \
    2360                 :            :   _RETM (cfunc (*m, *z));                                            \
    2361                 :            : }                                                                    \
    2362                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_m_v) (constant * args) {  \
    2363                 :            :   _ARM0 (m);                                                         \
    2364                 :            :   _ARV1 (z);                                                         \
    2365                 :            :   _DEFM ();                                                          \
    2366                 :            :   _RETM (cfunc (*m, *z));                                            \
    2367                 :            : }                                                                    \
    2368                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_mv) (constant * args) {   \
    2369                 :            :   _ARMV0 (m);                                                        \
    2370                 :            :   _DEFMV ();                                                         \
    2371                 :            :   _RETMV (cfunc (*m));                                               \
    2372                 :            : }                                                                    \
    2373                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_mv_d) (constant * args) { \
    2374                 :            :   _ARMV0 (m);                                                        \
    2375                 :            :   _ARD1 (z);                                                         \
    2376                 :            :   _DEFMV ();                                                         \
    2377                 :            :   _RETMV (cfunc (*m, nr_complex_t (z, 0)));                                  \
    2378                 :            : }                                                                    \
    2379                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_mv_c) (constant * args) { \
    2380                 :            :   _ARMV0 (m);                                                        \
    2381                 :            :   _ARC1 (z);                                                         \
    2382                 :            :   _DEFMV ();                                                         \
    2383                 :            :   _RETMV (cfunc (*m, *z));                                           \
    2384                 :            : }                                                                    \
    2385                 :            : constant * evaluate:: QUCS_CONCAT2 (cfunc,_mv_v) (constant * args) { \
    2386                 :            :   _ARMV0 (m);                                                        \
    2387                 :            :   _ARV1 (z);                                                         \
    2388                 :            :   _DEFMV ();                                                         \
    2389                 :            :   _RETMV (cfunc (*m, *z));                                           \
    2390                 :            : }                                                                    \
    2391                 :            : 
    2392 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_3 (stoy);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2393 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_3 (ytos);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2394 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_3 (stoz);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2395 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_3 (ztos);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2396                 :            : 
    2397                 :            : // ***************** matrix conversions *****************
    2398                 :          0 : constant * evaluate::ytoz_m (constant * args) {
    2399                 :          0 :   _ARM0 (m);
    2400         [ #  # ]:          0 :   _DEFM ();
    2401 [ #  # ][ #  # ]:          0 :   _RETM (ytoz (*m));
    2402                 :            : }
    2403                 :            : 
    2404                 :          0 : constant * evaluate::ytoz_mv (constant * args) {
    2405                 :          0 :   _ARMV0 (mv);
    2406         [ #  # ]:          0 :   _DEFMV ();
    2407 [ #  # ][ #  # ]:          0 :   _RETMV (ytoz (*mv));
    2408                 :            : }
    2409                 :            : 
    2410                 :          0 : constant * evaluate::ztoy_m (constant * args) {
    2411                 :          0 :   _ARM0 (m);
    2412         [ #  # ]:          0 :   _DEFM ();
    2413 [ #  # ][ #  # ]:          0 :   _RETM (ztoy (*m));
    2414                 :            : }
    2415                 :            : 
    2416                 :          0 : constant * evaluate::ztoy_mv (constant * args) {
    2417                 :          0 :   _ARMV0 (mv);
    2418         [ #  # ]:          0 :   _DEFMV ();
    2419 [ #  # ][ #  # ]:          0 :   _RETMV (ztoy (*mv));
    2420                 :            : }
    2421                 :            : 
    2422                 :            : // These are stos() helpers.
    2423                 :            : #define _CHKM(m) /* check square matrix */              \
    2424                 :            :   if (m->getCols () != m->getRows ()) {                 \
    2425                 :            :     THROW_MATH_EXCEPTION ("stos: not a square matrix"); \
    2426                 :            :     res->m = new matrix (m->getRows (), m->getCols ()); \
    2427                 :            :     return res; }
    2428                 :            : #define _CHKMV(mv) /* check square matrix vector */                        \
    2429                 :            :   if (mv->getCols () != mv->getRows ()) {                                  \
    2430                 :            :     THROW_MATH_EXCEPTION ("stos: not a square matrix");                    \
    2431                 :            :     res->mv = new matvec (mv->getSize (), mv->getRows (), mv->getCols ()); \
    2432                 :            :     return res; }
    2433                 :            : #define _CHKMA(m,cond) \
    2434                 :            :   if (!(cond)) {                                            \
    2435                 :            :     THROW_MATH_EXCEPTION ("stos: nonconformant arguments"); \
    2436                 :            :     res->m = new matrix (m->getRows (), m->getCols ());     \
    2437                 :            :     return res; }
    2438                 :            : #define _CHKMVA(mv,cond) \
    2439                 :            :   if (!(cond)) {                                                           \
    2440                 :            :     THROW_MATH_EXCEPTION ("stos: nonconformant arguments");                \
    2441                 :            :     res->mv = new matvec (mv->getSize (), mv->getRows (), mv->getCols ()); \
    2442                 :            :     return res; }
    2443                 :            : 
    2444                 :            : // Function -- MATRIX stos (MATRIX, DOUBLE)
    2445                 :          0 : constant * evaluate::stos_m_d (constant * args) {
    2446         [ #  # ]:          0 :   _ARM0 (m); _ARD1 (zref); _DEFM ();
    2447 [ #  # ][ #  # ]:          0 :   _CHKM (m);
                 [ #  # ]
    2448 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, zref));
    2449                 :            : }
    2450                 :            : 
    2451                 :            : // Function -- MATRIX stos (MATRIX, COMPLEX)
    2452                 :          0 : constant * evaluate::stos_m_c (constant * args) {
    2453         [ #  # ]:          0 :   _ARM0 (m); _ARC1 (zref); _DEFM ();
    2454 [ #  # ][ #  # ]:          0 :   _CHKM (m);
                 [ #  # ]
    2455 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, *zref));
    2456                 :            : }
    2457                 :            : 
    2458                 :            : // Function -- MATRIX stos (MATRIX, DOUBLE, DOUBLE)
    2459                 :          0 : constant * evaluate::stos_m_d_d (constant * args) {
    2460         [ #  # ]:          0 :   _ARM0 (m); _ARD1 (zref); _ARD2 (z0); _DEFM ();
    2461 [ #  # ][ #  # ]:          0 :   _CHKM (m);
                 [ #  # ]
    2462 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, zref, z0));
    2463                 :            : }
    2464                 :            : 
    2465                 :            : // Function -- MATRIX stos (MATRIX, DOUBLE, COMPLEX)
    2466                 :          0 : constant * evaluate::stos_m_d_c (constant * args) {
    2467         [ #  # ]:          0 :   _ARM0 (m); _ARD1 (zref); _ARC2 (z0); _DEFM ();
    2468 [ #  # ][ #  # ]:          0 :   _CHKM (m);
                 [ #  # ]
    2469 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, nr_complex_t (zref, 0), *z0));
    2470                 :            : }
    2471                 :            : 
    2472                 :            : // Function -- MATRIX stos (MATRIX, COMPLEX, DOUBLE)
    2473                 :          0 : constant * evaluate::stos_m_c_d (constant * args) {
    2474         [ #  # ]:          0 :   _ARM0 (m); _ARC1 (zref); _ARD2 (z0); _DEFM ();
    2475 [ #  # ][ #  # ]:          0 :   _CHKM (m);
                 [ #  # ]
    2476 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, *zref, nr_complex_t (z0, 0)));
    2477                 :            : }
    2478                 :            : 
    2479                 :            : // Function -- MATRIX stos (MATRIX, COMPLEX, COMPLEX)
    2480                 :          0 : constant * evaluate::stos_m_c_c (constant * args) {
    2481         [ #  # ]:          0 :   _ARM0 (m); _ARC1 (zref); _ARC2 (z0); _DEFM ();
    2482 [ #  # ][ #  # ]:          0 :   _CHKM (m);
                 [ #  # ]
    2483 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, *zref, *z0));
    2484                 :            : }
    2485                 :            : 
    2486                 :            : // Function -- MATRIX stos (MATRIX, VECTOR)
    2487                 :          0 : constant * evaluate::stos_m_v (constant * args) {
    2488         [ #  # ]:          0 :   _ARM0 (m); _ARV1 (zref); _DEFM ();
    2489 [ #  # ][ #  # ]:          0 :   _CHKM (m); _CHKMA (m, m->getRows () == zref->getSize ());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2490 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, *zref));
         [ #  # ][ #  # ]
    2491                 :            : }
    2492                 :            : 
    2493                 :            : // Function -- MATRIX stos (MATRIX, VECTOR, DOUBLE)
    2494                 :          0 : constant * evaluate::stos_m_v_d (constant * args) {
    2495         [ #  # ]:          0 :   _ARM0 (m); _ARV1 (zref); _ARD2 (z0); _DEFM ();
    2496 [ #  # ][ #  # ]:          0 :   _CHKM (m); _CHKMA (m, m->getRows () == zref->getSize ());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2497 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, *zref, nr_complex_t (z0, 0)));
         [ #  # ][ #  # ]
    2498                 :            : }
    2499                 :            : 
    2500                 :            : // Function -- MATRIX stos (MATRIX, VECTOR, COMPLEX)
    2501                 :          0 : constant * evaluate::stos_m_v_c (constant * args) {
    2502         [ #  # ]:          0 :   _ARM0 (m); _ARV1 (zref); _ARC2 (z0); _DEFM ();
    2503 [ #  # ][ #  # ]:          0 :   _CHKM (m); _CHKMA (m, m->getRows () == zref->getSize ());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2504 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, *zref, *z0));
         [ #  # ][ #  # ]
    2505                 :            : }
    2506                 :            : 
    2507                 :            : // Function -- MATRIX stos (MATRIX, DOUBLE, VECTOR)
    2508                 :          0 : constant * evaluate::stos_m_d_v (constant * args) {
    2509         [ #  # ]:          0 :   _ARM0 (m); _ARD1 (zref); _ARV2 (z0); _DEFM ();
    2510 [ #  # ][ #  # ]:          0 :   _CHKM (m); _CHKMA (m, m->getRows () == z0->getSize ());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2511 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, nr_complex_t (zref, 0), *z0));
         [ #  # ][ #  # ]
    2512                 :            : }
    2513                 :            : 
    2514                 :            : // Function -- MATRIX stos (MATRIX, COMPLEX, VECTOR)
    2515                 :          0 : constant * evaluate::stos_m_c_v (constant * args) {
    2516         [ #  # ]:          0 :   _ARM0 (m); _ARC1 (zref); _ARV2 (z0); _DEFM ();
    2517 [ #  # ][ #  # ]:          0 :   _CHKM (m); _CHKMA (m, m->getRows () == z0->getSize ());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2518 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, *zref, *z0));
         [ #  # ][ #  # ]
    2519                 :            : }
    2520                 :            : 
    2521                 :            : // Function -- MATRIX stos (MATRIX, VECTOR, VECTOR)
    2522                 :          0 : constant * evaluate::stos_m_v_v (constant * args) {
    2523         [ #  # ]:          0 :   _ARM0 (m); _ARV1 (zref); _ARV2 (z0); _DEFM ();
    2524 [ #  # ][ #  # ]:          0 :   _CHKM (m); _CHKMA (m, m->getRows () == z0->getSize () &&
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2525                 :            :                      m->getRows () == zref->getSize ());
    2526 [ #  # ][ #  # ]:          0 :   _RETM (stos (*m, *zref, *z0));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2527                 :            : }
    2528                 :            : 
    2529                 :            : // Function -- MATVEC stos (MATVEC, DOUBLE)
    2530                 :          0 : constant * evaluate::stos_mv_d (constant * args) {
    2531         [ #  # ]:          0 :   _ARMV0 (mv); _ARD1 (zref); _DEFMV ();
    2532 [ #  # ][ #  # ]:          0 :   _CHKMV (mv);
                 [ #  # ]
    2533 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, zref));
    2534                 :            : }
    2535                 :            : 
    2536                 :            : // Function -- MATVEC stos (MATVEC, COMPLEX)
    2537                 :          0 : constant * evaluate::stos_mv_c (constant * args) {
    2538         [ #  # ]:          0 :   _ARMV0 (mv); _ARC1 (zref); _DEFMV ();
    2539 [ #  # ][ #  # ]:          0 :   _CHKMV (mv);
                 [ #  # ]
    2540 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, *zref));
    2541                 :            : }
    2542                 :            : 
    2543                 :            : // Function -- MATVEC stos (MATVEC, DOUBLE, DOUBLE)
    2544                 :          0 : constant * evaluate::stos_mv_d_d (constant * args) {
    2545         [ #  # ]:          0 :   _ARMV0 (mv); _ARD1 (zref); _ARD2 (z0); _DEFMV ();
    2546 [ #  # ][ #  # ]:          0 :   _CHKMV (mv);
                 [ #  # ]
    2547 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, zref, z0));
    2548                 :            : }
    2549                 :            : 
    2550                 :            : // Function -- MATVEC stos (MATVEC, DOUBLE, COMPLEX)
    2551                 :          0 : constant * evaluate::stos_mv_d_c (constant * args) {
    2552         [ #  # ]:          0 :   _ARMV0 (mv); _ARD1 (zref); _ARC2 (z0); _DEFMV ();
    2553 [ #  # ][ #  # ]:          0 :   _CHKMV (mv);
                 [ #  # ]
    2554 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, nr_complex_t (zref, 0), *z0));
    2555                 :            : }
    2556                 :            : 
    2557                 :            : // Function -- MATVEC stos (MATVEC, COMPLEX, DOUBLE)
    2558                 :          0 : constant * evaluate::stos_mv_c_d (constant * args) {
    2559         [ #  # ]:          0 :   _ARMV0 (mv); _ARC1 (zref); _ARD2 (z0); _DEFMV ();
    2560 [ #  # ][ #  # ]:          0 :   _CHKMV (mv);
                 [ #  # ]
    2561 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, *zref, nr_complex_t (z0, 0)));
    2562                 :            : }
    2563                 :            : 
    2564                 :            : // Function -- MATVEC stos (MATVEC, COMPLEX, COMPLEX)
    2565                 :          0 : constant * evaluate::stos_mv_c_c (constant * args) {
    2566         [ #  # ]:          0 :   _ARMV0 (mv); _ARC1 (zref); _ARC2 (z0); _DEFMV ();
    2567 [ #  # ][ #  # ]:          0 :   _CHKMV (mv);
                 [ #  # ]
    2568 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, *zref, *z0));
    2569                 :            : }
    2570                 :            : 
    2571                 :            : // Function -- MATVEC stos (MATVEC, VECTOR)
    2572                 :          0 : constant * evaluate::stos_mv_v (constant * args) {
    2573         [ #  # ]:          0 :   _ARMV0 (mv); _ARV1 (zref); _DEFMV ();
    2574 [ #  # ][ #  # ]:          0 :   _CHKMV (mv); _CHKMVA (mv, mv->getRows () == zref->getSize ());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2575 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, *zref));
         [ #  # ][ #  # ]
    2576                 :            : }
    2577                 :            : 
    2578                 :            : // Function -- MATVEC stos (MATVEC, VECTOR, DOUBLE)
    2579                 :          0 : constant * evaluate::stos_mv_v_d (constant * args) {
    2580         [ #  # ]:          0 :   _ARMV0 (mv); _ARV1 (zref); _ARD2 (z0); _DEFMV ();
    2581 [ #  # ][ #  # ]:          0 :   _CHKMV (mv); _CHKMVA (mv, mv->getRows () == zref->getSize ());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2582 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, *zref, nr_complex_t (z0, 0)));
         [ #  # ][ #  # ]
    2583                 :            : }
    2584                 :            : 
    2585                 :            : // Function -- MATVEC stos (MATVEC, VECTOR, COMPLEX)
    2586                 :          0 : constant * evaluate::stos_mv_v_c (constant * args) {
    2587         [ #  # ]:          0 :   _ARMV0 (mv); _ARV1 (zref); _ARC2 (z0); _DEFMV ();
    2588 [ #  # ][ #  # ]:          0 :   _CHKMV (mv); _CHKMVA (mv, mv->getRows () == zref->getSize ());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2589 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, *zref, *z0));
         [ #  # ][ #  # ]
    2590                 :            : }
    2591                 :            : 
    2592                 :            : // Function -- MATVEC stos (MATVEC, DOUBLE, VECTOR)
    2593                 :          0 : constant * evaluate::stos_mv_d_v (constant * args) {
    2594         [ #  # ]:          0 :   _ARMV0 (mv); _ARD1 (zref); _ARV2 (z0); _DEFMV ();
    2595 [ #  # ][ #  # ]:          0 :   _CHKMV (mv); _CHKMVA (mv, mv->getRows () == z0->getSize ());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2596 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, nr_complex_t (zref, 0), *z0));
         [ #  # ][ #  # ]
    2597                 :            : }
    2598                 :            : 
    2599                 :            : // Function -- MATVEC stos (MATVEC, COMPLEX, VECTOR)
    2600                 :          0 : constant * evaluate::stos_mv_c_v (constant * args) {
    2601         [ #  # ]:          0 :   _ARMV0 (mv); _ARC1 (zref); _ARV2 (z0); _DEFMV ();
    2602 [ #  # ][ #  # ]:          0 :   _CHKMV (mv); _CHKMVA (mv, mv->getRows () == z0->getSize ());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2603 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, *zref, *z0));
         [ #  # ][ #  # ]
    2604                 :            : }
    2605                 :            : 
    2606                 :            : // Function -- MATVEC stos (MATVEC, VECTOR, VECTOR)
    2607                 :          0 : constant * evaluate::stos_mv_v_v (constant * args) {
    2608         [ #  # ]:          0 :   _ARMV0 (mv); _ARV1 (zref); _ARV2 (z0); _DEFMV ();
    2609 [ #  # ][ #  # ]:          0 :   _CHKMV (mv); _CHKMVA (mv, mv->getRows () == z0->getSize () &&
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2610                 :            :                         mv->getRows () == zref->getSize ());
    2611 [ #  # ][ #  # ]:          0 :   _RETMV (stos (*mv, *zref, *z0));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2612                 :            : }
    2613                 :            : 
    2614                 :          0 : constant * evaluate::twoport_m (constant * args) {
    2615                 :          0 :   _ARM0 (m);
    2616                 :          0 :   char f = CHR (_ARES(1));
    2617                 :          0 :   char t = CHR (_ARES(2));
    2618         [ #  # ]:          0 :   _DEFM ();
    2619 [ #  # ][ #  # ]:          0 :   if (m->getRows () < 2 || m->getCols () < 2) {
                 [ #  # ]
    2620         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("invalid matrix dimensions for twoport "
    2621                 :            :                           "transformation");
    2622         [ #  # ]:          0 :     _RETM (*m);
    2623                 :            :   }
    2624 [ #  # ][ #  # ]:          0 :   _RETM (twoport (*m, toupper (f), toupper (t)));
         [ #  # ][ #  # ]
    2625                 :            : }
    2626                 :            : 
    2627                 :          0 : constant * evaluate::twoport_mv (constant * args) {
    2628                 :          0 :   _ARMV0 (mv);
    2629                 :          0 :   char f = CHR (_ARES(1));
    2630                 :          0 :   char t = CHR (_ARES(2));
    2631         [ #  # ]:          0 :   _DEFMV ();
    2632 [ #  # ][ #  # ]:          0 :   if (mv->getRows () < 2 || mv->getCols () < 2) {
                 [ #  # ]
    2633         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("invalid matrix dimensions for twoport "
    2634                 :            :                           "transformation");
    2635         [ #  # ]:          0 :     _RETMV (*mv);
    2636                 :            :   }
    2637 [ #  # ][ #  # ]:          0 :   _RETMV (twoport (*mv, toupper (f), toupper (t)));
         [ #  # ][ #  # ]
    2638                 :            : }
    2639                 :            : 
    2640                 :          0 : constant * evaluate::inverse_m (constant * args) {
    2641                 :          0 :   _ARM0 (m);
    2642         [ #  # ]:          0 :   _DEFM ();
    2643 [ #  # ][ #  # ]:          0 :   _RETM (inverse (*m));
    2644                 :            : }
    2645                 :            : 
    2646                 :          0 : constant * evaluate::inverse_mv (constant * args) {
    2647                 :          0 :   _ARMV0 (mv);
    2648         [ #  # ]:          0 :   _DEFMV ();
    2649 [ #  # ][ #  # ]:          0 :   _RETMV (inverse (*mv));
    2650                 :            : }
    2651                 :            : 
    2652                 :          0 : constant * evaluate::transpose_m (constant * args) {
    2653                 :          0 :   _ARM0 (m);
    2654         [ #  # ]:          0 :   _DEFM ();
    2655 [ #  # ][ #  # ]:          0 :   _RETM (transpose (*m));
    2656                 :            : }
    2657                 :            : 
    2658                 :          0 : constant * evaluate::transpose_mv (constant * args) {
    2659                 :          0 :   _ARMV0 (mv);
    2660         [ #  # ]:          0 :   _DEFMV ();
    2661 [ #  # ][ #  # ]:          0 :   _RETMV (transpose (*mv));
    2662                 :            : }
    2663                 :            : 
    2664                 :          0 : constant * evaluate::det_m (constant * args) {
    2665                 :          0 :   _ARM0 (m);
    2666         [ #  # ]:          0 :   _DEFC ();
    2667 [ #  # ][ #  # ]:          0 :   _RETC (det (*m));
    2668                 :            : }
    2669                 :            : 
    2670                 :          0 : constant * evaluate::det_mv (constant * args) {
    2671                 :          0 :   _ARMV0 (mv);
    2672         [ #  # ]:          0 :   _DEFV ();
    2673 [ #  # ][ #  # ]:          0 :   _RETV (det (*mv));
    2674                 :            : }
    2675                 :            : 
    2676                 :          0 : constant * evaluate::eye_m (constant * args) {
    2677                 :          0 :   _ARI0 (i);
    2678         [ #  # ]:          0 :   _DEFM ();
    2679         [ #  # ]:          0 :   _RETM (eye (i));
    2680                 :            : }
    2681                 :            : 
    2682                 :          0 : constant * evaluate::adjoint_m (constant * args) {
    2683                 :          0 :   _ARM0 (m);
    2684         [ #  # ]:          0 :   _DEFM ();
    2685 [ #  # ][ #  # ]:          0 :   _RETM (adjoint (*m));
    2686                 :            : }
    2687                 :            : 
    2688                 :          0 : constant * evaluate::adjoint_mv (constant * args) {
    2689                 :          0 :   _ARMV0 (mv);
    2690         [ #  # ]:          0 :   _DEFMV ();
    2691 [ #  # ][ #  # ]:          0 :   _RETMV (adjoint (*mv));
    2692                 :            : }
    2693                 :            : 
    2694                 :            : // ***************** s-parameter stability factors *****************
    2695                 :          0 : constant * evaluate::rollet_m (constant * args) {
    2696                 :          0 :   _ARM0 (m);
    2697         [ #  # ]:          0 :   _DEFD ();
    2698         [ #  # ]:          0 :   _RETD (rollet (*m));
    2699                 :            : }
    2700                 :            : 
    2701                 :          0 : constant * evaluate::rollet_mv (constant * args) {
    2702                 :          0 :   _ARMV0 (mv);
    2703         [ #  # ]:          0 :   _DEFV ();
    2704 [ #  # ][ #  # ]:          0 :   _RETV (rollet (*mv));
    2705                 :            : }
    2706                 :            : 
    2707                 :          0 : constant * evaluate::mu1_m (constant * args) {
    2708                 :          0 :   _ARM0 (m);
    2709         [ #  # ]:          0 :   _DEFD ();
    2710                 :            :   nr_double_t k;
    2711                 :          0 :   k = (1 - norm (m->get (0, 0))) /
    2712 [ #  # ][ #  # ]:          0 :     (abs (m->get (1, 1) - conj (m->get (0, 0)) * det (*m)) +
         [ #  # ][ #  # ]
                 [ #  # ]
    2713 [ #  # ][ #  # ]:          0 :      abs (m->get (0, 1) * m->get (1, 0)));
                 [ #  # ]
    2714                 :          0 :   _RETD (k);
    2715                 :            : }
    2716                 :            : 
    2717                 :          0 : constant * evaluate::mu1_mv (constant * args) {
    2718         [ #  # ]:          0 :   _ARMV0 (mv);
    2719 [ #  # ][ #  # ]:          0 :   _DEFV ();
    2720         [ #  # ]:          0 :   qucs::vector k;
    2721                 :            :   k = (1 - norm (mv->get (0, 0))) /
    2722                 :            :     (abs (mv->get (1, 1) - conj (mv->get (0, 0)) * det (*mv)) +
    2723 [ #  # ][ #  # ]:          0 :      abs (mv->get (0, 1) * mv->get (1, 0)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2724 [ #  # ][ #  # ]:          0 :   _RETV (k);
                 [ #  # ]
    2725                 :            : }
    2726                 :            : 
    2727                 :          0 : constant * evaluate::mu2_m (constant * args) {
    2728                 :          0 :   _ARM0 (m);
    2729         [ #  # ]:          0 :   _DEFD ();
    2730                 :            :   nr_double_t k;
    2731                 :          0 :   k = (1 - norm (m->get (1, 1))) /
    2732 [ #  # ][ #  # ]:          0 :     (abs (m->get (0, 0) - conj (m->get (1, 1)) * det (*m)) +
         [ #  # ][ #  # ]
                 [ #  # ]
    2733 [ #  # ][ #  # ]:          0 :      abs (m->get (0, 1) * m->get (1, 0)));
                 [ #  # ]
    2734                 :          0 :   _RETD (k);
    2735                 :            : }
    2736                 :            : 
    2737                 :          0 : constant * evaluate::mu2_mv (constant * args) {
    2738         [ #  # ]:          0 :   _ARMV0 (mv);
    2739 [ #  # ][ #  # ]:          0 :   _DEFV ();
    2740         [ #  # ]:          0 :   qucs::vector k;
    2741                 :            :   k = (1 - norm (mv->get (1, 1))) /
    2742                 :            :     (abs (mv->get (0, 0) - conj (mv->get (1, 1)) * det (*mv)) +
    2743 [ #  # ][ #  # ]:          0 :      abs (mv->get (0, 1) * mv->get (1, 0)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2744 [ #  # ][ #  # ]:          0 :   _RETV (k);
                 [ #  # ]
    2745                 :            : }
    2746                 :            : 
    2747                 :          0 : constant * evaluate::b1_m (constant * args) {
    2748                 :          0 :   _ARM0 (m);
    2749         [ #  # ]:          0 :   _DEFD ();
    2750         [ #  # ]:          0 :   _RETD (b1 (*m));
    2751                 :            : }
    2752                 :            : 
    2753                 :          0 : constant * evaluate::b1_mv (constant * args) {
    2754                 :          0 :   _ARMV0 (mv);
    2755         [ #  # ]:          0 :   _DEFV ();
    2756 [ #  # ][ #  # ]:          0 :   _RETV (b1 (*mv));
    2757                 :            : }
    2758                 :            : 
    2759                 :            : // ***************** vector creation *****************
    2760                 :          0 : constant * evaluate::linspace (constant * args) {
    2761                 :          0 :   _ARD0 (start);
    2762                 :          0 :   _ARD1 (stop);
    2763                 :          0 :   _ARI2 (points);
    2764         [ #  # ]:          0 :   _DEFV ();
    2765         [ #  # ]:          0 :   if (points < 2) {
    2766         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("linspace: number of points must be greater than 1");
    2767         [ #  # ]:          0 :     res->v = new qucs::vector ();
    2768                 :          0 :     return res;
    2769                 :            :   }
    2770         [ #  # ]:          0 :   _RETV (qucs::linspace (start, stop, points));
    2771                 :            : }
    2772                 :            : 
    2773                 :          0 : constant * evaluate::logspace (constant * args) {
    2774                 :          0 :   _ARD0 (start);
    2775                 :          0 :   _ARD1 (stop);
    2776                 :          0 :   _ARI2 (points);
    2777         [ #  # ]:          0 :   _DEFV ();
    2778         [ #  # ]:          0 :   if (points < 2) {
    2779         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("logspace: number of points must be greater than 1");
    2780         [ #  # ]:          0 :     res->v = new qucs::vector ();
    2781                 :          0 :     return res;
    2782                 :            :   }
    2783         [ #  # ]:          0 :   if (start * stop <= 0) {
    2784         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("logspace: invalid start/stop values");
    2785         [ #  # ]:          0 :     res->v = new qucs::vector (points);
    2786                 :          0 :     return res;
    2787                 :            :   }
    2788         [ #  # ]:          0 :   _RETV (qucs::logspace (start, stop, points));
    2789                 :            : }
    2790                 :            : 
    2791                 :            : // Circle helper macro with a number of points given.
    2792                 :            : #define CIRCLE_HELPER_D(argi)                   \
    2793                 :            :   int n = INT (args->getResult (argi));         \
    2794                 :            :   if (n < 2) {                                  \
    2795                 :            :     THROW_MATH_EXCEPTION ("Circle: number of points must be greater than 1"); \
    2796                 :            :     _DEFV (); \
    2797                 :            :     res->v = new qucs::vector ();                    \
    2798                 :            :     return res;                                 \
    2799                 :            :   }                                             \
    2800                 :            :   constant * arg = new constant (TAG_VECTOR);   \
    2801                 :            :   arg->v = new qucs::vector (qucs::linspace (0, 360, n));    \
    2802                 :            :   arg->solvee = args->getResult(0)->solvee;     \
    2803                 :            :   arg->evaluate ();                             \
    2804                 :            :   delete args->get(argi);                       \
    2805                 :            :   args->get((argi)-1)->setNext (NULL);          \
    2806                 :            :   args->append (arg);
    2807                 :            : 
    2808                 :            : // Circle helper macro with no additional argument given.
    2809                 :            : #define CIRCLE_HELPER_A()                        \
    2810                 :            :   constant * arg = new constant (TAG_VECTOR);    \
    2811                 :            :   arg->v = new qucs::vector (qucs::linspace (0, 360, 64));   \
    2812                 :            :   arg->solvee = args->getResult(0)->solvee;      \
    2813                 :            :   arg->evaluate ();                              \
    2814                 :            :   args->append (arg);
    2815                 :            : 
    2816                 :            : // ***************** s-parameter noise circles *****************
    2817                 :          0 : constant * evaluate::noise_circle_d_v (constant * args) {
    2818         [ #  # ]:          0 :   qucs::vector * Sopt = V (_ARES(0));
    2819         [ #  # ]:          0 :   qucs::vector * Fmin = V (_ARES(1));
    2820         [ #  # ]:          0 :   qucs::vector * Rn   = V (_ARES(2));
    2821         [ #  # ]:          0 :   nr_double_t F = D (_ARES(3));
    2822         [ #  # ]:          0 :   qucs::vector * arc  = V (_ARES(4));
    2823                 :            : 
    2824 [ #  # ][ #  # ]:          0 :   _DEFV ();
    2825 [ #  # ][ #  # ]:          0 :   qucs::vector N = circuit::z0 / 4 / *Rn * (F - *Fmin) * norm (1 + *Sopt);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2826 [ #  # ][ #  # ]:          0 :   qucs::vector R = sqrt (N * N + N * (1 - norm (*Sopt))) / (1 + N);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2827 [ #  # ][ #  # ]:          0 :   qucs::vector C = *Sopt / (1 + N);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2828 [ #  # ][ #  # ]:          0 :   qucs::vector * circle = new qucs::vector (C.getSize () * arc->getSize ());
         [ #  # ][ #  # ]
    2829                 :          0 :   int i, a, j; nr_complex_t v;
    2830 [ #  # ][ #  # ]:          0 :   for (i = 0, j = 0; i < C.getSize (); i++) {
    2831 [ #  # ][ #  # ]:          0 :     for (a = 0; a < arc->getSize (); a++, j++) {
    2832 [ #  # ][ #  # ]:          0 :       v = C.get (i) + R.get (i) * exp (nr_complex_t (0, 1) * rad (arc->get (a)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2833         [ #  # ]:          0 :       circle->set (v, j);
    2834                 :            :     }
    2835                 :            :   }
    2836                 :            : 
    2837 [ #  # ][ #  # ]:          0 :   node * gen = SOLVEE(4)->addGeneratedEquation (arc, "Arcs");
    2838         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    2839                 :          0 :   res->v = circle;
    2840 [ #  # ][ #  # ]:          0 :   return res;
                 [ #  # ]
    2841                 :            : }
    2842                 :            : 
    2843                 :          0 : constant * evaluate::noise_circle_d_d (constant * args) {
    2844 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_D (4);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2845                 :          0 :   return noise_circle_d_v (args);
    2846                 :            : }
    2847                 :            : 
    2848                 :          0 : constant * evaluate::noise_circle_d (constant * args) {
    2849 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_A ();
    2850                 :          0 :   return noise_circle_d_v (args);
    2851                 :            : }
    2852                 :            : 
    2853                 :          0 : constant * evaluate::noise_circle_v_v (constant * args) {
    2854         [ #  # ]:          0 :   qucs::vector * Sopt = V (_ARES(0));
    2855         [ #  # ]:          0 :   qucs::vector * Fmin = V (_ARES(1));
    2856         [ #  # ]:          0 :   qucs::vector * Rn   = V (_ARES(2));
    2857         [ #  # ]:          0 :   qucs::vector * F    = V (_ARES(3));
    2858         [ #  # ]:          0 :   :: vector * arc  = V (_ARES(4));
    2859                 :            : 
    2860 [ #  # ][ #  # ]:          0 :   _DEFV ();
    2861                 :            :   qucs::vector * circle =
    2862 [ #  # ][ #  # ]:          0 :       new qucs::vector (Sopt->getSize () * arc->getSize () * F->getSize ());
         [ #  # ][ #  # ]
                 [ #  # ]
    2863 [ #  # ][ #  # ]:          0 :   int i, a, j, f; nr_complex_t v; qucs::vector N, R, C;
                 [ #  # ]
    2864 [ #  # ][ #  # ]:          0 :   for (f = 0; f < F->getSize (); f++) {
    2865 [ #  # ][ #  # ]:          0 :     N = circuit::z0 / 4 / *Rn * (F->get (f) - *Fmin) * norm (1 + *Sopt);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2866 [ #  # ][ #  # ]:          0 :     R = sqrt (N * N + N * (1 - norm (*Sopt))) / (1 + N);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2867 [ #  # ][ #  # ]:          0 :     C = *Sopt / (1 + N);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2868 [ #  # ][ #  # ]:          0 :     for (i = 0; i < C.getSize (); i++) {
    2869 [ #  # ][ #  # ]:          0 :       for (a = 0; a < arc->getSize (); a++) {
    2870 [ #  # ][ #  # ]:          0 :         v = C.get (i) + R.get (i) * exp (nr_complex_t (0, 1) * rad (arc->get (a)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2871 [ #  # ][ #  # ]:          0 :         j = i * F->getSize () * arc->getSize () + f * arc->getSize () + a;
                 [ #  # ]
    2872         [ #  # ]:          0 :         circle->set (v, j);
    2873                 :            :       }
    2874                 :            :     }
    2875                 :            :   }
    2876                 :            : 
    2877                 :            :   node * gen;
    2878 [ #  # ][ #  # ]:          0 :   gen = SOLVEE(3)->addGeneratedEquation (F, "NF");
    2879         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    2880 [ #  # ][ #  # ]:          0 :   gen = SOLVEE(4)->addGeneratedEquation (arc, "Arcs");
    2881         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    2882                 :            : 
    2883                 :          0 :   res->v = circle;
    2884 [ #  # ][ #  # ]:          0 :   return res;
                 [ #  # ]
    2885                 :            : }
    2886                 :            : 
    2887                 :          0 : constant * evaluate::noise_circle_v_d (constant * args) {
    2888 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_D (4);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2889                 :          0 :   return noise_circle_v_v (args);
    2890                 :            : }
    2891                 :            : 
    2892                 :          0 : constant * evaluate::noise_circle_v (constant * args) {
    2893 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_A ();
    2894                 :          0 :   return noise_circle_v_v (args);
    2895                 :            : }
    2896                 :            : 
    2897                 :            : // ***************** s-parameter stability circles *****************
    2898                 :          0 : constant * evaluate::stab_circle_l_v (constant * args) {
    2899         [ #  # ]:          0 :   _ARMV0 (S);
    2900         [ #  # ]:          0 :   _ARV1 (arc);
    2901 [ #  # ][ #  # ]:          0 :   _DEFV ();
    2902 [ #  # ][ #  # ]:          0 :   qucs::vector D = norm (S->get (1, 1)) - norm (det (*S));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2903 [ #  # ][ #  # ]:          0 :   qucs::vector C = (conj (S->get (1, 1)) - S->get (0, 0) * conj (det (*S))) / D;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2904 [ #  # ][ #  # ]:          0 :   qucs::vector R = abs (S->get (0, 1)) * abs (S->get (1, 0)) / D;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2905 [ #  # ][ #  # ]:          0 :   qucs::vector * circle = new qucs::vector (S->getSize () * arc->getSize ());
                 [ #  # ]
    2906                 :          0 :   int a, d, i; nr_complex_t v;
    2907         [ #  # ]:          0 :   for (i = 0, d = 0; i < S->getSize (); i++) {
    2908 [ #  # ][ #  # ]:          0 :     for (a = 0; a < arc->getSize (); a++, d++) {
    2909 [ #  # ][ #  # ]:          0 :       v = C.get (i) + R.get (i) * exp (nr_complex_t (0, 1) * rad (arc->get (a)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2910         [ #  # ]:          0 :       circle->set (v, d);
    2911                 :            :     }
    2912                 :            :   }
    2913 [ #  # ][ #  # ]:          0 :   node * gen = SOLVEE(1)->addGeneratedEquation (arc, "Arcs");
    2914         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    2915                 :          0 :   res->v = circle;
    2916 [ #  # ][ #  # ]:          0 :   return res;
                 [ #  # ]
    2917                 :            : }
    2918                 :            : 
    2919                 :          0 : constant * evaluate::stab_circle_l_d (constant * args) {
    2920 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_D (1);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2921                 :          0 :   return stab_circle_l_v (args);
    2922                 :            : }
    2923                 :            : 
    2924                 :          0 : constant * evaluate::stab_circle_l (constant * args) {
    2925 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_A ();
    2926                 :          0 :   return stab_circle_l_v (args);
    2927                 :            : }
    2928                 :            : 
    2929                 :          0 : constant * evaluate::stab_circle_s_v (constant * args) {
    2930         [ #  # ]:          0 :   _ARMV0 (S);
    2931         [ #  # ]:          0 :   _ARV1 (arc);
    2932 [ #  # ][ #  # ]:          0 :   _DEFV ();
    2933 [ #  # ][ #  # ]:          0 :   qucs::vector D = norm (S->get (0, 0)) - norm (det (*S));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2934 [ #  # ][ #  # ]:          0 :   qucs::vector C = (conj (S->get (0, 0)) - S->get (1, 1) * conj (det (*S))) / D;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2935 [ #  # ][ #  # ]:          0 :   qucs::vector R = abs (S->get (0, 1)) * abs (S->get (1, 0)) / D;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2936 [ #  # ][ #  # ]:          0 :   qucs::vector * circle = new qucs::vector (S->getSize () * arc->getSize ());
                 [ #  # ]
    2937                 :          0 :   int a, d, i; nr_complex_t v;
    2938         [ #  # ]:          0 :   for (i = 0, d = 0; i < S->getSize (); i++) {
    2939 [ #  # ][ #  # ]:          0 :     for (a = 0; a < arc->getSize (); a++, d++) {
    2940 [ #  # ][ #  # ]:          0 :       v = C.get (i) + R.get (i) * exp (nr_complex_t (0, 1) * rad (arc->get (a)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2941         [ #  # ]:          0 :       circle->set (v, d);
    2942                 :            :     }
    2943                 :            :   }
    2944 [ #  # ][ #  # ]:          0 :   node * gen = SOLVEE(1)->addGeneratedEquation (arc, "Arcs");
    2945         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    2946                 :          0 :   res->v = circle;
    2947 [ #  # ][ #  # ]:          0 :   return res;
                 [ #  # ]
    2948                 :            : }
    2949                 :            : 
    2950                 :          0 : constant * evaluate::stab_circle_s_d (constant * args) {
    2951 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_D (1);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2952                 :          0 :   return stab_circle_s_v (args);
    2953                 :            : }
    2954                 :            : 
    2955                 :          0 : constant * evaluate::stab_circle_s (constant * args) {
    2956 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_A ();
    2957                 :          0 :   return stab_circle_s_v (args);
    2958                 :            : }
    2959                 :            : 
    2960                 :            : // ***************** s-parameter gain circles *****************
    2961                 :          0 : constant * evaluate::ga_circle_d_v (constant * args) {
    2962         [ #  # ]:          0 :   _ARMV0 (S);
    2963         [ #  # ]:          0 :   _ARD1 (G);
    2964         [ #  # ]:          0 :   _ARV2 (arc);
    2965 [ #  # ][ #  # ]:          0 :   _DEFV ();
    2966 [ #  # ][ #  # ]:          0 :   qucs::vector g, D, c, s, k, C, R, d;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2967 [ #  # ][ #  # ]:          0 :   D = det (*S);
         [ #  # ][ #  # ]
                 [ #  # ]
    2968 [ #  # ][ #  # ]:          0 :   c = S->get (0, 0) - conj (S->get (1, 1)) * D;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2969 [ #  # ][ #  # ]:          0 :   k = rollet (*S);
         [ #  # ][ #  # ]
                 [ #  # ]
    2970 [ #  # ][ #  # ]:          0 :   s = S->get (0, 1) * S->get (1, 0);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2971 [ #  # ][ #  # ]:          0 :   g = G / norm (S->get (1, 0));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2972 [ #  # ][ #  # ]:          0 :   d = 1 + g * (norm (S->get (0, 0)) - norm (D));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2973 [ #  # ][ #  # ]:          0 :   C = g * conj (c) / d;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2974 [ #  # ][ #  # ]:          0 :   R = sqrt (1 - 2 * k * g * abs (s) + g * g * norm (s)) / abs (d);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2975                 :            : 
    2976 [ #  # ][ #  # ]:          0 :   qucs::vector * circle = new qucs::vector (S->getSize () * arc->getSize ());
                 [ #  # ]
    2977                 :          0 :   int i, a, j; nr_complex_t v;
    2978 [ #  # ][ #  # ]:          0 :   for (i = 0, j = 0; i < C.getSize (); i++) {
    2979 [ #  # ][ #  # ]:          0 :     for (a = 0; a < arc->getSize (); a++, j++) {
    2980 [ #  # ][ #  # ]:          0 :       v = C.get (i) + R.get (i) * exp (nr_complex_t (0, 1) * rad (arc->get (a)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2981         [ #  # ]:          0 :       circle->set (v, j);
    2982                 :            :     }
    2983                 :            :   }
    2984                 :            : 
    2985 [ #  # ][ #  # ]:          0 :   node * gen = SOLVEE(2)->addGeneratedEquation (arc, "Arcs");
    2986         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    2987                 :          0 :   res->v = circle;
    2988 [ #  # ][ #  # ]:          0 :   return res;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    2989                 :            : }
    2990                 :            : 
    2991                 :          0 : constant * evaluate::ga_circle_d_d (constant * args) {
    2992 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_D (2);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    2993                 :          0 :   return ga_circle_d_v (args);
    2994                 :            : }
    2995                 :            : 
    2996                 :          0 : constant * evaluate::ga_circle_d (constant * args) {
    2997 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_A ();
    2998                 :          0 :   return ga_circle_d_v (args);
    2999                 :            : }
    3000                 :            : 
    3001                 :          0 : constant * evaluate::ga_circle_v_v (constant * args) {
    3002         [ #  # ]:          0 :   _ARMV0 (S);
    3003         [ #  # ]:          0 :   _ARV1 (G);
    3004         [ #  # ]:          0 :   _ARV2 (arc);
    3005 [ #  # ][ #  # ]:          0 :   _DEFV ();
    3006                 :            :   qucs::vector * circle =
    3007 [ #  # ][ #  # ]:          0 :     new qucs::vector (S->getSize () * arc->getSize () * G->getSize ());
         [ #  # ][ #  # ]
    3008 [ #  # ][ #  # ]:          0 :   int i, a, j, f; nr_complex_t v; qucs::vector g, D, c, s, k, R, C, d;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3009 [ #  # ][ #  # ]:          0 :   D = det (*S);
         [ #  # ][ #  # ]
                 [ #  # ]
    3010 [ #  # ][ #  # ]:          0 :   c = S->get (0, 0) - conj (S->get (1, 1)) * D;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3011 [ #  # ][ #  # ]:          0 :   k = rollet (*S);
         [ #  # ][ #  # ]
                 [ #  # ]
    3012 [ #  # ][ #  # ]:          0 :   s = S->get (0, 1) * S->get (1, 0);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3013 [ #  # ][ #  # ]:          0 :   for (f = 0; f < G->getSize (); f++) {
    3014 [ #  # ][ #  # ]:          0 :     g = G->get (f) / norm (S->get (1, 0));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3015 [ #  # ][ #  # ]:          0 :     d = 1 + g * (norm (S->get (0, 0)) - norm (D));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3016 [ #  # ][ #  # ]:          0 :     C = g * conj (c) / d;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3017 [ #  # ][ #  # ]:          0 :     R = sqrt (1 - 2 * k * g * abs (s) + g * g * norm (s)) / abs (d);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3018 [ #  # ][ #  # ]:          0 :     for (i = 0; i < C.getSize (); i++) {
    3019 [ #  # ][ #  # ]:          0 :       for (a = 0; a < arc->getSize (); a++) {
    3020 [ #  # ][ #  # ]:          0 :         v = C.get (i) + R.get (i) * exp (nr_complex_t (0, 1) * rad (arc->get (a)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3021 [ #  # ][ #  # ]:          0 :         j = i * G->getSize () * arc->getSize () + f * arc->getSize () + a;
                 [ #  # ]
    3022         [ #  # ]:          0 :         circle->set (v, j);
    3023                 :            :       }
    3024                 :            :     }
    3025                 :            :   }
    3026                 :            : 
    3027                 :            :   node * gen;
    3028 [ #  # ][ #  # ]:          0 :   gen = SOLVEE(1)->addGeneratedEquation (G, "Ga");
    3029         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    3030 [ #  # ][ #  # ]:          0 :   gen = SOLVEE(2)->addGeneratedEquation (arc, "Arcs");
    3031         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    3032                 :          0 :   res->v = circle;
    3033 [ #  # ][ #  # ]:          0 :   return res;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3034                 :            : }
    3035                 :            : 
    3036                 :          0 : constant * evaluate::ga_circle_v_d (constant * args) {
    3037 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_D (2);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3038                 :          0 :   return ga_circle_v_v (args);
    3039                 :            : }
    3040                 :            : 
    3041                 :          0 : constant * evaluate::ga_circle_v (constant * args) {
    3042 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_A ();
    3043                 :          0 :   return ga_circle_v_v (args);
    3044                 :            : }
    3045                 :            : 
    3046                 :          0 : constant * evaluate::gp_circle_d_v (constant * args) {
    3047         [ #  # ]:          0 :   _ARMV0 (S);
    3048         [ #  # ]:          0 :   _ARD1 (G);
    3049         [ #  # ]:          0 :   _ARV2 (arc);
    3050 [ #  # ][ #  # ]:          0 :   _DEFV ();
    3051 [ #  # ][ #  # ]:          0 :   qucs::vector g, D, c, s, k, C, R, d;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3052 [ #  # ][ #  # ]:          0 :   D = det (*S);
         [ #  # ][ #  # ]
                 [ #  # ]
    3053 [ #  # ][ #  # ]:          0 :   c = S->get (1, 1) - conj (S->get (0, 0)) * D;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3054 [ #  # ][ #  # ]:          0 :   k = rollet (*S);
         [ #  # ][ #  # ]
                 [ #  # ]
    3055 [ #  # ][ #  # ]:          0 :   s = S->get (0, 1) * S->get (1, 0);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3056 [ #  # ][ #  # ]:          0 :   g = G / norm (S->get (1, 0));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3057 [ #  # ][ #  # ]:          0 :   d = 1 + g * (norm (S->get (1, 1)) - norm (D));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3058 [ #  # ][ #  # ]:          0 :   C = g * conj (c) / d;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3059 [ #  # ][ #  # ]:          0 :   R = sqrt (1 - 2 * k * g * abs (s) + g * g * norm (s)) / abs (d);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3060                 :            : 
    3061 [ #  # ][ #  # ]:          0 :   qucs::vector * circle = new qucs::vector (S->getSize () * arc->getSize ());
                 [ #  # ]
    3062                 :          0 :   int i, a, j; nr_complex_t v;
    3063 [ #  # ][ #  # ]:          0 :   for (i = 0, j = 0; i < C.getSize (); i++) {
    3064 [ #  # ][ #  # ]:          0 :     for (a = 0; a < arc->getSize (); a++, j++) {
    3065 [ #  # ][ #  # ]:          0 :       v = C.get (i) + R.get (i) * exp (nr_complex_t (0, 1) * rad (arc->get (a)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3066         [ #  # ]:          0 :       circle->set (v, j);
    3067                 :            :     }
    3068                 :            :   }
    3069                 :            : 
    3070 [ #  # ][ #  # ]:          0 :   node * gen = SOLVEE(2)->addGeneratedEquation (arc, "Arcs");
    3071         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    3072                 :          0 :   res->v = circle;
    3073 [ #  # ][ #  # ]:          0 :   return res;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3074                 :            : }
    3075                 :            : 
    3076                 :          0 : constant * evaluate::gp_circle_d_d (constant * args) {
    3077 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_D (2);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3078                 :          0 :   return gp_circle_d_v (args);
    3079                 :            : }
    3080                 :            : 
    3081                 :          0 : constant * evaluate::gp_circle_d (constant * args) {
    3082 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_A ();
    3083                 :          0 :   return gp_circle_d_v (args);
    3084                 :            : }
    3085                 :            : 
    3086                 :          0 : constant * evaluate::gp_circle_v_v (constant * args) {
    3087         [ #  # ]:          0 :   _ARMV0 (S);
    3088         [ #  # ]:          0 :   _ARV1 (G);
    3089         [ #  # ]:          0 :   _ARV2 (arc);
    3090 [ #  # ][ #  # ]:          0 :   _DEFV ();
    3091                 :            :   qucs::vector * circle =
    3092 [ #  # ][ #  # ]:          0 :       new qucs::vector (S->getSize () * arc->getSize () * G->getSize ());
         [ #  # ][ #  # ]
    3093 [ #  # ][ #  # ]:          0 :   int i, a, j, f; nr_complex_t v; qucs::vector g, D, c, s, k, R, C, d;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3094 [ #  # ][ #  # ]:          0 :   D = det (*S);
         [ #  # ][ #  # ]
                 [ #  # ]
    3095 [ #  # ][ #  # ]:          0 :   c = S->get (1, 1) - conj (S->get (0, 0)) * D;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3096 [ #  # ][ #  # ]:          0 :   k = rollet (*S);
         [ #  # ][ #  # ]
                 [ #  # ]
    3097 [ #  # ][ #  # ]:          0 :   s = S->get (0, 1) * S->get (1, 0);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3098 [ #  # ][ #  # ]:          0 :   for (f = 0; f < G->getSize (); f++) {
    3099 [ #  # ][ #  # ]:          0 :     g = G->get (f) / norm (S->get (1, 0));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3100 [ #  # ][ #  # ]:          0 :     d = 1 + g * (norm (S->get (1, 1)) - norm (D));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3101 [ #  # ][ #  # ]:          0 :     C = g * conj (c) / d;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3102 [ #  # ][ #  # ]:          0 :     R = sqrt (1 - 2 * k * g * abs (s) + g * g * norm (s)) / abs (d);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3103 [ #  # ][ #  # ]:          0 :     for (i = 0; i < C.getSize (); i++) {
    3104 [ #  # ][ #  # ]:          0 :       for (a = 0; a < arc->getSize (); a++) {
    3105 [ #  # ][ #  # ]:          0 :         v = C.get (i) + R.get (i) * exp (nr_complex_t (0, 1) * rad (arc->get (a)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3106 [ #  # ][ #  # ]:          0 :         j = i * G->getSize () * arc->getSize () + f * arc->getSize () + a;
                 [ #  # ]
    3107         [ #  # ]:          0 :         circle->set (v, j);
    3108                 :            :       }
    3109                 :            :     }
    3110                 :            :   }
    3111                 :            : 
    3112                 :            :   node * gen;
    3113 [ #  # ][ #  # ]:          0 :   gen = SOLVEE(1)->addGeneratedEquation (G, "Gp");
    3114         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    3115 [ #  # ][ #  # ]:          0 :   gen = SOLVEE(2)->addGeneratedEquation (arc, "Arcs");
    3116         [ #  # ]:          0 :   res->addPrepDependencies (A(gen)->result);
    3117                 :          0 :   res->v = circle;
    3118 [ #  # ][ #  # ]:          0 :   return res;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3119                 :            : }
    3120                 :            : 
    3121                 :          0 : constant * evaluate::gp_circle_v_d (constant * args) {
    3122 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_D (2);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    3123                 :          0 :   return gp_circle_v_v (args);
    3124                 :            : }
    3125                 :            : 
    3126                 :          0 : constant * evaluate::gp_circle_v (constant * args) {
    3127 [ #  # ][ #  # ]:          0 :   CIRCLE_HELPER_A ();
    3128                 :          0 :   return gp_circle_v_v (args);
    3129                 :            : }
    3130                 :            : 
    3131                 :            : // ***************** versus vectors *****************
    3132                 :          2 : constant * evaluate::plot_vs_v (constant * args) {
    3133                 :          2 :   _ARV0 (v);
    3134         [ +  - ]:          2 :   _DEFV ();
    3135                 :          2 :   int i = 1;
    3136         [ +  + ]:          4 :   for (node * arg = args->getNext (); arg != NULL; arg = arg->getNext ()) {
    3137                 :          2 :     node * gen = arg->solvee->addGeneratedEquation (V (_ARES (i)), "Versus");
    3138                 :          2 :     res->addPrepDependencies (A(gen)->result);
    3139                 :          2 :     i++;
    3140                 :            :   }
    3141                 :          2 :   res->dropdeps = 1;
    3142         [ +  - ]:          2 :   _RETV (*v);
    3143                 :            : }
    3144                 :            : 
    3145                 :          0 : constant * evaluate::plot_vs_mv (constant * args) {
    3146                 :          0 :   _ARMV0 (mv);
    3147         [ #  # ]:          0 :   _DEFMV ();
    3148                 :          0 :   int i = 1;
    3149         [ #  # ]:          0 :   for (node * arg = args->getNext (); arg != NULL; arg = arg->getNext ()) {
    3150                 :          0 :     node * gen = arg->solvee->addGeneratedEquation (V (_ARES (i)), "Versus");
    3151                 :          0 :     res->addPrepDependencies (A(gen)->result);
    3152                 :          0 :     i++;
    3153                 :            :   }
    3154                 :          0 :   res->dropdeps = 1;
    3155         [ #  # ]:          0 :   _RETMV (*mv);
    3156                 :            : }
    3157                 :            : 
    3158                 :            : // ***************** find x-value for given y-value *****************
    3159                 :          0 : constant * evaluate::xvalue_d (constant * args) {
    3160         [ #  # ]:          0 :   _ARV0 (v);
    3161         [ #  # ]:          0 :   _ARD1 (d);
    3162 [ #  # ][ #  # ]:          0 :   _DEFC ();
    3163 [ #  # ][ #  # ]:          0 :   strlist * deps = _ARG(0)->collectDataDependencies ();
    3164 [ #  # ][ #  # ]:          0 :   if (!deps || deps->length () != 1) {
         [ #  # ][ #  # ]
    3165 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
         [ #  # ][ #  # ]
    3166         [ #  # ]:          0 :     _RETC (0.0);
    3167                 :            :   }
    3168 [ #  # ][ #  # ]:          0 :   qucs::vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
                 [ #  # ]
    3169                 :            :   int idx, i;
    3170                 :          0 :   nr_double_t t, diff = std::numeric_limits<nr_double_t>::max();
    3171 [ #  # ][ #  # ]:          0 :   for (idx = i = 0; i < v->getSize (); i++) {
    3172         [ #  # ]:          0 :     t = abs (v->get (i) - d);
    3173         [ #  # ]:          0 :     if (t < diff) {
    3174                 :          0 :       idx = i;
    3175                 :          0 :       diff = t;
    3176                 :            :     }
    3177                 :            :   }
    3178 [ #  # ][ #  # ]:          0 :   _RETC (indep->get (idx));
    3179                 :            : }
    3180                 :            : 
    3181                 :          0 : constant * evaluate::xvalue_c (constant * args) {
    3182                 :          0 :   _ARV0 (v);
    3183                 :          0 :   _ARC1 (c);
    3184         [ #  # ]:          0 :   _DEFC ();
    3185                 :          0 :   strlist * deps = _ARG(0)->collectDataDependencies ();
    3186 [ #  # ][ #  # ]:          0 :   if (!deps || deps->length () != 1) {
                 [ #  # ]
    3187         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
    3188                 :          0 :     _RETC (0.0);
    3189                 :            :   }
    3190                 :          0 :   qucs::vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
    3191                 :            :   int idx, i;
    3192                 :          0 :   nr_double_t t, diff = std::numeric_limits<nr_double_t>::max();
    3193         [ #  # ]:          0 :   for (idx = i = 0; i < v->getSize (); i++) {
    3194         [ #  # ]:          0 :     t = abs (v->get (i) - *c);
    3195         [ #  # ]:          0 :     if (t < diff) {
    3196                 :          0 :       idx = i;
    3197                 :          0 :       diff = t;
    3198                 :            :     }
    3199                 :            :   }
    3200         [ #  # ]:          0 :   _RETC (indep->get (idx));
    3201                 :            : }
    3202                 :            : 
    3203                 :            : // ***************** find y-value for given x-value *****************
    3204                 :          0 : constant * evaluate::yvalue_d (constant * args) {
    3205         [ #  # ]:          0 :   _ARV0 (v);
    3206         [ #  # ]:          0 :   _ARD1 (d);
    3207 [ #  # ][ #  # ]:          0 :   _DEFC ();
    3208 [ #  # ][ #  # ]:          0 :   strlist * deps = _ARG(0)->collectDataDependencies ();
    3209 [ #  # ][ #  # ]:          0 :   if (!deps || deps->length () != 1) {
         [ #  # ][ #  # ]
    3210 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
         [ #  # ][ #  # ]
    3211         [ #  # ]:          0 :     _RETC (0.0);
    3212                 :            :   }
    3213 [ #  # ][ #  # ]:          0 :   qucs::vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
                 [ #  # ]
    3214                 :            :   int idx, i;
    3215                 :          0 :   nr_double_t t, diff = std::numeric_limits<nr_double_t>::max();
    3216 [ #  # ][ #  # ]:          0 :   for (idx = i = 0; i < indep->getSize (); i++) {
    3217         [ #  # ]:          0 :     t = abs (indep->get (i) - d);
    3218         [ #  # ]:          0 :     if (t < diff) {
    3219                 :          0 :       idx = i;
    3220                 :          0 :       diff = t;
    3221                 :            :     }
    3222                 :            :   }
    3223 [ #  # ][ #  # ]:          0 :   _RETC (v->get (idx));
    3224                 :            : }
    3225                 :            : 
    3226                 :          0 : constant * evaluate::yvalue_c (constant * args) {
    3227                 :          0 :   _ARV0 (v);
    3228                 :          0 :   _ARC1 (c);
    3229         [ #  # ]:          0 :   _DEFC ();
    3230                 :          0 :   strlist * deps = _ARG(0)->collectDataDependencies ();
    3231 [ #  # ][ #  # ]:          0 :   if (!deps || deps->length () != 1) {
                 [ #  # ]
    3232         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
    3233                 :          0 :     _RETC (0.0);
    3234                 :            :   }
    3235                 :          0 :   qucs::vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
    3236                 :            :   int idx, i;
    3237                 :          0 :   nr_double_t t, diff = std::numeric_limits<nr_double_t>::max();
    3238         [ #  # ]:          0 :   for (idx = i = 0; i < indep->getSize (); i++) {
    3239         [ #  # ]:          0 :     t = abs (indep->get (i) - *c);
    3240         [ #  # ]:          0 :     if (t < diff) {
    3241                 :          0 :       idx = i;
    3242                 :          0 :       diff = t;
    3243                 :            :     }
    3244                 :            :   }
    3245         [ #  # ]:          0 :   _RETC (v->get (idx));
    3246                 :            : }
    3247                 :            : 
    3248                 :            : // ***************** min, max, avg using range specification *****************
    3249                 :          0 : constant * evaluate::max_r (constant * args) {
    3250         [ #  # ]:          0 :   _ARV0 (v);
    3251         [ #  # ]:          0 :   _ARR1 (r);
    3252 [ #  # ][ #  # ]:          0 :   _DEFD ();
    3253 [ #  # ][ #  # ]:          0 :   strlist * deps = _ARG(0)->collectDataDependencies ();
    3254 [ #  # ][ #  # ]:          0 :   if (!deps || deps->length () != 1) {
         [ #  # ][ #  # ]
    3255 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
         [ #  # ][ #  # ]
    3256                 :          0 :     _RETD (0.0);
    3257                 :            :   }
    3258 [ #  # ][ #  # ]:          0 :   qucs::vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
                 [ #  # ]
    3259                 :          0 :   nr_complex_t c;
    3260                 :          0 :   nr_double_t d, M = -std::numeric_limits<nr_double_t>::max();
    3261 [ #  # ][ #  # ]:          0 :   for (int i = 0; i < indep->getSize (); i++) {
    3262 [ #  # ][ #  # ]:          0 :     if (r->inside (real (indep->get (i)))) {
                 [ #  # ]
    3263         [ #  # ]:          0 :       c = v->get (i);
    3264         [ #  # ]:          0 :       d = fabs (arg (c)) < M_PI_2 ? abs (c) : -abs (c);
    3265         [ #  # ]:          0 :       if (d > M) M = d;
    3266                 :            :     }
    3267                 :            :   }
    3268                 :          0 :   _RETD (M);
    3269                 :            : }
    3270                 :            : 
    3271                 :          0 : constant * evaluate::min_r (constant * args) {
    3272         [ #  # ]:          0 :   _ARV0 (v);
    3273         [ #  # ]:          0 :   _ARR1 (r);
    3274 [ #  # ][ #  # ]:          0 :   _DEFD ();
    3275 [ #  # ][ #  # ]:          0 :   strlist * deps = _ARG(0)->collectDataDependencies ();
    3276 [ #  # ][ #  # ]:          0 :   if (!deps || deps->length () != 1) {
         [ #  # ][ #  # ]
    3277 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
         [ #  # ][ #  # ]
    3278                 :          0 :     _RETD (0.0);
    3279                 :            :   }
    3280 [ #  # ][ #  # ]:          0 :   qucs::vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
                 [ #  # ]
    3281                 :          0 :   nr_complex_t c;
    3282                 :          0 :   nr_double_t d, M = +std::numeric_limits<nr_double_t>::max();
    3283 [ #  # ][ #  # ]:          0 :   for (int i = 0; i < indep->getSize (); i++) {
    3284 [ #  # ][ #  # ]:          0 :     if (r->inside (real (indep->get (i)))) {
                 [ #  # ]
    3285         [ #  # ]:          0 :       c = v->get (i);
    3286         [ #  # ]:          0 :       d = fabs (arg (c)) < M_PI_2 ? abs (c) : -abs (c);
    3287         [ #  # ]:          0 :       if (d < M) M = d;
    3288                 :            :     }
    3289                 :            :   }
    3290                 :          0 :   _RETD (M);
    3291                 :            : }
    3292                 :            : 
    3293                 :          0 : constant * evaluate::avg_r (constant * args) {
    3294         [ #  # ]:          0 :   _ARV0 (v);
    3295         [ #  # ]:          0 :   _ARR1 (r);
    3296 [ #  # ][ #  # ]:          0 :   _DEFC ();
    3297 [ #  # ][ #  # ]:          0 :   strlist * deps = _ARG(0)->collectDataDependencies ();
    3298 [ #  # ][ #  # ]:          0 :   if (!deps || deps->length () != 1) {
         [ #  # ][ #  # ]
    3299 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION ("not an appropriate dependent data vector");
         [ #  # ][ #  # ]
    3300         [ #  # ]:          0 :     _RETC (0.0);
    3301                 :            :   }
    3302 [ #  # ][ #  # ]:          0 :   qucs::vector * indep = SOLVEE(0)->getDataVector (deps->get (0));
                 [ #  # ]
    3303                 :          0 :   nr_complex_t c = 0.0;
    3304                 :            :   int i, k;
    3305 [ #  # ][ #  # ]:          0 :   for (k = i = 0; i < indep->getSize (); i++) {
    3306 [ #  # ][ #  # ]:          0 :     if (r->inside (real (indep->get (i)))) {
                 [ #  # ]
    3307         [ #  # ]:          0 :       c += v->get (i);
    3308                 :          0 :       k++;
    3309                 :            :     }
    3310                 :            :   }
    3311         [ #  # ]:          0 :   _RETC (c / (nr_double_t) k);
    3312                 :            : }
    3313                 :            : 
    3314                 :            : // *************** range functionality *****************
    3315                 :          0 : constant * evaluate::range_d_d (constant * args) {
    3316                 :          0 :   _ARD0 (d1);
    3317                 :          0 :   _ARD1 (d2);
    3318         [ #  # ]:          0 :   _DEFR ();
    3319         [ #  # ]:          0 :   _RETR (new range ('[', d1, d2, ']'));
    3320                 :            : }
    3321                 :            : 
    3322                 :          0 : constant * evaluate::range_c_d (constant * args) {
    3323                 :          0 :   _ARD1 (d2);
    3324         [ #  # ]:          0 :   _DEFR ();
    3325         [ #  # ]:          0 :   _RETR (new range ('.', d2 - 1, d2, ']'));
    3326                 :            : }
    3327                 :            : 
    3328                 :          0 : constant * evaluate::range_d_c (constant * args) {
    3329                 :          0 :   _ARD0 (d1);
    3330         [ #  # ]:          0 :   _DEFR ();
    3331         [ #  # ]:          0 :   _RETR (new range ('[', d1, d1 + 1, '.'));
    3332                 :            : }
    3333                 :            : 
    3334                 :          0 : constant * evaluate::range_c_c (constant *) {
    3335         [ #  # ]:          0 :   _DEFR ();
    3336         [ #  # ]:          0 :   _RETR (new range ('.', 0, 0, '.'));
    3337                 :            : }
    3338                 :            : 
    3339 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_STD (ceil);        // ceil double->integer conversion
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3340 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_STD (floor);       // floor double->integer conversion
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3341 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_QUCS (fix);        // fix double->integer conversion
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3342 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_QUCS (step);       // step function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3343 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_QUCS (round);      // round function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3344                 :            : //#ifndef HAVE_ERF
    3345 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_SPECIAL (erf);     // error function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3346                 :            : //#else
    3347                 :            : //MAKE_FUNC_DEFINITION_0_STD (erf);     // error function
    3348                 :            : //#endif
    3349                 :            : //#ifndef HAVE_ERFC
    3350 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_SPECIAL (erfc);    // complementary error function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3351                 :            : //#else
    3352                 :            : //MAKE_FUNC_DEFINITION_0_STD (erfc);    // complementary error function
    3353                 :            : //#endif
    3354 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_SPECIAL (erfinv);  // inverse of error function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3355 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_SPECIAL (erfcinv); // inverse of complementary error function
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3356 [ #  # ][ #  # ]:          0 : MAKE_FUNC_DEFINITION_0_SPECIAL (i0);      // modified bessel zero order
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3357                 :            : 
    3358                 :            : // ******************* cumulative sum *********************
    3359                 :          0 : constant * evaluate::cumsum_d (constant * args) {
    3360                 :          0 :   _ARD0 (d1);
    3361         [ #  # ]:          0 :   _DEFD ();
    3362                 :          0 :   _RETD (d1);
    3363                 :            : }
    3364                 :            : 
    3365                 :          0 : constant * evaluate::cumsum_c (constant * args) {
    3366                 :          0 :   _ARC0 (c1);
    3367         [ #  # ]:          0 :   _DEFC ();
    3368                 :          0 :   _RETC (*c1);
    3369                 :            : }
    3370                 :            : 
    3371                 :          0 : constant * evaluate::cumsum_v (constant * args) {
    3372                 :          0 :   _ARV0 (v1);
    3373         [ #  # ]:          0 :   _DEFV ();
    3374 [ #  # ][ #  # ]:          0 :   _RETV (cumsum (*v1));
    3375                 :            : }
    3376                 :            : 
    3377                 :            : // **************** cumulative average ******************
    3378                 :          0 : constant * evaluate::cumavg_d (constant * args) {
    3379                 :          0 :   _ARD0 (d1);
    3380         [ #  # ]:          0 :   _DEFD ();
    3381                 :          0 :   _RETD (d1);
    3382                 :            : }
    3383                 :            : 
    3384                 :          0 : constant * evaluate::cumavg_c (constant * args) {
    3385                 :          0 :   _ARC0 (c1);
    3386         [ #  # ]:          0 :   _DEFC ();
    3387                 :          0 :   _RETC (*c1);
    3388                 :            : }
    3389                 :            : 
    3390                 :          0 : constant * evaluate::cumavg_v (constant * args) {
    3391                 :          0 :   _ARV0 (v1);
    3392         [ #  # ]:          0 :   _DEFV ();
    3393 [ #  # ][ #  # ]:          0 :   _RETV (cumavg (*v1));
    3394                 :            : }
    3395                 :            : 
    3396                 :            : // ******************* cumulative product *********************
    3397                 :          0 : constant * evaluate::cumprod_d (constant * args) {
    3398                 :          0 :   _ARD0 (d1);
    3399         [ #  # ]:          0 :   _DEFD ();
    3400                 :          0 :   _RETD (d1);
    3401                 :            : }
    3402                 :            : 
    3403                 :          0 : constant * evaluate::cumprod_c (constant * args) {
    3404                 :          0 :   _ARC0 (c1);
    3405         [ #  # ]:          0 :   _DEFC ();
    3406                 :          0 :   _RETC (*c1);
    3407                 :            : }
    3408                 :            : 
    3409                 :          0 : constant * evaluate::cumprod_v (constant * args) {
    3410                 :          0 :   _ARV0 (v1);
    3411         [ #  # ]:          0 :   _DEFV ();
    3412 [ #  # ][ #  # ]:          0 :   _RETV (cumprod (*v1));
    3413                 :            : }
    3414                 :            : 
    3415                 :            : // ******************* rms *********************
    3416                 :          0 : constant * evaluate::rms_d (constant * args) {
    3417                 :          0 :   _ARD0 (d1);
    3418         [ #  # ]:          0 :   _DEFD ();
    3419                 :          0 :   _RETD (fabs (d1));
    3420                 :            : }
    3421                 :            : 
    3422                 :          0 : constant * evaluate::rms_c (constant * args) {
    3423                 :          0 :   _ARC0 (c1);
    3424         [ #  # ]:          0 :   _DEFD ();
    3425                 :          0 :   _RETD (abs (*c1));
    3426                 :            : }
    3427                 :            : 
    3428                 :          0 : constant * evaluate::rms_v (constant * args) {
    3429                 :          0 :   _ARV0 (v1);
    3430         [ #  # ]:          0 :   _DEFD ();
    3431                 :          0 :   _RETD (v1->rms ());
    3432                 :            : }
    3433                 :            : 
    3434                 :            : // ******************* variance *********************
    3435                 :          0 : constant * evaluate::variance_d (constant *) {
    3436         [ #  # ]:          0 :   _DEFD ();
    3437                 :          0 :   _RETD (0);
    3438                 :            : }
    3439                 :            : 
    3440                 :          0 : constant * evaluate::variance_c (constant *) {
    3441         [ #  # ]:          0 :   _DEFD ();
    3442                 :          0 :   _RETD (0);
    3443                 :            : }
    3444                 :            : 
    3445                 :          0 : constant * evaluate::variance_v (constant * args) {
    3446                 :          0 :   _ARV0 (v1);
    3447         [ #  # ]:          0 :   _DEFD ();
    3448                 :          0 :   _RETD (v1->variance ());
    3449                 :            : }
    3450                 :            : 
    3451                 :            : // ******************* stddev *********************
    3452                 :          0 : constant * evaluate::stddev_d (constant *) {
    3453         [ #  # ]:          0 :   _DEFD ();
    3454                 :          0 :   _RETD (0);
    3455                 :            : }
    3456                 :            : 
    3457                 :          0 : constant * evaluate::stddev_c (constant *) {
    3458         [ #  # ]:          0 :   _DEFD ();
    3459                 :          0 :   _RETD (0);
    3460                 :            : }
    3461                 :            : 
    3462                 :          0 : constant * evaluate::stddev_v (constant * args) {
    3463                 :          0 :   _ARV0 (v1);
    3464         [ #  # ]:          0 :   _DEFD ();
    3465                 :          0 :   _RETD (v1->stddev ());
    3466                 :            : }
    3467                 :            : 
    3468                 :            : // ********* jn (bessel function of 1st kind, nth order) ***********
    3469                 :          0 : constant * evaluate::jn_d_d (constant * args) {
    3470                 :          0 :   _ARI0 (n);
    3471                 :          0 :   _ARD1 (x);
    3472         [ #  # ]:          0 :   _DEFD ();
    3473                 :          0 :   _RETD (::jn (n, x));
    3474                 :            : }
    3475                 :            : 
    3476                 :          0 : constant * evaluate::jn_d_c (constant * args) {
    3477                 :          0 :   _ARI0 (n);
    3478                 :          0 :   _ARC1 (x);
    3479         [ #  # ]:          0 :   _DEFC ();
    3480         [ #  # ]:          0 :   _RETC (jn (n, *x));
    3481                 :            : }
    3482                 :            : 
    3483                 :          0 : constant * evaluate::jn_d_v (constant * args) {
    3484                 :          0 :   _ARI0 (n);
    3485                 :          0 :   _ARV1 (x);
    3486         [ #  # ]:          0 :   _DEFV ();
    3487 [ #  # ][ #  # ]:          0 :   _RETV (jn (n, *x));
    3488                 :            : }
    3489                 :            : 
    3490                 :            : // ********* yn (bessel function of 2nd kind, nth order) ***********
    3491                 :          0 : constant * evaluate::yn_d_d (constant * args) {
    3492                 :          0 :   _ARI0 (n);
    3493                 :          0 :   _ARD1 (x);
    3494         [ #  # ]:          0 :   _DEFD ();
    3495                 :          0 :   _RETD (::yn (n, x));
    3496                 :            : }
    3497                 :            : 
    3498                 :          0 : constant * evaluate::yn_d_c (constant * args) {
    3499                 :          0 :   _ARI0 (n);
    3500                 :          0 :   _ARC1 (x);
    3501         [ #  # ]:          0 :   _DEFC ();
    3502         [ #  # ]:          0 :   _RETC (yn (n, *x));
    3503                 :            : }
    3504                 :            : 
    3505                 :          0 : constant * evaluate::yn_d_v (constant * args) {
    3506                 :          0 :   _ARI0 (n);
    3507                 :          0 :   _ARV1 (x);
    3508         [ #  # ]:          0 :   _DEFV ();
    3509 [ #  # ][ #  # ]:          0 :   _RETV (yn (n, *x));
    3510                 :            : }
    3511                 :            : 
    3512                 :            : // ***************** sqr *****************
    3513                 :          0 : constant * evaluate::sqr_m (constant * args) {
    3514                 :          0 :   _ARM0 (m1);
    3515         [ #  # ]:          0 :   _DEFM ();
    3516 [ #  # ][ #  # ]:          0 :   _RETM (qucs::sqr (*m1));
    3517                 :            : }
    3518                 :            : 
    3519                 :          0 : constant * evaluate::sqr_mv (constant * args) {
    3520                 :          0 :   _ARMV0 (m1);
    3521         [ #  # ]:          0 :   _DEFMV ();
    3522 [ #  # ][ #  # ]:          0 :   _RETMV (qucs::sqr (*m1));
    3523                 :            : }
    3524                 :            : 
    3525                 :            : // ******************* polar *********************
    3526                 :          0 : constant * evaluate::polar_d_d (constant * args) {
    3527         [ #  # ]:          0 :   _ARD0 (a);
    3528         [ #  # ]:          0 :   _ARD1 (p);
    3529 [ #  # ][ #  # ]:          0 :   _DEFC ();
    3530         [ #  # ]:          0 :   _RETC (std::polar (a, rad (p)));
    3531                 :            : }
    3532                 :            : 
    3533                 :          0 : constant * evaluate::polar_c_d (constant * args) {
    3534                 :          0 :   _ARC0 (a);
    3535                 :          0 :   _ARD1 (p);
    3536         [ #  # ]:          0 :   _DEFC ();
    3537 [ #  # ][ #  # ]:          0 :   _RETC (qucs::polar (*a, nr_complex_t (rad (p), 0)));
    3538                 :            : }
    3539                 :            : 
    3540                 :          0 : constant * evaluate::polar_d_c (constant * args) {
    3541                 :          0 :   _ARD0 (a);
    3542                 :          0 :   _ARC1 (p);
    3543         [ #  # ]:          0 :   _DEFC ();
    3544 [ #  # ][ #  # ]:          0 :   _RETC (qucs::polar (nr_complex_t (a, 0), rad (*p)));
    3545                 :            : }
    3546                 :            : 
    3547                 :          0 : constant * evaluate::polar_c_c (constant * args) {
    3548                 :          0 :   _ARC0 (a);
    3549                 :          0 :   _ARC1 (p);
    3550         [ #  # ]:          0 :   _DEFC ();
    3551 [ #  # ][ #  # ]:          0 :   _RETC (qucs::polar (*a, rad (*p)));
    3552                 :            : }
    3553                 :            : 
    3554                 :          0 : constant * evaluate::polar_d_v (constant * args) {
    3555                 :          0 :   _ARD0 (a);
    3556                 :          0 :   _ARV1 (v);
    3557         [ #  # ]:          0 :   _DEFV ();
    3558 [ #  # ][ #  # ]:          0 :   _RETV (polar (nr_complex_t (a, 0), rad (*v)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3559                 :            : }
    3560                 :            : 
    3561                 :          0 : constant * evaluate::polar_c_v (constant * args) {
    3562                 :          0 :   _ARC0 (a);
    3563                 :          0 :   _ARV1 (v);
    3564         [ #  # ]:          0 :   _DEFV ();
    3565 [ #  # ][ #  # ]:          0 :   _RETV (polar (*a, rad (*v)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3566                 :            : }
    3567                 :            : 
    3568                 :          0 : constant * evaluate::polar_v_d (constant * args) {
    3569                 :          0 :   _ARV0 (v);
    3570                 :          0 :   _ARD1 (p);
    3571         [ #  # ]:          0 :   _DEFV ();
    3572 [ #  # ][ #  # ]:          0 :   _RETV (polar (*v, nr_complex_t (rad (p), 0)));
    3573                 :            : }
    3574                 :            : 
    3575                 :          0 : constant * evaluate::polar_v_c (constant * args) {
    3576                 :          0 :   _ARV0 (v);
    3577                 :          0 :   _ARC1 (p);
    3578         [ #  # ]:          0 :   _DEFV ();
    3579 [ #  # ][ #  # ]:          0 :   _RETV (polar (*v, rad (*p)));
    3580                 :            : }
    3581                 :            : 
    3582                 :          0 : constant * evaluate::polar_v_v (constant * args) {
    3583                 :          0 :   _ARV0 (a);
    3584                 :          0 :   _ARV1 (p);
    3585         [ #  # ]:          0 :   _DEFV ();
    3586 [ #  # ][ #  # ]:          0 :   _RETV (polar (*a, rad (*p)));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    3587                 :            : }
    3588                 :            : 
    3589                 :            : // ******************* arctan2 *********************
    3590                 :          0 : constant * evaluate::arctan2_d_d (constant * args) {
    3591                 :          0 :   _ARD0 (y);
    3592                 :          0 :   _ARD1 (x);
    3593         [ #  # ]:          0 :   _DEFD ();
    3594 [ #  # ][ #  # ]:          0 :   if ((x == 0) && (y == 0)) {
    3595         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("arctan2: not defined for (0,0)");
    3596                 :          0 :     _RETD (-M_PI / 2);
    3597                 :            :   }
    3598                 :          0 :   _RETD (std::atan2 (y, x));
    3599                 :            : }
    3600                 :            : 
    3601                 :          0 : constant * evaluate::arctan2_d_v (constant * args) {
    3602                 :          0 :   _ARD0 (y);
    3603                 :          0 :   _ARV1 (x);
    3604         [ #  # ]:          0 :   _DEFV ();
    3605 [ #  # ][ #  # ]:          0 :   _RETV (atan2 (y, *x));
    3606                 :            : }
    3607                 :            : 
    3608                 :          0 : constant * evaluate::arctan2_v_d (constant * args) {
    3609                 :          0 :   _ARV0 (y);
    3610                 :          0 :   _ARD1 (x);
    3611         [ #  # ]:          0 :   _DEFV ();
    3612 [ #  # ][ #  # ]:          0 :   _RETV (atan2 (*y, x));
    3613                 :            : }
    3614                 :            : 
    3615                 :          0 : constant * evaluate::arctan2_v_v (constant * args) {
    3616                 :          0 :   _ARV0 (y);
    3617                 :          0 :   _ARV1 (x);
    3618         [ #  # ]:          0 :   _DEFV ();
    3619 [ #  # ][ #  # ]:          0 :   _RETV (atan2 (*y, *x));
         [ #  # ][ #  # ]
    3620                 :            : }
    3621                 :            : 
    3622                 :            : // ******************* dbm2w *********************
    3623                 :          0 : constant * evaluate::dbm2w_d (constant * args) {
    3624                 :          0 :   _ARD0 (d1);
    3625         [ #  # ]:          0 :   _DEFD ();
    3626                 :          0 :   _RETD (0.001 * std::pow (10.0, d1 / 10.0));
    3627                 :            : }
    3628                 :            : 
    3629                 :          0 : constant * evaluate::dbm2w_c (constant * args) {
    3630                 :          0 :   _ARC0 (c1);
    3631         [ #  # ]:          0 :   _DEFC ();
    3632 [ #  # ][ #  # ]:          0 :   _RETC (0.001 * pow (10.0, *c1 / 10.0));
    3633                 :            : }
    3634                 :            : 
    3635                 :          0 : constant * evaluate::dbm2w_v (constant * args) {
    3636                 :          0 :   _ARV0 (v1);
    3637         [ #  # ]:          0 :   _DEFV ();
    3638 [ #  # ][ #  # ]:          0 :   _RETV (dbm2w (*v1));
    3639                 :            : }
    3640                 :            : 
    3641                 :            : // ******************* w2dbm *********************
    3642                 :          0 : constant * evaluate::w2dbm_d (constant * args) {
    3643                 :          0 :   _ARD0 (d1);
    3644         [ #  # ]:          0 :   _DEFD ();
    3645                 :          0 :   _RETD (10.0 * std::log10 (d1 / 0.001));
    3646                 :            : }
    3647                 :            : 
    3648                 :          0 : constant * evaluate::w2dbm_c (constant * args) {
    3649                 :          0 :   _ARC0 (c1);
    3650         [ #  # ]:          0 :   _DEFC ();
    3651 [ #  # ][ #  # ]:          0 :   _RETC (10.0 * log10 (*c1 / 0.001));
    3652                 :            : }
    3653                 :            : 
    3654                 :          0 : constant * evaluate::w2dbm_v (constant * args) {
    3655                 :          0 :   _ARV0 (v1);
    3656         [ #  # ]:          0 :   _DEFV ();
    3657 [ #  # ][ #  # ]:          0 :   _RETV (w2dbm (*v1));
    3658                 :            : }
    3659                 :            : 
    3660                 :            : // ********** integrate *****************
    3661                 :          0 : constant * evaluate::integrate_d_d (constant * args) {
    3662                 :          0 :   _ARD0 (data);
    3663                 :          0 :   _ARD1 (incr);
    3664         [ #  # ]:          0 :   _DEFD ();
    3665                 :          0 :   _RETD (data * incr);
    3666                 :            : }
    3667                 :            : 
    3668                 :          0 : constant * evaluate::integrate_c_c (constant * args) {
    3669                 :          0 :   _ARC0 (data);
    3670                 :          0 :   _ARC1 (incr);
    3671         [ #  # ]:          0 :   _DEFC ();
    3672         [ #  # ]:          0 :   _RETC (*data * *incr);
    3673                 :            : }
    3674                 :            : 
    3675                 :          0 : constant * evaluate::integrate_v_d (constant * args) {
    3676                 :          0 :   _ARV0 (data);
    3677                 :          0 :   _ARD1 (incr);
    3678         [ #  # ]:          0 :   _DEFD ();
    3679         [ #  # ]:          0 :   _RETD (integrate (*data, incr));
    3680                 :            : }
    3681                 :            : 
    3682                 :          0 : constant * evaluate::integrate_v_c (constant * args) {
    3683                 :          0 :   _ARV0 (data);
    3684                 :          0 :   _ARC1 (incr);
    3685         [ #  # ]:          0 :   _DEFC ();
    3686 [ #  # ][ #  # ]:          0 :   _RETC (integrate (*data, *incr));
    3687                 :            : }
    3688                 :            : 
    3689                 :            : // ******************* dbm *********************
    3690                 :          0 : constant * evaluate::dbm_d (constant * args) {
    3691                 :          0 :   _ARD0 (d1);
    3692         [ #  # ]:          0 :   _DEFD ();
    3693                 :          0 :   _RETD (10.0 * std::log10 (norm (d1) / circuit::z0 / 0.001));
    3694                 :            : }
    3695                 :            : 
    3696                 :          0 : constant * evaluate::dbm_d_d (constant * args) {
    3697                 :          0 :   _ARD0 (d1);
    3698                 :          0 :   _ARD1 (z);
    3699         [ #  # ]:          0 :   _DEFD ();
    3700                 :          0 :   _RETD (10.0 * std::log10 (norm (d1) / z / 0.001));
    3701                 :            : }
    3702                 :            : 
    3703                 :          0 : constant * evaluate::dbm_c (constant * args) {
    3704                 :          0 :   _ARC0 (c1);
    3705         [ #  # ]:          0 :   _DEFC ();
    3706                 :          0 :   _RETC (10.0 * log10 (norm (*c1) / circuit::z0 / 0.001));
    3707                 :            : }
    3708                 :            : 
    3709                 :          0 : constant * evaluate::dbm_c_d (constant * args) {
    3710                 :          0 :   _ARC0 (c1);
    3711                 :          0 :   _ARD1 (z);
    3712         [ #  # ]:          0 :   _DEFC ();
    3713                 :          0 :   _RETC (10.0 * log10 (norm (*c1) / z / 0.001));
    3714                 :            : }
    3715                 :            : 
    3716                 :          0 : constant * evaluate::dbm_v (constant * args) {
    3717                 :          0 :   _ARV0 (v1);
    3718         [ #  # ]:          0 :   _DEFV ();
    3719 [ #  # ][ #  # ]:          0 :   _RETV (dbm (*v1));
    3720                 :            : }
    3721                 :            : 
    3722                 :          0 : constant * evaluate::dbm_v_d (constant * args) {
    3723                 :          0 :   _ARV0 (v1);
    3724                 :          0 :   _ARD1 (z);
    3725         [ #  # ]:          0 :   _DEFV ();
    3726 [ #  # ][ #  # ]:          0 :   _RETV (dbm (*v1, z));
    3727                 :            : }
    3728                 :            : 
    3729                 :          0 : constant * evaluate::dbm_d_c (constant * args) {
    3730                 :          0 :   _ARD0 (d1);
    3731                 :          0 :   _ARC1 (z);
    3732         [ #  # ]:          0 :   _DEFC ();
    3733 [ #  # ][ #  # ]:          0 :   _RETC (10.0 * log10 (norm (d1) / conj (*z) / 0.001));
         [ #  # ][ #  # ]
    3734                 :            : }
    3735                 :            : 
    3736                 :          0 : constant * evaluate::dbm_c_c (constant * args) {
    3737                 :          0 :   _ARC0 (c1);
    3738                 :          0 :   _ARC1 (z);
    3739         [ #  # ]:          0 :   _DEFC ();
    3740 [ #  # ][ #  # ]:          0 :   _RETC (10.0 * log10 (norm (*c1) / conj (*z) / 0.001));
         [ #  # ][ #  # ]
    3741                 :            : }
    3742                 :            : 
    3743                 :          0 : constant * evaluate::dbm_v_c (constant * args) {
    3744                 :          0 :   _ARV0 (v1);
    3745                 :          0 :   _ARC1 (z);
    3746         [ #  # ]:          0 :   _DEFV ();
    3747 [ #  # ][ #  # ]:          0 :   _RETV (dbm (*v1, *z));
    3748                 :            : }
    3749                 :            : 
    3750                 :            : // ************** running average ****************
    3751                 :          0 : constant * evaluate::runavg_d_d (constant * args) {
    3752                 :          0 :   _ARD0 (x);
    3753                 :          0 :   _ARI1 (n);
    3754         [ #  # ]:          0 :   _DEFV ();
    3755         [ #  # ]:          0 :   if (n < 1) {
    3756         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("runavg: number n to be averaged over must be "
    3757                 :            :                           "larger or equal 1");
    3758         [ #  # ]:          0 :     __RETV ();
    3759                 :            :   }
    3760 [ #  # ][ #  # ]:          0 :   _RETV (runavg (nr_complex_t (x, 0), n));
    3761                 :            : }
    3762                 :            : 
    3763                 :          0 : constant * evaluate::runavg_c_d (constant * args) {
    3764                 :          0 :   _ARC0 (x);
    3765                 :          0 :   _ARI1 (n);
    3766         [ #  # ]:          0 :   _DEFV ();
    3767         [ #  # ]:          0 :   if (n < 1) {
    3768         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("runavg: number n to be averaged over must be "
    3769                 :            :                           "larger or equal 1");
    3770         [ #  # ]:          0 :     __RETV ();
    3771                 :            :   }
    3772         [ #  # ]:          0 :   _RETV (runavg (*x, n));
    3773                 :            : }
    3774                 :            : 
    3775                 :          0 : constant * evaluate::runavg_v_d (constant * args) {
    3776                 :          0 :   _ARV0 (x);
    3777                 :          0 :   _ARI1 (n);
    3778         [ #  # ]:          0 :   _DEFV ();
    3779 [ #  # ][ #  # ]:          0 :   if (n < 1 || n > x->getSize ()) {
                 [ #  # ]
    3780         [ #  # ]:          0 :     THROW_MATH_EXCEPTION ("runavg: number n to be averaged over must be "
    3781                 :            :                           "larger or equal 1 and less or equal than the "
    3782                 :            :                           "number of vector elements");
    3783         [ #  # ]:          0 :     __RETV ();
    3784                 :            :   }
    3785 [ #  # ][ #  # ]:          0 :   _RETV (runavg (*x, n));
    3786                 :            : }
    3787                 :            : 
    3788                 :            : // ********************* thermal voltage **********************
    3789                 :          0 : constant * evaluate::vt_d (constant * args) {
    3790                 :          0 :   _ARD0 (d1);
    3791         [ #  # ]:          0 :   _DEFD ();
    3792                 :          0 :   _RETD (d1 * kBoverQ);
    3793                 :            : }
    3794                 :            : 
    3795                 :          0 : constant * evaluate::vt_c (constant * args) {
    3796                 :          0 :   _ARC0 (c1);
    3797         [ #  # ]:          0 :   _DEFC ();
    3798         [ #  # ]:          0 :   _RETC (*c1 * kBoverQ);
    3799                 :            : }
    3800                 :            : 
    3801                 :          0 : constant * evaluate::vt_v (constant * args) {
    3802                 :          0 :   _ARV0 (v1);
    3803         [ #  # ]:          0 :   _DEFV ();
    3804         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    3805 [ #  # ][ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) v->add (v1->get (i) * kBoverQ);
                 [ #  # ]
    3806                 :          0 :   res->v = v;
    3807                 :          0 :   return res;
    3808                 :            : }
    3809                 :            : 
    3810                 :            : // ************** Kaiser-Bessel derived window ****************
    3811                 :          0 : constant * evaluate::kbd_d_d (constant * args) {
    3812         [ #  # ]:          0 :   _ARD0 (alpha);
    3813         [ #  # ]:          0 :   _ARI1 (size);
    3814 [ #  # ][ #  # ]:          0 :   _DEFV ();
    3815                 :            :   int i;
    3816                 :          0 :   nr_double_t sval = 0.0;
    3817         [ #  # ]:          0 :   if (size <= 0) {
    3818 [ #  # ][ #  # ]:          0 :     THROW_MATH_EXCEPTION ("kbd: vector length must be greater than zero");
         [ #  # ][ #  # ]
    3819 [ #  # ][ #  # ]:          0 :     __RETV ();
    3820                 :            :   }
    3821         [ #  # ]:          0 :   qucs::vector v (size);
    3822         [ #  # ]:          0 :   for (i = 0; i < size / 2; i++) {
    3823 [ #  # ][ #  # ]:          0 :     sval += fspecial::i0 (M_PI * alpha * std::sqrt (1.0 - sqr (4.0 * i / size - 1.0)));
    3824                 :          0 :     v (i) = sval;
    3825                 :            :   }
    3826                 :            :   // need to add one more value to the normalization factor at size/2
    3827 [ #  # ][ #  # ]:          0 :   sval += fspecial::i0 (M_PI * alpha * std::sqrt (1.0 - sqr (4.0 * (size / 2) / size - 1.0)));
    3828                 :            :   // normalize the window and fill in the righthand side of the window
    3829         [ #  # ]:          0 :   for (i = 0; i < size / 2; i++) {
    3830                 :          0 :     v (i) = std::sqrt (v (i) / sval);
    3831                 :          0 :     v (size - 1 - i) = v (i);
    3832                 :            :   }
    3833 [ #  # ][ #  # ]:          0 :   _RETV (v);
                 [ #  # ]
    3834                 :            : }
    3835                 :            : 
    3836                 :          0 : constant * evaluate::kbd_d (constant * args) {
    3837         [ #  # ]:          0 :   constant * arg = new constant (TAG_DOUBLE);
    3838                 :          0 :   arg->d = 64;
    3839                 :          0 :   arg->solvee = args->getResult(0)->solvee;
    3840                 :          0 :   arg->evaluate ();
    3841                 :          0 :   args->append (arg);
    3842                 :          0 :   return kbd_d_d (args);
    3843                 :            : }
    3844                 :            : 
    3845                 :            : // ***************** if-then-else operation ****************
    3846                 :          0 : constant * evaluate::ifthenelse_d_d (constant * args) {
    3847                 :          0 :   _ARB0 (cond);
    3848                 :          0 :   _ARD1 (d1);
    3849                 :          0 :   _ARD2 (d2);
    3850         [ #  # ]:          0 :   _DEFD ();
    3851         [ #  # ]:          0 :   _RETD (cond ? d1 : d2);
    3852                 :            : }
    3853                 :            : 
    3854                 :          0 : constant * evaluate::ifthenelse_b_b (constant * args) {
    3855                 :          0 :   _ARB0 (cond);
    3856                 :          0 :   _ARB1 (b1);
    3857                 :          0 :   _ARB2 (b2);
    3858         [ #  # ]:          0 :   _DEFB ();
    3859         [ #  # ]:          0 :   _RETB (cond ? b1 : b2);
    3860                 :            : }
    3861                 :            : 
    3862                 :          0 : constant * evaluate::ifthenelse_d_b (constant * args) {
    3863                 :          0 :   _ARB0 (cond);
    3864                 :          0 :   _ARD1 (d1);
    3865                 :          0 :   _ARB2 (b2);
    3866         [ #  # ]:          0 :   _DEFD ();
    3867 [ #  # ][ #  # ]:          0 :   _RETD (cond ? d1 : (b2 ? 1.0 : 0.0));
    3868                 :            : }
    3869                 :            : 
    3870                 :          0 : constant * evaluate::ifthenelse_b_d (constant * args) {
    3871                 :          0 :   _ARB0 (cond);
    3872                 :          0 :   _ARB1 (b1);
    3873                 :          0 :   _ARD2 (d2);
    3874         [ #  # ]:          0 :   _DEFD ();
    3875 [ #  # ][ #  # ]:          0 :   _RETD (cond ? (b1 ? 1.0 : 0.0) : d2);
    3876                 :            : }
    3877                 :            : 
    3878                 :          0 : constant * evaluate::ifthenelse_c_c (constant * args) {
    3879         [ #  # ]:          0 :   _ARB0 (cond);
    3880         [ #  # ]:          0 :   int t1 = _ARG(1)->getType ();
    3881         [ #  # ]:          0 :   int t2 = _ARG(2)->getType ();
    3882                 :          0 :   nr_complex_t c1, c2;
    3883         [ #  # ]:          0 :   if (t1 == TAG_DOUBLE)
    3884         [ #  # ]:          0 :     c1 = D(_ARES(1));
    3885         [ #  # ]:          0 :   else if (t1 == TAG_COMPLEX)
    3886         [ #  # ]:          0 :     c1 = *C(_ARES(1));
    3887                 :            :   else
    3888 [ #  # ][ #  # ]:          0 :     c1 = B(_ARES(1)) ? 1.0 : 0.0;
    3889         [ #  # ]:          0 :   if (t2 == TAG_DOUBLE)
    3890         [ #  # ]:          0 :     c2 = D(_ARES(2));
    3891         [ #  # ]:          0 :   else if (t2 == TAG_COMPLEX)
    3892         [ #  # ]:          0 :     c2 = *C(_ARES(2));
    3893                 :            :   else
    3894 [ #  # ][ #  # ]:          0 :     c2 = B(_ARES(2)) ? 1.0 : 0.0;
    3895 [ #  # ][ #  # ]:          0 :   _DEFC ();
    3896 [ #  # ][ #  # ]:          0 :   _RETC (cond ? c1 : c2);
    3897                 :            : }
    3898                 :            : 
    3899                 :          0 : constant * evaluate::ifthenelse_m_m (constant * args) {
    3900         [ #  # ]:          0 :   _ARB0 (cond);
    3901         [ #  # ]:          0 :   int t1 = _ARG(1)->getType ();
    3902         [ #  # ]:          0 :   int t2 = _ARG(2)->getType ();
    3903 [ #  # ][ #  # ]:          0 :   matrix m1, m2;
    3904   [ #  #  #  #  :          0 :   switch (t1) {
                      # ]
    3905                 :            :   case TAG_DOUBLE:
    3906 [ #  # ][ #  # ]:          0 :     m1 = matrix (1); m1 (1,1) = D(_ARES(1)); break;
         [ #  # ][ #  # ]
    3907                 :            :   case TAG_COMPLEX:
    3908 [ #  # ][ #  # ]:          0 :     m1 = matrix (1); m1 (1,1) = *C(_ARES(1)); break;
         [ #  # ][ #  # ]
    3909                 :            :   case TAG_BOOLEAN:
    3910 [ #  # ][ #  # ]:          0 :     m1 = matrix (1); m1 (1,1) = B(_ARES(1)) ? 1.0 : 0.0; break;
         [ #  # ][ #  # ]
                 [ #  # ]
    3911                 :            :   case TAG_MATRIX:
    3912 [ #  # ][ #  # ]:          0 :     m1 = *M(_ARES(1)); break;
    3913                 :            :   }
    3914   [ #  #  #  #  :          0 :   switch (t2) {
                      # ]
    3915                 :            :   case TAG_DOUBLE:
    3916 [ #  # ][ #  # ]:          0 :     m2 = matrix (1); m2 (0,0) = D(_ARES(2)); break;
         [ #  # ][ #  # ]
    3917                 :            :   case TAG_COMPLEX:
    3918 [ #  # ][ #  # ]:          0 :     m2 = matrix (1); m2 (0,0) = *C(_ARES(2)); break;
         [ #  # ][ #  # ]
    3919                 :            :   case TAG_BOOLEAN:
    3920 [ #  # ][ #  # ]:          0 :     m2 = matrix (1); m2 (0,0) = B(_ARES(2)) ? 1.0 : 0.0; break;
         [ #  # ][ #  # ]
                 [ #  # ]
    3921                 :            :   case TAG_MATRIX:
    3922 [ #  # ][ #  # ]:          0 :     m2 = *M(_ARES(2)); break;
    3923                 :            :   }
    3924 [ #  # ][ #  # ]:          0 :   _DEFM ();
    3925 [ #  # ][ #  # ]:          0 :   _RETM (cond ? m1 : m2);
         [ #  # ][ #  # ]
                 [ #  # ]
    3926                 :            : }
    3927                 :            : 
    3928                 :          0 : constant * evaluate::ifthenelse_v_v (constant * args) {
    3929         [ #  # ]:          0 :   _ARB0 (cond);
    3930         [ #  # ]:          0 :   int t1 = _ARG(1)->getType ();
    3931         [ #  # ]:          0 :   int t2 = _ARG(2)->getType ();
    3932 [ #  # ][ #  # ]:          0 :   qucs::vector v1, v2;
    3933   [ #  #  #  #  :          0 :   switch (t1) {
                      # ]
    3934                 :            :   case TAG_DOUBLE:
    3935 [ #  # ][ #  # ]:          0 :     v1 = qucs::vector (1); v1 (0) = D(_ARES(1)); break;
         [ #  # ][ #  # ]
    3936                 :            :   case TAG_COMPLEX:
    3937 [ #  # ][ #  # ]:          0 :     v1 = qucs::vector (1); v1 (0) = *C(_ARES(1)); break;
         [ #  # ][ #  # ]
    3938                 :            :   case TAG_BOOLEAN:
    3939 [ #  # ][ #  # ]:          0 :     v1 = qucs::vector (1); v1 (0) = B(_ARES(1)) ? 1.0 : 0.0; break;
         [ #  # ][ #  # ]
                 [ #  # ]
    3940                 :            :   case TAG_VECTOR:
    3941 [ #  # ][ #  # ]:          0 :     v1 = *V(_ARES(1)); break;
    3942                 :            :   }
    3943   [ #  #  #  #  :          0 :   switch (t2) {
                      # ]
    3944                 :            :   case TAG_DOUBLE:
    3945 [ #  # ][ #  # ]:          0 :     v2 = qucs::vector (1); v2 (0) = D(_ARES(2)); break;
         [ #  # ][ #  # ]
    3946                 :            :   case TAG_COMPLEX:
    3947 [ #  # ][ #  # ]:          0 :     v2 = qucs::vector (1); v2 (0) = *C(_ARES(2)); break;
         [ #  # ][ #  # ]
    3948                 :            :   case TAG_BOOLEAN:
    3949 [ #  # ][ #  # ]:          0 :     v2 = qucs::vector (1); v2 (0) = B(_ARES(2)) ? 1.0 : 0.0; break;
         [ #  # ][ #  # ]
                 [ #  # ]
    3950                 :            :   case TAG_VECTOR:
    3951 [ #  # ][ #  # ]:          0 :     v2 = *V(_ARES(2)); break;
    3952                 :            :   }
    3953 [ #  # ][ #  # ]:          0 :   _DEFV ();
    3954 [ #  # ][ #  # ]:          0 :   _RETV (cond ? v1 : v2);
         [ #  # ][ #  # ]
                 [ #  # ]
    3955                 :            : }
    3956                 :            : 
    3957                 :          0 : constant * evaluate::ifthenelse_v_v_v (constant * args) {
    3958         [ #  # ]:          0 :   _ARV0 (cond);
    3959         [ #  # ]:          0 :   int t1 = _ARG(1)->getType ();
    3960         [ #  # ]:          0 :   int t2 = _ARG(2)->getType ();
    3961 [ #  # ][ #  # ]:          0 :   qucs::vector v1, v2;
    3962   [ #  #  #  #  :          0 :   switch (t1) {
                      # ]
    3963                 :            :   case TAG_DOUBLE:
    3964 [ #  # ][ #  # ]:          0 :     v1 = qucs::vector (1); v1 (0) = D(_ARES(1)); break;
         [ #  # ][ #  # ]
    3965                 :            :   case TAG_COMPLEX:
    3966 [ #  # ][ #  # ]:          0 :     v1 = qucs::vector (1); v1 (0) = *C(_ARES(1)); break;
         [ #  # ][ #  # ]
    3967                 :            :   case TAG_BOOLEAN:
    3968 [ #  # ][ #  # ]:          0 :     v1 = qucs::vector (1); v1 (0) = B(_ARES(1)) ? 1.0 : 0.0; break;
         [ #  # ][ #  # ]
                 [ #  # ]
    3969                 :            :   case TAG_VECTOR:
    3970 [ #  # ][ #  # ]:          0 :     v1 = *V(_ARES(1)); break;
    3971                 :            :   }
    3972   [ #  #  #  #  :          0 :   switch (t2) {
                      # ]
    3973                 :            :   case TAG_DOUBLE:
    3974 [ #  # ][ #  # ]:          0 :     v2 = qucs::vector (1); v2 (0) = D(_ARES(2)); break;
         [ #  # ][ #  # ]
    3975                 :            :   case TAG_COMPLEX:
    3976 [ #  # ][ #  # ]:          0 :     v2 = qucs::vector (1); v2 (0) = *C(_ARES(2)); break;
         [ #  # ][ #  # ]
    3977                 :            :   case TAG_BOOLEAN:
    3978 [ #  # ][ #  # ]:          0 :     v2 = qucs::vector (1); v2 (0) = B(_ARES(2)) ? 1.0 : 0.0; break;
         [ #  # ][ #  # ]
                 [ #  # ]
    3979                 :            :   case TAG_VECTOR:
    3980 [ #  # ][ #  # ]:          0 :     v2 = *V(_ARES(2)); break;
    3981                 :            :   }
    3982 [ #  # ][ #  # ]:          0 :   _DEFV ();
    3983                 :            :   int i, a, b;
    3984 [ #  # ][ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    3985 [ #  # ][ #  # ]:          0 :   for (a = b = i = 0; i < cond->getSize (); i++) {
    3986 [ #  # ][ #  # ]:          0 :     v->add (cond->get (i) != 0.0 ? v1 (a) : v2 (b));
                 [ #  # ]
    3987                 :          0 :     a++;
    3988                 :          0 :     b++;
    3989 [ #  # ][ #  # ]:          0 :     if (a >= v1.getSize ()) a = 0;
    3990 [ #  # ][ #  # ]:          0 :     if (b >= v2.getSize ()) b = 0;
    3991                 :            :   }
    3992                 :          0 :   res->v = v;
    3993 [ #  # ][ #  # ]:          0 :   return res;
    3994                 :            : }
    3995                 :            : 
    3996                 :            : // ************************** less *************************
    3997                 :          0 : constant * evaluate::less_d_d (constant * args) {
    3998                 :          0 :   _ARD0 (d0);
    3999                 :          0 :   _ARD1 (d1);
    4000         [ #  # ]:          0 :   _DEFB ();
    4001                 :          0 :   _RETB (d0 < d1);
    4002                 :            : }
    4003                 :            : 
    4004                 :          0 : constant * evaluate::less_d_c (constant * args) {
    4005                 :          0 :   _ARD0 (d0);
    4006                 :          0 :   _ARC1 (c1);
    4007         [ #  # ]:          0 :   _DEFB ();
    4008         [ #  # ]:          0 :   _RETB (d0 < *c1);
    4009                 :            : }
    4010                 :            : 
    4011                 :          0 : constant * evaluate::less_d_v (constant * args) {
    4012                 :          0 :   _ARD0 (d0);
    4013                 :          0 :   _ARV1 (v1);
    4014         [ #  # ]:          0 :   _DEFV ();
    4015         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4016         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4017 [ #  # ][ #  # ]:          0 :     v->add (d0 < v1->get (i) ? 1.0 : 0.0);
                 [ #  # ]
    4018                 :            :   }
    4019                 :          0 :   res->v = v;
    4020                 :          0 :   return res;
    4021                 :            : }
    4022                 :            : 
    4023                 :          0 : constant * evaluate::less_c_d (constant * args) {
    4024                 :          0 :   _ARC0 (c0);
    4025                 :          0 :   _ARD1 (d1);
    4026         [ #  # ]:          0 :   _DEFB ();
    4027         [ #  # ]:          0 :   _RETB (*c0 < d1);
    4028                 :            : }
    4029                 :            : 
    4030                 :          0 : constant * evaluate::less_c_c (constant * args) {
    4031                 :          0 :   _ARC0 (c0);
    4032                 :          0 :   _ARC1 (c1);
    4033         [ #  # ]:          0 :   _DEFB ();
    4034                 :          0 :   _RETB (*c0 < *c1);
    4035                 :            : }
    4036                 :            : 
    4037                 :          0 : constant * evaluate::less_c_v (constant * args) {
    4038                 :          0 :   _ARC0 (c0);
    4039                 :          0 :   _ARV1 (v1);
    4040         [ #  # ]:          0 :   _DEFV ();
    4041         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4042         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4043 [ #  # ][ #  # ]:          0 :     v->add (*c0 < v1->get (i) ? 1.0 : 0.0);
    4044                 :            :   }
    4045                 :          0 :   res->v = v;
    4046                 :          0 :   return res;
    4047                 :            : }
    4048                 :            : 
    4049                 :         21 : constant * evaluate::less_v_d (constant * args) {
    4050                 :         21 :   _ARV0 (v0);
    4051                 :         21 :   _ARD1 (d1);
    4052         [ +  - ]:         21 :   _DEFV ();
    4053         [ +  - ]:         21 :   qucs::vector * v = new qucs::vector ();
    4054         [ +  + ]:      36363 :   for (int i = 0; i < v0->getSize (); i++) {
    4055 [ +  - ][ +  - ]:      36342 :     v->add (real (v0->get (i)) < d1 ? 1.0 : 0.0);
    4056                 :            :   }
    4057                 :         21 :   res->v = v;
    4058                 :         21 :   return res;
    4059                 :            : }
    4060                 :            : 
    4061                 :          0 : constant * evaluate::less_v_c (constant * args) {
    4062                 :          0 :   _ARV0 (v0);
    4063                 :          0 :   _ARC1 (c1);
    4064         [ #  # ]:          0 :   _DEFV ();
    4065         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4066         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4067 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) < *c1 ? 1.0 : 0.0);
    4068                 :            :   }
    4069                 :          0 :   res->v = v;
    4070                 :          0 :   return res;
    4071                 :            : }
    4072                 :            : 
    4073                 :          0 : constant * evaluate::less_v_v (constant * args) {
    4074                 :          0 :   _ARV0 (v0);
    4075                 :          0 :   _ARV1 (v1);
    4076         [ #  # ]:          0 :   _DEFV ();
    4077         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4078         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4079 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) < v1->get (i) ? 1.0 : 0.0);
    4080                 :            :   }
    4081                 :          0 :   res->v = v;
    4082                 :          0 :   return res;
    4083                 :            : }
    4084                 :            : 
    4085                 :            : // ************************* greater ***********************
    4086                 :          0 : constant * evaluate::greater_d_d (constant * args) {
    4087                 :          0 :   _ARD0 (d0);
    4088                 :          0 :   _ARD1 (d1);
    4089         [ #  # ]:          0 :   _DEFB ();
    4090                 :          0 :   _RETB (d0 > d1);
    4091                 :            : }
    4092                 :            : 
    4093                 :          0 : constant * evaluate::greater_d_c (constant * args) {
    4094                 :          0 :   _ARD0 (d0);
    4095                 :          0 :   _ARC1 (c1);
    4096         [ #  # ]:          0 :   _DEFB ();
    4097         [ #  # ]:          0 :   _RETB (d0 > *c1);
    4098                 :            : }
    4099                 :            : 
    4100                 :          0 : constant * evaluate::greater_d_v (constant * args) {
    4101                 :          0 :   _ARD0 (d0);
    4102                 :          0 :   _ARV1 (v1);
    4103         [ #  # ]:          0 :   _DEFV ();
    4104         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4105         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4106 [ #  # ][ #  # ]:          0 :     v->add (d0 > real (v1->get (i)) ? 1.0 : 0.0);
    4107                 :            :   }
    4108                 :          0 :   res->v = v;
    4109                 :          0 :   return res;
    4110                 :            : }
    4111                 :            : 
    4112                 :          0 : constant * evaluate::greater_c_d (constant * args) {
    4113                 :          0 :   _ARC0 (c0);
    4114                 :          0 :   _ARD1 (d1);
    4115         [ #  # ]:          0 :   _DEFB ();
    4116         [ #  # ]:          0 :   _RETB (*c0 > d1);
    4117                 :            : }
    4118                 :            : 
    4119                 :          0 : constant * evaluate::greater_c_c (constant * args) {
    4120                 :          0 :   _ARC0 (c0);
    4121                 :          0 :   _ARC1 (c1);
    4122         [ #  # ]:          0 :   _DEFB ();
    4123                 :          0 :   _RETB (*c0 > *c1);
    4124                 :            : }
    4125                 :            : 
    4126                 :          0 : constant * evaluate::greater_c_v (constant * args) {
    4127                 :          0 :   _ARC0 (c0);
    4128                 :          0 :   _ARV1 (v1);
    4129         [ #  # ]:          0 :   _DEFV ();
    4130         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4131         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4132 [ #  # ][ #  # ]:          0 :     v->add (*c0 > v1->get (i) ? 1.0 : 0.0);
    4133                 :            :   }
    4134                 :          0 :   res->v = v;
    4135                 :          0 :   return res;
    4136                 :            : }
    4137                 :            : 
    4138                 :          0 : constant * evaluate::greater_v_d (constant * args) {
    4139                 :          0 :   _ARV0 (v0);
    4140                 :          0 :   _ARD1 (d1);
    4141         [ #  # ]:          0 :   _DEFV ();
    4142         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4143         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4144 [ #  # ][ #  # ]:          0 :     v->add (real (v0->get (i)) > d1 ? 1.0 : 0.0);
    4145                 :            :   }
    4146                 :          0 :   res->v = v;
    4147                 :          0 :   return res;
    4148                 :            : }
    4149                 :            : 
    4150                 :          0 : constant * evaluate::greater_v_c (constant * args) {
    4151                 :          0 :   _ARV0 (v0);
    4152                 :          0 :   _ARC1 (c1);
    4153         [ #  # ]:          0 :   _DEFV ();
    4154         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4155         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4156 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) > *c1 ? 1.0 : 0.0);
    4157                 :            :   }
    4158                 :          0 :   res->v = v;
    4159                 :          0 :   return res;
    4160                 :            : }
    4161                 :            : 
    4162                 :          0 : constant * evaluate::greater_v_v (constant * args) {
    4163                 :          0 :   _ARV0 (v0);
    4164                 :          0 :   _ARV1 (v1);
    4165         [ #  # ]:          0 :   _DEFV ();
    4166         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4167         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4168 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) > v1->get (i) ? 1.0 : 0.0);
    4169                 :            :   }
    4170                 :          0 :   res->v = v;
    4171                 :          0 :   return res;
    4172                 :            : }
    4173                 :            : 
    4174                 :            : // ********************** less or equal ********************
    4175                 :          0 : constant * evaluate::lessorequal_d_d (constant * args) {
    4176                 :          0 :   _ARD0 (d0);
    4177                 :          0 :   _ARD1 (d1);
    4178         [ #  # ]:          0 :   _DEFB ();
    4179                 :          0 :   _RETB (d0 <= d1);
    4180                 :            : }
    4181                 :            : 
    4182                 :          0 : constant * evaluate::lessorequal_d_c (constant * args) {
    4183                 :          0 :   _ARD0 (d0);
    4184                 :          0 :   _ARC1 (c1);
    4185         [ #  # ]:          0 :   _DEFB ();
    4186         [ #  # ]:          0 :   _RETB (d0 <= *c1);
    4187                 :            : }
    4188                 :            : 
    4189                 :          0 : constant * evaluate::lessorequal_d_v (constant * args) {
    4190                 :          0 :   _ARD0 (d0);
    4191                 :          0 :   _ARV1 (v1);
    4192         [ #  # ]:          0 :   _DEFV ();
    4193         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4194         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4195 [ #  # ][ #  # ]:          0 :     v->add (d0 <= real (v1->get (i)) ? 1.0 : 0.0);
    4196                 :            :   }
    4197                 :          0 :   res->v = v;
    4198                 :          0 :   return res;
    4199                 :            : }
    4200                 :            : 
    4201                 :          0 : constant * evaluate::lessorequal_c_d (constant * args) {
    4202                 :          0 :   _ARC0 (c0);
    4203                 :          0 :   _ARD1 (d1);
    4204         [ #  # ]:          0 :   _DEFB ();
    4205         [ #  # ]:          0 :   _RETB (*c0 <= d1);
    4206                 :            : }
    4207                 :            : 
    4208                 :          0 : constant * evaluate::lessorequal_c_c (constant * args) {
    4209                 :          0 :   _ARC0 (c0);
    4210                 :          0 :   _ARC1 (c1);
    4211         [ #  # ]:          0 :   _DEFB ();
    4212                 :          0 :   _RETB (*c0 <= *c1);
    4213                 :            : }
    4214                 :            : 
    4215                 :          0 : constant * evaluate::lessorequal_c_v (constant * args) {
    4216                 :          0 :   _ARC0 (c0);
    4217                 :          0 :   _ARV1 (v1);
    4218         [ #  # ]:          0 :   _DEFV ();
    4219         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4220         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4221 [ #  # ][ #  # ]:          0 :     v->add (*c0 <= v1->get (i) ? 1.0 : 0.0);
    4222                 :            :   }
    4223                 :          0 :   res->v = v;
    4224                 :          0 :   return res;
    4225                 :            : }
    4226                 :            : 
    4227                 :          0 : constant * evaluate::lessorequal_v_d (constant * args) {
    4228                 :          0 :   _ARV0 (v0);
    4229                 :          0 :   _ARD1 (d1);
    4230         [ #  # ]:          0 :   _DEFV ();
    4231         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4232         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4233 [ #  # ][ #  # ]:          0 :     v->add (real (v0->get (i)) <= d1 ? 1.0 : 0.0);
    4234                 :            :   }
    4235                 :          0 :   res->v = v;
    4236                 :          0 :   return res;
    4237                 :            : }
    4238                 :            : 
    4239                 :          0 : constant * evaluate::lessorequal_v_c (constant * args) {
    4240                 :          0 :   _ARV0 (v0);
    4241                 :          0 :   _ARC1 (c1);
    4242         [ #  # ]:          0 :   _DEFV ();
    4243         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4244         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4245 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) <= *c1 ? 1.0 : 0.0);
    4246                 :            :   }
    4247                 :          0 :   res->v = v;
    4248                 :          0 :   return res;
    4249                 :            : }
    4250                 :            : 
    4251                 :          0 : constant * evaluate::lessorequal_v_v (constant * args) {
    4252                 :          0 :   _ARV0 (v0);
    4253                 :          0 :   _ARV1 (v1);
    4254         [ #  # ]:          0 :   _DEFV ();
    4255         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4256         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4257 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) <= v1->get (i) ? 1.0 : 0.0);
    4258                 :            :   }
    4259                 :          0 :   res->v = v;
    4260                 :          0 :   return res;
    4261                 :            : }
    4262                 :            : 
    4263                 :            : // ********************* greater or equal ******************
    4264                 :          0 : constant * evaluate::greaterorequal_d_d (constant * args) {
    4265                 :          0 :   _ARD0 (d0);
    4266                 :          0 :   _ARD1 (d1);
    4267         [ #  # ]:          0 :   _DEFB ();
    4268                 :          0 :   _RETB (d0 >= d1);
    4269                 :            : }
    4270                 :            : 
    4271                 :          0 : constant * evaluate::greaterorequal_d_c (constant * args) {
    4272                 :          0 :   _ARD0 (d0);
    4273                 :          0 :   _ARC1 (c1);
    4274         [ #  # ]:          0 :   _DEFB ();
    4275         [ #  # ]:          0 :   _RETB (d0 >= *c1);
    4276                 :            : }
    4277                 :            : 
    4278                 :          0 : constant * evaluate::greaterorequal_d_v (constant * args) {
    4279                 :          0 :   _ARD0 (d0);
    4280                 :          0 :   _ARV1 (v1);
    4281         [ #  # ]:          0 :   _DEFV ();
    4282         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4283         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4284 [ #  # ][ #  # ]:          0 :     v->add (d0 >= real (v1->get (i)) ? 1.0 : 0.0);
    4285                 :            :   }
    4286                 :          0 :   res->v = v;
    4287                 :          0 :   return res;
    4288                 :            : }
    4289                 :            : 
    4290                 :          0 : constant * evaluate::greaterorequal_c_d (constant * args) {
    4291                 :          0 :   _ARC0 (c0);
    4292                 :          0 :   _ARD1 (d1);
    4293         [ #  # ]:          0 :   _DEFB ();
    4294         [ #  # ]:          0 :   _RETB (*c0 >= d1);
    4295                 :            : }
    4296                 :            : 
    4297                 :          0 : constant * evaluate::greaterorequal_c_c (constant * args) {
    4298                 :          0 :   _ARC0 (c0);
    4299                 :          0 :   _ARC1 (c1);
    4300         [ #  # ]:          0 :   _DEFB ();
    4301                 :          0 :   _RETB (*c0 >= *c1);
    4302                 :            : }
    4303                 :            : 
    4304                 :          0 : constant * evaluate::greaterorequal_c_v (constant * args) {
    4305                 :          0 :   _ARC0 (c0);
    4306                 :          0 :   _ARV1 (v1);
    4307         [ #  # ]:          0 :   _DEFV ();
    4308         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4309         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4310 [ #  # ][ #  # ]:          0 :     v->add (*c0 >= v1->get (i) ? 1.0 : 0.0);
    4311                 :            :   }
    4312                 :          0 :   res->v = v;
    4313                 :          0 :   return res;
    4314                 :            : }
    4315                 :            : 
    4316                 :          0 : constant * evaluate::greaterorequal_v_d (constant * args) {
    4317                 :          0 :   _ARV0 (v0);
    4318                 :          0 :   _ARD1 (d1);
    4319         [ #  # ]:          0 :   _DEFV ();
    4320         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4321         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4322 [ #  # ][ #  # ]:          0 :     v->add (real (v0->get (i)) >= d1 ? 1.0 : 0.0);
    4323                 :            :   }
    4324                 :          0 :   res->v = v;
    4325                 :          0 :   return res;
    4326                 :            : }
    4327                 :            : 
    4328                 :          0 : constant * evaluate::greaterorequal_v_c (constant * args) {
    4329                 :          0 :   _ARV0 (v0);
    4330                 :          0 :   _ARC1 (c1);
    4331         [ #  # ]:          0 :   _DEFV ();
    4332         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4333         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4334 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) >= *c1 ? 1.0 : 0.0);
    4335                 :            :   }
    4336                 :          0 :   res->v = v;
    4337                 :          0 :   return res;
    4338                 :            : }
    4339                 :            : 
    4340                 :          0 : constant * evaluate::greaterorequal_v_v (constant * args) {
    4341                 :          0 :   _ARV0 (v0);
    4342                 :          0 :   _ARV1 (v1);
    4343         [ #  # ]:          0 :   _DEFV ();
    4344         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4345         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4346 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) >= v1->get (i) ? 1.0 : 0.0);
    4347                 :            :   }
    4348                 :          0 :   res->v = v;
    4349                 :          0 :   return res;
    4350                 :            : }
    4351                 :            : 
    4352                 :            : // ************************** equal ************************
    4353                 :          0 : constant * evaluate::equal_d_d (constant * args) {
    4354                 :          0 :   _ARD0 (d0);
    4355                 :          0 :   _ARD1 (d1);
    4356         [ #  # ]:          0 :   _DEFB ();
    4357                 :          0 :   _RETB (d0 == d1);
    4358                 :            : }
    4359                 :            : 
    4360                 :          0 : constant * evaluate::equal_d_c (constant * args) {
    4361         [ #  # ]:          0 :   _ARD0 (d0);
    4362         [ #  # ]:          0 :   _ARC1 (c1);
    4363 [ #  # ][ #  # ]:          0 :   _DEFB ();
    4364                 :          0 :   _RETB (d0 == *c1);
    4365                 :            : }
    4366                 :            : 
    4367                 :          0 : constant * evaluate::equal_d_v (constant * args) {
    4368                 :          0 :   _ARD0 (d0);
    4369                 :          0 :   _ARV1 (v1);
    4370         [ #  # ]:          0 :   _DEFV ();
    4371         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4372         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4373 [ #  # ][ #  # ]:          0 :     v->add (d0 == real (v1->get (i)) ? 1.0 : 0.0);
    4374                 :            :   }
    4375                 :          0 :   res->v = v;
    4376                 :          0 :   return res;
    4377                 :            : }
    4378                 :            : 
    4379                 :          0 : constant * evaluate::equal_c_d (constant * args) {
    4380         [ #  # ]:          0 :   _ARC0 (c0);
    4381         [ #  # ]:          0 :   _ARD1 (d1);
    4382 [ #  # ][ #  # ]:          0 :   _DEFB ();
    4383                 :          0 :   _RETB (*c0 == d1);
    4384                 :            : }
    4385                 :            : 
    4386                 :          0 : constant * evaluate::equal_c_c (constant * args) {
    4387                 :          0 :   _ARC0 (c0);
    4388                 :          0 :   _ARC1 (c1);
    4389         [ #  # ]:          0 :   _DEFB ();
    4390                 :          0 :   _RETB (*c0 == *c1);
    4391                 :            : }
    4392                 :            : 
    4393                 :          0 : constant * evaluate::equal_c_v (constant * args) {
    4394                 :          0 :   _ARC0 (c0);
    4395                 :          0 :   _ARV1 (v1);
    4396         [ #  # ]:          0 :   _DEFV ();
    4397         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4398         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4399 [ #  # ][ #  # ]:          0 :     v->add (*c0 == v1->get (i) ? 1.0 : 0.0);
    4400                 :            :   }
    4401                 :          0 :   res->v = v;
    4402                 :          0 :   return res;
    4403                 :            : }
    4404                 :            : 
    4405                 :          0 : constant * evaluate::equal_v_d (constant * args) {
    4406                 :          0 :   _ARV0 (v0);
    4407                 :          0 :   _ARD1 (d1);
    4408         [ #  # ]:          0 :   _DEFV ();
    4409         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4410         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4411 [ #  # ][ #  # ]:          0 :     v->add (real (v0->get (i)) == d1 ? 1.0 : 0.0);
    4412                 :            :   }
    4413                 :          0 :   res->v = v;
    4414                 :          0 :   return res;
    4415                 :            : }
    4416                 :            : 
    4417                 :          0 : constant * evaluate::equal_v_c (constant * args) {
    4418                 :          0 :   _ARV0 (v0);
    4419                 :          0 :   _ARC1 (c1);
    4420         [ #  # ]:          0 :   _DEFV ();
    4421         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4422         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4423 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) == *c1 ? 1.0 : 0.0);
    4424                 :            :   }
    4425                 :          0 :   res->v = v;
    4426                 :          0 :   return res;
    4427                 :            : }
    4428                 :            : 
    4429                 :          0 : constant * evaluate::equal_v_v (constant * args) {
    4430                 :          0 :   _ARV0 (v0);
    4431                 :          0 :   _ARV1 (v1);
    4432         [ #  # ]:          0 :   _DEFV ();
    4433         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4434         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4435 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) == v1->get (i) ? 1.0 : 0.0);
    4436                 :            :   }
    4437                 :          0 :   res->v = v;
    4438                 :          0 :   return res;
    4439                 :            : }
    4440                 :            : 
    4441                 :          0 : constant * evaluate::equal_b_b (constant * args) {
    4442                 :          0 :   _ARB0 (b0);
    4443                 :          0 :   _ARB1 (b1);
    4444         [ #  # ]:          0 :   _DEFB ();
    4445                 :          0 :   _RETB (b0 == b1);
    4446                 :            : }
    4447                 :            : 
    4448                 :            : // ************************ not equal **********************
    4449                 :          0 : constant * evaluate::notequal_d_d (constant * args) {
    4450                 :          0 :   _ARD0 (d0);
    4451                 :          0 :   _ARD1 (d1);
    4452         [ #  # ]:          0 :   _DEFB ();
    4453                 :          0 :   _RETB (d0 != d1);
    4454                 :            : }
    4455                 :            : 
    4456                 :          0 : constant * evaluate::notequal_d_c (constant * args) {
    4457         [ #  # ]:          0 :   _ARD0 (d0);
    4458         [ #  # ]:          0 :   _ARC1 (c1);
    4459 [ #  # ][ #  # ]:          0 :   _DEFB ();
    4460                 :          0 :   _RETB (d0 != *c1);
    4461                 :            : }
    4462                 :            : 
    4463                 :          0 : constant * evaluate::notequal_d_v (constant * args) {
    4464                 :          0 :   _ARD0 (d0);
    4465                 :          0 :   _ARV1 (v1);
    4466         [ #  # ]:          0 :   _DEFV ();
    4467         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4468         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4469 [ #  # ][ #  # ]:          0 :     v->add (d0 != real (v1->get (i)) ? 1.0 : 0.0);
    4470                 :            :   }
    4471                 :          0 :   res->v = v;
    4472                 :          0 :   return res;
    4473                 :            : }
    4474                 :            : 
    4475                 :          0 : constant * evaluate::notequal_c_d (constant * args) {
    4476         [ #  # ]:          0 :   _ARC0 (c0);
    4477         [ #  # ]:          0 :   _ARD1 (d1);
    4478 [ #  # ][ #  # ]:          0 :   _DEFB ();
    4479                 :          0 :   _RETB (*c0 != d1);
    4480                 :            : }
    4481                 :            : 
    4482                 :          0 : constant * evaluate::notequal_c_c (constant * args) {
    4483                 :          0 :   _ARC0 (c0);
    4484                 :          0 :   _ARC1 (c1);
    4485         [ #  # ]:          0 :   _DEFB ();
    4486                 :          0 :   _RETB (*c0 != *c1);
    4487                 :            : }
    4488                 :            : 
    4489                 :          0 : constant * evaluate::notequal_c_v (constant * args) {
    4490                 :          0 :   _ARC0 (c0);
    4491                 :          0 :   _ARV1 (v1);
    4492         [ #  # ]:          0 :   _DEFV ();
    4493         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4494         [ #  # ]:          0 :   for (int i = 0; i < v1->getSize (); i++) {
    4495 [ #  # ][ #  # ]:          0 :     v->add (*c0 != v1->get (i) ? 1.0 : 0.0);
    4496                 :            :   }
    4497                 :          0 :   res->v = v;
    4498                 :          0 :   return res;
    4499                 :            : }
    4500                 :            : 
    4501                 :          0 : constant * evaluate::notequal_v_d (constant * args) {
    4502                 :          0 :   _ARV0 (v0);
    4503                 :          0 :   _ARD1 (d1);
    4504         [ #  # ]:          0 :   _DEFV ();
    4505         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4506         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4507 [ #  # ][ #  # ]:          0 :     v->add (real (v0->get (i)) != d1 ? 1.0 : 0.0);
    4508                 :            :   }
    4509                 :          0 :   res->v = v;
    4510                 :          0 :   return res;
    4511                 :            : }
    4512                 :            : 
    4513                 :          0 : constant * evaluate::notequal_v_c (constant * args) {
    4514                 :          0 :   _ARV0 (v0);
    4515                 :          0 :   _ARC1 (c1);
    4516         [ #  # ]:          0 :   _DEFV ();
    4517         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4518         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4519 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) != *c1 ? 1.0 : 0.0);
    4520                 :            :   }
    4521                 :          0 :   res->v = v;
    4522                 :          0 :   return res;
    4523                 :            : }
    4524                 :            : 
    4525                 :          0 : constant * evaluate::notequal_v_v (constant * args) {
    4526                 :          0 :   _ARV0 (v0);
    4527                 :          0 :   _ARV1 (v1);
    4528         [ #  # ]:          0 :   _DEFV ();
    4529         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4530         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4531 [ #  # ][ #  # ]:          0 :     v->add (v0->get (i) != v1->get (i) ? 1.0 : 0.0);
    4532                 :            :   }
    4533                 :          0 :   res->v = v;
    4534                 :          0 :   return res;
    4535                 :            : }
    4536                 :            : 
    4537                 :          0 : constant * evaluate::notequal_b_b (constant * args) {
    4538                 :          0 :   _ARB0 (b0);
    4539                 :          0 :   _ARB1 (b1);
    4540         [ #  # ]:          0 :   _DEFB ();
    4541                 :          0 :   _RETB (b0 != b1);
    4542                 :            : }
    4543                 :            : 
    4544                 :            : // *************************** not *************************
    4545                 :          0 : constant * evaluate::not_b (constant * args) {
    4546                 :          0 :   _ARB0 (b0);
    4547         [ #  # ]:          0 :   _DEFB ();
    4548                 :          0 :   _RETB (!b0);
    4549                 :            : }
    4550                 :            : 
    4551                 :            : // *************************** or **************************
    4552                 :          0 : constant * evaluate::or_b_b (constant * args) {
    4553                 :          0 :   _ARB0 (b0);
    4554                 :          0 :   _ARB1 (b1);
    4555         [ #  # ]:          0 :   _DEFB ();
    4556 [ #  # ][ #  # ]:          0 :   _RETB (b0 || b1);
    4557                 :            : }
    4558                 :            : 
    4559                 :            : // ************************** and **************************
    4560                 :          0 : constant * evaluate::and_b_b (constant * args) {
    4561                 :          0 :   _ARB0 (b0);
    4562                 :          0 :   _ARB1 (b1);
    4563         [ #  # ]:          0 :   _DEFB ();
    4564 [ #  # ][ #  # ]:          0 :   _RETB (b0 && b1);
    4565                 :            : }
    4566                 :            : 
    4567                 :            : // ******************* random numbers **********************
    4568                 :          0 : constant * evaluate::rand (constant *) {
    4569         [ #  # ]:          0 :   _DEFD ();
    4570                 :          0 :   _RETD (((nr_double_t) ::rand ()) / (nr_double_t) RAND_MAX);
    4571                 :            : }
    4572                 :            : 
    4573                 :          0 : constant * evaluate::srand_d (constant * args) {
    4574                 :            :   static int done = 0;
    4575                 :          0 :   _ARD0 (d0);
    4576         [ #  # ]:          0 :   _DEFD ();
    4577         [ #  # ]:          0 :   if (!done) {
    4578                 :          0 :     unsigned int i0 = (unsigned int) d0;
    4579                 :          0 :     ::srand (i0);
    4580                 :          0 :     done = 1;
    4581                 :          0 :     _RETD (1.0);
    4582                 :            :   } else {
    4583                 :          0 :     _RETD (0.0);
    4584                 :            :   }
    4585                 :            : }
    4586                 :            : 
    4587                 :            : 
    4588                 :            : // ******************* assert test *************************
    4589                 :          0 : constant * evaluate::assert_b(constant *args)
    4590                 :            : {
    4591                 :          0 :     _ARB0(b0);
    4592         [ #  # ]:          0 :     if(!b0) {
    4593         [ #  # ]:          0 :         THROW_MATH_EXCEPTION ("assert failled");
    4594                 :          0 :         abort();
    4595                 :            :      }
    4596         [ #  # ]:          0 :      _DEFB ();
    4597                 :          0 :     _RETB(true);
    4598                 :            : }
    4599                 :            : 
    4600                 :            : 
    4601                 :          0 : constant * evaluate::assert_d(constant *args)
    4602                 :            : {
    4603                 :          0 :     _ARD0(d0);
    4604         [ #  # ]:          0 :     if(d0 == 0.0) {
    4605         [ #  # ]:          0 :         THROW_MATH_EXCEPTION ("assert failled");
    4606                 :          0 :         abort();
    4607                 :            :     }
    4608         [ #  # ]:          0 :      _DEFB ();
    4609                 :          0 :     _RETB(true);
    4610                 :            : }
    4611                 :            : 
    4612                 :            : 
    4613                 :         21 : constant * evaluate::assert_v (constant * args) {
    4614                 :         21 :   _ARV0 (v0);
    4615         [ +  + ]:      36363 :   for (int i = 0; i < v0->getSize (); i++) {
    4616 [ +  - ][ -  + ]:      36342 :     if( v0->get(i) == 0.0 ) {
    4617         [ #  # ]:          0 :         THROW_MATH_EXCEPTION ("assert failled");
    4618                 :          0 :         abort();
    4619                 :            :     }
    4620                 :            :   }
    4621         [ +  - ]:         21 :   _DEFB ();
    4622                 :         21 :   _RETB(true);
    4623                 :            : }
    4624                 :            : 
    4625                 :            : 
    4626                 :          0 : constant * evaluate::bugon_b(constant *args)
    4627                 :            : {
    4628                 :          0 :     _ARB0(b0);
    4629         [ #  # ]:          0 :     if(b0) {
    4630         [ #  # ]:          0 :         THROW_MATH_EXCEPTION ("bugon failled");
    4631                 :          0 :         abort();
    4632                 :            :      }
    4633         [ #  # ]:          0 :      _DEFB ();
    4634                 :          0 :     _RETB(true);
    4635                 :            : }
    4636                 :            : 
    4637                 :            : 
    4638                 :          0 : constant * evaluate::bugon_d(constant *args)
    4639                 :            : {
    4640                 :          0 :     _ARD0(d0);
    4641         [ #  # ]:          0 :     if(d0 != 0.0) {
    4642         [ #  # ]:          0 :         THROW_MATH_EXCEPTION ("bugon failled");
    4643                 :          0 :         abort();
    4644                 :            :      }
    4645         [ #  # ]:          0 :      _DEFB ();
    4646                 :          0 :     _RETB(true);
    4647                 :            : }
    4648                 :            : 
    4649                 :            : 
    4650                 :          0 : constant * evaluate::bugon_v (constant * args) {
    4651                 :          0 :   _ARV0 (v0);
    4652         [ #  # ]:          0 :   for (int i = 0; i < v0->getSize (); i++) {
    4653 [ #  # ][ #  # ]:          0 :     if( v0->get(i) != 0.0 ) {
    4654         [ #  # ]:          0 :         THROW_MATH_EXCEPTION ("bugon failled");
    4655                 :          0 :         abort();
    4656                 :            :     }
    4657                 :            :   }
    4658         [ #  # ]:          0 :   _DEFB ();
    4659                 :          0 :   _RETB(true);
    4660                 :            : }
    4661                 :            : 
    4662                 :            : 
    4663                 :            : // ******************* immediate vectors *******************
    4664                 :          0 : constant * evaluate::vector_x (constant * args) {
    4665         [ #  # ]:          0 :   _DEFV ();
    4666         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4667         [ #  # ]:          0 :   for (node * arg = args; arg != NULL; arg = arg->getNext ()) {
    4668                 :          0 :     constant * c = arg->getResult ();
    4669   [ #  #  #  #  :          0 :     switch (arg->getType ()) {
                      # ]
    4670                 :            :     case TAG_COMPLEX:
    4671                 :          0 :       v->add (*(c->c)); break;
    4672                 :            :     case TAG_DOUBLE:
    4673         [ #  # ]:          0 :       v->add (c->d); break;
    4674                 :            :     case TAG_BOOLEAN:
    4675 [ #  # ][ #  # ]:          0 :       v->add (c->b ? 1.0 : 0.0); break;
    4676                 :            :     case TAG_VECTOR:
    4677                 :          0 :       v->add (c->v); break;
    4678                 :            :     default:
    4679         [ #  # ]:          0 :       v->add (0.0); break;
    4680                 :            :     }
    4681                 :            :   }
    4682                 :          0 :   res->v = v;
    4683                 :          0 :   return res;
    4684                 :            : }
    4685                 :            : 
    4686                 :            : // ******************* immediate matrices ******************
    4687                 :          0 : constant * evaluate::matrix_x (constant * args) {
    4688         [ #  # ]:          0 :   _DEFM ();
    4689                 :            :   /* create temporary list of vectors */
    4690                 :          0 :   qucs::vector * va = NULL;
    4691         [ #  # ]:          0 :   qucs::vector * v = new qucs::vector ();
    4692                 :          0 :   va = v;
    4693         [ #  # ]:          0 :   for (node * arg = args; arg != NULL; arg = arg->getNext ()) {
    4694                 :          0 :     constant * c = arg->getResult ();
    4695   [ #  #  #  #  :          0 :     switch (arg->getType ()) {
                   #  # ]
    4696                 :            :     case TAG_COMPLEX:
    4697                 :          0 :       v->add (*(c->c)); break;
    4698                 :            :     case TAG_DOUBLE:
    4699         [ #  # ]:          0 :       v->add (c->d); break;
    4700                 :            :     case TAG_BOOLEAN:
    4701 [ #  # ][ #  # ]:          0 :       v->add (c->b ? 1.0 : 0.0); break;
    4702                 :            :     case TAG_VECTOR:
    4703                 :          0 :       v->add (c->v); break;
    4704                 :            :     case TAG_CHAR:
    4705         [ #  # ]:          0 :       if (c->chr == ';') {
    4706                 :            :         /* append new vector, i.e. a new matrix row */
    4707         [ #  # ]:          0 :         qucs::vector * vn = new qucs::vector ();
    4708                 :          0 :         v->setNext (vn);
    4709                 :          0 :         v = vn;
    4710                 :            :       }
    4711         [ #  # ]:          0 :       else v->add (0.0);
    4712                 :          0 :       break;
    4713                 :            :     default:
    4714         [ #  # ]:          0 :       v->add (0.0); break;
    4715                 :            :     }
    4716                 :            :   }
    4717                 :            :   /* determine matrix dimensions and create it */
    4718                 :            :   int r, c;
    4719         [ #  # ]:          0 :   for (r = 0, c = 0, v = va; v != NULL; v = (::vector *) v->getNext (), r++) {
    4720         [ #  # ]:          0 :     if (c < v->getSize ()) c = v->getSize ();
    4721                 :            :   }
    4722         [ #  # ]:          0 :   matrix * m = new matrix (r, c);
    4723                 :            :   /* fill in matrix entries and delete temporary vector list */
    4724                 :          0 :   qucs::vector * vn = NULL;
    4725         [ #  # ]:          0 :   for (r = 0, v = va; v != NULL; v = vn, r++) {
    4726         [ #  # ]:          0 :     for (c = 0; c < v->getSize (); c++) {
    4727                 :          0 :       m->set (r, c, v->get (c));
    4728                 :            :     }
    4729                 :          0 :     vn = (::vector *) v->getNext ();
    4730         [ #  # ]:          0 :     delete v;
    4731                 :            :   }
    4732                 :            :   /* return result matrix */
    4733                 :          0 :   res->m = m;
    4734                 :          0 :   return res;
    4735                 :            : }
    4736                 :            : 
    4737                 :            : // ********************** EMI receiver *********************
    4738                 :          0 : constant * evaluate::receiver_v_v (constant * args) {
    4739                 :          0 :   _ARV0 (da);
    4740                 :          0 :   _ARV1 (dt);
    4741         [ #  # ]:          0 :   _DEFV ();
    4742                 :            : 
    4743                 :            :   // run receiver functionality
    4744                 :            :   qucs::vector * ed;
    4745         [ #  # ]:          0 :   if (_ARG(2)) {
    4746                 :          0 :     _ARI2 (len);
    4747                 :          0 :     ed = emi::receiver (da, dt, len);
    4748                 :            :   }
    4749                 :            :   else {
    4750                 :          0 :     ed = emi::receiver (da, dt);
    4751                 :            :   }
    4752                 :            : 
    4753                 :            :   // create two vectors for spectrum and frequency
    4754                 :          0 :   int rlen = ed->getSize ();
    4755         [ #  # ]:          0 :   qucs::vector * rvec = new qucs::vector (rlen);
    4756         [ #  # ]:          0 :   qucs::vector * rfeq = new qucs::vector (rlen);
    4757         [ #  # ]:          0 :   for (int i = 0; i < rlen; i++) {
    4758                 :          0 :     (*rvec)(i) = real (ed->get (i));
    4759                 :          0 :     (*rfeq)(i) = imag (ed->get (i));
    4760                 :            :   }
    4761         [ #  # ]:          0 :   delete ed;
    4762                 :            : 
    4763                 :            :   // put results back into equation solver
    4764                 :          0 :   node * gen = SOLVEE(0)->addGeneratedEquation (rfeq, "Frequency");
    4765                 :          0 :   res->addPrepDependencies (A(gen)->result);
    4766                 :          0 :   res->dropdeps = 1;
    4767                 :          0 :   res->v = rvec;
    4768                 :          0 :   return res;
    4769                 :            : }
    4770                 :            : 
    4771                 :            : // Include the application array.
    4772                 :            : #include "applications.h"
    4773                 :            : 

Generated by: LCOV version 1.11