def _do_allocation(self, ordered_subverts, placements, machine): # Iterate over subvertices and generate placements progress_bar = ProgressBar(len(ordered_subverts), "Placing graph vertices") resource_tracker = ResourceTracker( machine, self._generate_radial_chips(machine)) # iterate over subverts for subvertex_list in ordered_subverts: # if too many one to ones to fit on a chip, allocate individually if len(subvertex_list) > self.MAX_CORES_PER_CHIP_TO_CONSIDER: for subvertex in subvertex_list: self._allocate_individual(subvertex, placements, progress_bar, resource_tracker) else: # can allocate in one block # merge constraints placement_constraint, ip_tag_constraints, \ reverse_ip_tag_constraints = \ self._merge_constraints(subvertex_list) # locate most cores on a chip max_size_on_a_chip = resource_tracker.\ max_available_cores_on_chips_that_satisfy( placement_constraint, ip_tag_constraints, reverse_ip_tag_constraints) # if size fits block allocate, otherwise allocate individually if max_size_on_a_chip < len(subvertex_list): # collect resource requirement resources = list() for subvert in subvertex_list: resources.append(subvert.resources_required) # get cores cores = resource_tracker.allocate_group( resources, placement_constraint, ip_tag_constraints, reverse_ip_tag_constraints) # allocate cores to subverts for subvert, (x, y, p, _, _) in zip(subvertex_list, cores): placement = Placement(subvert, x, y, p) placements.add_placement(placement) progress_bar.update() else: for subvertex in subvertex_list: self._allocate_individual(subvertex, placements, progress_bar, resource_tracker) progress_bar.end()