Source code for spynnaker8.models.populations.idmixin
# Copyright (c) 2017-2019 The University of Manchester
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Alternative implementation for
# https://github.com/NeuralEnsemble/PyNN/blob/master/pyNN/common/populations.py
[docs]class IDMixin(object):
__slots__ = ("__id", "__population")
__realslots__ = tuple("_IDMixin" + item for item in __slots__)
def __init__(self, population, id): # pylint: disable=redefined-builtin
self.__id = id
self.__population = population
# NON-PYNN API CALLS
@property
def id(self):
return self.__id
@property
def _population(self):
return self.__population
def __getattr__(self, name):
try:
return self.__population.get_by_selector(
selector=self.__id, parameter_names=name)[0]
except Exception as ex: # pylint: disable=broad-except
try:
# try initialisable variable
return self.__population.get_initial_value(
selector=self.__id, variable=name)[0]
except Exception:
# that failed too so raise the better original exception
raise ex
def __setattr__(self, name, value):
if name in self.__realslots__:
object.__setattr__(self, name, value)
else:
try:
self.__population.set_by_selector(self.__id, name, value)
except Exception as ex: # pylint: disable=broad-except
try:
# try initialisable variable
return self.__population.set_initial_value(
selector=self.__id, variable=name, value=value)
except Exception:
# that failed too so raise the better original exception
raise ex
[docs] def set_parameters(self, **parameters):
""" Set cell parameters, given as a sequence of parameter=value\
arguments.
"""
for (name, value) in parameters.items():
self.__population.set_by_selector(self.__id, name, value)
[docs] def get_parameters(self):
""" Return a dict of all cell parameters.
"""
results = dict()
for name in self.celltype.get_parameter_names():
results[name] = self.__population.get_by_selector(self.__id, name)
return results
@property
def celltype(self):
return self.__population.celltype
@property
def is_standard_cell(self):
raise NotImplementedError # pragma: no cover
def _set_position(self, pos):
""" Set the cell position in 3D space.\
Cell positions are stored in an array in the parent Population.
"""
self.__population.positions[self.__id] = pos # pragma: no cover
def _get_position(self):
""" Return the cell position in 3D space.\
Cell positions are stored in an array in the parent Population,\
if any, or within the ID object otherwise. Positions are generated\
the first time they are requested and then cached.
"""
return self.__population.positions[:, self.__id] # pragma: no cover
position = property(_get_position, _set_position)
@property
def local(self):
return self.__population.is_local(self.__id)
[docs] def inject(self, current_source):
""" Inject current from a current source object into the cell.
"""
raise NotImplementedError # pragma: no cover
[docs] def get_initial_value(self, variable):
""" Get the initial value of a state variable of the cell.
"""
return self.__population.get_initial_value(variable, self.__id)
[docs] def set_initial_value(self, variable, value):
""" Set the initial value of a state variable of the cell.
"""
self.__population.set_initial_value(variable, value, self.__id)
[docs] def as_view(self):
""" Return a PopulationView containing just this cell.
"""
return self.__population[self.__id]
def __eq__(self, other):
if not isinstance(other, IDMixin):
return False
return self.__population == other._population and \
self.__id == other.id
def __ne__(self, other):
if not isinstance(other, IDMixin):
return True
return not self.__eq__(other)
def __str__(self):
return str(self.__population) + "[" + str(self.__id) + "]"
def __repr__(self):
return repr(self.__population) + "[" + str(self.__id) + "]"