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 :param n_neurons: :return: the size of the parameters, in bytes :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 spec: The data specification to write to :param region: region ID :param weight_scales: Weight scaling for each synapse type :param app_vertex: The target application vertex :param vertex_slice: The slice of the target vertex to generate for :param 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 connections: :param post_vertex_slice: :param app_edge: :param synapse_info: """ raise NotImplementedError
@property @abstractmethod def f_rew(self) -> float: """ The frequency of rewiring. """ raise NotImplementedError @property @abstractmethod def s_max(self) -> int: """ The maximum number of synapses. """ raise NotImplementedError @property @abstractmethod def with_replacement(self) -> bool: """ Whether to allow replacement when creating synapses. """ 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. """ raise NotImplementedError @property @abstractmethod def initial_delay(self) -> InitialDelay: """ The delay of a formed connection. """ raise NotImplementedError @property @abstractmethod def partner_selection(self) -> AbstractPartnerSelection: """ The partner selection rule. """ raise NotImplementedError @property @abstractmethod def formation(self) -> AbstractFormation: """ The formation rule. """ raise NotImplementedError @property @abstractmethod def elimination(self) -> AbstractElimination: """ The elimination rule. """ raise NotImplementedError
[docs] @abstractmethod def check_initial_delay(self, max_delay_ms: int) -> None: """ Check that delays can be done without delay extensions. :param 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: """ :returns: The max number of rewires per timestep. """ raise NotImplementedError