Source code for pacman.model.routing_info.routing_info
# pacman imports
from pacman.exceptions import PacmanAlreadyExistsException
[docs]class RoutingInfo(object):
""" An association of a set of edges to a non-overlapping set of keys\
and masks
"""
__slots__ = [
# Partition information indexed by partition
"_partition_info_by_partition",
# Partition information indexed by edge pre vertex and partition id
# name
"_partition_info_by_pre_vertex",
# Partition information by edge
"_partition_info_by_edge"
]
def __init__(self, partition_info_items=None):
"""
:param partition_info_items: The partition information items to add
:type partition_info_items: iterable of\
:py:class:`pacman.model.routing_info.PartitionRoutingInfo`
or none
:raise pacman.exceptions.PacmanAlreadyExistsException: If there are \
two partition information objects with the same partition
"""
# Partition information indexed by partition
self._partition_info_by_partition = dict()
# Partition information indexed by edge pre vertex and partition id
# name
self._partition_info_by_pre_vertex = dict()
# Partition information by edge
self._partition_info_by_edge = dict()
if partition_info_items is not None:
for partition_info_item in partition_info_items:
self.add_partition_info(partition_info_item)
[docs] def add_partition_info(self, partition_info):
""" Add a partition information item
:param partition_info: The partition information item to add
:type partition_info:\
:py:class:`pacman.model.routing_info.PartitionRoutingInfo`
:rtype: None
:raise pacman.exceptions.PacmanAlreadyExistsException:\
If the partition is already in the set of edges
"""
partition = partition_info.partition
if partition in self._partition_info_by_partition:
raise PacmanAlreadyExistsException(
"Partition", str(partition_info))
if ((partition.pre_vertex, partition.identifier)
in self._partition_info_by_pre_vertex):
raise PacmanAlreadyExistsException(
"Partition", str(partition_info))
self._partition_info_by_partition[partition] = partition_info
self._partition_info_by_pre_vertex[
partition.pre_vertex, partition.identifier] = partition_info
for edge in partition.edges:
self._partition_info_by_edge[edge] = partition_info
[docs] def get_first_key_from_partition(self, partition):
""" Get the first key associated with a particular partition
:param partition: The partition to get the first key of
:type partition:\
:py:class:`pacman.model.graph.OutgoingEdgePartition`
:return: The routing key or None if the partition does not exist
:rtype: int
:raise None: does not raise any known exceptions
"""
if partition in self._partition_info_by_partition:
return self._partition_info_by_partition[
partition].keys_and_masks[0].key
return None
[docs] def get_routing_info_from_partition(self, partition):
"""
:param partition: The partition to set the number of keys for
:type partition:\
:py:class:`pacman.model.graph.OutgoingEdgePartition`
:return: the partition_routing_info for the partition
"""
if partition in self._partition_info_by_partition:
return self._partition_info_by_partition[partition]
return None
[docs] def get_routing_info_from_pre_vertex(self, vertex, partition_id):
""" Get routing information for edges with a given partition_id from\
a pre vertex
:param vertex: The pre_vertex to search for
:param partition_id: The id of the partition for which to get\
the routing information
"""
if (vertex, partition_id) in self._partition_info_by_pre_vertex:
return self._partition_info_by_pre_vertex[vertex, partition_id]
return None
[docs] def get_first_key_from_pre_vertex(self, vertex, partition_id):
""" Get the first key for the partition starting at a vertex
:param vertex: The vertex which the partition starts at
:param partition_id: The id of the partition for which to get\
the routing information
:return: The routing key of the partition
:rtype: int
"""
if (vertex, partition_id) in self._partition_info_by_pre_vertex:
return self._partition_info_by_pre_vertex[
vertex, partition_id].keys_and_masks[0].key
return None
[docs] def get_routing_info_for_edge(self, edge):
""" Get routing information for an edge
:param edge: The edge to search for
"""
return self._partition_info_by_edge.get(edge, None)
[docs] def get_first_key_for_edge(self, edge):
""" Get routing key for an edge
:param edge: The edge to search for
"""
if edge in self._partition_info_by_edge:
return self._partition_info_by_edge[edge].keys_and_masks[0].key
return None
def __iter__(self):
""" returns a iterator for the partition routing information
:return: a iterator of partition routing information
"""
return self._partition_info_by_partition.itervalues()