Esempio n. 1
0
 def test_sympify(self):
     a = sympy.Symbol('a')
     self.assertEqual(a, sympy.sympify(Alias('a', 'b + c')))
     self.assertEqual(a, sympy.sympify(AnalogReceivePort('a')))
     self.assertEqual(a, sympy.sympify(AnalogReducePort('a')))
     self.assertEqual(a, sympy.sympify(Constant('a', 1.0,
                                                units=un.unitless)))
Esempio n. 2
0
 def test_nonlinear_state_assignment_in_onevent(self):
     """Test that nonlinear state assignements in on events"""
     g = Dynamics(name='G',
                  regimes=[
                      Regime('dSV1/dt = -SV1 / P1',
                             'dSV2/dt = -SV2 / P1 + ARP1 * P2',
                             name='R1',
                             transitions=[
                                 OnEvent('ERP1',
                                         state_assignments=[
                                             StateAssignment(
                                                 'SV2', 'SV2 + A2')
                                         ])
                             ])
                  ],
                  aliases=['A1:=SV1 * C1', 'A2:=P3 * P4 / ADP1'],
                  analog_ports=[
                      AnalogReceivePort('ARP1', dimension=un.per_time),
                      AnalogReducePort('ADP1',
                                       operator='+',
                                       dimension=un.dimensionless),
                      AnalogSendPort('A1', dimension=un.current),
                      AnalogSendPort('A2', dimension=un.dimensionless)
                  ],
                  event_ports=[EventReceivePort('ERP1')],
                  parameters=[
                      Parameter('P1', dimension=un.time),
                      Parameter('P2', dimension=un.dimensionless),
                      Parameter('P3', dimension=un.resistance),
                      Parameter('P4', dimension=un.conductance)
                  ],
                  constants=[Constant('C1', 10, units=un.nA)])
     self.assertFalse(g.is_linear())
Esempio n. 3
0
    def test_unused_reduce_ports(self):
        """
        Tests whether empty reduce ports are "closed" by inserting a zero-
        valued constant in their stead
        """
        test_dyn = Dynamics(
            name='TestDyn',
            regimes=[Regime('dSV1/dt = -P1/t + ADP1', name='r1')],
            analog_ports=[AnalogReducePort('ADP1', un.per_time)],
            parameters=['P1'])

        test_multi = MultiDynamics(name="TestMultiDyn",
                                   sub_components={'cell': test_dyn})

        self.assert_(
            Constant('ADP1__cell', 0.0,
                     un.per_time.origin.units) in test_multi.constants,
            "Zero-valued constant wasn't inserted for unused reduce "
            "port")
Esempio n. 4
0
                       StateAssignment('SV1', 'P1 + random.uniform()')
                   ])
            ],
            name='R1',
        ),
        Regime(name='R2',
               transitions=[
                   On('SV1 > 1', to='R1'),
                   On('SV3 < 0.001',
                      to='R2',
                      do=[StateAssignment('SV3', '2 * random.normal()')])
               ])
    ],
    constants=[Constant('C1', 10.0 * un.mA, un.nA)],
    analog_receive_ports=[AnalogReceivePort('ARP1', dimension=un.current)],
    analog_reduce_ports=[AnalogReducePort('ADP1', operator='+')],
    analog_send_ports=[
        AnalogSendPort('A1'),
        AnalogSendPort('A2'),
        AnalogSendPort('SV3')
    ],
    event_send_ports=[EventSendPort('ESP1')],
    event_receive_ports=[EventReceivePort('ERP1')],
    parameters=['P1', 'P2', 'P3'])

dynC = Dynamics(
    name='dynC',
    aliases=['A1:=P1', 'A2 := ARP1 + SV2', 'A3 := SV1'],
    regimes=[
        Regime(
            'dSV1/dt = -SV1 / (P2*t)',
Esempio n. 5
0
def get_compound_component():
    """Cannot yet be implemented in PyDSTool
    """
    from nineml.abstraction.testing_utils import RecordValue
    from nineml.abstraction import Dynamics, Regime, On, OutputEvent, AnalogSendPort, AnalogReducePort

    emitter = Dynamics(
        name='EventEmitter',
        parameters=['cyclelength'],
        regimes=[
            Regime(transitions=On('t > tchange + cyclelength',
                                  do=[OutputEvent('emit'), 'tchange=t'])),
        ])

    ev_based_cc = Dynamics(
        name='EventBasedCurrentClass',
        parameters=['dur', 'i'],
        analog_ports=[AnalogSendPort('I')],
        regimes=[
            Regime(transitions=[
                On('inputevent', do=['I=i', 'tchange = t']),
                On('t>tchange + dur', do=['I=0', 'tchange=t'])
            ])
        ])

    pulsing_emitter = Dynamics(name='pulsing_cc',
                               subnodes={
                                   'evs': emitter,
                                   'cc': ev_based_cc
                               },
                               portconnections=[('evs.emit', 'cc.inputevent')])

    nrn = Dynamics(
        name='LeakyNeuron',
        parameters=['Cm', 'gL', 'E'],
        regimes=[
            Regime('dV/dt = (iInj + (E-V)*gL )/Cm'),
        ],
        aliases=['iIn := iInj'],
        analog_ports=[
            AnalogSendPort('V'),
            AnalogReducePort('iInj', operator='+')
        ],
    )

    combined_comp = Dynamics(name='Comp1',
                             subnodes={
                                 'nrn': nrn,
                                 'cc1': pulsing_emitter,
                                 'cc2': pulsing_emitter
                             },
                             portconnections=[('cc1.cc.I', 'nrn.iInj'),
                                              ('cc2.cc.I', 'nrn.iInj')])

    combined_comp = al.flattening.flatten(combined_comp)

    ##        records = [
    ##            RecordValue(what='cc1_cc_I', tag='Current', label='Current Clamp 1'),
    ##            RecordValue(what='cc2_cc_I', tag='Current', label='Current Clamp 2'),
    ##            RecordValue(what='nrn_iIn', tag='Current', label='Total Input Current'),
    ##            RecordValue(what='nrn_V', tag='Voltage', label='Neuron Voltage'),
    ##            RecordValue(what='cc1_cc_tchange', tag='Tchange', label='tChange CC1'),
    ##            RecordValue(what='cc2_cc_tchange', tag='Tchange', label='tChange CC2'),
    ##            RecordValue(what='regime',     tag='Regime',  label='Regime'),
    ##        ]

    parameters = al.flattening.ComponentFlattener.flatten_namespace_dict({
        'cc1.cc.i':
        13.8,
        'cc1.cc.dur':
        10,
        'cc1.evs.cyclelength':
        30,
        'cc2.cc.i':
        20.8,
        'cc2.cc.dur':
        5.0,
        'cc2.evs.cyclelength':
        20,
        'nrn.gL':
        4.3,
        'nrn.E':
        -70
    })

    return combined_comp, parameters
Esempio n. 6
0
    def test_analog_ports(self):
        # Signature: name
                # No Docstring

        c = Dynamics(name='C1')
        self.assertEqual(len(list(c.analog_ports)), 0)

        c = Dynamics(name='C1')
        self.assertEqual(len(list(c.analog_ports)), 0)

        c = Dynamics(name='C1', aliases=['A:=2'],
                     analog_ports=[AnalogSendPort('A')])
        self.assertEqual(len(list(c.analog_ports)), 1)
        self.assertEqual(list(c.analog_ports)[0].mode, 'send')
        self.assertEqual(len(list(c.analog_send_ports)), 1)
        self.assertEqual(len(list(c.analog_receive_ports)), 0)
        self.assertEqual(len(list(c.analog_reduce_ports)), 0)

        c = Dynamics(name='C1', analog_ports=[AnalogReceivePort('B')])
        self.assertEqual(len(list(c.analog_ports)), 1)
        self.assertEqual(list(c.analog_ports)[0].mode, 'recv')
        self.assertEqual(len(list(c.analog_send_ports)), 0)
        self.assertEqual(len(list(c.analog_receive_ports)), 1)
        self.assertEqual(len(list(c.analog_reduce_ports)), 0)

        c = Dynamics(name='C1',
                     analog_ports=[AnalogReducePort('B', operator='+')])
        self.assertEqual(len(list(c.analog_ports)), 1)
        self.assertEqual(list(c.analog_ports)[0].mode, 'reduce')
        self.assertEqual(list(c.analog_ports)[0].operator, '+')
        self.assertEqual(len(list(c.analog_send_ports)), 0)
        self.assertEqual(len(list(c.analog_receive_ports)), 0)
        self.assertEqual(len(list(c.analog_reduce_ports)), 1)

        # Duplicate Port Names:
        self.assertRaises(
            NineMLUsageError,
            Dynamics,
            name='C1',
            aliases=['A1:=1'],
            analog_ports=[AnalogReducePort('B', operator='+'),
                          AnalogSendPort('B')]
        )

        self.assertRaises(
            NineMLUsageError,
            Dynamics,
            name='C1',
            aliases=['A1:=1'],
            analog_ports=[AnalogSendPort('A'), AnalogSendPort('A')]
        )

        self.assertRaises(
            NineMLUsageError,
            Dynamics,
            name='C1',
            aliases=['A1:=1'],
            analog_ports=[AnalogReceivePort('A'), AnalogReceivePort('A')]
        )

        self.assertRaises(
            NineMLUsageError,
            lambda: Dynamics(name='C1', analog_ports=[AnalogReceivePort('1')])
        )

        self.assertRaises(
            NineMLUsageError,
            lambda: Dynamics(name='C1', analog_ports=[AnalogReceivePort('?')])
        )
Esempio n. 7
0
    def setUp(self):

        self.a = Dynamics(
            name='A',
            aliases=[
                'A1:=P1 / P2', 'A2 := ARP2 + P3', 'A3 := A4 * P4 * P5',
                'A4:=P6 ** 2 + ADP1', 'A5:=SV1 * SV2 * P8',
                'A6:=SV1 * P1 / P8', 'A7:=A1 / P8'
            ],
            regimes=[
                Regime('dSV1/dt = -A1 / A2',
                       'dSV2/dt = -ADP1 / P7',
                       'dSV3/dt = -A1 * A3 / (A2 * C1)',
                       transitions=[
                           OnCondition('SV1 > 10', target_regime_name='R2')
                       ],
                       aliases=[
                           Alias('A1', 'P1 / P2 * 2'),
                           Alias('A5', 'SV1 * SV2 * P8 * 2')
                       ],
                       name='R1'),
                Regime('dSV1/dt = -A1 / A2',
                       'dSV3/dt = -A1 / A2 * A4',
                       transitions=[
                           OnCondition('C2 > A6',
                                       state_assignments=[
                                           StateAssignment('SV1', 'SV1 - A7')
                                       ],
                                       target_regime_name='R1')
                       ],
                       name='R2')
            ],
            analog_ports=[
                AnalogReceivePort('ARP1', dimension=un.resistance),
                AnalogReceivePort('ARP2', dimension=un.charge),
                AnalogReducePort('ADP1', dimension=un.dimensionless),
                AnalogSendPort('A5', dimension=un.current)
            ],
            parameters=[
                Parameter('P1', dimension=un.voltage),
                Parameter('P2', dimension=un.resistance),
                Parameter('P3', dimension=un.charge),
                Parameter('P4', dimension=old_div(un.length, un.current**2)),
                Parameter('P5', dimension=old_div(un.current**2, un.length)),
                Parameter('P6', dimension=un.dimensionless),
                Parameter('P7', dimension=un.time),
                Parameter('P8', dimension=un.current)
            ],
            constants=[
                Constant('C1', value=10.0, units=un.unitless),
                Constant('C2', value=1.0, units=un.ohm)
            ])

        self.ref_substituted_a = Dynamics(
            name='substituted_A',
            aliases=['A5:=SV1 * SV2 * P8'],
            regimes=[
                Regime('dSV1/dt = -2 * (P1 / P2) / (ARP2 + P3)',
                       'dSV2/dt = -ADP1 / P7',
                       ('dSV3/dt = -2 * (P1 / P2) * ((P6 ** 2 + ADP1) * P4 * '
                        'P5) / ((ARP2 + P3) * C1)'),
                       transitions=[
                           OnCondition('SV1 > 10', target_regime_name='R2')
                       ],
                       aliases=[Alias('A5', 'SV1 * SV2 * P8 * 2')],
                       name='R1'),
                Regime('dSV1/dt = -(P1 / P2) / (ARP2 + P3)',
                       'dSV3/dt = -(P1 / P2) / (ARP2 + P3) * (P6 ** 2 + ADP1)',
                       transitions=[
                           OnCondition('C2 > (SV1 * P1 / P8)',
                                       state_assignments=[
                                           StateAssignment(
                                               'SV1', 'SV1 - (P1 / P2) / P8')
                                       ],
                                       target_regime_name='R1')
                       ],
                       name='R2')
            ],
            analog_ports=[
                AnalogReceivePort('ARP1', dimension=un.resistance),
                AnalogReceivePort('ARP2', dimension=un.charge),
                AnalogReducePort('ADP1', dimension=un.dimensionless),
                AnalogSendPort('A5', dimension=un.current)
            ],
            parameters=[
                Parameter('P1', dimension=un.voltage),
                Parameter('P2', dimension=un.resistance),
                Parameter('P3', dimension=un.charge),
                Parameter('P4', dimension=old_div(un.length, un.current**2)),
                Parameter('P5', dimension=old_div(un.current**2, un.length)),
                Parameter('P6', dimension=un.dimensionless),
                Parameter('P7', dimension=un.time),
                Parameter('P8', dimension=un.current)
            ],
            constants=[
                Constant('C1', value=10.0, units=un.unitless),
                Constant('C2', value=1.0, units=un.ohm)
            ])
Esempio n. 8
0
    def setUp(self):
        liaf = Dynamics(
            name='liaf',
            parameters=[
                Parameter(name='R', dimension=un.resistance),
                Parameter(name='Vreset', dimension=un.voltage),
                Parameter(name='tau', dimension=un.time),
                Parameter(name='tau_rp', dimension=un.time),
                Parameter(name='theta', dimension=un.voltage)
            ],
            analog_ports=[
                AnalogReducePort(name='Isyn',
                                 dimension=un.current,
                                 operator='+'),
                AnalogSendPort(name='V', dimension=un.voltage),
                AnalogSendPort(name='t_rpend', dimension=un.time)
            ],
            event_ports=[EventSendPort(name='spikeOutput')],
            state_variables=[
                StateVariable(name='V', dimension=un.voltage),
                StateVariable(name='t_rpend', dimension=un.time)
            ],
            regimes=[
                Regime(name='refractoryRegime',
                       transitions=[
                           OnCondition('t > t_rpend',
                                       target_regime_name='subthresholdRegime')
                       ]),
                Regime(
                    name='subthresholdRegime',
                    time_derivatives=[TimeDerivative('V', '(Isyn*R - V)/tau')],
                    transitions=[
                        OnCondition('V > theta',
                                    target_regime_name='refractoryRegime',
                                    state_assignments=[
                                        StateAssignment('V', 'Vreset'),
                                        StateAssignment(
                                            't_rpend', 't + tau_rp')
                                    ],
                                    output_events=[OutputEvent('spikeOutput')])
                    ])
            ])

        poisson = Dynamics(
            name='Poisson',
            parameters=[Parameter(name='rate', dimension=un.per_time)],
            event_ports=[EventSendPort(name='spikeOutput')],
            state_variables=[StateVariable(name='t_next', dimension=un.time)],
            regimes=[
                Regime(name='default',
                       transitions=[
                           OnCondition(
                               't > t_next',
                               target_regime_name='default',
                               state_assignments=[
                                   StateAssignment(
                                       't_next', 'one_ms*random.exponential('
                                       'rate*thousand_milliseconds) + t')
                               ],
                               output_events=[OutputEvent('spikeOutput')])
                       ])
            ],
            constants=[
                Constant(name='one_ms', units=un.ms, value=1.0),
                Constant(name='thousand_milliseconds',
                         units=un.ms,
                         value=1000.0)
            ])

        static = Dynamics(
            name='StaticConnection',
            analog_ports=[AnalogSendPort(name='weight', dimension=un.current)],
            state_variables=[
                StateVariable(name='weight', dimension=un.current)
            ],
            regimes=[
                Regime(name='default',
                       time_derivatives=[TimeDerivative('weight', 'zero')])
            ],
            constants=[Constant(name='zero', units=un.A / un.s, value=0.0)])

        psr = Dynamics(
            name='AlphaPSR',
            parameters=[Parameter(name='tau_syn', dimension=un.time)],
            event_ports=[EventReceivePort(name='spike')],
            analog_ports=[
                AnalogReceivePort(name='weight', dimension=un.current),
                AnalogSendPort(name='A', dimension=un.current),
                AnalogSendPort(name='B', dimension=un.current),
                AnalogSendPort(name='Isyn', dimension=un.current)
            ],
            state_variables=[
                StateVariable(name='A', dimension=un.current),
                StateVariable(name='B', dimension=un.current)
            ],
            regimes=[
                Regime(name='default',
                       time_derivatives=[
                           TimeDerivative('A', '(-A + B)/tau_syn'),
                           TimeDerivative('B', '-B/tau_syn')
                       ],
                       transitions=[
                           OnEvent('spike',
                                   target_regime_name='default',
                                   state_assignments=[
                                       StateAssignment('B', 'B + weight')
                                   ])
                       ])
            ],
            aliases=['Isyn:=A'])

        one_to_one_class = ConnectionRule(
            'OneToOneClass',
            standard_library=(
                "http://nineml.net/9ML/1.0/connectionrules/OneToOne"))

        self.one_to_one = ConnectionRuleProperties("OneToOne",
                                                   one_to_one_class, {})

        random_fan_in_class = ConnectionRule(
            name="RandomFanIn",
            parameters=[Parameter(name="number")],
            standard_library=(
                "http://nineml.net/9ML/1.0/connectionrules/RandomFanIn"))

        exc_random_fan_in = ConnectionRuleProperties(
            name="RandomFanInProps",
            definition=random_fan_in_class,
            properties={'number': 100})

        inh_random_fan_in = ConnectionRuleProperties(
            name="RandomFanInProps",
            definition=random_fan_in_class,
            properties={'number': 200})

        self.celltype = DynamicsProperties(name="liaf_props",
                                           definition=liaf,
                                           properties={
                                               'tau': self.tau,
                                               'theta': self.theta,
                                               'tau_rp': 2.0 * un.ms,
                                               'Vreset': 10.0 * un.mV,
                                               'R': 1.5 * un.Mohm
                                           },
                                           initial_values={
                                               "V": 0.0 * un.mV,
                                               "t_rpend": 0.0 * un.ms
                                           })
        ext_stim = DynamicsProperties(name="stim",
                                      definition=poisson,
                                      properties={'rate': self.input_rate},
                                      initial_values={"t_next": 0.5 * un.ms})

        self.psr = DynamicsProperties(name="syn",
                                      definition=psr,
                                      properties={'tau_syn': self.tau_syn},
                                      initial_values={
                                          "A": 0.0 * un.nA,
                                          "B": 0.0 * un.nA
                                      })

        exc = Population("Exc", self.order * 4, self.celltype)
        inh = Population("Inh", self.order, self.celltype)
        ext = Population("Ext", self.order * 5, ext_stim)
        exc_and_inh = Selection("All", Concatenate((exc, inh)))

        self.static_ext = DynamicsProperties(
            "ExternalPlasticity",
            static, {},
            initial_values={"weight": self.Je * un.nA})

        static_exc = DynamicsProperties(
            "ExcitatoryPlasticity",
            static, {},
            initial_values={"weight": self.Je * un.nA})

        static_inh = DynamicsProperties(
            "InhibitoryPlasticity",
            static,
            initial_values={"weight": self.Ji * un.nA})

        ext_prj = Projection("External",
                             pre=ext,
                             post=exc_and_inh,
                             response=self.psr,
                             plasticity=self.static_ext,
                             connection_rule_properties=self.one_to_one,
                             delay=self.delay,
                             port_connections=[
                                 ('response', 'Isyn', 'post', 'Isyn'),
                                 ('plasticity', 'weight', 'response', 'weight')
                             ])

        exc_prj = Projection("Excitation",
                             pre=exc,
                             post=exc_and_inh,
                             response=self.psr,
                             plasticity=static_exc,
                             connection_rule_properties=exc_random_fan_in,
                             delay=self.delay,
                             port_connections=[
                                 ('response', 'Isyn', 'post', 'Isyn'),
                                 ('plasticity', 'weight', 'response', 'weight')
                             ])
        inh_prj = Projection("Inhibition",
                             pre=inh,
                             post=exc_and_inh,
                             response=self.psr,
                             plasticity=static_inh,
                             connection_rule_properties=inh_random_fan_in,
                             delay=self.delay,
                             port_connections=[
                                 ('response', 'Isyn', 'post', 'Isyn'),
                                 ('plasticity', 'weight', 'response', 'weight')
                             ])
        self.model = Network("brunel_network")
        self.model.add(ext)
        self.model.add(exc)
        self.model.add(inh)
        self.model.add(exc_and_inh)
        self.model.add(ext_prj)
        self.model.add(exc_prj)
        self.model.add(inh_prj)
Esempio n. 9
0
                to="refractoryregime"),
        ),
        Regime(
            name="refractoryregime",
            transitions=[
                On("t >= tspike + taurefrac", to="subthresholdregime")
            ],
        )
    ],
    state_variables=[
        StateVariable('V', un.voltage),
        StateVariable('tspike', un.time),
    ],
    analog_ports=[
        AnalogSendPort("V", un.voltage),
        AnalogReducePort("ISyn", un.current, operator="+"),
    ],
    event_ports=[
        EventSendPort('spikeoutput'),
    ],
    parameters=[
        Parameter('cm', un.capacitance),
        Parameter('taurefrac', un.time),
        Parameter('gl', un.conductance),
        Parameter('vreset', un.voltage),
        Parameter('vrest', un.voltage),
        Parameter('vthresh', un.voltage)
    ])

coba = Dynamics(name="CobaSyn",
                aliases=[
Esempio n. 10
0
 def test_name(self):
     # Signature: name
     # The name of the port, local to the current component
     self.assertEqual(AnalogReceivePort('A').name, 'A')
     self.assertEqual(AnalogReducePort('B', operator='+').name, 'B')
     self.assertEqual(AnalogSendPort('C').name, 'C')