diff --git a/python/datastruct.py b/python/datastruct.py index 330d2fe..0b970a0 100644 --- a/python/datastruct.py +++ b/python/datastruct.py @@ -115,6 +115,7 @@ class UnionFindQueue(Generic[_NameT, _ElemT]): if node is not None: node.owner = None while node is not None: + node.min_node = None # type: ignore prev_node = node if node.left is not None: node = node.left diff --git a/python/mwmatching.py b/python/mwmatching.py index d49b95f..9c58709 100644 --- a/python/mwmatching.py +++ b/python/mwmatching.py @@ -610,7 +610,7 @@ class _MatchingContext: # For each T-vertex or unlabeled vertex "x", # "vertex_sedge_queue[x]" is a queue of edges between "x" and any # S-vertex. The priority of an edge is 2 times its pseudo-slack. - self.vertex_sedge_queue: list[PriorityQueue] + self.vertex_sedge_queue: list[PriorityQueue[int]] self.vertex_sedge_queue = [PriorityQueue() for _x in range(num_vertex)] self.vertex_sedge_node: list[Optional[PriorityQueue.Node]] self.vertex_sedge_node = [None for _e in graph.edges] @@ -623,9 +623,9 @@ class _MatchingContext: for blossom in itertools.chain(self.trivial_blossom, self.nontrivial_blossom): + blossom.parent = None blossom.vertex_set.clear() del blossom.vertex_set - blossom.tree_blossoms = None # # Least-slack edge tracking: @@ -1316,6 +1316,9 @@ class _MatchingContext: self.delta2_enable_blossom(sub) + # Avoid leaking a reference cycle. + del blossom.vertex_set + # Delete the expanded blossom. self.nontrivial_blossom.remove(blossom) @@ -1827,7 +1830,7 @@ class _MatchingContext: # This loop runs through at most O(n) iterations per stage. while True: - self._check_alternating_tree_consistency() # TODO -- remove this + # self._check_alternating_tree_consistency() # TODO -- remove this # Consider the incident edges of newly labeled S-vertices. self.scan_new_s_vertices()