colomemaria / epiScanpy

Episcanpy: Epigenomics Single Cell Analysis in Python
BSD 3-Clause "New" or "Revised" License
139 stars 33 forks source link

Potential dependency conflicts between episcanpy and scipy #61

Closed NeolithEra closed 4 years ago

NeolithEra commented 4 years ago

Hi, as shown in the following full dependency graph of episcanpy, episcanpy requires scipy <=1.3, episcanpy requires *_seaborn _ (seaborn 0.10.0 will be installed, i.e., the newest version satisfying the version constraint), and directed dependency seaborn 0.10.0 transitively introduces scipy >=1.0.1. Obviously, there are multiple version constraints set for scipy in this project. However, according to pip's “first found wins” installation strategy, scipy 1.3 (i.e., the newest version satisfying constraint <=1.3) is the actually installed version. Although the first found package version scipy 1.3 just satisfies the later dependency constraint (scipy >=1.0.1), such installed version is very close to the upper bound of the version constraint of Scipy specified by seaborn 0.10.0** .

Once seaborn upgrades,its newest version will be installed, as episcanpy does not specify the upper bound of version constraint for seaborn. Therefore, it will easily cause a dependency conflict (build failure), if the upgraded seaborn version introduces a higher version of Scipy, violating its another version constraint <=1.3. According to the release history of seaborn, it habitually upgrates Scipy in its recent releases. For instance, seaborn 0.9.0 upgrated Scipy’s constraint from *_ to >=0.14.0_, seaborn 0.9.1.rc0 upgrated Scipy’s constraint from >=0.14.0 to >=0.17.1, and seaborn 0.10.0rc0 upgrated Scipy’s constraint from >=0.17.1 to >=1.0.1**. As such, it is a warm warning of a potential dependency conflict issue for episcanpy.

Dependency tree

episcanpy - 0.1.10
| +- anndata(install version:0.6.22rc1 version range:==0.6.22rc1)
| | +- h5py(install version:2.10.0 version range:*)
| | +- natsort(install version:6.2.1 version range:*)
| | +- numpy(install version:1.18.4 version range:<2,>=1.14)
| | +- pandas(install version:1.0.3 version range:>=0.23.0)
| | +- scipy(install version:1.3 version range:<2,>=1.0)
| +- bamnostic(install version:1.1.4 version range:>=1.0.12)
| +- matplotlib(install version:3.2.1 version range:>=3.0.0)
| | +- cycler(install version:0.10.0 version range:>=0.10)
| | | +- six(install version:1.14.0 version range:*)
| | +- kiwisolver(install version:1.2.0 version range:>=1.0.1)
| | +- numpy(install version:1.18.4 version range:>=1.11)
| | +- pyparsing(install version:3.0.0a1 version range:>=2.0.1)
| | +- python-dateutil(install version:2.8.1 version range:>=2.1)
| +- pandas(install version:1.0.3 version range:>=0.21)
| +- scanpy(install version:1.4.4 version range:==1.4.4)
| | +- anndata(install version:0.6.22rc1 version range:>=0.6.22rc1)
| | | +- h5py(install version:2.10.0 version range:*)
| | | +- natsort(install version:6.2.1 version range:*)
| | | +- numpy(install version:1.18.4 version range:<2,>=1.14)
| | | +- pandas(install version:1.0.3 version range:>=0.23.0)
| | | +- scipy(install version:1.3 version range:<2,>=1.0)
| | +- h5py(install version:2.10.0 version range:*)
| | +- importlib-metadata(install version:1.6.0 version range:>=0.7)
| | +- joblib(install version:0.14.1 version range:*)
| | +- matplotlib(install version:3.0. version range:==3.0.)
| | +- natsort(install version:6.2.1 version range:*)
| | +- networkx(install version:2.4 version range:*)
| | | +- decorator(install version:4.4.2 version range:>=4.3.0)
| | +- numba(install version:0.48.0 version range:>=0.41.0)
| | +- pandas(install version:1.0.3 version range:>=0.21)
| | +- patsy(install version:0.5.1 version range:*)
| | | +- numpy(install version:1.18.4 version range:>=1.4)
| | | +- six(install version:1.14.0 version range:*)
| | +- scikit-learn(install version:0.22.2.post1 version range:>=0.19.1)
| | +- scipy(install version:1.3 version range:>=1.3)
| | +- seaborn(install version:0.10.0 version range:*)
| | | +- matplotlib(install version:3.2.1 version range:>=2.1.2)
| | | | +- cycler(install version:0.10.0 version range:>=0.10)
| | | | +- kiwisolver(install version:1.2.0 version range:>=1.0.1)
| | | | +- numpy(install version:1.18.4 version range:>=1.11)
| | | | +- pyparsing(install version:3.0.0a1 version range:>=2.0.1)
| | | | +- python-dateutil(install version:2.8.1 version range:>=2.1)
| | | +- numpy(install version:1.18.4 version range:>=1.13.3)
| | | +- pandas(install version:1.0.3 version range:>=0.22.0)
| | | +- scipy(install version:1.3 version range:>=1.0.1)
| | +- statsmodels(install version:0.11.1 version range:>=0.10.0rc2)
| | | +- numpy(install version:1.18.4 version range:>=1.14)
| | | +- pandas(install version:1.0.3 version range:>=0.21)
| | | +- patsy(install version:0.5.1 version range:>=0.5)
| | | | +- numpy(install version:1.18.4 version range:>=1.4)
| | | | +- six(install version:1.14.0 version range:*)
| | | +- scipy(install version:1.3 version range:>=1.0)
| | +- tables(install version:3.6.1 version range:*)
| | | +- numexpr(install version:2.7.1 version range:>=2.6.2)
| | | | +- numpy(install version:1.18.4 version range:>=1.7)
| | | +- numpy(install version:1.18.4 version range:>=1.9.3)
| | +- tqdm(install version:4.45.0 version range:*)
| | +- umap-learn(install version:0.4.1 version range:>=0.3.0)
| +- scipy(install version:1.3 version range:<=1.3)
| +- seaborn(install version:0.10.0 version range:*)
| | +- matplotlib(install version:3.2.1 version range:>=2.1.2)
| | | +- cycler(install version:0.10.0 version range:>=0.10)
| | | | +- six(install version:1.14.0 version range:*)
| | | +- kiwisolver(install version:1.2.0 version range:>=1.0.1)
| | | +- numpy(install version:1.18.4 version range:>=1.11)
| | | +- pyparsing(install version:3.0.0a1 version range:>=2.0.1)
| | | +- python-dateutil(install version:2.8.1 version range:>=2.1)
| | +- numpy(install version:1.18.4 version range:>=1.13.3)
| | +- pandas(install version:1.0.3 version range:>=0.22.0)
| | +- scipy(install version:1.3 version range:>=1.0.1) 

Thanks for your help. Best, Neolith

NeolithEra commented 4 years ago

Suggested Solution

  1. Loosen the version range of scipy to be *__**.
  2. Remove your direct dependency scipy, and use the scipy transitively introduced by seaborn.
  3. Change your direct dependency seaborn to be <=0.10.0. @DaneseAnna Which solution do you prefer, 1 ,2 or 3? Please let me know your choice. May I pull a request to solve this issue?
DaneseAnna commented 4 years ago

Hi, This is a very good point. The problem we encountered was a compatibility issue between script and h5py (if I recall correctly). The easiest is probably to go with option 3 for now. But I will have a closer look, to resolve the compatibility issues and loosen the version requirements.