Source code for spinn_front_end_common.interface.interface_functions.process_partition_constraints
# 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/>.
from spinn_utilities.progress_bar import ProgressBar
from pacman.model.graphs.common import EdgeTrafficType
from spinn_front_end_common.abstract_models import (
AbstractProvidesOutgoingPartitionConstraints,
AbstractProvidesIncomingPartitionConstraints)
from spinn_front_end_common.utilities.exceptions import ConfigurationException
[docs]class ProcessPartitionConstraints(object):
def __call__(self, machine_graph=None, application_graph=None,
graph_mapper=None):
if machine_graph is None:
raise ConfigurationException(
"A machine graph is required for this mapper. "
"Please choose and try again")
if (application_graph is None) != (graph_mapper is None):
raise ConfigurationException(
"Can only do one graph. semantically doing 2 graphs makes no "
"sense. Please choose and try again")
if application_graph is not None:
# generate progress bar
progress = ProgressBar(
machine_graph.n_vertices,
"Getting constraints for application graph")
# iterate over each partition in the graph
for vertex in progress.over(machine_graph.vertices):
partitions = machine_graph.\
get_outgoing_edge_partitions_starting_at_vertex(
vertex)
for partition in partitions:
if partition.traffic_type == EdgeTrafficType.MULTICAST:
self._process_application_partition(
partition, graph_mapper)
else:
# generate progress bar
progress = ProgressBar(
machine_graph.n_vertices,
"Getting constraints for machine graph")
for vertex in progress.over(machine_graph.vertices):
partitions = machine_graph.\
get_outgoing_edge_partitions_starting_at_vertex(
vertex)
for partition in partitions:
if partition.traffic_type == EdgeTrafficType.MULTICAST:
self._process_machine_partition(partition)
@staticmethod
def _process_application_partition(partition, graph_mapper):
vertex = graph_mapper.get_application_vertex(
partition.pre_vertex)
if isinstance(vertex,
AbstractProvidesOutgoingPartitionConstraints):
partition.add_constraints(
vertex.get_outgoing_partition_constraints(partition))
for edge in partition.edges:
app_edge = graph_mapper.get_application_edge(edge)
if isinstance(app_edge.post_vertex,
AbstractProvidesIncomingPartitionConstraints):
partition.add_constraints(
app_edge.post_vertex.get_incoming_partition_constraints(
partition))
@staticmethod
def _process_machine_partition(partition):
if isinstance(partition.pre_vertex,
AbstractProvidesOutgoingPartitionConstraints):
partition.add_constraints(
partition.pre_vertex.get_outgoing_partition_constraints(
partition))
for edge in partition.edges:
if isinstance(edge.post_vertex,
AbstractProvidesIncomingPartitionConstraints):
partition.add_constraints(
edge.post_vertex.get_incoming_partition_constraints(
partition))