Source code for spynnaker.pyNN.extra_algorithms.spynnaker_synaptic_matrix_report

# Copyright (c) 2014 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 contextlib import contextmanager
import logging
import os
from typing import Dict, Tuple

import numpy

from spinn_utilities.log import FormatAdapter
from spinn_utilities.progress_bar import ProgressBar

from spynnaker.pyNN.data import SpynnakerDataView
from spynnaker.pyNN.models.neural_projections import ProjectionApplicationEdge
from spynnaker.pyNN.models.neural_projections import SynapseInformation
from spynnaker.pyNN.models.neuron import ConnectionHolder

logger = FormatAdapter(logging.getLogger(__name__))
_DIRNAME = "synaptic_matrix_reports"


@contextmanager
def _print_all():
    """
    Update the numpy print options to display everything.
    """
    print_opts = numpy.get_printoptions()
    numpy.set_printoptions(threshold=numpy.nan)
    try:
        yield
    finally:
        numpy.set_printoptions(**print_opts)


class SpYNNakerSynapticMatrixReport(object):
    """
    Generate the synaptic matrices for reporting purposes.
    """

[docs] def __call__(self, connection_holder: Dict[Tuple[ ProjectionApplicationEdge, SynapseInformation], ConnectionHolder]): """ Convert synaptic matrix for every application edge. :param connection_holder: where the synaptic matrices are stored (possibly after retrieval from the machine) :type connection_holder: dict(tuple(ProjectionApplicationEdge, SynapseInformation), ConnectionHolder) """ # generate folder for synaptic reports top_level_folder = os.path.join( SpynnakerDataView.get_run_dir_path(), _DIRNAME) if not os.path.exists(top_level_folder): os.mkdir(top_level_folder) # create progress bar progress = ProgressBar(connection_holder.keys(), "Generating synaptic matrix reports") # Update the print options to display everything with _print_all(): # for each application edge, write matrix in new file for edge, _ in progress.over(connection_holder.keys()): # only write matrix's for edges which have matrix's if isinstance(edge, ProjectionApplicationEdge): # figure new file name self._write_file(os.path.join( top_level_folder, f"synaptic_matrix_for_application_edge_{edge.label}"), connection_holder, edge)
def _write_file( self, file_name: str, connection_holder: Dict[Tuple[ ProjectionApplicationEdge, SynapseInformation], ConnectionHolder], edge: ProjectionApplicationEdge): # open writer try: with open(file_name, "w", encoding="utf-8") as f: # write all data for all synapse_information's in same file for info in edge.synapse_information: f.write(f"{connection_holder[edge, info]}") except IOError: logger.exception( "Generate_placement_reports: Can't open file {} for writing.", file_name)