Source code for spynnaker.pyNN.extra_algorithms.spynnaker_connection_holder_generations
# Copyright (c) 2016 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 Dict, Mapping, Tuple
from spinn_utilities.progress_bar import ProgressBar
from pacman.model.graphs.application import ApplicationGraph
from spynnaker.pyNN.models.neuron import ConnectionHolder
from spynnaker.pyNN.models.neural_projections import (
ProjectionApplicationEdge, SynapseInformation)
class SpYNNakerConnectionHolderGenerator(object):
"""
Sets up connection holders for reports to use.
"""
[docs]
def __call__(self, application_graph: ApplicationGraph) -> Mapping[
Tuple[ProjectionApplicationEdge, SynapseInformation],
ConnectionHolder]:
"""
:param application_graph: application graph
:type application_graph:
~pacman.model.graphs.application.ApplicationGraph
:return:
the set of connection holders for after data specification
generation
:rtype: dict(tuple(ProjectionApplicationEdge, SynapseInformation),
ConnectionHolder)
"""
progress = ProgressBar(
application_graph.n_outgoing_edge_partitions,
"Generating connection holders for reporting connection data.")
data_holders: Dict[
Tuple[ProjectionApplicationEdge, SynapseInformation],
ConnectionHolder] = dict()
for partition in progress.over(
application_graph.outgoing_edge_partitions):
for edge in partition.edges:
# add pre run generators so that reports can extract without
# going to machine.
if isinstance(edge, ProjectionApplicationEdge):
# build connection holders
self._generate_holder_for_edge(edge, data_holders)
# return the two holders
return data_holders
@staticmethod
def _generate_holder_for_edge(
edge: ProjectionApplicationEdge, data_holders: Dict[
Tuple[ProjectionApplicationEdge, SynapseInformation],
ConnectionHolder]):
"""
:param ProjectionApplicationEdge edge:
:param dict data_holders:
"""
# build connection holders
connection_holder = ConnectionHolder(
None, True, edge.pre_vertex.n_atoms, edge.post_vertex.n_atoms)
for synapse_information in edge.synapse_information:
synapse_information.add_pre_run_connection_holder(
connection_holder)
# store for the report generations
data_holders[edge, synapse_information] = connection_holder