Esempio n. 1
0
 def test_lorenz_attractor(self):
     indict = open_json("lorenz_attractor.json")
     shapes = _from_json_to_shapes(indict, default_config)
     shape_sys = SystemOfShapes.from_shapes(shapes)
     sigma, beta, rho = sympy.symbols("sigma beta rho")
     assert shape_sys.A_ == sympy.Matrix([[-sigma, sigma, 0], [rho, -1, 0],
                                          [0, 0, -beta]])
     x, y, z = sympy.symbols("x y z")
     assert shape_sys.c_ == sympy.Matrix([[0], [-x * z], [x * y]])
Esempio n. 2
0
    def test_inhomogeneous_solver_second_order(self):
        r"""test failure to generate propagators for inhomogeneous 2nd order ODE"""
        tau = 10.  # [s]
        parameters_dict = {sympy.Symbol("tau"): str(tau)}

        x0 = 0.
        x0d = 10.

        shape = Shape.from_ode("x", "-1/tau**2 * x - 2/tau * x' - 1", initial_values={"x": str(x0), "x'": str(x0d)}, parameters=parameters_dict)
        sys_of_shape = SystemOfShapes.from_shapes([shape], parameters=parameters_dict)
        solver_dict = sys_of_shape.generate_propagator_solver()
Esempio n. 3
0
 def test_system_matrix_construction(self):
     indict = open_json("system_matrix_test.json")
     shapes = _from_json_to_shapes(indict, default_config)
     shape_sys = SystemOfShapes.from_shapes(shapes)
     sigma, beta = sympy.symbols("sigma beta")
     assert shape_sys.A_ == sympy.Matrix([[-sigma, sigma, 0.0],
                                          [0.0, 0.0, 0.0],
                                          [0.0, 0.0, -beta]])
     x, y, z = sympy.symbols("x y z")
     assert shape_sys.c_ == sympy.Matrix([[0], [3 * z * x**2 - x * y],
                                          [x * y]])
Esempio n. 4
0
    def test_morris_lecar(self):
        indict = open_json("morris_lecar.json")
        shapes, parameters = _from_json_to_shapes(indict, default_config)
        shape_sys = SystemOfShapes.from_shapes(shapes, parameters=parameters)
        C_m, g_Ca, g_K, g_L, E_Ca, E_K, E_L, I_ext = sympy.symbols("C_m g_Ca g_K g_L E_Ca E_K E_L I_ext")
        assert shape_sys.A_ == sympy.Matrix([[sympy.parsing.sympy_parser.parse_expr("-500.0 * g_Ca / C_m - 1000.0 * g_L / C_m"), sympy.parsing.sympy_parser.parse_expr("1000.0 * E_K * g_K / C_m")],
                                            [sympy.parsing.sympy_parser.parse_expr("0.0"), sympy.parsing.sympy_parser.parse_expr("0.0")]])

        V, W = sympy.symbols("V W")
        assert shape_sys.b_ == sympy.Matrix([[sympy.parsing.sympy_parser.parse_expr("500.0 * E_Ca * g_Ca / C_m + 1000.0 * E_L * g_L / C_m + 1000.0 * I_ext / C_m")],
                                             [sympy.parsing.sympy_parser.parse_expr("0.0")]])
        assert shape_sys.c_ == sympy.Matrix([[sympy.parsing.sympy_parser.parse_expr("500.0 * E_Ca * g_Ca * tanh(V / 15 + 1 / 15) / C_m - 1000.0 * V * W * g_K / C_m - 500.0 * V * g_Ca * tanh(V / 15 + 1 / 15) / C_m")],
                                             [sympy.parsing.sympy_parser.parse_expr("-200.0 * W * cosh(V / 60) + 100.0 * cosh(V / 60) * tanh(V / 30) + 100.0 * cosh(V / 60)")]])
Esempio n. 5
0
    def test_inhomogeneous_solver_second_order_combined_system(self):
        r"""test propagators generation for combined homogeneous/inhomogeneous ODEs"""
        tau = 10.  # [s]
        E_L = -70.  # [mV]
        parameters_dict = {sympy.Symbol("tau"): str(tau),
                           sympy.Symbol("E_L"): str(E_L)}

        x0 = 0.
        x0d = 10.

        shape_V_m = Shape.from_ode("V_m", "x / tau + (E_L - V_m)", initial_values={"V_m": "0."}, parameters=parameters_dict)
        shape_I_syn1 = Shape.from_ode("x", "y", initial_values={"x": str(x0)}, parameters=parameters_dict)
        shape_I_syn2 = Shape.from_ode("y", "-1/tau**2 * x - 2/tau * y", initial_values={"y": str(x0d)}, parameters=parameters_dict)
        sys_of_shape = SystemOfShapes.from_shapes([shape_V_m, shape_I_syn1, shape_I_syn2], parameters=parameters_dict)
        solver_dict = sys_of_shape.generate_propagator_solver()
        assert set(solver_dict["state_variables"]) == set(['V_m', 'x', 'y'])
Esempio n. 6
0
    def test_inhomogeneous_simultaneous(self):
        U = .2
        tau = 5.  # [s]

        x0 = 0.

        parameters_dict = {sympy.Symbol("U"): str(U),
                           sympy.Symbol("tau1"): str(tau),
                           sympy.Symbol("tau2"): str(tau)}

        shape_x = Shape.from_ode("x", "(U - x) / tau1", initial_values={"x": str(x0)}, parameters=parameters_dict)
        shape_y = Shape.from_ode("y", "(1 - y) / tau2", initial_values={"y": str(x0)}, parameters=parameters_dict)

        sys_of_shape = SystemOfShapes.from_shapes([shape_x, shape_y], parameters=parameters_dict)
        print(sys_of_shape.reconstitute_expr())
        solver_dict = sys_of_shape.generate_propagator_solver()
        solver_dict["parameters"] = parameters_dict
        print(solver_dict)

        analytic_integrator = AnalyticIntegrator(solver_dict)
        analytic_integrator.set_initial_values({"x": str(x0), "y": str(x0)})
        analytic_integrator.reset()

        dt = 1.

        actual_x = []
        actual_y = []
        correct_x = []
        correct_y = []
        cur_x = x0
        cur_y = x0
        timevec = np.arange(0., 100., dt)
        kernel = np.exp(-dt / tau)
        for step, t in enumerate(timevec):
            state_x = analytic_integrator.get_value(t)["x"]
            state_y = analytic_integrator.get_value(t)["y"]
            actual_x.append(state_x)
            actual_y.append(state_y)
            correct_x.append(cur_x)
            correct_y.append(cur_y)
            cur_x = U + kernel * (cur_x - U)
            cur_y = 1 + kernel * (cur_y - 1)

        np.testing.assert_allclose(correct_x, actual_x)
        np.testing.assert_allclose(correct_y, actual_y)
Esempio n. 7
0
    def test_inhomogeneous_solver(self, ode_definition):
        U = .2
        if ode_definition == "(1 - x) / tau":
            U = 1.
        tau = 5.  # [s]

        x0 = 0.

        parameters_dict = {sympy.Symbol("U"): str(U),
                           sympy.Symbol("tau"): str(tau)}

        shape = Shape.from_ode("x", ode_definition, initial_values={"x": str(x0)}, parameters=parameters_dict)

        assert not shape.is_homogeneous()
        assert shape.is_lin_const_coeff()

        sys_of_shape = SystemOfShapes.from_shapes([shape], parameters=parameters_dict)
        print(sys_of_shape.reconstitute_expr())
        solver_dict = sys_of_shape.generate_propagator_solver()
        solver_dict["parameters"] = parameters_dict
        print(solver_dict)

        analytic_integrator = AnalyticIntegrator(solver_dict)
        analytic_integrator.set_initial_values({"x": str(x0)})
        analytic_integrator.reset()

        dt = 1.

        actual = []
        correct = []
        cur_x = x0
        timevec = np.arange(0., 100., dt)
        kernel = np.exp(-dt / tau)
        for step, t in enumerate(timevec):
            state_ = analytic_integrator.get_value(t)["x"]
            actual.append(state_)
            correct.append(cur_x)
            cur_x = U + kernel * (cur_x - U)

        np.testing.assert_allclose(correct, actual)
Esempio n. 8
0
    def test_morris_lecar(self):
        indict = open_json("morris_lecar.json")
        shapes = _from_json_to_shapes(indict, default_config)
        shape_sys = SystemOfShapes.from_shapes(shapes)
        C_m, g_Ca, g_K, g_L, E_Ca, E_K, E_L, I_ext = sympy.symbols(
            "C_m g_Ca g_K g_L E_Ca E_K E_L I_ext")
        assert shape_sys.A_ == sympy.Matrix([[
            -500.0 * g_Ca / C_m - 1000.0 * g_L / C_m, 1000.0 * E_K * g_K / C_m
        ], [0.0, 0.0]])

        V, W = sympy.symbols("V W")
        assert shape_sys.c_ == sympy.Matrix(
            [[
                500.0 * E_Ca * g_Ca * sympy.tanh(V / 15 + sympy.S("1/15")) /
                C_m + 500.0 * E_Ca * g_Ca / C_m + 1000.0 * E_L * g_L / C_m +
                1000.0 * I_ext / C_m - 1000.0 * V * W * g_K / C_m -
                500.0 * V * g_Ca * sympy.tanh(V / 15 + sympy.S("1/15")) / C_m
            ],
             [
                 -200.0 * W * sympy.cosh(V / 60) +
                 100.0 * sympy.cosh(V / 60) * sympy.tanh(V / 30) +
                 100.0 * sympy.cosh(V / 60)
             ]])