Source code for spynnaker.pyNN.models.neuron.synapse_dynamics.abstract_synapse_dynamics_structural
# Copyright (c) 2017 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 __future__ import annotations
from typing import Iterable, Optional, TYPE_CHECKING
from numpy import floating
from numpy.typing import NDArray
from typing_extensions import TypeAlias
from spinn_utilities.abstract_base import AbstractBase, abstractmethod
from pacman.model.graphs.common import Slice
from spinn_front_end_common.interface.ds import DataSpecificationBase
if TYPE_CHECKING:
from spynnaker.pyNN.models.neuron.synapse_dynamics.types import (
ConnectionsArray)
from spynnaker.pyNN.models.neuron.structural_plasticity.synaptogenesis\
.partner_selection import AbstractPartnerSelection
from spynnaker.pyNN.models.neuron.structural_plasticity.synaptogenesis\
.formation import AbstractFormation
from spynnaker.pyNN.models.neuron.structural_plasticity.synaptogenesis\
.elimination import AbstractElimination
from spynnaker.pyNN.models.projection import Projection
from spynnaker.pyNN.models.neuron.synaptic_matrices import SynapticMatrices
from spynnaker.pyNN.models.neuron import PopulationVertex
from spynnaker.pyNN.models.neural_projections import (
ProjectionApplicationEdge, SynapseInformation)
# see https://github.com/SpiNNakerManchester/sPyNNaker/issues/1427
#: :meta private:
InitialDelay: TypeAlias = float
class AbstractSynapseDynamicsStructural(object, metaclass=AbstractBase):
"""
Base class for synapse dynamics that structural plasticity understands.
"""
__slots__ = ()
[docs]
@abstractmethod
def get_structural_parameters_sdram_usage_in_bytes(
self, incoming_projections: Iterable[Projection],
n_neurons: int) -> int:
"""
Get the size of the structural parameters.
.. note::
At the Application level this will be an estimate.
:param incoming_projections:
The projections that target the vertex in question
:type incoming_projections:
list(~spynnaker.pyNN.models.projection.Projection)
:param int n_neurons:
:return: the size of the parameters, in bytes
:rtype: int
:raises PacmanInvalidParameterException:
If the parameters make no sense.
"""
raise NotImplementedError
[docs]
@abstractmethod
def write_structural_parameters(
self, spec: DataSpecificationBase, region: int,
weight_scales: NDArray[floating],
app_vertex: PopulationVertex,
vertex_slice: Slice, synaptic_matrices: SynapticMatrices) -> None:
"""
Write structural plasticity parameters.
:param ~data_specification.DataSpecificationGenerator spec:
The data specification to write to
:param int region: region ID
:param list(float) weight_scales: Weight scaling for each synapse type
:param ~pacman.model.graphs.application.ApplicationVertex app_vertex:
The target application vertex
:param ~pacman.model.graphs.common.Slice vertex_slice:
The slice of the target vertex to generate for
:param SynapticMatrices synaptic_matrices:
The synaptic matrices for this vertex
"""
raise NotImplementedError
[docs]
@abstractmethod
def set_connections(
self, connections: ConnectionsArray, post_vertex_slice: Slice,
app_edge: ProjectionApplicationEdge,
synapse_info: SynapseInformation) -> None:
"""
Set connections for structural plasticity.
:param ~numpy.ndarray connections:
:param ~pacman.model.graphs.common.Slice post_vertex_slice:
:param ProjectionApplicationEdge app_edge:
:param SynapseInformation synapse_info:
"""
raise NotImplementedError
@property
@abstractmethod
def f_rew(self) -> float:
"""
The frequency of rewiring.
:rtype: float
"""
raise NotImplementedError
@property
@abstractmethod
def s_max(self) -> int:
"""
The maximum number of synapses.
:rtype: int
"""
raise NotImplementedError
@property
@abstractmethod
def with_replacement(self) -> bool:
"""
Whether to allow replacement when creating synapses.
:rtype: bool
"""
raise NotImplementedError
@property
@abstractmethod
def seed(self) -> Optional[int]:
"""
The seed to control the randomness.
"""
raise NotImplementedError
@property
@abstractmethod
def initial_weight(self) -> float:
"""
The weight of a formed connection.
:rtype: float
"""
raise NotImplementedError
@property
@abstractmethod
def initial_delay(self) -> InitialDelay:
"""
The delay of a formed connection.
:rtype: float or (float, float)
"""
raise NotImplementedError
@property
@abstractmethod
def partner_selection(self) -> AbstractPartnerSelection:
"""
The partner selection rule.
:rtype: AbstractPartnerSelection
"""
raise NotImplementedError
@property
@abstractmethod
def formation(self) -> AbstractFormation:
"""
The formation rule.
:rtype: AbstractFormation
"""
raise NotImplementedError
@property
@abstractmethod
def elimination(self) -> AbstractElimination:
"""
The elimination rule.
:rtype: AbstractElimination
"""
raise NotImplementedError
[docs]
@abstractmethod
def check_initial_delay(self, max_delay_ms: int) -> None:
"""
Check that delays can be done without delay extensions.
:param int max_delay_ms: The maximum delay supported, in milliseconds
:raises Exception: if the delay is out of range
"""
raise NotImplementedError
[docs]
@abstractmethod
def get_max_rewires_per_ts(self) -> int:
"""
Get the max number of rewires per timestep.
:rtype: int
"""
raise NotImplementedError