Source code for spynnaker.pyNN.models.neuron.neuron_models.neuron_model_leaky_integrate_and_fire
# Copyright (c) 2015 The University of Manchester
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Optional
from spinn_utilities.overrides import overrides
from spinn_utilities.ranged import RangeDictionary
from spinn_front_end_common.interface.ds import DataType
from spynnaker.pyNN.models.neuron.implementations import (
AbstractStandardNeuronComponent, ModelParameter)
from spynnaker.pyNN.utilities.struct import Struct
from spynnaker.pyNN.data import SpynnakerDataView
from .neuron_model import NeuronModel
V = "v"
V_REST = "v_rest"
TAU_M = "tau_m"
CM = "cm"
I_OFFSET = "i_offset"
V_RESET = "v_reset"
TAU_REFRAC = "tau_refrac"
TIMESTEP = "timestep"
REFRACT_TIMER = "refract_timer"
class NeuronModelLeakyIntegrateAndFire(NeuronModel):
"""
Classic leaky integrate and fire neuron model.
"""
__slots__ = (
"__v_init",
"__v_rest",
"__tau_m",
"__cm",
"__i_offset",
"__v_reset",
"__tau_refrac")
def __init__(
self, v_init: Optional[ModelParameter], v_rest: ModelParameter,
tau_m: ModelParameter, cm: ModelParameter,
i_offset: ModelParameter, v_reset: ModelParameter,
tau_refrac: ModelParameter):
r"""
:param v_init: :math:`V_{init}`
:type v_init: float or iterable(float) or
~spynnaker.pyNN.RandomDistribution or (mapping) function
:param v_rest: :math:`V_{rest}`
:type v_rest: float or iterable(float) or
~spynnaker.pyNN.RandomDistribution or (mapping) function
:param tau_m: :math:`\tau_{m}`
:type tau_m: float or iterable(float) or
~spynnaker.pyNN.RandomDistribution or (mapping) function
:param cm: :math:`C_m`
:type cm: float or iterable(float) or
~spynnaker.pyNN.RandomDistribution or (mapping) function
:param i_offset: :math:`I_{offset}`
:type i_offset: float or iterable(float) or
~spynnaker.pyNN.RandomDistribution or (mapping) function
:param v_reset: :math:`V_{reset}`
:type v_reset: float or iterable(float) or
~spynnaker.pyNN.RandomDistribution or (mapping) function
:param tau_refrac: :math:`\tau_{refrac}`
:type tau_refrac: float or iterable(float) or
~spynnaker.pyNN.RandomDistribution or (mapping) function
"""
super().__init__(
[Struct([
(DataType.S1615, V),
(DataType.S1615, V_REST),
(DataType.S1615, CM),
(DataType.S1615, TAU_M),
(DataType.S1615, I_OFFSET),
(DataType.S1615, V_RESET),
(DataType.S1615, TAU_REFRAC),
(DataType.INT32, REFRACT_TIMER),
(DataType.S1615, TIMESTEP)])],
{V: 'mV', V_REST: 'mV', TAU_M: 'ms', CM: 'nF', I_OFFSET: 'nA',
V_RESET: 'mV', TAU_REFRAC: 'ms'})
if v_init is None:
v_init = v_rest
self.__v_init = v_init
self.__v_rest = v_rest
self.__tau_m = tau_m
self.__cm = cm
self.__i_offset = i_offset
self.__v_reset = v_reset
self.__tau_refrac = tau_refrac
[docs]
@overrides(AbstractStandardNeuronComponent.add_parameters)
def add_parameters(self, parameters: RangeDictionary[float]):
parameters[V_REST] = self._convert(self.__v_rest)
parameters[TAU_M] = self._convert(self.__tau_m)
parameters[CM] = self._convert(self.__cm)
parameters[I_OFFSET] = self._convert(self.__i_offset)
parameters[V_RESET] = self._convert(self.__v_reset)
parameters[TAU_REFRAC] = self._convert(self.__tau_refrac)
parameters[TIMESTEP] = SpynnakerDataView.get_simulation_time_step_ms()
[docs]
@overrides(AbstractStandardNeuronComponent.add_state_variables)
def add_state_variables(self, state_variables: RangeDictionary[float]):
state_variables[V] = self._convert(self.__v_init)
state_variables[REFRACT_TIMER] = 0
@property
def v_init(self) -> ModelParameter:
"""
Settable model parameter: :math:`V_{init}`
:rtype: float
"""
return self.__v_init
@property
def v_rest(self) -> ModelParameter:
"""
Settable model parameter: :math:`V_{rest}`
:rtype: float
"""
return self.__v_rest
@property
def tau_m(self) -> ModelParameter:
r"""
Settable model parameter: :math:`\tau_{m}`
:rtype: float
"""
return self.__tau_m
@property
def cm(self) -> ModelParameter:
"""
Settable model parameter: :math:`C_m`
:rtype: float
"""
return self.__cm
@property
def i_offset(self) -> ModelParameter:
"""
Settable model parameter: :math:`I_{offset}`
:rtype: float
"""
return self.__i_offset
@property
def v_reset(self) -> ModelParameter:
"""
Settable model parameter: :math:`V_{reset}`
:rtype: float
"""
return self.__v_reset
@property
def tau_refrac(self) -> ModelParameter:
r"""
Settable model parameter: :math:`\tau_{refrac}`
:rtype: float
"""
return self.__tau_refrac