Skip to content

Commit 65fc7d6

Browse files
chriskuehlradoering
authored andcommitted
perf: don't clear the entire contradicted_incompatibilies cache when backtracking (#7950)
(cherry picked from commit fba1309)
1 parent 90ad5ac commit 65fc7d6

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

src/poetry/mixology/version_solver.py

+19-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import collections
34
import functools
45
import time
56

@@ -94,7 +95,9 @@ def __init__(self, root: ProjectPackage, provider: Provider) -> None:
9495
self._provider = provider
9596
self._dependency_cache = DependencyCache(provider)
9697
self._incompatibilities: dict[str, list[Incompatibility]] = {}
97-
self._contradicted_incompatibilities: set[Incompatibility] = set()
98+
self._contradicted_incompatibilities: dict[int, set[Incompatibility]] = (
99+
collections.defaultdict(set)
100+
)
98101
self._solution = PartialSolution()
99102

100103
@property
@@ -143,7 +146,10 @@ def _propagate(self, package: str) -> None:
143146
# we can derive stronger assignments sooner and more eagerly find
144147
# conflicts.
145148
for incompatibility in reversed(self._incompatibilities[package]):
146-
if incompatibility in self._contradicted_incompatibilities:
149+
if any(
150+
incompatibility in c
151+
for c in self._contradicted_incompatibilities.values()
152+
):
147153
continue
148154

149155
result = self._propagate_incompatibility(incompatibility)
@@ -192,7 +198,9 @@ def _propagate_incompatibility(
192198
# If term is already contradicted by _solution, then
193199
# incompatibility is contradicted as well and there's nothing new we
194200
# can deduce from it.
195-
self._contradicted_incompatibilities.add(incompatibility)
201+
self._contradicted_incompatibilities[self._solution.decision_level].add(
202+
incompatibility
203+
)
196204
return None
197205
elif relation == SetRelation.OVERLAPPING:
198206
# If more than one term is inconclusive, we can't deduce anything about
@@ -210,7 +218,9 @@ def _propagate_incompatibility(
210218
if unsatisfied is None:
211219
return _conflict
212220

213-
self._contradicted_incompatibilities.add(incompatibility)
221+
self._contradicted_incompatibilities[self._solution.decision_level].add(
222+
incompatibility
223+
)
214224

215225
adverb = "not " if unsatisfied.is_positive() else ""
216226
self._log(f"derived: {adverb}{unsatisfied.dependency}")
@@ -304,8 +314,12 @@ def _resolve_conflict(self, incompatibility: Incompatibility) -> Incompatibility
304314
previous_satisfier_level < most_recent_satisfier.decision_level
305315
or most_recent_satisfier.cause is None
306316
):
317+
for level in range(
318+
self._solution.decision_level, previous_satisfier_level, -1
319+
):
320+
self._contradicted_incompatibilities.pop(level, None)
321+
307322
self._solution.backtrack(previous_satisfier_level)
308-
self._contradicted_incompatibilities.clear()
309323
self._dependency_cache.clear()
310324
if new_incompatibility:
311325
self._add_incompatibility(incompatibility)

0 commit comments

Comments
 (0)