def _allocate_one_to_one_group(
            resource_tracker, vertices, progress, placements, chips,
            all_vertices_placed, machine_graph):
        """
        :param ResourceTracker resource_tracker:
        :param list(MachineVertex) vertices:
        :param ~spinn_utilities.progress_bar.ProgressBar progress:
        :param Placements placements:
        :param chips:
        :type chips: iterable(tuple(int, int)) or None
        :param MachineGraph machine_graph: machine graph
        :param set(MachineVertex) all_vertices_placed:
        :rtype: bool
        """
        try:
            allocs = resource_tracker.allocate_constrained_group_resources(
                create_requirement_collections(vertices, machine_graph),
                chips)

            # allocate cores to vertices
            for vertex, (x, y, p, _, _) in progress.over(
                    zip(vertices, allocs), False):
                placements.add_placement(Placement(vertex, x, y, p))
                all_vertices_placed.add(vertex)
            return True
        except (PacmanValueError, PacmanException,
                PacmanInvalidParameterException):
            return False
Example #2
0
    def _place_same_chip_verts(self, same_chip_vertex_groups, chips_in_order,
                               placements, progress_bar, resource_tracker,
                               placed_vertices, cost_per_chip, machine_graph,
                               n_keys_map):
        """ places verts which have to be on the same chip on minimum chip.

        :param same_chip_vertex_groups:
            groups of verts which want to be on the same chip.
        :type same_chip_vertex_groups: dict(MachineVertex, set(MachineVertex))
        :param chips_in_order: chips in radial order from mid machine
        :type chips_in_order: iterable(tuple(int,int))
        :param Placements placements: placements holder
        :param ~spinn_utilities.progress_bar.ProgressBar progress_bar:
            progress bar
        :param ResourceTracker resource_tracker: resource tracker
        :param set(MachineVertex) placed_vertices:
            vertices which have already been placed
        :param cost_per_chip: map between (x,y) and the cost of packets
        :type cost_per_chip: dict(tuple(int, int), int)
        :param MachineGraph machine_graph:
        :param AbstractMachinePartitionNKeysMap n_keys_map:
        :rtype: None
        """
        for vertex in same_chip_vertex_groups.keys():
            if len(same_chip_vertex_groups[vertex]) != 1:
                if vertex not in placed_vertices:
                    to_do_as_group = list()
                    for other_vert in same_chip_vertex_groups[vertex]:
                        if other_vert not in placed_vertices:
                            to_do_as_group.extend(
                                create_requirement_collections([other_vert],
                                                               machine_graph))

                    # allocate as a group to sorted chips so that ones with
                    # least incoming packets are considered first
                    results = \
                        resource_tracker.allocate_constrained_group_resources(
                            to_do_as_group, chips=chips_in_order)

                    # create placements and add cost to the chip
                    for (x, y, p, _, _), placed_vertex in zip(
                            results, same_chip_vertex_groups[vertex]):
                        placements.add_placement(
                            Placement(placed_vertex, x, y, p))
                        placed_vertices.add(placed_vertex)
                        cost_per_chip[x, y] += self._get_cost(
                            placed_vertex, machine_graph, n_keys_map)

                # resort the chips, as no idea where in the list the resource
                # tracker selected
                chips_in_order = self._sort_chips_based_off_incoming_cost(
                    chips_in_order, cost_per_chip)

        # update progress bar to cover one cycle of all the verts in the graph
        progress_bar.update(len(machine_graph.vertices))
Example #3
0
    def _place_vertex(self, vertex, resource_tracker, machine, placements,
                      vertices_on_same_chip, machine_graph):
        """
        :param MachineVertex vertex:
        :param ResourceTracker resource_tracker:
        :param ~spinn_machine.Machine machine:
        :param Placements placements:
        :param vertices_on_same_chip:
        :type vertices_on_same_chip: dict(MachineVertex, set(MachineVertex))
        :param MachineGraph machine_graph:
        :rtype: set(MachineVertex)
        """
        vertices = vertices_on_same_chip[vertex]

        # Check for the radial placement constraint
        radial_constraints = [
            c for v in vertices for c in v.constraints
            if isinstance(c, RadialPlacementFromChipConstraint)
        ]
        start_x, start_y = self._get_start(radial_constraints)
        chips = None
        if start_x is not None and start_y is not None:
            chips = self._generate_radial_chips(machine, resource_tracker,
                                                start_x, start_y)

        if len(vertices) > 1:
            assigned_values = \
                resource_tracker.allocate_constrained_group_resources(
                    create_requirement_collections(vertices, machine_graph),
                    chips=chips)
            for (x, y, p, _, _), vert in zip(assigned_values, vertices):
                placement = Placement(vert, x, y, p)
                placements.add_placement(placement)
        else:
            (x, y, p, _, _) = resource_tracker.allocate_constrained_resources(
                vertex.resources_required, vertex.constraints, chips=chips)
            placement = Placement(vertex, x, y, p)
            placements.add_placement(placement)

        return vertices
    def _allocate_same_chip_as_group(
            vertex, placements, tracker, same_chip_vertex_groups,
            all_vertices_placed, progress, machine_graph):
        """
        :param MachineVertex vertex:
        :param Placements placements:
        :param ResourceTracker tracker:
        :param dict(MachineVertex,set(MachineVertex)) same_chip_vertex_groups:
        :param ~spinn_utilities.progress_bar.ProgressBar progress:
        :param MachineGraph machine_graph:
        """
        if vertex not in all_vertices_placed:
            # get vert's
            vertices = same_chip_vertex_groups[vertex]

            resources = tracker.allocate_constrained_group_resources(
                create_requirement_collections(vertices, machine_graph))

            for (x, y, p, _, _), v in progress.over(
                    zip(resources, vertices), False):
                placements.add_placement(Placement(v, x, y, p))
                all_vertices_placed.add(v)