def run(self, subgraph, graph_mapper): new_sub_graph = PartitionedGraph(label=subgraph.label) new_graph_mapper = GraphMapper(graph_mapper.first_graph_label, subgraph.label) # create progress bar progress_bar = ProgressBar( len(subgraph.subvertices) + len(subgraph.subedges), "Filtering edges") # add the subverts directly, as they wont be pruned. for subvert in subgraph.subvertices: new_sub_graph.add_subvertex(subvert) associated_vertex = graph_mapper.get_vertex_from_subvertex(subvert) vertex_slice = graph_mapper.get_subvertex_slice(subvert) new_graph_mapper.add_subvertex( subvertex=subvert, vertex_slice=vertex_slice, vertex=associated_vertex) progress_bar.update() # start checking subedges to decide which ones need pruning.... for subedge in subgraph.subedges: if not self._is_filterable(subedge, graph_mapper): logger.debug("this subedge was not pruned {}".format(subedge)) new_sub_graph.add_subedge(subedge) associated_edge = graph_mapper.\ get_partitionable_edge_from_partitioned_edge(subedge) new_graph_mapper.add_partitioned_edge(subedge, associated_edge) else: logger.debug("this subedge was pruned {}".format(subedge)) progress_bar.update() progress_bar.end() # returned the pruned partitioned_graph and graph_mapper return new_sub_graph, new_graph_mapper
def test_get_vertex_from_subvertex(self): """ test that the graph mapper can retribve a vertex froma given subvertex :return: """ subvertices = list() subvertices.append(PartitionedVertex(None, "")) subvertices.append(PartitionedVertex(None, "")) subvert1 = PartitionedVertex(None, "") subvert2 = PartitionedVertex(None, "") graph_mapper = GraphMapper() vert = TestVertex(10, "Some testing vertex") vertex_slice = Slice(0, 1) graph_mapper.add_subvertex(subvert1, vertex_slice, vert) vertex_slice = Slice(2, 3) graph_mapper.add_subvertex(subvert2, vertex_slice, vert) self.assertEqual( vert, graph_mapper.get_vertex_from_subvertex(subvert1)) self.assertEqual( vert, graph_mapper.get_vertex_from_subvertex(subvert2)) self.assertEqual( None, graph_mapper.get_vertex_from_subvertex(subvertices[0])) self.assertEqual( None, graph_mapper.get_vertex_from_subvertex(subvertices[1]))
def __call__(self, subgraph, graph_mapper): """ :param subgraph: the subgraph whose edges are to be filtered :param graph_mapper: the graph mapper between partitionable and \ partitioned graphs. :return: a new graph mapper and partitioned graph """ new_sub_graph = PartitionedGraph(label=subgraph.label) new_graph_mapper = GraphMapper(graph_mapper.first_graph_label, subgraph.label) # create progress bar progress_bar = ProgressBar( len(subgraph.subvertices) + len(subgraph.subedges), "Filtering edges") # add the subverts directly, as they wont be pruned. for subvert in subgraph.subvertices: new_sub_graph.add_subvertex(subvert) associated_vertex = graph_mapper.get_vertex_from_subvertex(subvert) vertex_slice = graph_mapper.get_subvertex_slice(subvert) new_graph_mapper.add_subvertex( subvertex=subvert, vertex_slice=vertex_slice, vertex=associated_vertex) progress_bar.update() # start checking subedges to decide which ones need pruning.... for subvert in subgraph.subvertices: out_going_partitions = \ subgraph.outgoing_edges_partitions_from_vertex(subvert) for partitioner_identifier in out_going_partitions: for subedge in \ out_going_partitions[partitioner_identifier].edges: if not self._is_filterable(subedge, graph_mapper): logger.debug("this subedge was not pruned {}" .format(subedge)) new_sub_graph.add_subedge(subedge, partitioner_identifier) associated_edge = graph_mapper.\ get_partitionable_edge_from_partitioned_edge( subedge) new_graph_mapper.add_partitioned_edge( subedge, associated_edge) else: logger.debug("this subedge was pruned {}" .format(subedge)) progress_bar.update() progress_bar.end() # returned the pruned partitioned_graph and graph_mapper return {'new_sub_graph': new_sub_graph, 'new_graph_mapper': new_graph_mapper}
def test_many_subvertices(self): subvertices = list() for i in range(20 * 17): #51 atoms per each processor on 20 chips subvertices.append(PartitionedVertex( 0, 50, get_resources_used_by_atoms(0, 50, []), "Subvertex " + str(i))) self.graph = PartitionableGraph("Graph",subvertices) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(subvertices) self.bp = RadialPlacer(self.machine, self.graph) self.subgraph = PartitionedGraph(subvertices=subvertices) placements = self.bp.place(self.subgraph, self.graph_mapper) unorderdered_info = list() for placement in placements.placements: unorderdered_info.append( (placement.subvertex.label.split(" ")[0], "{:<4}".format(placement.subvertex.label.split(" ")[1]), placement.subvertex.n_atoms, 'x: ', placement.x, 'y: ', placement.y, 'p: ', placement.p)) from operator import itemgetter sorted_info = sorted(unorderdered_info, key=itemgetter(4, 6, 8)) from pprint import pprint as pp pp(sorted_info) pp("{}".format("=" * 50)) sorted_info = sorted(unorderdered_info, key=lambda x: int(x[1])) pp(sorted_info)
def test_place_where_subvertices_have_vertices(self): self.bp = BasicPlacer(self.machine, self.graph) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(self.subvertices, self.vert1) placements = self.bp.place(self.subgraph, self.graph_mapper) for placement in placements.placements: print placement.subvertex.label, placement.subvertex.n_atoms, \ 'x:', placement.x, 'y:', placement.y, 'p:', placement.p
def test_place_subvertex_too_big_with_vertex(self): large_vertex = TestVertex(500, "Large vertex 500") large_subvertex = large_vertex.create_subvertex( 0, 499, get_resources_used_by_atoms(0, 499, []))#PartitionedVertex(0, 499, "Large subvertex") self.graph.add_vertex(large_vertex) self.graph = PartitionableGraph("Graph",[large_vertex]) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices([large_subvertex], large_vertex) self.bp = BasicPlacer(self.machine, self.graph) self.subgraph = PartitionedGraph(subvertices=[large_subvertex]) with self.assertRaises(PacmanPlaceException): placements = self.bp.place(self.subgraph, self.graph_mapper)
def test_get_subvertices_from_vertex(self): """ test getting the subvertex from a graph mappert via the vertex :return: """ subvertices = list() subvertices.append(PartitionedVertex(None, "")) subvertices.append(PartitionedVertex(None, "")) subvert1 = PartitionedVertex(None, "") subvert2 = PartitionedVertex(None, "") subedges = list() subedges.append(MultiCastPartitionedEdge(subvertices[0], subvertices[1])) subedges.append(MultiCastPartitionedEdge(subvertices[1], subvertices[1])) graph_mapper = GraphMapper() vert = TestVertex(4, "Some testing vertex") vertex_slice = Slice(0, 1) graph_mapper.add_subvertex(subvert1, vertex_slice, vert) vertex_slice = Slice(2, 3) graph_mapper.add_subvertex(subvert2, vertex_slice, vert) returned_subverts = graph_mapper.get_subvertices_from_vertex(vert) self.assertIn(subvert1, returned_subverts) self.assertIn(subvert2, returned_subverts) for sub in subvertices: self.assertNotIn(sub, returned_subverts)
def test_get_subedges_from_edge(self): """ test getting the subedges from a graph mapper from a edge :return: """ subvertices = list() subedges = list() subvertices.append(PartitionedVertex(None, "")) subvertices.append(PartitionedVertex(None, "")) subedges.append(MultiCastPartitionedEdge(subvertices[0], subvertices[1])) subedges.append(MultiCastPartitionedEdge(subvertices[1], subvertices[1])) sube = MultiCastPartitionedEdge(subvertices[1], subvertices[0]) subedges.append(sube) graph = GraphMapper() edge = TestPartitionableEdge(TestVertex(10, "pre"), TestVertex(5, "post")) graph.add_partitioned_edge(sube, edge) graph.add_partitioned_edge(subedges[0], edge) subedges_from_edge = \ graph.get_partitioned_edges_from_partitionable_edge(edge) self.assertIn(sube, subedges_from_edge) self.assertIn(subedges[0], subedges_from_edge) self.assertNotIn(subedges[1], subedges_from_edge)
def test_fill_machine(self): subvertices = list() for i in range(99 * 17): #50 atoms per each processor on 20 chips subvertices.append(PartitionedTestVertex( 0, 50, get_resources_used_by_atoms(0, 50, []), "PartitionedVertex " + str(i))) self.graph = PartitionableGraph("Graph",subvertices) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(subvertices) self.bp = BasicPlacer(self.machine, self.graph) self.subgraph = PartitionedGraph(subvertices=subvertices) placements = self.bp.place(self.subgraph, self.graph_mapper)
def test_too_many_subvertices(self): subvertices = list() for i in range(100 * 17): #50 atoms per each processor on 20 chips subvertices.append(PartitionedVertex( 0, 50, get_resources_used_by_atoms(0, 50, []), "Subvertex " + str(i))) self.graph = PartitionableGraph("Graph",subvertices) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(subvertices) self.bp = RadialPlacer(self.machine, self.graph) self.subgraph = PartitionedGraph(subvertices=subvertices) with self.assertRaises(PacmanPlaceException): placements = self.bp.place(self.subgraph, self.graph_mapper)
def test_many_subvertices(self): subvertices = list() for i in range(20 * 17): #50 atoms per each processor on 20 chips subvertices.append(PartitionedTestVertex( 0, 50, get_resources_used_by_atoms(0, 50, []), "PartitionedVertex " + str(i))) self.graph = PartitionableGraph("Graph",subvertices) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(subvertices) self.bp = BasicPlacer(self.machine, self.graph) self.subgraph = PartitionedGraph(subvertices=subvertices) placements = self.bp.place(self.subgraph, self.graph_mapper) for placement in placements.placements: print placement.subvertex.label, placement.subvertex.n_atoms, \ 'x:', placement.x, 'y:', placement.y, 'p:', placement.p
def __call__(self, subgraph, graph_mapper): """ :param subgraph: the subgraph whose edges are to be filtered :param graph_mapper: the graph mapper between partitionable and \ partitioned graphs. :return: a new graph mapper and partitioned graph """ new_sub_graph = PartitionedGraph(label=subgraph.label) new_graph_mapper = GraphMapper(graph_mapper.first_graph_label, subgraph.label) # create progress bar progress_bar = ProgressBar( len(subgraph.subvertices) + len(subgraph.subedges), "Filtering edges") # add the subverts directly, as they wont be pruned. for subvert in subgraph.subvertices: new_sub_graph.add_subvertex(subvert) associated_vertex = graph_mapper.get_vertex_from_subvertex(subvert) vertex_slice = graph_mapper.get_subvertex_slice(subvert) new_graph_mapper.add_subvertex(subvertex=subvert, vertex_slice=vertex_slice, vertex=associated_vertex) progress_bar.update() # start checking subedges to decide which ones need pruning.... for subvert in subgraph.subvertices: out_going_partitions = \ subgraph.outgoing_edges_partitions_from_vertex(subvert) for partitioner_identifier in out_going_partitions: for subedge in \ out_going_partitions[partitioner_identifier].edges: if not self._is_filterable(subedge, graph_mapper): logger.debug( "this subedge was not pruned {}".format(subedge)) new_sub_graph.add_subedge(subedge, partitioner_identifier) associated_edge = graph_mapper.\ get_partitionable_edge_from_partitioned_edge( subedge) new_graph_mapper.add_partitioned_edge( subedge, associated_edge) else: logger.debug( "this subedge was pruned {}".format(subedge)) progress_bar.update() progress_bar.end() # returned the pruned partitioned_graph and graph_mapper return { 'new_sub_graph': new_sub_graph, 'new_graph_mapper': new_graph_mapper }
def test_deal_with_constraint_placement_subvertices_have_vertices(self): self.bp = BasicPlacer(self.machine, self.graph) self.subvertex1.add_constraint(PlacerChipAndCoreConstraint(1, 5, 2)) self.assertIsInstance(self.subvertex1.constraints[0], PlacerChipAndCoreConstraint) self.subvertex2.add_constraint(PlacerChipAndCoreConstraint(3, 5, 7)) self.subvertex3.add_constraint(PlacerChipAndCoreConstraint(2, 4, 6)) self.subvertex4.add_constraint(PlacerChipAndCoreConstraint(6, 7, 16)) self.subvertices = list() self.subvertices.append(self.subvertex1) self.subvertices.append(self.subvertex2) self.subvertices.append(self.subvertex3) self.subvertices.append(self.subvertex4) self.subedges = list() self.subgraph = PartitionedGraph("Subgraph", self.subvertices, self.subedges) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(self.subvertices, self.vert1) placements = self.bp.place(self.subgraph, self.graph_mapper) for placement in placements.placements: print placement.subvertex.label, placement.subvertex.n_atoms, \ 'x:', placement.x, 'y:', placement.y, 'p:', placement.p
def test_get_edge_from_subedge(self): """ test that tests getting a edge from a graph mapper based off its subedge :return: """ subvertices = list() subvertices.append(PartitionedVertex(None, "")) subvertices.append(PartitionedVertex(None, "")) subedges = list() subedges.append(MultiCastPartitionedEdge(subvertices[0], subvertices[1])) subedges.append(MultiCastPartitionedEdge(subvertices[1], subvertices[1])) sube = MultiCastPartitionedEdge(subvertices[1], subvertices[0]) subedges.append(sube) # Create the graph mapper graph = GraphMapper() edge = TestPartitionableEdge(TestVertex(10, "pre"), TestVertex(5, "post")) graph.add_partitioned_edge(sube, edge) graph.add_partitioned_edge(subedges[0], edge) edge_from_subedge = \ graph.get_partitionable_edge_from_partitioned_edge(sube) self.assertEqual(edge_from_subedge, edge) self.assertEqual( graph.get_partitionable_edge_from_partitioned_edge(subedges[0]), edge ) self.assertRaises( PacmanNotFoundError, graph.get_partitionable_edge_from_partitioned_edge, subedges[1] )
def run(self, subgraph, graph_mapper): new_sub_graph = PartitionedGraph(label=subgraph.label) new_graph_mapper = GraphMapper(graph_mapper.first_graph_label, subgraph.label) # create progress bar progress_bar = \ ProgressBar(len(subgraph.subvertices) + len(subgraph.subedges), "on checking which subedges are filterable given " "heuristics") # add the subverts directly, as they wont be pruned. for subvert in subgraph.subvertices: new_sub_graph.add_subvertex(subvert) associated_vertex = graph_mapper.get_vertex_from_subvertex(subvert) vertex_slice = graph_mapper.get_subvertex_slice(subvert) new_graph_mapper.add_subvertex(subvertex=subvert, vertex_slice=vertex_slice, vertex=associated_vertex) progress_bar.update() # start checking subedges to decide which ones need pruning.... for subedge in subgraph.subedges: if not self._is_filterable(subedge, graph_mapper): logger.debug("this subedge was not pruned {}".format(subedge)) new_sub_graph.add_subedge(subedge) associated_edge = graph_mapper.\ get_partitionable_edge_from_partitioned_edge(subedge) new_graph_mapper.add_partitioned_edge(subedge, associated_edge) else: logger.debug("this subedge was pruned {}".format(subedge)) progress_bar.update() progress_bar.end() # returned the pruned partitioned_graph and graph_mapper return new_sub_graph, new_graph_mapper
def __call__(self, graph, machine): utility_calls.check_algorithm_can_support_constraints( constrained_vertices=graph.vertices, supported_constraints=[PartitionerMaximumSizeConstraint], abstract_constraint_type=AbstractPartitionerConstraint) # start progress bar progress_bar = ProgressBar(len(graph.vertices), "Partitioning graph vertices") vertices = graph.vertices subgraph = PartitionedGraph(label="partitioned_graph for partitionable" "_graph {}".format(graph.label)) graph_to_subgraph_mapper = GraphMapper(graph.label, subgraph.label) resource_tracker = ResourceTracker(machine) # Partition one vertex at a time for vertex in vertices: # Get the usage of the first atom, then assume that this # will be the usage of all the atoms requirements = vertex.get_resources_used_by_atoms(Slice(0, 1), graph) # Locate the maximum resources available max_resources_available = \ resource_tracker.get_maximum_constrained_resources_available( vertex.constraints) # Find the ratio of each of the resources - if 0 is required, # assume the ratio is the max available atoms_per_sdram = self._get_ratio( max_resources_available.sdram.get_value(), requirements.sdram.get_value()) atoms_per_dtcm = self._get_ratio( max_resources_available.dtcm.get_value(), requirements.dtcm.get_value()) atoms_per_cpu = self._get_ratio( max_resources_available.cpu.get_value(), requirements.cpu.get_value()) max_atom_values = [atoms_per_sdram, atoms_per_dtcm, atoms_per_cpu] max_atoms_constraints = utility_calls.locate_constraints_of_type( vertex.constraints, PartitionerMaximumSizeConstraint) for max_atom_constraint in max_atoms_constraints: max_atom_values.append(max_atom_constraint.size) atoms_per_core = min(max_atom_values) # Partition into subvertices counted = 0 while counted < vertex.n_atoms: # Determine subvertex size remaining = vertex.n_atoms - counted if remaining > atoms_per_core: alloc = atoms_per_core else: alloc = remaining # Create and store new subvertex, and increment elements # counted if counted < 0 or counted + alloc - 1 < 0: raise PacmanPartitionException("Not enough resources" " available to create" " subvertex") vertex_slice = Slice(counted, counted + (alloc - 1)) subvertex_usage = vertex.get_resources_used_by_atoms( vertex_slice, graph) subvert = vertex.create_subvertex( vertex_slice, subvertex_usage, "{}:{}:{}".format(vertex.label, counted, (counted + (alloc - 1))), partition_algorithm_utilities. get_remaining_constraints(vertex)) subgraph.add_subvertex(subvert) graph_to_subgraph_mapper.add_subvertex( subvert, vertex_slice, vertex) counted = counted + alloc # update allocated resources resource_tracker.allocate_constrained_resources( subvertex_usage, vertex.constraints) # update and end progress bars as needed progress_bar.update() progress_bar.end() partition_algorithm_utilities.generate_sub_edges( subgraph, graph_to_subgraph_mapper, graph) return {'Partitioned_graph': subgraph, 'Graph_mapper': graph_to_subgraph_mapper}
class TestBasicPlacer(unittest.TestCase): """ test for basic placement algorithum """ def setUp(self): ######################################################################## # Setting up vertices, edges and graph # ######################################################################## self.vert1 = TestVertex(100, "New AbstractConstrainedTestVertex 1") self.vert2 = TestVertex(5, "New AbstractConstrainedTestVertex 2") self.vert3 = TestVertex(3, "New AbstractConstrainedTestVertex 3") self.edge1 = MultiCastPartitionableEdge(self.vert1, self.vert2, "First edge") self.edge2 = MultiCastPartitionableEdge(self.vert2, self.vert1, "Second edge") self.edge3 = MultiCastPartitionableEdge(self.vert1, self.vert3, "Third edge") self.verts = [self.vert1, self.vert2, self.vert3] self.edges = [self.edge1, self.edge2, self.edge3] self.graph = PartitionableGraph("Graph", self.verts, self.edges) ######################################################################## # Setting up machine # ######################################################################## flops = 1000 (e, ne, n, w, sw, s) = range(6) processors = list() for i in range(18): processors.append(Processor(i, flops)) _sdram = SDRAM(128 * (2**20)) ip = "192.168.240.253" chips = list() for x in range(10): for y in range(10): links = list() links.append(Link(x, y, 0, (x + 1) % 10, y, n, n)) links.append(Link(x, y, 1, (x + 1) % 10, (y + 1) % 10, s, s)) links.append(Link(x, y, 2, x, (y + 1) % 10, n, n)) links.append(Link(x, y, 3, (x - 1) % 10, y, s, s)) links.append(Link(x, y, 4, (x - 1) % 10, (y - 1) % 10, n, n)) links.append(Link(x, y, 5, x, (y - 1) % 10, s, s)) r = Router(links, False, 100, 1024) chips.append(Chip(x, y, processors, r, _sdram, 0, 0, ip)) self.machine = Machine(chips) ######################################################################## # Setting up subgraph and graph_mapper # ######################################################################## self.subvertices = list() self.subvertex1 = PartitionedVertex( 0, 1, self.vert1.get_resources_used_by_atoms(0, 1, []), "First subvertex") self.subvertex2 = PartitionedVertex( 1, 5, get_resources_used_by_atoms(1, 5, []), "Second subvertex") self.subvertex3 = PartitionedVertex( 5, 10, get_resources_used_by_atoms(5, 10, []), "Third subvertex") self.subvertex4 = PartitionedVertex( 10, 100, get_resources_used_by_atoms(10, 100, []), "Fourth subvertex") self.subvertices.append(self.subvertex1) self.subvertices.append(self.subvertex2) self.subvertices.append(self.subvertex3) self.subvertices.append(self.subvertex4) self.subedges = list() self.subgraph = PartitionedGraph("Subgraph", self.subvertices, self.subedges) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(self.subvertices) @unittest.skip("demonstrating skipping") def test_new_basic_placer(self): self.bp = BasicPlacer(self.machine, self.graph) self.assertEqual(self.bp._machine, self.machine) self.assertEqual(self.bp._graph, self.graph) @unittest.skip("demonstrating skipping") def test_place_where_subvertices_dont_have_vertex(self): self.bp = BasicPlacer(self.machine, self.graph) placements = self.bp.place(self.subgraph, self.graph_mapper) for placement in placements.placements: print placement.subvertex.label, placement.subvertex.n_atoms, \ 'x:', placement.x, 'y:', placement.y, 'p:', placement.p @unittest.skip("demonstrating skipping") def test_place_where_subvertices_have_vertices(self): self.bp = BasicPlacer(self.machine, self.graph) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(self.subvertices, self.vert1) placements = self.bp.place(self.subgraph, self.graph_mapper) for placement in placements.placements: print placement.subvertex.label, placement.subvertex.n_atoms, \ 'x:', placement.x, 'y:', placement.y, 'p:', placement.p @unittest.skip("demonstrating skipping") def test_place_subvertex_too_big_with_vertex(self): large_vertex = TestVertex(500, "Large vertex 500") large_subvertex = large_vertex.create_subvertex( 0, 499, get_resources_used_by_atoms(0, 499, []))#PartitionedVertex(0, 499, "Large subvertex") self.graph.add_vertex(large_vertex) self.graph = PartitionableGraph("Graph",[large_vertex]) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices([large_subvertex], large_vertex) self.bp = BasicPlacer(self.machine, self.graph) self.subgraph = PartitionedGraph(subvertices=[large_subvertex]) with self.assertRaises(PacmanPlaceException): placements = self.bp.place(self.subgraph, self.graph_mapper) @unittest.skip("demonstrating skipping") def test_try_to_place(self): self.assertEqual(True, False, "Test not implemented yet") @unittest.skip("demonstrating skipping") def test_deal_with_constraint_placement_subvertices_dont_have_vertex(self): self.bp = BasicPlacer(self.machine, self.graph) self.subvertex1.add_constraint(PlacerChipAndCoreConstraint(8, 3, 2)) self.assertIsInstance(self.subvertex1.constraints[0], PlacerChipAndCoreConstraint) self.subvertex2.add_constraint(PlacerChipAndCoreConstraint(3, 5, 7)) self.subvertex3.add_constraint(PlacerChipAndCoreConstraint(2, 4, 6)) self.subvertex4.add_constraint(PlacerChipAndCoreConstraint(6, 4, 16)) self.subvertices = list() self.subvertices.append(self.subvertex1) self.subvertices.append(self.subvertex2) self.subvertices.append(self.subvertex3) self.subvertices.append(self.subvertex4) self.subedges = list() self.subgraph = PartitionedGraph("Subgraph", self.subvertices, self.subedges) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(self.subvertices) placements = self.bp.place(self.subgraph, self.graph_mapper) for placement in placements.placements: print placement.subvertex.label, placement.subvertex.n_atoms, \ 'x:', placement.x, 'y:', placement.y, 'p:', placement.p @unittest.skip("demonstrating skipping") def test_deal_with_constraint_placement_subvertices_have_vertices(self): self.bp = BasicPlacer(self.machine, self.graph) self.subvertex1.add_constraint(PlacerChipAndCoreConstraint(1, 5, 2)) self.assertIsInstance(self.subvertex1.constraints[0], PlacerChipAndCoreConstraint) self.subvertex2.add_constraint(PlacerChipAndCoreConstraint(3, 5, 7)) self.subvertex3.add_constraint(PlacerChipAndCoreConstraint(2, 4, 6)) self.subvertex4.add_constraint(PlacerChipAndCoreConstraint(6, 7, 16)) self.subvertices = list() self.subvertices.append(self.subvertex1) self.subvertices.append(self.subvertex2) self.subvertices.append(self.subvertex3) self.subvertices.append(self.subvertex4) self.subedges = list() self.subgraph = PartitionedGraph("Subgraph", self.subvertices, self.subedges) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(self.subvertices, self.vert1) placements = self.bp.place(self.subgraph, self.graph_mapper) for placement in placements.placements: print placement.subvertex.label, placement.subvertex.n_atoms, \ 'x:', placement.x, 'y:', placement.y, 'p:', placement.p @unittest.skip("demonstrating skipping") def test_unsupported_non_placer_constraint(self): self.assertEqual(True, False, "Test not implemented yet") @unittest.skip("demonstrating skipping") def test_unsupported_placer_constraint(self): self.assertEqual(True, False, "Test not implemented yet") @unittest.skip("demonstrating skipping") def test_unsupported_placer_constraints(self): self.assertEqual(True, False, "Test not implemented yet") @unittest.skip("demonstrating skipping") def test_many_subvertices(self): subvertices = list() for i in range(20 * 17): #50 atoms per each processor on 20 chips subvertices.append(PartitionedTestVertex( 0, 50, get_resources_used_by_atoms(0, 50, []), "PartitionedVertex " + str(i))) self.graph = PartitionableGraph("Graph",subvertices) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(subvertices) self.bp = BasicPlacer(self.machine, self.graph) self.subgraph = PartitionedGraph(subvertices=subvertices) placements = self.bp.place(self.subgraph, self.graph_mapper) for placement in placements.placements: print placement.subvertex.label, placement.subvertex.n_atoms, \ 'x:', placement.x, 'y:', placement.y, 'p:', placement.p @unittest.skip("demonstrating skipping") def test_too_many_subvertices(self): subvertices = list() for i in range(100 * 17): #50 atoms per each processor on 20 chips subvertices.append(PartitionedTestVertex( 0, 50, get_resources_used_by_atoms(0, 50, []), "PartitionedVertex " + str(i))) self.graph = PartitionableGraph("Graph",subvertices) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(subvertices) self.bp = BasicPlacer(self.machine, self.graph) self.subgraph = PartitionedGraph(subvertices=subvertices) with self.assertRaises(PacmanPlaceException): placements = self.bp.place(self.subgraph, self.graph_mapper) @unittest.skip("demonstrating skipping") def test_fill_machine(self): subvertices = list() for i in range(99 * 17): #50 atoms per each processor on 20 chips subvertices.append(PartitionedTestVertex( 0, 50, get_resources_used_by_atoms(0, 50, []), "PartitionedVertex " + str(i))) self.graph = PartitionableGraph("Graph",subvertices) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(subvertices) self.bp = BasicPlacer(self.machine, self.graph) self.subgraph = PartitionedGraph(subvertices=subvertices) placements = self.bp.place(self.subgraph, self.graph_mapper)
def __call__(self, graph, machine): """ Partition a partitionable_graph so that each subvertex will fit\ on a processor within the machine :param graph: The partitionable_graph to partition :type graph:\ :py:class:`pacman.model.graph.partitionable_graph.PartitionableGraph` :param machine: The machine with respect to which to partition the\ partitionable_graph :type machine: :py:class:`spinn_machine.machine.Machine` :return: A partitioned_graph of partitioned vertices and partitioned\ edges :rtype:\ :py:class:`pacman.model.partitioned_graph.partitioned_graph.PartitionedGraph` :raise pacman.exceptions.PacmanPartitionException: If something\ goes wrong with the partitioning """ utility_calls.check_algorithm_can_support_constraints( constrained_vertices=graph.vertices, abstract_constraint_type=AbstractPartitionerConstraint, supported_constraints=[PartitionerMaximumSizeConstraint, PartitionerSameSizeAsVertexConstraint]) # Load the vertices and create the subgraph to fill vertices = graph.vertices subgraph = PartitionedGraph( label="partitioned graph for {}".format(graph.label)) graph_mapper = GraphMapper(graph.label, subgraph.label) # sort out vertex's by constraints vertices = utility_calls.sort_objects_by_constraint_authority(vertices) # Set up the progress n_atoms = 0 for vertex in vertices: n_atoms += vertex.n_atoms progress_bar = ProgressBar(n_atoms, "Partitioning graph vertices") resource_tracker = ResourceTracker(machine) # Partition one vertex at a time for vertex in vertices: # check that the vertex hasn't already been partitioned subverts_from_vertex = \ graph_mapper.get_subvertices_from_vertex(vertex) # if not, partition if subverts_from_vertex is None: self._partition_vertex(vertex, subgraph, graph_mapper, resource_tracker, graph) progress_bar.update(vertex.n_atoms) progress_bar.end() partition_algorithm_utilities.generate_sub_edges( subgraph, graph_mapper, graph) results = dict() results['partitioned_graph'] = subgraph results['graph_mapper'] = graph_mapper return results
def setUp(self): ######################################################################## # Setting up vertices, edges and graph # ######################################################################## self.vert1 = TestVertex(100, "New AbstractConstrainedTestVertex 1") self.vert2 = TestVertex(5, "New AbstractConstrainedTestVertex 2") self.vert3 = TestVertex(3, "New AbstractConstrainedTestVertex 3") self.edge1 = MultiCastPartitionableEdge(self.vert1, self.vert2, "First edge") self.edge2 = MultiCastPartitionableEdge(self.vert2, self.vert1, "Second edge") self.edge3 = MultiCastPartitionableEdge(self.vert1, self.vert3, "Third edge") self.verts = [self.vert1, self.vert2, self.vert3] self.edges = [self.edge1, self.edge2, self.edge3] self.graph = PartitionableGraph("Graph", self.verts, self.edges) ######################################################################## # Setting up machine # ######################################################################## flops = 1000 (e, ne, n, w, sw, s) = range(6) processors = list() for i in range(18): processors.append(Processor(i, flops)) _sdram = SDRAM(128 * (2**20)) ip = "192.168.240.253" chips = list() for x in range(10): for y in range(10): links = list() links.append(Link(x, y, 0, (x + 1) % 10, y, n, n)) links.append(Link(x, y, 1, (x + 1) % 10, (y + 1) % 10, s, s)) links.append(Link(x, y, 2, x, (y + 1) % 10, n, n)) links.append(Link(x, y, 3, (x - 1) % 10, y, s, s)) links.append(Link(x, y, 4, (x - 1) % 10, (y - 1) % 10, n, n)) links.append(Link(x, y, 5, x, (y - 1) % 10, s, s)) r = Router(links, False, 100, 1024) chips.append(Chip(x, y, processors, r, _sdram, 0, 0, ip)) self.machine = Machine(chips) ######################################################################## # Setting up subgraph and graph_mapper # ######################################################################## self.subvertices = list() self.subvertex1 = PartitionedVertex( 0, 1, self.vert1.get_resources_used_by_atoms(0, 1, []), "First subvertex") self.subvertex2 = PartitionedVertex( 1, 5, get_resources_used_by_atoms(1, 5, []), "Second subvertex") self.subvertex3 = PartitionedVertex( 5, 10, get_resources_used_by_atoms(5, 10, []), "Third subvertex") self.subvertex4 = PartitionedVertex( 10, 100, get_resources_used_by_atoms(10, 100, []), "Fourth subvertex") self.subvertices.append(self.subvertex1) self.subvertices.append(self.subvertex2) self.subvertices.append(self.subvertex3) self.subvertices.append(self.subvertex4) self.subedges = list() self.subgraph = PartitionedGraph("Subgraph", self.subvertices, self.subedges) self.graph_mapper = GraphMapper() self.graph_mapper.add_subvertices(self.subvertices)
def __call__(self, graph, machine): """ Partition a partitionable_graph so that each subvertex will fit\ on a processor within the machine :param graph: The partitionable_graph to partition :type graph:\ :py:class:`pacman.model.graph.partitionable_graph.PartitionableGraph` :param machine: The machine with respect to which to partition the\ partitionable_graph :type machine: :py:class:`spinn_machine.machine.Machine` :return: A partitioned_graph of partitioned vertices and partitioned\ edges :rtype:\ :py:class:`pacman.model.partitioned_graph.partitioned_graph.PartitionedGraph` :raise pacman.exceptions.PacmanPartitionException: If something\ goes wrong with the partitioning """ utility_calls.check_algorithm_can_support_constraints( constrained_vertices=graph.vertices, abstract_constraint_type=AbstractPartitionerConstraint, supported_constraints=[PartitionerMaximumSizeConstraint, PartitionerSameSizeAsVertexConstraint]) # Load the vertices and create the subgraph to fill vertices = graph.vertices subgraph = PartitionedGraph( label="partitioned graph for {}".format(graph.label)) graph_mapper = GraphMapper(graph.label, subgraph.label) # sort out vertex's by constraints vertices = utility_calls.sort_objects_by_constraint_authority(vertices) # Set up the progress n_atoms = 0 for vertex in vertices: n_atoms += vertex.n_atoms progress_bar = ProgressBar(n_atoms, "Partitioning graph vertices") resource_tracker = ResourceTracker(machine) # Partition one vertex at a time for vertex in vertices: # check that the vertex hasn't already been partitioned subverts_from_vertex = \ graph_mapper.get_subvertices_from_vertex(vertex) # if not, partition if subverts_from_vertex is None: self._partition_vertex( vertex, subgraph, graph_mapper, resource_tracker, graph) progress_bar.update(vertex.n_atoms) progress_bar.end() partition_algorithm_utilities.generate_sub_edges( subgraph, graph_mapper, graph) results = dict() results['partitioned_graph'] = subgraph results['graph_mapper'] = graph_mapper results['nChips'] = len(resource_tracker.keys) return results