=================
Generic functions
=================

Apart from :any:`example_trigonometric`, there are also generic functions that can be used in any Numerical P System simulated in Pep. The generic functions are:

    * sqrt
    * abs
    * log
    * log10
    * log2

An example Numerical P System that uses the previous list of functions can be found in ``input_files/input_generic_func.pep`` and is also shown below::

    num_ps = {
        # membrane names (labels)
        H = {m1, m2};

        # test generic functions (Matlab/Octave names):
        #   sqrt, abs, log, log10, log2
        structure = [m1 [m2 ]m2 ]m1;

        m1 = {
            var = {rez_1};
            # rez = 22.935 (3.3166 + 12 + 2.5649 + 1.1461 + 3.9069)
            pr = {sqrt(11) + abs(0 - 12) + log(13) + log10(14) + log2(15) + rez_1 * 0 -> 1|rez_1};
            var0 = (0);
        };

        m2 = {
            var = {rez_2};
            # rez = 20.480 (4.6904 + 4 + 2.9444 + 0.84510 + 8)
            pr = {sqrt(11 * 2) + abs((0 - 12) / 3) + log(13 + 6) + log10(14 - 7) + log2(2 ^ 8) + rez_2 * 0  -> 1|rez_2};
            var0 = (0);
        };
    }

The output of the Numerical P System, for a single execution step was obtained after executing the following command::

    ./pep.py input_files/input_generic_func.pep -n 1

and offers the following output::

    INFO     reading input file 
    INFO     building NumericalPsystem 
    INFO     building membrane list 
    INFO     building membrane structure 
    INFO     building Membrane 
    INFO     building variable list 
    INFO     building Program 
    INFO     building production function 
    INFO     building distribution rule 
    INFO     building var0 list 
    INFO     building Membrane 
    INFO     building variable list 
    INFO     building Program 
    INFO     building production function 
    INFO     building distribution rule 
    INFO     building var0 list 
    num_ps = {
        m1:
            var = { rez_1: 0.00, }
            E = {}
            pr_0 = { sqrt ( 11 ) + abs ( 0 - 12 ) + log ( 13 ) + log10 ( 14 ) + log2 ( 15 ) + rez_1 * 0  ->  1|rez_1 }
        m2:
            var = { rez_2: 0.00, }
            E = {}
            pr_0 = { sqrt ( 11 * 2 ) + abs ( ( 0 - 12 ) / 3 ) + log ( 13 + 6 ) + log10 ( 14 - 7 ) + log2 ( 2 ^ 8 ) + rez_2 * 0  ->  1|rez_2 }
    }

    INFO     Starting simulation step 1 
    INFO     Simulation step finished succesfully 
    num_ps = {
      m1:
        var = { rez_1: 22.93, }
        E = {}
      m2:
        var = { rez_2: 20.48, }
        E = {}
    }


The P object values that are printed by the simulator are not always precisely equal to those obtained in other mathematical software. The reason is that during the printing of each value, these are rounded to the nearest 2 digit value. The internal calculations are always done using *double* precision floating point values.