Esempio n. 1
0
    def test_rhs_atoms_in_namespace(self):
        from nineml.abstraction_layer import Expression

        e = Expression("random.randn() + random.randn() + random.randint() / sin(t)")
        self.assertEquals(set(e.rhs_atoms), set(["t", "random.randn", "random.randint", "sin"]))

        self.assertEquals(set(e.rhs_atoms_in_namespace("random")), set(["randn", "randint"]))
Esempio n. 2
0
    def test_rhs_atoms_in_namespace(self):
        e = Expression(
            "random.randn() + random.randn() + random.randint() / sin(t)")
        self.assertEquals(set(e.rhs_atoms),
                          set(['t', 'random.randn', 'random.randint', 'sin']))

        self.assertEquals(set(e.rhs_atoms_in_namespace('random')),
                          set(['randn', 'randint']))
Esempio n. 3
0
 def test_escape_of_carets(self):
     try:
         expr = Expression("a^2")  # @UnusedVariable
         expr = Expression("(a - 2)^2")  # @UnusedVariable
         expr = Expression("(a - (a^2 - 2))^2")  # @UnusedVariable
         expr = Expression("a^(a - 2)")  # @UnusedVariable
     except NineMLMathParseError as e:
         self.fail("Carets (signifying exponents) were not escaped properly"
                   " in expression: {}".format(e))
     self.assertTrue(True)
Esempio n. 4
0
    def test_rhs_atoms_in_namespace(self):
        e = Expression("random.randn() + random.randn() + random.randint() / sin(t)")
        self.assertEquals(
            set(e.rhs_atoms),
            set(['t', 'random.randn', 'random.randint', 'sin'])
        )

        self.assertEquals(
            set(e.rhs_atoms_in_namespace('random')),
            set(['randn', 'randint'])
        )
Esempio n. 5
0
    def test_rhs_name_transform_inplace(self):
        # Signature: name(self, name_map)
        # Replace atoms on the RHS with values in the name_map

        e = Expression("V/(1 + mg_conc*eta*exp(-1*gamma*V*V)) * sin(V)")
        e.rhs_name_transform_inplace({'V': 'VNEW'})
        self.assertEquals(
            e.rhs,
            "VNEW/(1 + mg_conc*eta*exp(-1*gamma*VNEW*VNEW)) * sin(VNEW)")

        # Don't Change builtin function names:
        e.rhs_name_transform_inplace({'sin': 'SIN'})
        self.assertEquals(
            e.rhs,
            "VNEW/(1 + mg_conc*eta*exp(-1*gamma*VNEW*VNEW)) * sin(VNEW)")
        e.rhs_name_transform_inplace({'exp': 'EXP'})
        self.assertEquals(
            e.rhs,
            "VNEW/(1 + mg_conc*eta*exp(-1*gamma*VNEW*VNEW)) * sin(VNEW)")

        # Check the attributes:
        self.assertEquals(
            set(e.rhs_atoms),
            set(['VNEW', 'mg_conc', 'eta', 'gamma', 'exp', 'sin']))
        self.assertEquals(set(e.rhs_funcs), set(['exp', 'sin']))
Esempio n. 6
0
    def test_rhs_name_transform_inplace(self):
        # Signature: name(self, name_map)
                # Replace atoms on the RHS with values in the name_map

        e = Expression("V/(1 + mg_conc*eta*exp(-1*gamma*V*V)) * sin(V)")
        e.rhs_name_transform_inplace({'V': 'VNEW'})
        self.assertEquals(e.rhs, "VNEW/(1 + mg_conc*eta*exp(-1*gamma*VNEW*VNEW)) * sin(VNEW)")

        # Don't Change builtin function names:
        e.rhs_name_transform_inplace({'sin': 'SIN'})
        self.assertEquals(e.rhs, "VNEW/(1 + mg_conc*eta*exp(-1*gamma*VNEW*VNEW)) * sin(VNEW)")
        e.rhs_name_transform_inplace({'exp': 'EXP'})
        self.assertEquals(e.rhs, "VNEW/(1 + mg_conc*eta*exp(-1*gamma*VNEW*VNEW)) * sin(VNEW)")

        # Check the attributes:
        self.assertEquals(set(e.rhs_atoms), set(
            ['VNEW', 'mg_conc', 'eta', 'gamma', 'exp', 'sin']))
        self.assertEquals(set(e.rhs_funcs), set(['exp', 'sin']))
Esempio n. 7
0
    def test_rhs_name_transform_inplace(self):
        # Signature: name(self, name_map)
        # Replace atoms on the RHS with values in the name_map
        from nineml.abstraction_layer import Expression

        e = Expression("V/(1 + mg_conc*eta*exp(-1*gamma*V*V)) * sin(V)")
        e.rhs_name_transform_inplace({"V": "VNEW"})
        self.assertEquals(e.rhs, "VNEW/(1 + mg_conc*eta*exp(-1*gamma*VNEW*VNEW)) * sin(VNEW)")

        # Don't Change builtin function names:
        e.rhs_name_transform_inplace({"sin": "SIN"})
        self.assertEquals(e.rhs, "VNEW/(1 + mg_conc*eta*exp(-1*gamma*VNEW*VNEW)) * sin(VNEW)")
        e.rhs_name_transform_inplace({"exp": "EXP"})
        self.assertEquals(e.rhs, "VNEW/(1 + mg_conc*eta*exp(-1*gamma*VNEW*VNEW)) * sin(VNEW)")

        # Check the attributes:
        self.assertEquals(set(e.rhs_atoms), set(["VNEW", "mg_conc", "eta", "gamma", "exp", "sin"]))
        self.assertEquals(set(e.rhs_funcs), set(["exp", "sin"]))
Esempio n. 8
0
    def test_Valid(self):
        # rhs, expt_vars, expt_funcs, result, values
        valid_rhses = [
            (('a'),                ('a'),                (), 5,            {'a': 5}, ),
            (('b'),                ('b'),                (), 7,            {'b': 7}, ),
            (('a+b'),              ('a', 'b'),
             (), 13,           {'a': 12, 'b': 1}),
            (('1./(alpha+2*beta)'),  ('alpha', 'beta'),
             (), 0.2,          {'alpha': 1, 'beta': 2}),
            (('pi'),                (),                  (), 3.14159265,   {}),
        ]

        for rhs, exp_var, exp_func, exp_res, params in valid_rhses:
            e = Expression(rhs)
            self.assertEquals(set(e.rhs_names), set(exp_var))
            self.assertEquals(set(e.rhs_funcs), set(exp_func))
            self.assertAlmostEqual(e.rhs_as_python_func()(**params), exp_res, places=4)

        import numpy
        expr_vars = [["-A/tau_r", ("A", "tau_r"), ()],
                    ["V*V", ("V",), ()],
                    ["a*(b*V - U)", ("U", "V", "b", "a"), ()],
                    [" 0.04*V*V + 5.0*V + 1. + 140.0 - U + Isyn", ("V", "U", "Isyn"), ()],
                    ["c", ("c"), ()],
                    ["1", (), ()],
                    ["atan2(sin(x),cos(y))", ("x", "y"), ("atan2", "sin", "cos")],
                    ["1.*V", ("V"), ()],
                    ["1.0", (), ()],
                    [".1", (), ()],
                    ["1/(1 + mg_conc*eta*exp(-1*gamma*V))", (
                        "mg_conc", "eta", "gamma", "V"), ('exp',)],
                    ["1 / ( 1 + mg_conc * eta *  exp( -1 * gamma*V))",
                     ("mg_conc", "eta", "gamma", "V"), ('exp',)],
                    ["1 / ( 1 + mg_conc * sin(0.5) *  exp ( -1 * gamma*V))",
                     ("mg_conc", "gamma", "V"), ('exp', "sin")],
                    [".1 / ( 1.0 + mg_conc * sin(V) *  exp ( -1.0 * gamma*V))",
                     ("mg_conc", "gamma", "V"), ('exp', "sin")],
                    ["sin(w)", ("w"), ("sin",)]]

        namespace = {
            "A": 10.0,
            "tau_r": 11.0,
            "V": -70.0,
            "a": 1.2,
            "b": 3.0,
            "U": -80.0,
            "Isyn": 2.0,
            "c": 10.0,
            "mg_conc": 1.0,
            "eta": 2.0,
            "gamma": -20.0,
            "x": 1.0,
            "y": 1.0,
            "w": numpy.arange(10)
        }

        return_values = [-0.909090909091, 4900.0, -156.0, 69.0, 10.0, 1,
                         1.0, -70.0, 1.0, 0.1, 1.0, 1.0, 1.0, 0.1, numpy.sin(namespace['w'])]

        for i, (expr, expt_vars, expt_funcs) in enumerate(expr_vars):
            c = Expression(expr)
            self.assertEqual(set(c.rhs_names), set(expt_vars))
            self.assertEqual(set(c.rhs_funcs), set(expt_funcs))

            python_func = c.rhs_as_python_func(namespace=namespace)
            param_dict = dict([(v, namespace[v]) for v in expt_vars])

            v = return_values[i] - python_func(**param_dict)
            self.assertAlmostEqual(numpy.dot(v, v), 0)
Esempio n. 9
0
    def test_Valid(self):
        # rhs, expt_vars, expt_funcs, result, values
        valid_rhses = [
            (
                ('a'),
                ('a'),
                (),
                5,
                {
                    'a': 5
                },
            ),
            (
                ('b'),
                ('b'),
                (),
                7,
                {
                    'b': 7
                },
            ),
            (('a+b'), ('a', 'b'), (), 13, {
                'a': 12,
                'b': 1
            }),
            (('1./(alpha+2*beta)'), ('alpha', 'beta'), (), 0.2, {
                'alpha': 1,
                'beta': 2
            }),
            (('pi'), (), (), 3.14159265, {}),
        ]

        for rhs, exp_var, exp_func, exp_res, params in valid_rhses:
            e = Expression(rhs)
            self.assertEquals(set(e.rhs_names), set(exp_var))
            self.assertEquals(set(e.rhs_funcs), set(exp_func))
            self.assertAlmostEqual(e.rhs_as_python_func()(**params),
                                   exp_res,
                                   places=4)

        import numpy
        expr_vars = [
            ["-A/tau_r", ("A", "tau_r"), ()], ["V*V", ("V", ), ()],
            ["a*(b*V - U)", ("U", "V", "b", "a"), ()],
            [
                " 0.04*V*V + 5.0*V + 1. + 140.0 - U + Isyn",
                ("V", "U", "Isyn"), ()
            ], ["c", ("c"), ()], ["1", (), ()],
            ["atan2(sin(x),cos(y))", ("x", "y"), ("atan2", "sin", "cos")],
            ["1.*V", ("V"), ()], ["1.0", (), ()], [".1", (), ()],
            [
                "1/(1 + mg_conc*eta*exp(-1*gamma*V))",
                ("mg_conc", "eta", "gamma", "V"), ('exp', )
            ],
            [
                "1 / ( 1 + mg_conc * eta *  exp( -1 * gamma*V))",
                ("mg_conc", "eta", "gamma", "V"), ('exp', )
            ],
            [
                "1 / ( 1 + mg_conc * sin(0.5) *  exp ( -1 * gamma*V))",
                ("mg_conc", "gamma", "V"), ('exp', "sin")
            ],
            [
                ".1 / ( 1.0 + mg_conc * sin(V) *  exp ( -1.0 * gamma*V))",
                ("mg_conc", "gamma", "V"), ('exp', "sin")
            ], ["sin(w)", ("w"), ("sin", )]
        ]

        namespace = {
            "A": 10.0,
            "tau_r": 11.0,
            "V": -70.0,
            "a": 1.2,
            "b": 3.0,
            "U": -80.0,
            "Isyn": 2.0,
            "c": 10.0,
            "mg_conc": 1.0,
            "eta": 2.0,
            "gamma": -20.0,
            "x": 1.0,
            "y": 1.0,
            "w": numpy.arange(10)
        }

        return_values = [
            -0.909090909091, 4900.0, -156.0, 69.0, 10.0, 1, 1.0, -70.0, 1.0,
            0.1, 1.0, 1.0, 1.0, 0.1,
            numpy.sin(namespace['w'])
        ]

        for i, (expr, expt_vars, expt_funcs) in enumerate(expr_vars):
            c = Expression(expr)
            self.assertEqual(set(c.rhs_names), set(expt_vars))
            self.assertEqual(set(c.rhs_funcs), set(expt_funcs))

            python_func = c.rhs_as_python_func(namespace=namespace)
            param_dict = dict([(v, namespace[v]) for v in expt_vars])

            v = return_values[i] - python_func(**param_dict)
            self.assertAlmostEqual(numpy.dot(v, v), 0)