Source code for spynnaker.pyNN.models.neuron.neuron_models.neuron_model_izh
# 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 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
A = 'a'
B = 'b'
C = 'c'
D = 'd'
V = 'v'
U = 'u'
I_OFFSET = 'i_offset'
TIMESTEP = 'timestep'
NEXT_H = 'next_h'
class NeuronModelIzh(NeuronModel):
"""
Model of neuron due to Eugene M. Izhikevich et al.
"""
__slots__ = (
"__a", "__b", "__c", "__d",
"__v_init", "__u_init", "__i_offset")
def __init__(
self, a: ModelParameter, b: ModelParameter, c: ModelParameter,
d: ModelParameter, v_init: ModelParameter, u_init: ModelParameter,
i_offset: ModelParameter):
"""
:param a: :math:`a`
:param b: :math:`b`
:param c: :math:`c`
:param d: :math:`d`
:param v_init: :math:`v_{init}`
:param u_init: :math:`u_{init}`
:param i_offset: :math:`I_{offset}`
"""
super().__init__(
[Struct([
(DataType.S1615, A),
(DataType.S1615, B),
(DataType.S1615, C),
(DataType.S1615, D),
(DataType.S1615, V),
(DataType.S1615, U),
(DataType.S1615, I_OFFSET),
(DataType.S1615, TIMESTEP),
(DataType.S1615, NEXT_H)])],
{A: "ms", B: "ms", C: "mV", D: "mV/ms", V: "mV", U: "mV/ms",
I_OFFSET: "nA"})
self.__a = a
self.__b = b
self.__c = c
self.__d = d
self.__i_offset = i_offset
self.__v_init = v_init
self.__u_init = u_init
[docs]
@overrides(AbstractStandardNeuronComponent.add_parameters)
def add_parameters(self, parameters: RangeDictionary[float]) -> None:
parameters[A] = self._convert(self.__a)
parameters[B] = self._convert(self.__b)
parameters[C] = self._convert(self.__c)
parameters[D] = self._convert(self.__d)
parameters[I_OFFSET] = self._convert(self.__i_offset)
parameters[TIMESTEP] = SpynnakerDataView.get_simulation_time_step_ms()
[docs]
@overrides(AbstractStandardNeuronComponent.add_state_variables)
def add_state_variables(
self, state_variables: RangeDictionary[float]) -> None:
state_variables[V] = self._convert(self.__v_init)
state_variables[U] = self._convert(self.__u_init)
state_variables[NEXT_H] = (
SpynnakerDataView.get_simulation_time_step_ms())
@property
def a(self) -> ModelParameter:
"""
Settable model parameter: :math:`a`
"""
return self.__a
@property
def b(self) -> ModelParameter:
"""
Settable model parameter: :math:`b`
"""
return self.__b
@property
def c(self) -> ModelParameter:
"""
Settable model parameter: :math:`c`
"""
return self.__c
@property
def d(self) -> ModelParameter:
"""
Settable model parameter: :math:`d`
"""
return self.__d
@property
def i_offset(self) -> ModelParameter:
"""
Settable model parameter: :math:`I_{offset}`
"""
return self.__i_offset
@property
def v_init(self) -> ModelParameter:
"""
Settable model parameter: :math:`v_{init}`
"""
return self.__v_init
@property
def u_init(self) -> ModelParameter:
"""
Settable model parameter: :math:`u_{init}`
"""
return self.__u_init