# Minimum allowed package versions for gliquid compatibility testing.
# Applied via: pip install --constraint requirements/min-constraints.txt
# These pin each package to the lowest version permitted by pyproject.toml.
#
# Notes:
#   - The ML stack is no longer a base dependency; it reaches these environments through
#     the `test` extra, which pulls gliquid[ml] plus unpinned scikit-learn/joblib/openpyxl.
#     scikit-learn stays pinned at 1.7.1 here (NOT at the 1.4 floor of the range) so the
#     -min envs keep resolving exactly what they resolved before this split.
#   - xgboost-cpu, not xgboost: the `ml` extra asks for xgboost-cpu everywhere except macOS
#     (no macOS wheels are published for it), so the constraint has to name that
#     distribution or it silently applies to nothing and the -min envs float to the latest
#     release. Both lines are carried for the same reason. 3.1.3 exists on both.
#   - shap is deliberately ABSENT: no test exercises a SHAP path, so the matrix no longer
#     installs it. A pin here would constrain a package that is never resolved.
#   - plotly 5.24.0 is the minimum: 5.18's express layer calls grouped.get_group(s[0]),
#     which pandas 3.x rejects (KeyError). Measured in the compat matrix on every -min
#     env at py311+, where pandas 3 is installable; py310-min escapes on pandas 2.3.3.
#   - emmet-core is now capped <0.86 in pyproject: 0.87.1 imports pymatgen.core.entries,
#     removed from current pymatgen, breaking every live MP fetch on py311+.
#   - emmet-core has no lower bound — its minimum is resolved transitively by mp-api==0.45.1.
#   - openpyxl 3.1.5 is the minimum: pandas>=3.0 requires >=3.1.5; 3.0.x uses numpy.float
#     (removed in numpy>=1.24); 3.1.0–3.1.4 rejected by pandas 3.0.3+ at import time.
#   - sympy 1.12 is incompatible with numpy 2.x: str(np.float64(x)) in numpy 2.0 returns
#     'np.float64(x)' instead of 'x', which breaks sympy's string-to-mpmath conversion.
#   - matplotlib 3.10.0 is the minimum for Python 3.13: 3.9.0 has no cp313 wheel, forcing
#     a from-source build that fails without a C compiler. 3.10.0+ ships cp313 wheels.
#   - numpy>=2.0 keeps pip from backtracking through old pymatgen versions, and ensures
#     py313 gets a binary wheel (no C-compiler needed): modern pymatgen cp310/cp313 wheels
#     require numpy>=2.0. The ORIGINAL trigger was shap==0.48.0 pulling numba, which
#     resolved numpy back to 1.26.4; shap is no longer installed here, so that particular
#     backtracking path is gone, but the pymatgen-wheel reason stands on its own and the
#     pin stays. Removing it is a matrix experiment, not a cleanup.

plotly==5.24.0
nbformat==4.2.0
mp-api==0.45.1
matplotlib==3.10.0
sympy==1.13
scikit-learn==1.7.1
joblib==1.3.0
xgboost-cpu==3.1.3
xgboost==3.1.3
openpyxl==3.1.5
numpy>=2.0
