Source code for pacman.model.placements.placements

from pacman.exceptions import (PacmanAlreadyPlacedError,
                               PacmanNotPlacedError,
                               PacmanProcessorAlreadyOccupiedError,
                               PacmanProcessorNotOccupiedError)


[docs]class Placements(object): """ The placements of vertices on the chips of the machine """ __slots__ = [ # dict of [(x,y,p)] -> placement object. used for fast lookup of a # vertex given a set of coordinates "_placements", # dict of [machine_vertex] -> placement object. used for fast lookup of # the placement of a machine vertex. "_machine_vertices", ] def __init__(self, placements=None): """ :param placements: Any initial placements :type placements:\ iterable of :py:class:`pacman.model.placements.placement.Placement` :raise PacmanAlreadyPlacedError:\ If there is any vertex with more than one placement. :raise PacmanProcessorAlreadyOccupiedError:\ If two placements are made to the same processor. """ self._placements = dict() self._machine_vertices = dict() if placements is not None: self.add_placements(placements) @property def n_placements(self): """ The number of placements :rtype: int """ return len(self._placements)
[docs] def add_placements(self, placements): """ Add some placements :param placements: The placements to add :type placements:\ iterable of :py:class:`pacman.model.placements.placement.Placement` """ for placement in placements: self.add_placement(placement)
[docs] def add_placement(self, placement): """ Add a placement :param placement: The placement to add :type placement:\ :py:class:`pacman.model.placements.placement.Placement` :raise PacmanAlreadyPlacedError:\ If there is any vertex with more than one placement. :raise PacmanProcessorAlreadyOccupiedError:\ If two placements are made to the same processor. """ placement_id = (placement.x, placement.y, placement.p) if placement_id in self._placements: raise PacmanProcessorAlreadyOccupiedError(placement_id) if placement.vertex in self._machine_vertices: raise PacmanAlreadyPlacedError(placement.vertex) self._placements[placement_id] = placement self._machine_vertices[placement.vertex] = placement
[docs] def get_vertex_on_processor(self, x, y, p): """ Return the vertex on a specific processor or None if the\ processor has not been allocated :param x: the x coordinate of the chip :type x: int :param y: the y coordinate of the chip :type y: int :param p: the processor on the chip :type p: int :return: the vertex placed on the given processor :rtype:\ :py:class:`pacman.model.graph.machine.abstract_machine_vertex.impl.MachineVertex` :raise PacmanProcessorNotOccupiedError:\ If the processor is not occupied """ placement_id = (x, y, p) try: return self._placements[placement_id].vertex except KeyError: raise PacmanProcessorNotOccupiedError(placement_id)
[docs] def get_placement_of_vertex(self, vertex): """ Return the placement information for a vertex :param vertex: The vertex to find the placement of :type vertex:\ :py:class:`pacman.model.graph.machine.abstract_machine_vertex.impl.MachineVertex` :return: The placement :rtype: :py:class:`pacman.model.placements.placement.Placement` :raise PacmanNotPlacedError: If the vertex has not been placed. """ try: return self._machine_vertices[vertex] except KeyError: raise PacmanNotPlacedError(vertex)
[docs] def get_placed_processors(self): """ Return an iterable of processors with assigned vertices. :return: Iterable of (x, y, p) tuples :rtype: iterable of (int, int, int) """ return self._placements.iterkeys()
[docs] def is_processor_occupied(self, x, y, p): """ Determine if a processor has a vertex on it :param int x: x coordinate of processor. :param int y: y coordinate of processor. :param int p: Index of processor. :return bool: Whether the processor has an assigned vertex. """ return (x, y, p) in self._placements
@property def placements(self): """ All of the placements :return: iterable of placements :rtype: iterable of\ :py:class:`pacman.model.placements.placement.Placement` :raise None: does not raise any known exceptions """ return self._placements.itervalues() def __repr__(self): output = "" for placement in self._placements: output += placement.__repr__() return output def __iter__(self): """ An iterator for the placements object within """ return iter(self.placements) def __len__(self): return len(self._placements)