-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Description
What's the problem this feature will solve?
When backtracking Pip attempts to optimize picking which package to backtrack on by first choosing packages which are the "cause" of backtracking, i.e. they have requirements which generate conflicts with other package's requirements.
However the problem is that resolvelib doesn't actually have a very granular understanding of "causes", if two packages conflict on their numpy
requirement, then all packages which require numpy, even if they have a very libreral requirement, will be considered a "cause".
This can create an an exponetial choice in package backtracking choice, and a ResolutionTooDeep error, e.g. #12305
Describe the solution you'd like
The "Requirement" API that resolvelib provides does not appear to be enough to apply any filtering logic on resolvelib side.
However Pip understands it's own requirement objects and there could implement a "narrow_causes" "filter unsatisfied names" method from the Pip resolve provider that resolvelib can call, and Pip can choose to closest causes that conflict.
Alternative Solutions
Maybe I am misunderstanding the resolvelib/Pip architecture and there is a much simpler way to implement this. Please provide feedback if you think
Additional context
I have created this branch as a rough test for this approach, there are probably more places in resolvelib to apply this method to speed things or give better quality messages:
https://github.com/notatallshaw/pip/tree/narrow-causeshttps://github.com/pypa/pip/compare/main...notatallshaw:pip:narrow-causes?diff=unified- Prefer closest conflicting causes when backtracking #12459
On Python 3.8 this command produces a ResolutionTooDeep error on Pip/main but solves quickly on my branch:
python -m pip install --disable-pip-version-check --dry-run --only-binary ":all:" "numpy==1.21.6" "cython==0.29.28" "scipy>=1.4.0" "torch>=1.7" "torchaudio" "soundfile" "librosa==0.10.0.*" "numba==0.55.1" "inflect==5.6.0" "tqdm" "anyascii" "pyyaml" "fsspec>=2021.04.0" "aiohttp" "packaging" "flask" "pysbd" "pandas" "matplotlib" "trainer==0.0.20" "coqpit>=0.0.16" "pypinyin" "mecab-python3==1.0.5" "jamo" "bangla==0.0.2" "k_diffusion" "einops" "transformers"
As this requires an addition to the resolvelib API I am looking for buy in for this approach from Pip maintainers before I start creating PRs across both projects.
Code of Conduct
- I agree to follow the PSF Code of Conduct.