From 1291b9b1982b6dbca0b0d1a1288d586d029f4851 Mon Sep 17 00:00:00 2001 From: Damian Date: Fri, 29 Oct 2021 11:43:27 -0400 Subject: [PATCH] Pre-compute backtrack causes --- src/resolvelib/resolvers.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/resolvelib/resolvers.py b/src/resolvelib/resolvers.py index 787681b..fbfb4a1 100644 --- a/src/resolvelib/resolvers.py +++ b/src/resolvelib/resolvers.py @@ -130,7 +130,7 @@ def _push_new_state(self): state = State( mapping=base.mapping.copy(), criteria=base.criteria.copy(), - backtrack_causes=base.backtrack_causes[:], + backtrack_causes=base.backtrack_causes.copy(), ) self._states.append(state) @@ -340,7 +340,7 @@ def resolve(self, requirements, max_rounds): State( mapping=collections.OrderedDict(), criteria={}, - backtrack_causes=[], + backtrack_causes=set(), ) ] for r in requirements: @@ -378,11 +378,15 @@ def resolve(self, requirements, max_rounds): # an unpinned state, so we can work on it in the next round. self._r.resolving_conflicts(causes=causes) success = self._backtrack() - self.state.backtrack_causes[:] = causes # Dead ends everywhere. Give up. if not success: - raise ResolutionImpossible(self.state.backtrack_causes) + raise ResolutionImpossible(causes) + + # Update backtrack causes + backtrack_causes = self._causes_to_names(causes) + self.state.backtrack_causes.clear() + self.state.backtrack_causes.update(backtrack_causes) else: # Pinning was successful. Push a new state to do another pin. self._push_new_state() @@ -391,6 +395,12 @@ def resolve(self, requirements, max_rounds): raise ResolutionTooDeep(max_rounds) + @staticmethod + def _causes_to_names(causes): + return {c.requirement.name for c in causes} | { + c.parent.name for c in causes if c.parent + } + def _has_route_to_root(criteria, key, all_keys, connected): if key in connected: