(self, assembly, lookup, assembled, safe_edge, nan_policy)
| 488 | return links |
| 489 | |
| 490 | def _fill_assembly(self, assembly, lookup, assembled, safe_edge, nan_policy): |
| 491 | stack = [] |
| 492 | visited = set() |
| 493 | tabu = [] |
| 494 | counter = itertools.count() |
| 495 | |
| 496 | def push_to_stack(i): |
| 497 | for j, link in lookup[i].items(): |
| 498 | if j in assembly._idx: |
| 499 | continue |
| 500 | if link.idx in visited: |
| 501 | continue |
| 502 | heapq.heappush(stack, (-link.affinity, next(counter), link)) |
| 503 | visited.add(link.idx) |
| 504 | |
| 505 | for idx in assembly._idx: |
| 506 | push_to_stack(idx) |
| 507 | |
| 508 | while stack and len(assembly) < self.n_multibodyparts: |
| 509 | _, _, best = heapq.heappop(stack) |
| 510 | i, j = best.idx |
| 511 | if i in assembly._idx: |
| 512 | new_ind = j |
| 513 | elif j in assembly._idx: |
| 514 | new_ind = i |
| 515 | else: |
| 516 | continue |
| 517 | if new_ind in assembled: |
| 518 | continue |
| 519 | if safe_edge: |
| 520 | d_old = self.calc_assembly_mahalanobis_dist(assembly, nan_policy=nan_policy) |
| 521 | success = assembly.add_link(best, store_dict=True) |
| 522 | if not success: |
| 523 | assembly._dict = dict() |
| 524 | continue |
| 525 | d = self.calc_assembly_mahalanobis_dist(assembly, nan_policy=nan_policy) |
| 526 | if d < d_old: |
| 527 | push_to_stack(new_ind) |
| 528 | try: |
| 529 | _, _, link = heapq.heappop(tabu) |
| 530 | heapq.heappush(stack, (-link.affinity, next(counter), link)) |
| 531 | except IndexError: |
| 532 | pass |
| 533 | else: |
| 534 | heapq.heappush(tabu, (d - d_old, next(counter), best)) |
| 535 | assembly.__dict__.update(assembly._dict) |
| 536 | assembly._dict = dict() |
| 537 | else: |
| 538 | assembly.add_link(best) |
| 539 | push_to_stack(new_ind) |
| 540 | |
| 541 | def build_assemblies(self, links): |
| 542 | lookup = defaultdict(dict) |
no test coverage detected