diff --git a/.github/workflows/check-changelog.yml b/.github/workflows/check-changelog.yml index d5bfc8ef0f430..2c0792136a204 100644 --- a/.github/workflows/check-changelog.yml +++ b/.github/workflows/check-changelog.yml @@ -16,7 +16,7 @@ jobs: run: | echo "PR_NUMBER=${{ github.event.pull_request.number }}" >> $GITHUB_ENV echo "TAGGED_MILESTONE=${{ github.event.pull_request.milestone.title }}" >> $GITHUB_ENV - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: '0' - name: Check the changelog entry diff --git a/.github/workflows/check-sdist.yml b/.github/workflows/check-sdist.yml index c02af711bdb6c..81a13294bdd96 100644 --- a/.github/workflows/check-sdist.yml +++ b/.github/workflows/check-sdist.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.9' diff --git a/.github/workflows/labeler-title-regex.yml b/.github/workflows/labeler-title-regex.yml index 10195eca13a73..03de57d66ddb9 100644 --- a/.github/workflows/labeler-title-regex.yml +++ b/.github/workflows/labeler-title-regex.yml @@ -15,7 +15,7 @@ jobs: labeler: runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.9' diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 30dd632289b6e..0ef75cdcce660 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} @@ -31,6 +31,7 @@ jobs: - name: Install dependencies run: | + curl https://raw.githubusercontent.com/${{ github.repository }}/main/build_tools/shared.sh --retry 5 -o ./build_tools/shared.sh source build_tools/shared.sh # Include pytest compatibility with mypy pip install pytest $(get_dep ruff min) $(get_dep mypy min) $(get_dep black min) cython-lint @@ -72,7 +73,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 diff --git a/.github/workflows/publish_pypi.yml b/.github/workflows/publish_pypi.yml index b8940ae133ad9..394dcfd408ac2 100644 --- a/.github/workflows/publish_pypi.yml +++ b/.github/workflows/publish_pypi.yml @@ -18,7 +18,7 @@ jobs: # IMPORTANT: this permission is mandatory for trusted publishing id-token: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.8' @@ -39,10 +39,10 @@ jobs: run: | python build_tools/github/check_wheels.py - name: Publish package to TestPyPI - uses: pypa/gh-action-pypi-publish@v1.8.5 + uses: pypa/gh-action-pypi-publish@8a08d616893759ef8e1aa1f2785787c0b97e20d6 # v1.10.0 with: repository_url: https://test.pypi.org/legacy/ if: ${{ github.event.inputs.pypi_repo == 'testpypi' }} - name: Publish package to PyPI - uses: pypa/gh-action-pypi-publish@v1.8.5 + uses: pypa/gh-action-pypi-publish@8a08d616893759ef8e1aa1f2785787c0b97e20d6 # v1.10.0 if: ${{ github.event.inputs.pypi_repo == 'pypi' }} diff --git a/.github/workflows/update-lock-files.yml b/.github/workflows/update-lock-files.yml index 50d62c85d00a6..669a1e88b024e 100644 --- a/.github/workflows/update-lock-files.yml +++ b/.github/workflows/update-lock-files.yml @@ -43,7 +43,7 @@ jobs: - name: Create Pull Request id: cpr - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: token: ${{ secrets.BOT_GITHUB_TOKEN }} push-to-fork: scikit-learn-bot/scikit-learn diff --git a/.github/workflows/update_tracking_issue.yml b/.github/workflows/update_tracking_issue.yml index d4538fe6848d8..2039089654fea 100644 --- a/.github/workflows/update_tracking_issue.yml +++ b/.github/workflows/update_tracking_issue.yml @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'scikit-learn/scikit-learn' && github.event_name == 'schedule' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.9' diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 632425dcd046e..4d0d1e420e813 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout scikit-learn - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} @@ -65,6 +65,11 @@ jobs: - os: windows-latest python: 312 platform_id: win_amd64 + - os: windows-latest + python: 313 + platform_id: win_amd64 + # TODO: remove next line when Python 3.13 is released + prerelease_pythons: True # Linux 64 bit manylinux2014 - os: ubuntu-latest @@ -86,6 +91,10 @@ jobs: python: 312 platform_id: manylinux_x86_64 manylinux_image: manylinux2014 + - os: ubuntu-latest + python: 313 + platform_id: manylinux_x86_64 + manylinux_image: manylinux2014 # MacOS x86_64 - os: macos-12 @@ -100,6 +109,9 @@ jobs: - os: macos-12 python: 312 platform_id: macosx_x86_64 + - os: macos-12 + python: 313 + platform_id: macosx_x86_64 # MacOS arm64 - os: macos-14 @@ -114,10 +126,13 @@ jobs: - os: macos-14 python: 312 platform_id: macosx_arm64 + - os: macos-14 + python: 313 + platform_id: macosx_arm64 steps: - name: Checkout scikit-learn - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 @@ -154,7 +169,8 @@ jobs: - name: Build and test wheels env: - CIBW_PRERELEASE_PYTHONS: ${{ matrix.prerelease }} + CIBW_PRERELEASE_PYTHONS: ${{ matrix.prerelease_pythons }} + CIBW_FREE_THREADED_SUPPORT: ${{ matrix.free_threaded_support }} CIBW_ENVIRONMENT: SKLEARN_SKIP_NETWORK_TESTS=1 SKLEARN_BUILD_PARALLEL=3 CIBW_BUILD: cp${{ matrix.python }}-${{ matrix.platform_id }} @@ -167,7 +183,12 @@ jobs: CIBW_CONFIG_SETTINGS_WINDOWS: "setup-args=--vsenv" CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: bash build_tools/github/repair_windows_wheels.sh {wheel} {dest_dir} CIBW_BEFORE_TEST_WINDOWS: bash build_tools/github/build_minimal_windows_image.sh ${{ matrix.python }} - CIBW_TEST_REQUIRES: pytest pandas ${{ matrix.python == 312 && 'numpy>=2.0.0rc2' || '' }} + CIBW_BEFORE_TEST: bash {project}/build_tools/wheels/cibw_before_test.sh + CIBW_TEST_REQUIRES: pytest pandas + # On Windows, we use a custom Docker image and CIBW_TEST_REQUIRES_WINDOWS + # does not make sense because it would install dependencies in the host + # rather than inside the Docker image + CIBW_TEST_REQUIRES_WINDOWS: "" CIBW_TEST_COMMAND: bash {project}/build_tools/wheels/test_wheels.sh CIBW_TEST_COMMAND_WINDOWS: bash {project}/build_tools/github/test_windows_wheels.sh ${{ matrix.python }} CIBW_BUILD_VERBOSITY: 1 @@ -198,7 +219,7 @@ jobs: steps: - name: Checkout scikit-learn - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 @@ -232,7 +253,7 @@ jobs: steps: - name: Checkout scikit-learn - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Download artifacts uses: actions/download-artifact@v4 diff --git a/.gitignore b/.gitignore index 61c89bcb96491..ee30b02a61c2b 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ doc/css/* !doc/css/.gitkeep doc/modules/generated/ doc/datasets/generated/ +doc/developers/maintainer.rst doc/index.rst doc/min_dependency_table.rst doc/min_dependency_substitutions.rst diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000000000..c3e367c124f81 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,48 @@ +cff-version: 1.2.0 +title: scikit-learn +type: software +authors: + - name: "The scikit-learn developers" +message: "If you use scikit-learn in a scientific publication, we would appreciate citations to the following paper:" +preferred-citation: + type: article + title: "Scikit-learn: Machine Learning in Python" + authors: + - family-names: "Pedregosa" + given-names: "Fabian" + - family-names: "Varoquaux" + given-names: "Gaël" + - family-names: "Gramfort" + given-names: "Alexandre" + - family-names: "Michel" + given-names: "Vincent" + - family-names: "Thirion" + given-names: "Bertrand" + - family-names: "Grisel" + given-names: "Olivier" + - family-names: "Blondel" + given-names: "Mathieu" + - family-names: "Prettenhofer" + given-names: "Peter" + - family-names: "Weiss" + given-names: "Ron" + - family-names: "Dubourg" + given-names: "Vincent" + - family-names: "Vanderplas" + given-names: "Jake" + - family-names: "Passos" + given-names: "Alexandre" + - family-names: "Cournapeau" + given-names: "David" + - family-names: "Brucher" + given-names: "Matthieu" + - family-names: "Perrot" + given-names: "Matthieu" + - family-names: "Duchesnay" + given-names: "Édouard" + journal: "Journal of Machine Learning Research" + volume: 12 + start: 2825 + end: 2830 + year: 2011 + url: "https://jmlr.csail.mit.edu/papers/v12/pedregosa11a.html" diff --git a/Makefile b/Makefile index 52374ba44ff79..70ac24f01f412 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,8 @@ inplace: dev-meson: pip install --verbose --no-build-isolation --editable . --config-settings editable-verbose=true +clean: clean-meson + clean-meson: pip uninstall -y scikit-learn diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1f8819d264d77..4497436eef0de 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -40,6 +40,11 @@ jobs: - bash: | ./build_tools/linting.sh displayName: Run linters + - bash: | + pip install ninja meson scipy + python build_tools/check-meson-openmp-dependencies.py + displayName: Run Meson OpenMP checks + - template: build_tools/azure/posix.yml parameters: @@ -232,10 +237,10 @@ jobs: not(contains(dependencies['git_commit']['outputs']['commit.message'], '[ci skip]')) ) matrix: - # Linux + Python 3.9 build with OpenBLAS and without pandas - pymin_conda_defaults_openblas: + # Linux + Python 3.9 build with minimum supported version of dependencies + pymin_conda_forge_openblas_min_dependencies: DISTRIB: 'conda' - LOCK_FILE: './build_tools/azure/pymin_conda_defaults_openblas_linux-64_conda.lock' + LOCK_FILE: './build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock' # Enable debug Cython directives to capture IndexError exceptions in # combination with the -Werror::pytest.PytestUnraisableExceptionWarning # flag for pytest. @@ -270,11 +275,11 @@ jobs: not(contains(dependencies['git_commit']['outputs']['commit.message'], '[ci skip]')) ) matrix: - debian_atlas_32bit: - DOCKER_CONTAINER: 'i386/debian:11.2' + debian_32bit: + DOCKER_CONTAINER: 'i386/debian:trixie' DISTRIB: 'debian-32' COVERAGE: "true" - LOCK_FILE: './build_tools/azure/debian_atlas_32bit_lock.txt' + LOCK_FILE: './build_tools/azure/debian_32bit_lock.txt' # disable pytest xdist due to unknown bug with 32-bit container PYTEST_XDIST_VERSION: 'none' SKLEARN_TESTS_GLOBAL_RANDOM_SEED: '4' # non-default seed diff --git a/build_tools/azure/debian_32bit_lock.txt b/build_tools/azure/debian_32bit_lock.txt new file mode 100644 index 0000000000000..4778cc05a91fa --- /dev/null +++ b/build_tools/azure/debian_32bit_lock.txt @@ -0,0 +1,37 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --output-file=build_tools/azure/debian_32bit_lock.txt build_tools/azure/debian_32bit_requirements.txt +# +coverage[toml]==7.6.1 + # via pytest-cov +cython==3.0.11 + # via -r build_tools/azure/debian_32bit_requirements.txt +iniconfig==2.0.0 + # via pytest +joblib==1.4.2 + # via -r build_tools/azure/debian_32bit_requirements.txt +meson==1.5.1 + # via meson-python +meson-python==0.16.0 + # via -r build_tools/azure/debian_32bit_requirements.txt +ninja==1.11.1.1 + # via -r build_tools/azure/debian_32bit_requirements.txt +packaging==24.1 + # via + # meson-python + # pyproject-metadata + # pytest +pluggy==1.5.0 + # via pytest +pyproject-metadata==0.8.0 + # via meson-python +pytest==8.3.2 + # via + # -r build_tools/azure/debian_32bit_requirements.txt + # pytest-cov +pytest-cov==5.0.0 + # via -r build_tools/azure/debian_32bit_requirements.txt +threadpoolctl==3.5.0 + # via -r build_tools/azure/debian_32bit_requirements.txt diff --git a/build_tools/azure/debian_atlas_32bit_requirements.txt b/build_tools/azure/debian_32bit_requirements.txt similarity index 65% rename from build_tools/azure/debian_atlas_32bit_requirements.txt rename to build_tools/azure/debian_32bit_requirements.txt index 615193a71fc6b..6dcf67d11c58d 100644 --- a/build_tools/azure/debian_atlas_32bit_requirements.txt +++ b/build_tools/azure/debian_32bit_requirements.txt @@ -1,10 +1,10 @@ # DO NOT EDIT: this file is generated from the specification found in the # following script to centralize the configuration for CI builds: # build_tools/update_environments_and_lock_files.py -cython==3.0.10 # min -joblib==1.2.0 # min -threadpoolctl==3.1.0 -pytest==7.1.2 # min -pytest-cov==2.9.0 # min +cython +joblib +threadpoolctl +pytest +pytest-cov ninja meson-python diff --git a/build_tools/azure/debian_atlas_32bit_lock.txt b/build_tools/azure/debian_atlas_32bit_lock.txt deleted file mode 100644 index 9da822ecd9cb8..0000000000000 --- a/build_tools/azure/debian_atlas_32bit_lock.txt +++ /dev/null @@ -1,45 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --output-file=build_tools/azure/debian_atlas_32bit_lock.txt build_tools/azure/debian_atlas_32bit_requirements.txt -# -attrs==23.2.0 - # via pytest -coverage==7.5.3 - # via pytest-cov -cython==3.0.10 - # via -r build_tools/azure/debian_atlas_32bit_requirements.txt -iniconfig==2.0.0 - # via pytest -joblib==1.2.0 - # via -r build_tools/azure/debian_atlas_32bit_requirements.txt -meson==1.4.1 - # via meson-python -meson-python==0.16.0 - # via -r build_tools/azure/debian_atlas_32bit_requirements.txt -ninja==1.11.1.1 - # via -r build_tools/azure/debian_atlas_32bit_requirements.txt -packaging==24.1 - # via - # meson-python - # pyproject-metadata - # pytest -pluggy==1.5.0 - # via pytest -py==1.11.0 - # via pytest -pyproject-metadata==0.8.0 - # via meson-python -pytest==7.1.2 - # via - # -r build_tools/azure/debian_atlas_32bit_requirements.txt - # pytest-cov -pytest-cov==2.9.0 - # via -r build_tools/azure/debian_atlas_32bit_requirements.txt -threadpoolctl==3.1.0 - # via -r build_tools/azure/debian_atlas_32bit_requirements.txt -tomli==2.0.1 - # via - # meson-python - # pytest diff --git a/build_tools/azure/install.sh b/build_tools/azure/install.sh index 9a6a526fafa46..c5dd4e07de6fe 100755 --- a/build_tools/azure/install.sh +++ b/build_tools/azure/install.sh @@ -24,6 +24,9 @@ setup_ccache() { done export PATH="${CCACHE_LINKS_DIR}:${PATH}" ccache -M 256M + + # Zeroing statistics so that ccache statistics are shown only for this build + ccache -z fi } @@ -35,8 +38,8 @@ pre_python_environment_install() { elif [[ "$DISTRIB" == "debian-32" ]]; then apt-get update - apt-get install -y python3-dev python3-numpy python3-scipy \ - python3-matplotlib libatlas3-base libatlas-base-dev \ + apt-get install -y python3-dev python3-setuptools python3-numpy python3-scipy \ + python3-matplotlib libopenblas-dev \ python3-virtualenv python3-pandas ccache git elif [[ "$DISTRIB" == "conda-pypy3" ]]; then @@ -50,7 +53,7 @@ pre_python_environment_install() { check_packages_dev_version() { for package in $@; do package_version=$(python -c "import $package; print($package.__version__)") - if ! [[ $package_version =~ "dev" ]]; then + if [[ $package_version =~ "^[.0-9]+$" ]]; then echo "$package is not a development version: $package_version" exit 1 fi @@ -71,18 +74,25 @@ python_environment_install_and_activate() { python -m venv $VIRTUALENV source $VIRTUALENV/bin/activate pip install -r "${LOCK_FILE}" + # TODO for now need pip 24.1b1 to find free-threaded wheels + pip install -U --pre pip + # TODO When there are CPython 3.13 free-threaded wheels for numpy, + # scipy and cython move them to + # build_tools/azure/cpython_free_threaded_requirements.txt. For now we + # install them from scientific-python-nightly-wheels + dev_anaconda_url=https://pypi.anaconda.org/scientific-python-nightly-wheels/simple + dev_packages="numpy scipy Cython" + pip install --pre --upgrade --timeout=60 --extra-index $dev_anaconda_url $dev_packages --only-binary :all: fi if [[ "$DISTRIB" == "conda-pip-scipy-dev" ]]; then echo "Installing development dependency wheels" dev_anaconda_url=https://pypi.anaconda.org/scientific-python-nightly-wheels/simple - dev_packages="numpy scipy pandas" - pip install --pre --upgrade --timeout=60 --extra-index $dev_anaconda_url $dev_packages + dev_packages="numpy scipy pandas Cython" + pip install --pre --upgrade --timeout=60 --extra-index $dev_anaconda_url $dev_packages --only-binary :all: check_packages_dev_version $dev_packages - echo "Installing Cython from latest sources" - pip install https://github.com/cython/cython/archive/master.zip echo "Installing joblib from latest sources" pip install https://github.com/joblib/joblib/archive/master.zip echo "Installing pillow from latest sources" diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock index 09249ad17160b..3394858626338 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock @@ -3,219 +3,210 @@ # input_hash: 50fed47bc507d9ee3dbf5ff7a2247cb88944928bd5797e534ebdf8ece2d858ec @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_3.conda#7c1062eaa78dec4ea8a9a988dbda6045 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_0.conda#e46b5ae31282252e0525713e34ffbe2b https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab +https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_0.conda#35e52d19547cb3265a09c49de146a5ae https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2#562b26ba2e19059551a811e72ab7f793 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda#0bb492cca54017ea314b809b1ee3a176 -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.0-hd590300_0.conda#71b89db63b5b504e7afc8ad901172e1e -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f -https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 -https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2#cddaf2c63ea4a5901cf09524c490ecdc -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230125.3-cxx17_h59595ed_0.conda#d1db1b8be7c3a8983dcbbbfe4f0765de -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c -https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d +https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda#172bcc51059416e7ce99e7b528cede83 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libnuma-2.0.18-h4ab18f5_2.conda#a263760479dbc7bc1f3df12707bd90dc -https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 -https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2#ede4266dc02e875fe1ea77b25dd43747 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 -https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/rdma-core-28.9-h59595ed_1.conda#aeffb7c06b5f65e55e6c637408dc4100 -https://conda.anaconda.org/conda-forge/linux-64/re2-2023.03.02-h8c504da_0.conda#206f8fa808748f6e90599c3368a1114e -https://conda.anaconda.org/conda-forge/linux-64/sleef-3.5.1-h9b69904_2.tar.bz2#6e016cf4c525d04a7bd038cee53ad3fd -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.49-h06160fa_0.conda#1d78349eb26366ecc034a4afe70a8534 +https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-recordproto-1.14.2-h7f98852_1002.tar.bz2#2f835e6c386e73c6faaddfe9eda67e98 https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2#3ceea9668625c18f19530de98b15d5b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.1-hc309b26_1.conda#cc09293a2c2b7fd77aff284f370c12c0 https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h4d4d85c_2.conda#9ca99452635fe03eb5fa937f5ae604b0 https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h4d4d85c_1.conda#eba092fc6de212a01de0065f38fe8bbb https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h4d4d85c_1.conda#30f9df85ce23cd14faa9a4dfa50cca2b -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 -https://conda.anaconda.org/conda-forge/linux-64/glog-0.6.0-h6f12383_0.tar.bz2#b31f3565cb84435407594e548a2fb7b2 -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 +https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 +https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2#cddaf2c63ea4a5901cf09524c490ecdc +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230125.3-cxx17_h59595ed_0.conda#d1db1b8be7c3a8983dcbbbfe4f0765de https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_9.conda#081aa22f4581c08e4372b0b6c2f8478e https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.conda#1f0a03af852a9659ed2bf08f2f1704fd -https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 +https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda#ee605e794bdc14e2b7f84c4faa0d8c2c https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda#b63d9b6da3653179a278077f0de20014 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-3.21.12-hfc55251_2.conda#e3a7d4ba09b8dc939b98fef55f539220 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda#784a4df6676c581ca624fbe460703a6d -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.18.1-h8fd135c_2.conda#bbf65f7688512872f063810623b755dc +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h70512c7_0.conda#c567b6fa201bc424e84f1e70f7a36095 +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/rdma-core-28.9-h59595ed_1.conda#aeffb7c06b5f65e55e6c637408dc4100 +https://conda.anaconda.org/conda-forge/linux-64/re2-2023.03.02-h8c504da_0.conda#206f8fa808748f6e90599c3368a1114e https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.49-h06160fa_0.conda#1d78349eb26366ecc034a4afe70a8534 +https://conda.anaconda.org/conda-forge/linux-64/sleef-3.6.1-h1b44611_3.conda#af4dbe128af0840dcaeb4d40eb27ab73 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/ucx-1.14.1-h64cca9d_5.conda#39aa3b356d10d7e5add0c540945a0944 +https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-he9a53bd_1.conda#8a24e5820f4a0ffd2ed9c4722cd5d7ca https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 +https://conda.anaconda.org/conda-forge/linux-64/glog-0.6.0-h6f12383_0.tar.bz2#b31f3565cb84435407594e548a2fb7b2 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h315aac3_2.conda#b0143a3e98136a680b728fdf9b42a258 https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.54.3-hb20ce57_0.conda#7af7c59ab24db007dfd82e0a3a343f66 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h5622ce7_1001.conda#fc2d5b79c2d3f8568fbab31db7ae02f3 -https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef -https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.7-hb77312f_0.conda#bc0ea7e1f75a9b1c8467597fbbd9f86b -https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.18.1-h8fd135c_2.conda#bbf65f7688512872f063810623b755dc -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.7-ha31de31_0.conda#7234f31acd176e402e91e03feba90f7d -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda#1b50eebe2a738a3146c154d2eceaa8b6 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda#949c4a82290ee58b3c970cef4bcfd4ad +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.8-hf5423f3_1.conda#8782406a10201b67bd6476ca70cf92a8 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-ha479ceb_0.conda#6fd406aef37faad86bd7f37a94fb6f8a https://conda.anaconda.org/conda-forge/linux-64/orc-1.9.0-h2f23424_1.conda#9571eb3eb0f7fe8b59956a7786babbcd https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec -https://conda.anaconda.org/conda-forge/noarch/array-api-compat-1.7.1-pyhd8ed1ab_0.conda#8791d81c38f676a7c08c76546800bf70 +https://conda.anaconda.org/conda-forge/linux-64/ucx-1.14.1-h64cca9d_5.conda#39aa3b356d10d7e5add0c540945a0944 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 +https://conda.anaconda.org/conda-forge/noarch/array-api-compat-1.8-pyhd8ed1ab_0.conda#1178a75b8f6f260ac4b4436979754278 https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h2e3709c_4.conda#2cf21b1cbc1c096a28ffa2892257a2c1 https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-h00aa349_4.conda#cb932dff7328ff620ce8059c9968b095 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 -https://conda.anaconda.org/conda-forge/linux-64/ccache-4.9.1-h1fcd64f_0.conda#3620f564bcf28c3524951b6f64f5c5ac -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/linux-64/ccache-4.10.1-h065aff2_0.conda#d6b48c138e0c8170a6fe9c136e063540 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py311hb755f60_0.conda#f3a8a500a2e743ff92f418f0eaf9bf71 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py311hfdbb021_2.conda#e0ee31128372cd4c6873372a756964bb https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda#a965aeaf060289528a3fbe09326edae2 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda#d0a9633b53cdc319b8a1a532ae7822b8 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.7-default_h087397f_0.conda#536526073c2e7f9056fdce8584da779e https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 -https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda#dfcfd72c7a430d3616763ecfbefe4ca9 -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_0.conda#b470cc353c5b852e0d830e8d5d23e952 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a +https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.8-h8b73ec9_2.conda#2e25bb2f53e4a48873a936f8ef53e592 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h2d7952a_1.conda#7e3173fd1299939a02ebf9ec32aa77c4 +https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda#18c6deb6f9602e32446398203c8f0e91 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h297d8ca_1.conda#3ff978d8994f591818a506640c6a7071 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h331c9d8_0.conda#e29e451c96bf8e81a5760b7565c6ed2c +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h9ecbd09_1.conda#616fed0b6f5c925250be779b05d1d7f7 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.42-h4ab18f5_0.conda#b193af204da1bfb8c13882d131a14bd2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-h28f7589_1.conda#97503d3e565004697f1651753aa95b9e https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.3-hb447be9_1.conda#c520669eb0be9269a5f0d8ef62531882 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py311h331c9d8_0.conda#2daef6c4ce74840c8d7a431498be83e9 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h9ecbd09_1.conda#a36ccf0f3d2eb95a0ecc293f5f56e080 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h9ecbd09_1.conda#89ed1820af1523df84171049199ed915 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f -https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.8-default_hf981a13_4.conda#7b72d74b57e681251536094b96ba9c46 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_4.conda#7e3f831d4ae9820999418821be65ff67 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_0.conda#3deca8c25851196c28d1c84dd4ae9149 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.12.0-hac9eb74_1.conda#0dee716254497604762957076ac76540 -https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 -https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 -https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.2.1-h84fe81f_16997.conda#a7ce56d5757f5b57e7daabe703ade5bb -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda#e2eaefa4de2b7237af7c907b8bbc760a +https://conda.anaconda.org/conda-forge/noarch/meson-1.5.1-pyhd8ed1ab_1.conda#979087ee59bea1355f991a3b738af64e +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py311h82a398c_0.conda#b9e0ac1f5564b6572a6d702c04207be8 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.8.0-pyhd8ed1ab_0.conda#573fe09d7bd0cd4bcc210d8369b5ca47 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py311hb755f60_0.conda#02336abab4cb5dd794010ef53c54bd09 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda#ee6f7fd1e76061ef1fa307d41fa86a96 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.4-h4ab18f5_2.conda#79e46d4a6ccecb7ee1912042958a8758 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-h4bc722e_1.conda#0c90ad87101001080484b91bd9d2cdef https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-hf3aad02_1.conda#a968ffa7e9fe0c257628033d393e512f -https://conda.anaconda.org/conda-forge/linux-64/blas-1.0-mkl.tar.bz2#349aef876b1d8c9dccae01de20d5b385 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.conda#926c2c7ee7a0b48d6d70783a33f7bc80 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2#85f61af03fd291dae33150ffe89dc09a -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 -https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py311hb755f60_5.conda#e4d262cc3600e70b505a6761d29f6207 +https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.2.1-h6508926_16999.tar.bz2#0bc81ce33d4d943c76b5145d8503fe21 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-h4bc722e_0.conda#185159d666308204eca00295599b0a5c https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.21.0-hb942446_5.conda#07d92ed5403ad7b5c66ffd7d5b8f7e57 -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 +https://conda.anaconda.org/conda-forge/linux-64/blas-1.0-mkl.tar.bz2#349aef876b1d8c9dccae01de20d5b385 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2#85f61af03fd291dae33150ffe89dc09a +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.2-hb12f9c5_5.conda#8c662388c2418f293266f5e7f50df7d7 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h85b1a90_19.conda#0605d3d60857fc07bd6a11e878fe0f08 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2#361bf757b95488de76c4f123805742d3 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2#a2f166748917d6d6e4707841ca1f519e -https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h85b1a90_19.conda#0605d3d60857fc07bd6a11e878fe0f08 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda#b325046180590c868ce0dbf267b82eb8 -https://conda.anaconda.org/conda-forge/noarch/array-api-strict-1.1.1-pyhd8ed1ab_0.conda#941bbcd64d1a7b44aeb497f468fc85b4 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 +https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.7.2-py311hba19f1e_2.conda#fdd0e9bde09b9bb4a3713e906c7047d7 https://conda.anaconda.org/conda-forge/linux-64/libarrow-12.0.1-hb87d912_8_cpu.conda#3f3b11398fe79b578e3c44dd00a44e4a +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d +https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.0.1-pyhd8ed1ab_0.conda#2c00d29e0e276f2d32dfe20e698b8eeb +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_1.conda#f709f23e2b1b93b3b6a20e9e7217a258 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py311h14de704_1.conda#84e2dd379d4edec4dd6382861486104d -https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.31-py311h00856b1_0.conda#4f1cc2c95c25fe838acabfa8dc0d48ff -https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py311hf0fb5b6_5.conda#ec7e45bc76d9d0b69a74a2075932b8e8 -https://conda.anaconda.org/conda-forge/linux-64/pytorch-1.13.1-cpu_py311h410fd25_1.conda#ddd2fadddf89e3dc3d541a2537fce010 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda#764b0e055f59dbd7d114d32b8c6e55e6 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda#0848e2084cbb57014f232f48568561af -https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.1.0-py311h5510f57_1.conda#734865cccfb0a27b433ea31bd178d0e3 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.6.0-py311hf9ffc17_0.conda#22b6e5c2ca9e53df24282cb3ebe5cf5c https://conda.anaconda.org/conda-forge/linux-64/pyarrow-12.0.1-py311h39c9aba_8_cpu.conda#587370a25bb2c50cce90909ce20d38b8 +https://conda.anaconda.org/conda-forge/linux-64/pytorch-1.13.1-cpu_py311h410fd25_1.conda#ddd2fadddf89e3dc3d541a2537fce010 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he1f765f_0.conda#eb7e2a849cd47483d7e9eeb728c7a8c5 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h74b4f7c_0.conda#de8e36c9792f14eed7e11e672f03fbf0 +https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py311h5510f57_0.conda#c10eb75127eec724f76872a408535ead https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-1.13.1-cpu_py311hdb170b5_1.conda#a805d5f103e493f207613283d8acbbe1 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py311h38be061_2.conda#7667100b9559c1b7a40c728cd72dabdf +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.9.2-py311h38be061_0.conda#a0bc9952e7a3c112f7bae89d5dd01fe9 diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock index 4b7200379d4fe..82625134e7829 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock @@ -2,128 +2,130 @@ # platform: osx-64 # input_hash: e7c2bc2b07721ef735f30d3b1cf0b2a780b5bf5c138d9d18ad174611bfbd32bf @EXPLICIT -https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda#6097a6ca9ada32699b5fc4312dd6ef18 -https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.6.2-h8857fd0_0.conda#3c23a8cab15ae51ebc9efdc229fccecf -https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda#5cc301d759ec03f28328428e28f65591 -https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h0dc2134_1.conda#9e6c31441c9aa24e41ace40d6151aab6 -https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.20-h49d49c5_0.conda#d46104f6a896a0bc6a1d37b88b2edf5c -https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda#3d1d51c8f716d97c864d12f7af329526 +https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda#b7e5424e7f06547a903d28e4651dbb21 https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2#ccb34fb14960ad8b125962d3d79b31a9 -https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-12.3.0-h0b6f5ec_3.conda#39eeea5454333825d72202fae2d5e0b8 +https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-13.2.0-h80d4556_3.conda#3a689f0d733e67828ad00eac5f3cf26e https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda#6c3628d047e151efba7cf08c5e54d1ca https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda#72507f8e3961bc968af17435060b6dd6 https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda#b2c0047ea73819d992484faacbbe1c24 https://conda.anaconda.org/conda-forge/osx-64/mkl-include-2023.2.0-h6bab518_50500.conda#835abb8ded5e26f23ea6996259c7972e -https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda#02a888433d165c99bf09784a7b14d900 https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2#addd19059de62181cd11ae8f4ef26084 -https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-4_cp312.conda#87201ac4314b911b74197e588cca3639 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda#c34dd4920e0addf7cfcc725809f25d8e +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h0dc2134_0.conda#9566b4c29274125b0266d0177b5eb97b https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.3-h35c211d_0.tar.bz2#86ac76d6bf1cbb9621943eb3bd9ae36e https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2#a72f9d4ea13d55d745ff1ed594747f10 -https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h0dc2134_1.conda#9ee0bab91b2ca579e10353738be36063 -https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h0dc2134_1.conda#8a421fe09c6187f0eb5e2338a8a8be6d -https://conda.anaconda.org/conda-forge/osx-64/libcxx-17.0.6-h88467a6_0.conda#0fe355aecb8d24b8bc07c763209adbd9 -https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda#5513f57e0238c87c12dffedbcc9c1a4a +https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda#7ed4301d437b59045be7e051a0308211 +https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda#d68d48a3060eb5abdc1cdc8e2a3a5966 +https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda#58f2c4bdd56c46cc7451596e4ae68e0b +https://conda.anaconda.org/conda-forge/osx-64/libcxx-18.1.8-hd876a4e_7.conda#c346ae5c96382a12563e3b0c403c8c4a +https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.21-hfdf4475_0.conda#88409b23a5585c15d52de0073f3c9c61 +https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.3-hac325c4_0.conda#c1db99b0a94a2f23bd6ce39e2d314e07 +https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.16-h00291cd_1.conda#c989b18131ab79fdc67e42473d53d545 https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-h87427d6_1.conda#b7575b5aa92108dcc9aaab0f05f2dbce -https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.7-h15ab845_0.conda#57440310d92e93efd808c75fec50f94d -https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.1-h87427d6_0.conda#1bdad93ae01353340f194c5d879745db -https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda#f17f77f2acf4d344734bda76829ce14e -https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h0dc2134_1.conda#ece565c215adcc47fc1db4e651ee094b -https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-h73e2aa4_1.conda#92f8d748d95d97f92fc26cfac9bb5b6e +https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.8-h15ab845_1.conda#ad0afa524866cc1c08b436865d0ae484 +https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda#e102bbf8a6ceeaf429deab8032fc8977 +https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda#2ff47134c8e292868a4609519b1ea3b6 +https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda#427101d13f19c4974552a4e5b072eef1 https://conda.anaconda.org/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda#d06222822a9144918333346f145b68c6 https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2#f9d6a4c82889d5ecedec1d90eb673c55 +https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda#34709a1f5df44e054c4a12ab536c5459 +https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda#691f0dcb36f1ae67f5c489f20ae987ea +https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-17.0.6-h8f8a49f_6.conda#faa013d493ffd2d5f2d2fc6df5f98f2e https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda#e4fb4d23ec2870ff3c40d10afe305aec https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda#65dcddb15965c9de2c0365cb14910532 -https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda#68e462226209f35182ef66eda0f794ff -https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-h3e169fe_1.conda#ddb63049aa7bd9f08f2cdc5a1c144d1a +https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.1-h4b8f8c9_0.conda#84de0078b58f899fc164303b0603ff0e +https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-heaf3512_4.conda#ea1be6ecfe814da889e882c8b6ead79d https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-h3c5361c_0.conda#a0ebabd021c8191aeb82793fe43cfdcb +https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda#dd1ea9ff27c93db7c01a7b7656bd4ad4 +https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda#f17f77f2acf4d344734bda76829ce14e https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2#fbfb84b9de9a6939cb165c02c69b1865 -https://conda.anaconda.org/conda-forge/osx-64/tapi-1100.0.11-h9ce4665_0.tar.bz2#f9ff42ccf809a21ba6f8607f8de36108 +https://conda.anaconda.org/conda-forge/osx-64/tapi-1300.6.5-h390ca13_0.conda#c6ee25eb54accb3f1c8fc39203acfaf1 https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda#bf830ba5afc507c6232d4ef0fb1a882d https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-h87427d6_1.conda#3ac9ef8975965f9698dbedd2a4cc5894 https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda#4cb2cd56f039b129bb0e491c1164167e -https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h0dc2134_1.conda#9272dd3b19c4e8212f8542cefd5c3d67 +https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h00291cd_2.conda#049933ecbf552479a12c7917f0a4ce59 https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda#25152fce119320c980e5470e64834b50 https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda#0b6e23a012ee7a9a5f6b244f5a92c1d5 -https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.10.0-default_h456cccd_1001.conda#d2dc768b14cdf226a30a8eab15641305 -https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-hbedff68_3.conda#8fd56c0adc07a37f93bd44aa61a97c90 -https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h129831d_3.conda#568593071d2e6cea7b5fc1f75bfa10ca -https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-h4f6b447_1.conda#b90df08f0deb2f58631447c1462c92a7 -https://conda.anaconda.org/conda-forge/osx-64/python-3.12.3-h1411813_0_cpython.conda#df1448ec6cbf8eceb03d29003cf72ae6 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.11.1-default_h456cccd_1000.conda#a14989f6bbea46e6ec4521a403f63ff2 +https://conda.anaconda.org/conda-forge/osx-64/libllvm17-17.0.6-hbedff68_1.conda#fcd38f0553a99fa279fb66a5bfc2fb28 +https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h603087a_4.conda#362626a2aacb976ec89c91b99bfab30b +https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda#d511e58aaaabfc23136880d9956fa7a6 +https://conda.anaconda.org/conda-forge/osx-64/python-3.12.5-h37a9e06_0_cpython.conda#517cb4e16466f8d96ba2a72897d14c48 +https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda#2db0c38a7f2321c5bdaf32b181e832c7 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/osx-64/cython-3.0.10-py312hede676d_0.conda#3008aa88f0dc67e7144734b16e331ee4 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/osx-64/cython-3.0.11-py312h5861a67_2.conda#0d7278f5f7ff4f003d3c813555879417 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py312h49ebfd2_1.conda#21f174a5cfb5964069c374171a979157 +https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.7-py312hc5c4d5f_0.conda#7b72389a8a3ba350285f86933ab85da0 https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda#1442db8f03517834843666c422238c9b -https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-711-ha20a434_0.conda#a8b41eb97c8a9d618243a79ba78fdc3c -https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp16-16.0.6-default_h4c8afb6_7.conda#784816790fe438443354d13050fcd67d +https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-907-h38c89e5_0.conda#260ac3c6e16dca89750e2d7bf82205e5 +https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp17-17.0.6-default_hb173f14_7.conda#9fb4dfe8b2c3ba1b68b79fcd9a71cb76 https://conda.anaconda.org/conda-forge/osx-64/libhiredis-1.0.2-h2beb688_0.tar.bz2#524282b2c46c9dedf051b3bc2ae05494 -https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-16.0.6-hbedff68_3.conda#e9356b0807462e8f84c1384a8da539a5 -https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h81bd1dd_0.conda#c752c0eb6c250919559172c011e5f65b +https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-17.0.6-hbedff68_1.conda#4260f86b3dd201ad7ea758d783cd5613 +https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda#0520855aaae268ea413d6bc913f1384c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda#05a14cc9d725dd74995927968d6547e3 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/osx-64/tbb-2021.12.0-h3c5361c_1.conda#e23dd312f13ffe470cc4fdeaddc7a32e +https://conda.anaconda.org/conda-forge/osx-64/tbb-2021.13.0-h37c8870_0.conda#89742f5ac7aeb5c44ec2b4c3c6692c3c https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.1-py312hbd25219_0.conda#5a40db69b327c71511248f8186965bd3 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae -https://conda.anaconda.org/conda-forge/osx-64/ccache-4.9.1-h41adc32_0.conda#45aaf96b67840bd98a928de8679098fa -https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-986-ha1c5b94_0.conda#a8951de2506df5649f5a3295fdfd9f2c -https://conda.anaconda.org/conda-forge/osx-64/clang-16-16.0.6-default_h4c8afb6_7.conda#c9da6a62b571cac3707db69610ed7bd3 -https://conda.anaconda.org/conda-forge/osx-64/coverage-7.5.3-py312hbd25219_0.conda#135eeb22a4da903e2d06c4323b459003 -https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.53.0-py312hbd25219_0.conda#ce2e9b0279cbbae03017ec7be748b255 -https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-12.3.0-hc328e78_3.conda#b3d751dc7073bbfdfa9d863e39b9685d +https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.1-py312hb553811_1.conda#479bb06cef210f968f20866277acd8b9 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/osx-64/ccache-4.10.1-hee5fd93_0.conda#09898bb80e196695cea9e07402cff215 +https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1009.2-h98e843e_0.conda#1e1f9fb5a75da573f4fea0ec61d2110d +https://conda.anaconda.org/conda-forge/osx-64/clang-17-17.0.6-default_hb173f14_7.conda#809e36447b1bfb87ed1b7fb46339561a +https://conda.anaconda.org/conda-forge/osx-64/coverage-7.6.1-py312hb553811_1.conda#49f066bb9337fd34a4c9c09f576ce136 +https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.53.1-py312hb553811_1.conda#df00a7504c74682d63ae89c32687a3a2 +https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-13.2.0-h2bc304d_3.conda#57aa4cb95277a27aa0a1834ed97be45b https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f -https://conda.anaconda.org/conda-forge/osx-64/ld64-711-ha02d983_0.conda#3ae4930ec076735cce481e906f5192e0 -https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 +https://conda.anaconda.org/conda-forge/osx-64/ld64-907-h0a3eb4e_0.conda#8143d28ee620bb34946734d489f12215 +https://conda.anaconda.org/conda-forge/noarch/meson-1.5.1-pyhd8ed1ab_1.conda#979087ee59bea1355f991a3b738af64e https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b -https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py312h0c923fa_0.conda#6f0591ae972e9b815739da3392fbb3c3 -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 +https://conda.anaconda.org/conda-forge/osx-64/pillow-10.4.0-py312hbd70edc_0.conda#8d55e92fa6380ac8c245f253b096fefd +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.8.0-pyhd8ed1ab_0.conda#573fe09d7bd0cd4bcc210d8369b5ca47 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/osx-64/cctools-986-h40f6528_0.conda#b7a2ca0062a6ee8bc4e83ec887bef942 -https://conda.anaconda.org/conda-forge/osx-64/clang-16.0.6-hd4457cd_7.conda#0f91e4c1d9d85887db66ddbc185d65d4 +https://conda.anaconda.org/conda-forge/osx-64/cctools-1009.2-h5b2de21_0.conda#3f99045727892099c001bf35bb527857 +https://conda.anaconda.org/conda-forge/osx-64/clang-17.0.6-default_he371ed4_7.conda#fd6888f26c44ddb10c9954a2df5765c7 https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda#160fdc97a51d66d51dc782fb67d35205 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 https://conda.anaconda.org/conda-forge/osx-64/mkl-devel-2023.2.0-h694c41f_50500.conda#1b4d0235ef253a1e19459351badf4f9f https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/osx-64/clangxx-16.0.6-default_ha3b9224_7.conda#00c8a212cbbd427dcbcc4231b23ddc5e +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/osx-64/clangxx-17.0.6-default_he371ed4_7.conda#4f110486af1272f0d4dee6adc5041fbf https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda#51089a4865eb4aec2bc5c7468bd07f9f https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda#58f08e12ad487fac4a08f90ff0b87aec -https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-16.0.6-ha38d28d_2.conda#7a46507edc35c6c8818db0adaf8d787f +https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-17.0.6-hf2b8a54_2.conda#98e6d83e484e42f6beebba4276e38145 https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-20_osx64_mkl.conda#124ae8e384268a8da66f1d64114a1eda -https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py312he3a82b2_0.conda#96c61a21c4276613748dba069554846b +https://conda.anaconda.org/conda-forge/osx-64/numpy-2.1.1-py312he4d506f_0.conda#3592cb7c367e5f64a5bc3fd1166ff4d4 https://conda.anaconda.org/conda-forge/osx-64/blas-devel-3.9.0-20_osx64_mkl.conda#cc3260179093918b801e373c6e888e02 -https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-16.0.6-ha38d28d_2.conda#3b9e8c5c63b8e86234f499490acd85c2 -https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py312h9230928_0.conda#079df34ce7c71259cfdd394645370891 +https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-17.0.6-h1020d70_2.conda#be4cb4531d4cee9df94bf752455d68de +https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.0-py312hc5c4d5f_1.conda#68996da74a346963430ace9984d627b4 https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.2-py312h1171441_1.conda#240737937f1f046b0e03ecc11ac4ec98 -https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.1-py312hb9702fa_0.conda#46cb49e67c33f8340a09e49e69adf195 +https://conda.anaconda.org/conda-forge/osx-64/scipy-1.14.1-py312he82a568_0.conda#dd3c55da62964fcadf27771e1928e67f https://conda.anaconda.org/conda-forge/osx-64/blas-2.120-mkl.conda#b041a7677a412f3d925d8208936cb1e2 -https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-16.0.6-h8787910_16.conda#c50c939d1bf9785561220b2cfbb98cb9 -https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py312hb6d62fa_2.conda#6c5cf505d118f4b58961191fd5e0d030 -https://conda.anaconda.org/conda-forge/osx-64/pyamg-5.1.0-py312h44e70fa_1.conda#ffbfe3b3d5e9675541ee516badfb7729 -https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-16.0.6-hb91bd55_16.conda#b5dacba087761db21ba9eb69b2c1718b -https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.4-py312hb401068_2.conda#456c057a3e2dcac3d02f4b9d25e277f5 -https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.7.0-h282daa2_1.conda#d27411cb82bc1b76b9f487da6ae97f1d -https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-16.0.6-h6d92fbe_16.conda#55fb2d5cbc9ec490347b1f797536fba8 -https://conda.anaconda.org/conda-forge/osx-64/gfortran_osx-64-12.3.0-h18f7dce_1.conda#436af2384c47aedb94af78a128e174f1 -https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-16.0.6-hb91bd55_16.conda#5879c43528a2601d04d64c5f9fdf3033 -https://conda.anaconda.org/conda-forge/osx-64/gfortran-12.3.0-h2c809b3_1.conda#c48adbaa8944234b80ef287c37e329b0 -https://conda.anaconda.org/conda-forge/osx-64/cxx-compiler-1.7.0-h7728843_1.conda#e04cb15a20553b973dd068c2dc81d682 -https://conda.anaconda.org/conda-forge/osx-64/fortran-compiler-1.7.0-h6c2ab21_1.conda#48319058089f492d5059e04494b81ed9 -https://conda.anaconda.org/conda-forge/osx-64/compilers-1.7.0-h694c41f_1.conda#875e9b06186a41d55b96b9c1a52f15be +https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-17.0.6-h1af8efd_19.conda#259772eca66f37161379f078ace329e5 +https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.9.2-py312h0d5aeb7_0.conda#0c73a08429d20f15fa8b28083ec04cc9 +https://conda.anaconda.org/conda-forge/osx-64/pyamg-5.2.1-py312h44e70fa_0.conda#a7c77239f0135d30cbba0164922aa861 +https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-17.0.6-hb91bd55_19.conda#687f001448d6a4dc367e62f934fb4afe +https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.9.2-py312hb401068_0.conda#f468fd4f10632ff2500482118a3d4ace +https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.8.0-hb714fc7_0.conda#71b4b830facf1fe50f7a3c753a7b99bb +https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-17.0.6-hc3430b7_19.conda#5b93950c253f46c500993d7ad972e44e +https://conda.anaconda.org/conda-forge/osx-64/gfortran_osx-64-13.2.0-h18f7dce_1.conda#71d59c1ae3fea7a97154ff0e20b38df3 +https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-17.0.6-hb91bd55_19.conda#0eafbc533fd9a4bb1e3e77f9be348afb +https://conda.anaconda.org/conda-forge/osx-64/gfortran-13.2.0-h2c809b3_1.conda#b5ad3b799b9ae996fcc8aab3a60fb48e +https://conda.anaconda.org/conda-forge/osx-64/cxx-compiler-1.8.0-h6a1c779_0.conda#a61a75c445dba355b9bf7006332fea7b +https://conda.anaconda.org/conda-forge/osx-64/fortran-compiler-1.8.0-h33d1f46_0.conda#c69efb52bf1eea6570a816278d64d683 +https://conda.anaconda.org/conda-forge/osx-64/compilers-1.8.0-h694c41f_0.conda#3d9fa39371da870a987fc83a24366c1c diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml b/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml index 7e85b28b3f6c4..4752e10556a92 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml @@ -25,3 +25,4 @@ dependencies: - cython - threadpoolctl - meson-python + - meson<1.5 diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock index d38d4fcd82d6f..04c06e437881c 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock @@ -1,11 +1,11 @@ # Generated by conda-lock. # platform: osx-64 -# input_hash: 33a102d2ccde4e14e315a98b50340349af349f802403dd49589375b2b889f2d3 +# input_hash: 5845cb6c37d0833b4f2f61e276bf4f86f98aa0e19d9c74bfbc8ddcc73d251139 @EXPLICIT https://repo.anaconda.com/pkgs/main/osx-64/blas-1.0-mkl.conda#cb2c87e85ac8e0ceae776d26d4214c8a https://repo.anaconda.com/pkgs/main/osx-64/bzip2-1.0.8-h6c40b1e_6.conda#96224786021d0765ce05818fa3c59bdb -https://repo.anaconda.com/pkgs/main/osx-64/ca-certificates-2024.3.11-hecd8cb5_0.conda#a2e29a11940c66baf9942912096fad5f -https://repo.anaconda.com/pkgs/main/osx-64/jpeg-9e-h6c40b1e_1.conda#fc3e61fa41309946c9283fe8737d7f41 +https://repo.anaconda.com/pkgs/main/osx-64/ca-certificates-2024.7.2-hecd8cb5_0.conda#297cfad0c0eac53e5ac75674828eedd9 +https://repo.anaconda.com/pkgs/main/osx-64/jpeg-9e-h46256e1_3.conda#b1d9769eac428e11f5f922531a1da2e0 https://repo.anaconda.com/pkgs/main/osx-64/libbrotlicommon-1.0.9-h6c40b1e_8.conda#8e86dfa34b08bc664b19e1499e5465b8 https://repo.anaconda.com/pkgs/main/osx-64/libcxx-14.0.6-h9765a3e_0.conda#387757bb354ae9042370452cd0fb5627 https://repo.anaconda.com/pkgs/main/osx-64/libdeflate-1.17-hb664fd8_1.conda#b6116b8db33ea6a5b5287dae70d4a913 @@ -17,7 +17,7 @@ https://repo.anaconda.com/pkgs/main/noarch/tzdata-2024a-h04d1e81_0.conda#452af53 https://repo.anaconda.com/pkgs/main/osx-64/xz-5.4.6-h6c40b1e_1.conda#b40d69768d28133d8be1843def4f82f5 https://repo.anaconda.com/pkgs/main/osx-64/zlib-1.2.13-h4b97444_1.conda#38e35f7c817fac0973034bfce6706ec2 https://repo.anaconda.com/pkgs/main/osx-64/ccache-3.7.9-hf120daa_0.conda#a01515a32e721c51d631283f991bc8ea -https://repo.anaconda.com/pkgs/main/osx-64/expat-2.6.2-hcec6c5f_0.conda#c748234dd7e242784198ab038372cb0c +https://repo.anaconda.com/pkgs/main/osx-64/expat-2.6.3-h6d0c2b6_0.conda#7cfb1a4651369640118e6ee80198e682 https://repo.anaconda.com/pkgs/main/osx-64/intel-openmp-2023.1.0-ha357a0b_43548.conda#ba8a89ffe593eb88e4c01334753c40c3 https://repo.anaconda.com/pkgs/main/osx-64/lerc-3.0-he9d5cce_0.conda#aec2c3dbef836849c9260f05be04f3db https://repo.anaconda.com/pkgs/main/osx-64/libbrotlidec-1.0.9-h6c40b1e_8.conda#6338cd7779e614fc16d835990e627e04 @@ -26,7 +26,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/libgfortran5-11.3.0-h9dfd629_28.conda https://repo.anaconda.com/pkgs/main/osx-64/libpng-1.6.39-h6c40b1e_0.conda#a3c824835f53ad27aeb86d2b55e47804 https://repo.anaconda.com/pkgs/main/osx-64/lz4-c-1.9.4-hcec6c5f_1.conda#aee0efbb45220e1985533dbff48551f8 https://repo.anaconda.com/pkgs/main/osx-64/ninja-base-1.10.2-haf03e11_5.conda#c857c13129710a61395270656905c4a2 -https://repo.anaconda.com/pkgs/main/osx-64/openssl-3.0.13-hca72f7f_2.conda#4f840ec6217dff98040ff6be19cf3afb +https://repo.anaconda.com/pkgs/main/osx-64/openssl-3.0.15-h46256e1_0.conda#3286ae31653124afad386b813a5d17da https://repo.anaconda.com/pkgs/main/osx-64/readline-8.2-hca72f7f_0.conda#971667436260e523f6f7355fdfa238bf https://repo.anaconda.com/pkgs/main/osx-64/tbb-2021.8.0-ha357a0b_0.conda#fb48530a3eea681c11dafb95b3387c0f https://repo.anaconda.com/pkgs/main/osx-64/tk-8.6.14-h4d00af3_0.conda#a2c03940c2ae54614301ec82e6a98d75 @@ -38,49 +38,49 @@ https://repo.anaconda.com/pkgs/main/osx-64/sqlite-3.45.3-h6c40b1e_0.conda#2edf90 https://repo.anaconda.com/pkgs/main/osx-64/zstd-1.5.5-hc035e20_2.conda#c033bf68c12f8c71fd916f000f3dc118 https://repo.anaconda.com/pkgs/main/osx-64/brotli-1.0.9-h6c40b1e_8.conda#10f89677a3898d0113dc354adf643df3 https://repo.anaconda.com/pkgs/main/osx-64/libtiff-4.5.1-hcec6c5f_0.conda#e127a800ffd9d300ed7d5e1b026944ec -https://repo.anaconda.com/pkgs/main/osx-64/python-3.12.3-hd58486a_1.conda#cdc61e8f6c2d77b3b263e720048c4b54 +https://repo.anaconda.com/pkgs/main/osx-64/python-3.12.4-hcd54a6c_1.conda#753d941593548d5e26518c51b3e3b10d https://repo.anaconda.com/pkgs/main/osx-64/coverage-7.2.2-py312h6c40b1e_0.conda#b6e4b9fba325047c07f3c9211ae91d1c https://repo.anaconda.com/pkgs/main/noarch/cycler-0.11.0-pyhd3eb1b0_0.conda#f5e365d2cdb66d547eb8c3ab93843aab https://repo.anaconda.com/pkgs/main/noarch/execnet-1.9.0-pyhd3eb1b0_0.conda#f895937671af67cebb8af617494b3513 https://repo.anaconda.com/pkgs/main/noarch/iniconfig-1.1.1-pyhd3eb1b0_0.tar.bz2#e40edff2c5708f342cef43c7f280c507 -https://repo.anaconda.com/pkgs/main/osx-64/joblib-1.4.0-py312hecd8cb5_0.conda#0af12a3a87d9c8051ae6ba2ed2c3882a +https://repo.anaconda.com/pkgs/main/osx-64/joblib-1.4.2-py312hecd8cb5_0.conda#8ab03dfa447b4e0bfa0bd3d25930f3b6 https://repo.anaconda.com/pkgs/main/osx-64/kiwisolver-1.4.4-py312hcec6c5f_0.conda#2ba6561ddd1d05936fe74f5d118ce7dd https://repo.anaconda.com/pkgs/main/osx-64/lcms2-2.12-hf1fd2bf_0.conda#697aba7a3308226df7a93ccfeae16ffa https://repo.anaconda.com/pkgs/main/osx-64/mkl-service-2.4.0-py312h6c40b1e_1.conda#b1ef860be9043b35c5e8d9388b858514 https://repo.anaconda.com/pkgs/main/osx-64/ninja-1.10.2-hecd8cb5_5.conda#a0043b325fb08db82477ae433668e684 -https://repo.anaconda.com/pkgs/main/osx-64/openjpeg-2.4.0-h66ea3da_0.conda#882833bd7befc5e60e6fba9c518c1b79 -https://repo.anaconda.com/pkgs/main/osx-64/packaging-23.2-py312hecd8cb5_0.conda#2b4e331c8f6df5d95a5dd3af37a34d89 +https://repo.anaconda.com/pkgs/main/osx-64/openjpeg-2.5.2-hbf2204d_0.conda#8463f11309271a93d615450382761470 +https://repo.anaconda.com/pkgs/main/osx-64/packaging-24.1-py312hecd8cb5_0.conda#6130dafc4d26d55e93ceab460d2a72b5 https://repo.anaconda.com/pkgs/main/osx-64/pluggy-1.0.0-py312hecd8cb5_1.conda#647fada22f1697691fdee90b52c99bcb -https://repo.anaconda.com/pkgs/main/osx-64/pyparsing-3.0.9-py312hecd8cb5_0.conda#d85cf2b81c6d9326a57a6418e14db258 +https://repo.anaconda.com/pkgs/main/osx-64/pyparsing-3.1.2-py312hecd8cb5_0.conda#645e2108165e45a3a385f0e11d1748a1 https://repo.anaconda.com/pkgs/main/noarch/python-tzdata-2023.3-pyhd3eb1b0_0.conda#479c037de0186d114b9911158427624e https://repo.anaconda.com/pkgs/main/osx-64/pytz-2024.1-py312hecd8cb5_0.conda#2b28ec0e0d07f5c0c701f75200b1e8b6 -https://repo.anaconda.com/pkgs/main/osx-64/setuptools-69.5.1-py312hecd8cb5_0.conda#5c7c7ef1e0762e3ca1f543d28310946f +https://repo.anaconda.com/pkgs/main/osx-64/setuptools-72.1.0-py312hecd8cb5_0.conda#dff219f3528a6e8ad235c48a29cd6dbe https://repo.anaconda.com/pkgs/main/noarch/six-1.16.0-pyhd3eb1b0_1.conda#34586824d411d36af2fa40e799c172d0 https://repo.anaconda.com/pkgs/main/noarch/toml-0.10.2-pyhd3eb1b0_0.conda#cda05f5f6d8509529d1a2743288d197a -https://repo.anaconda.com/pkgs/main/osx-64/tornado-6.3.3-py312h6c40b1e_0.conda#49173b5a36c9134865221f29d4a73fb6 +https://repo.anaconda.com/pkgs/main/osx-64/tornado-6.4.1-py312h46256e1_0.conda#ff2efd781e1b1af38284aeda9d676d42 https://repo.anaconda.com/pkgs/main/osx-64/unicodedata2-15.1.0-py312h6c40b1e_0.conda#65bd2cb787fc99662d9bb6e6520c5826 https://repo.anaconda.com/pkgs/main/osx-64/wheel-0.43.0-py312hecd8cb5_0.conda#c0bdd5748b170523232e8ad1d667136c https://repo.anaconda.com/pkgs/main/osx-64/fonttools-4.51.0-py312h6c40b1e_0.conda#8f55fa86b73e8a7f4403503f9b7a9959 https://repo.anaconda.com/pkgs/main/osx-64/numpy-base-1.26.4-py312h6f81483_0.conda#87f73efbf26ab2e2ea7c32481a71bd47 -https://repo.anaconda.com/pkgs/main/osx-64/pillow-10.3.0-py312h6c40b1e_0.conda#fe883fa4247d35fe6de49f713529ca02 -https://repo.anaconda.com/pkgs/main/osx-64/pip-24.0-py312hecd8cb5_0.conda#7a8e0b1d3742ddf1c8aa97fbaa158039 +https://repo.anaconda.com/pkgs/main/osx-64/pillow-10.4.0-py312h46256e1_0.conda#486a21e17faf0611e454c0e7faf0bcbc +https://repo.anaconda.com/pkgs/main/osx-64/pip-24.2-py312hecd8cb5_0.conda#35119ef238299ccf29b25889fd466139 https://repo.anaconda.com/pkgs/main/osx-64/pytest-7.4.4-py312hecd8cb5_0.conda#d4dda983900b045cd27ae836cad670de https://repo.anaconda.com/pkgs/main/osx-64/python-dateutil-2.9.0post0-py312hecd8cb5_2.conda#1047dde28f78127dd9f6121e882926dd https://repo.anaconda.com/pkgs/main/osx-64/pytest-cov-4.1.0-py312hecd8cb5_1.conda#a33a24eb20359f464938e75b2f57e23a https://repo.anaconda.com/pkgs/main/osx-64/pytest-xdist-3.5.0-py312hecd8cb5_0.conda#d1ecfb3691cceecb1f16bcfdf0b67bb5 https://repo.anaconda.com/pkgs/main/osx-64/bottleneck-1.3.7-py312h32608ca_0.conda#f96a01eba5ea542cf9c7cc8d77447627 https://repo.anaconda.com/pkgs/main/osx-64/contourpy-1.2.0-py312ha357a0b_0.conda#57d384ad07152375b40a6293f79e3f0c -https://repo.anaconda.com/pkgs/main/osx-64/matplotlib-3.8.4-py312hecd8cb5_0.conda#6886c230c2ec2f47621b5cca4c7d493a -https://repo.anaconda.com/pkgs/main/osx-64/matplotlib-base-3.8.4-py312h7f12edd_0.conda#a4eee14a4dcaa89b306ca33d2d479fa4 +https://repo.anaconda.com/pkgs/main/osx-64/matplotlib-3.9.2-py312hecd8cb5_0.conda#4a0c6fbe79aefa058fddc09690772afa +https://repo.anaconda.com/pkgs/main/osx-64/matplotlib-base-3.9.2-py312ha7ebc0d_0.conda#a5396c401f535238325577ab702ac32a https://repo.anaconda.com/pkgs/main/osx-64/mkl_fft-1.3.8-py312h6c40b1e_0.conda#d59d01b940493f2b6a84aac922fd0c76 https://repo.anaconda.com/pkgs/main/osx-64/mkl_random-1.2.4-py312ha357a0b_0.conda#c1ea9c8eee79a5af3399f3c31be0e9c6 https://repo.anaconda.com/pkgs/main/osx-64/numpy-1.26.4-py312hac873b0_0.conda#3150bac1e382156f82a153229e1ebd06 https://repo.anaconda.com/pkgs/main/osx-64/numexpr-2.8.7-py312hac873b0_0.conda#6303ba071636ef57fddf69eb6f440ec1 https://repo.anaconda.com/pkgs/main/osx-64/scipy-1.11.4-py312h81688c2_0.conda#7d57b4c21a9261f97fa511e0940c5d93 -https://repo.anaconda.com/pkgs/main/osx-64/pandas-2.2.1-py312he282a81_0.conda#021b70a1e40efb75b89eb8ebdb347132 +https://repo.anaconda.com/pkgs/main/osx-64/pandas-2.2.2-py312h77d3abe_0.conda#463868c40d8ff98bec263f1fd57a8d97 https://repo.anaconda.com/pkgs/main/osx-64/pyamg-4.2.3-py312h44cbcf4_0.conda#3bdc7be74087b3a5a83c520a74e1e8eb -# pip cython @ https://files.pythonhosted.org/packages/d5/6d/06c08d75adb98cdf72af18801e193d22580cc86ca553610f430f18ea26b3/Cython-3.0.10-cp312-cp312-macosx_10_9_x86_64.whl#sha256=8f2864ab5fcd27a346f0b50f901ebeb8f60b25a60a575ccfd982e7f3e9674914 -# pip meson @ https://files.pythonhosted.org/packages/44/b2/d4433391a7c5e94a39b50ca7295a8ceba736e7c72c455752a60122f52453/meson-1.4.1-py3-none-any.whl#sha256=d5acc3abae2dad3c70ddcbd10acac92b78b144d34d43f40f5b8ac31dfd8a826a +# pip cython @ https://files.pythonhosted.org/packages/58/50/fbb23239efe2183e4eaf76689270d6f5b3bbcf9be9ad1eb97cc34349e6fc/Cython-3.0.11-cp312-cp312-macosx_10_9_x86_64.whl#sha256=11996c40c32abf843ba652a6d53cb15944c88d91f91fc4e6f0028f5df8a8f8a1 +# pip meson @ https://files.pythonhosted.org/packages/1d/8d/b83d525907c00c5e22a9cae832bbd958310518ae6ad1dc7e01b69abbb117/meson-1.4.2.tar.gz#sha256=ea2546a26f4a171a741c1fd036f22c9c804d6198e3259f1df588e01f842dd69f # pip threadpoolctl @ https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl#sha256=56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467 # pip pyproject-metadata @ https://files.pythonhosted.org/packages/aa/5f/bb5970d3d04173b46c9037109f7f05fc8904ff5be073ee49bb6ff00301bc/pyproject_metadata-0.8.0-py3-none-any.whl#sha256=ad858d448e1d3a1fb408ac5bac9ea7743e7a8bbb472f2693aaa334d2db42f526 # pip meson-python @ https://files.pythonhosted.org/packages/91/c0/104cb6244c83fe6bc3886f144cc433db0c0c78efac5dc00e409a5a08c87d/meson_python-0.16.0-py3-none-any.whl#sha256=842dc9f5dc29e55fc769ff1b6fe328412fe6c870220fc321060a1d2d395e69e8 diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml b/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml index adb7add7622e1..2d9ca394a6ac9 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml +++ b/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml @@ -4,7 +4,7 @@ channels: - defaults dependencies: - - python=3.9 + - python=3.11 - ccache - pip - pip: @@ -27,3 +27,5 @@ dependencies: - numpydoc - lightgbm - scikit-image + - array-api-compat + - array-api-strict diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock index 449ca9a70121d..d3e309f445f96 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock @@ -1,88 +1,87 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 37f8029b6bb116e0d5856093424791a8c1ddc3f493e20fcb5d02cd32d516523d +# input_hash: 893e5f90e655d6606d6b7e308c1099125012b25c3444b5a4240d44b184531e00 @EXPLICIT https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda#c3473ff8bdb3d124ed5ff11ec380d6f9 -https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2024.3.11-h06a4308_0.conda#08529eb3504712baabcbda266a19feb7 +https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2024.7.2-h06a4308_0.conda#5c6799c01e9be4c7ba294f6530b2d562 https://repo.anaconda.com/pkgs/main/linux-64/ld_impl_linux-64-2.38-h1181459_1.conda#68eedfd9c06f2b0e6888d8db345b7f5b https://repo.anaconda.com/pkgs/main/noarch/tzdata-2024a-h04d1e81_0.conda#452af53adae0a5b06eb5d05c707b2f25 https://repo.anaconda.com/pkgs/main/linux-64/libgomp-11.2.0-h1234567_1.conda#b372c0eea9b60732fdae4b817a63c8cd https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-11.2.0-h1234567_1.conda#57623d10a70e09e1d048c2b2b6f4e2dd https://repo.anaconda.com/pkgs/main/linux-64/_openmp_mutex-5.1-1_gnu.conda#71d281e9c2192cb3fa425655a8defb85 https://repo.anaconda.com/pkgs/main/linux-64/libgcc-ng-11.2.0-h1234567_1.conda#a87728dabf3151fb9cfa990bd2eb0464 +https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h5eee18b_6.conda#f21a3ff51c1b271977f53ce956a69297 https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.4.4-h6a678d5_1.conda#70646cc713f0c43926cfdcfe9b695fe0 +https://repo.anaconda.com/pkgs/main/linux-64/libuuid-1.41.5-h5eee18b_0.conda#4a6a2354414c9080327274aa514e5299 https://repo.anaconda.com/pkgs/main/linux-64/ncurses-6.4-h6a678d5_0.conda#5558eec6e2191741a92f832ea826251c -https://repo.anaconda.com/pkgs/main/linux-64/openssl-3.0.13-h7f8727e_2.conda#0019453c25f5e72129f99236e60febaa +https://repo.anaconda.com/pkgs/main/linux-64/openssl-3.0.15-h5eee18b_0.conda#019e501b69841c6d4aeaef3b8619a678 https://repo.anaconda.com/pkgs/main/linux-64/xz-5.4.6-h5eee18b_1.conda#1562802f843297ee776a50b9329597ed https://repo.anaconda.com/pkgs/main/linux-64/zlib-1.2.13-h5eee18b_1.conda#92e42d8310108b0a440fb2e60b2b2a25 https://repo.anaconda.com/pkgs/main/linux-64/ccache-3.7.9-hfe4627d_0.conda#bef6fc681c273bb7bd0c67d1a591365e https://repo.anaconda.com/pkgs/main/linux-64/readline-8.2-h5eee18b_0.conda#be42180685cce6e6b0329201d9f48efb https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.14-h39e8969_0.conda#78dbc5e3c69143ebc037fc5d5b22e597 https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.45.3-h5eee18b_0.conda#acf93d6aceb74d6110e20b44cc45939e -https://repo.anaconda.com/pkgs/main/linux-64/python-3.9.19-h955ad1f_1.conda#4b453281859c293c9d577271f3b18a0d -https://repo.anaconda.com/pkgs/main/linux-64/setuptools-69.5.1-py39h06a4308_0.conda#3eb144d481b39c0fbbced789dd9b76b3 -https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.43.0-py39h06a4308_0.conda#40bb60408c7433d767fd8c65b35bc4a0 -https://repo.anaconda.com/pkgs/main/linux-64/pip-24.0-py39h06a4308_0.conda#7f8ce3af15cfecd12e4dda8c5cef5fb7 -# pip alabaster @ https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl#sha256=b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 -# pip babel @ https://files.pythonhosted.org/packages/27/45/377f7e32a5c93d94cd56542349b34efab5ca3f9e2fd5a68c5e93169aa32d/Babel-2.15.0-py3-none-any.whl#sha256=08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb -# pip certifi @ https://files.pythonhosted.org/packages/5b/11/1e78951465b4a225519b8c3ad29769c49e0d8d157a070f681d5b6d64737f/certifi-2024.6.2-py3-none-any.whl#sha256=ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 -# pip charset-normalizer @ https://files.pythonhosted.org/packages/98/69/5d8751b4b670d623aa7a47bef061d69c279e9f922f6705147983aa76c3ce/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 +https://repo.anaconda.com/pkgs/main/linux-64/python-3.11.9-h955ad1f_0.conda#5668a8845dd35bbbc9663c8f217a2ab8 +https://repo.anaconda.com/pkgs/main/linux-64/setuptools-72.1.0-py311h06a4308_0.conda#58a35dba367429761d046074dcfa8b19 +https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.43.0-py311h06a4308_0.conda#ec915b5ff89bdbcea7ef943d9e296967 +https://repo.anaconda.com/pkgs/main/linux-64/pip-24.2-py311h06a4308_0.conda#eff3ec695130b6912d64997edbc0db16 +# pip alabaster @ https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl#sha256=fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b +# pip array-api-compat @ https://files.pythonhosted.org/packages/0f/22/8228be1d3c6d4ffcf05cd89872ce65c1317b2af98d34b9d89b247d8d49cb/array_api_compat-1.8-py3-none-any.whl#sha256=140204454086264d37263bc4afe1182b428353e94e9edcc38d17b009863c982d +# pip babel @ https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl#sha256=368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b +# pip certifi @ https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl#sha256=922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 +# pip charset-normalizer @ https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 +# pip coverage @ https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6 # pip cycler @ https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl#sha256=85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 -# pip cython @ https://files.pythonhosted.org/packages/a7/f5/3dde4d96076888ceaa981827b098274c2b45ddd4b20d75a8cfaa92b91eec/Cython-3.0.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=651a15a8534ebfb9b58cb0b87c269c70984b6f9c88bfe65e4f635f0e3f07dfcd +# pip cython @ https://files.pythonhosted.org/packages/93/03/e330b241ad8aa12bb9d98b58fb76d4eb7dcbe747479aab5c29fce937b9e7/Cython-3.0.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=3999fb52d3328a6a5e8c63122b0a8bd110dfcdb98dda585a3def1426b991cba7 # pip docutils @ https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl#sha256=dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 -# pip exceptiongroup @ https://files.pythonhosted.org/packages/01/90/79fe92dd413a9cab314ef5c591b5aa9b9ba787ae4cadab75055b0ae00b33/exceptiongroup-1.2.1-py3-none-any.whl#sha256=5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad # pip execnet @ https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl#sha256=26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc -# pip fonttools @ https://files.pythonhosted.org/packages/c1/cb/b1877d606dfa1daca70324bf37afec2b0a386138c467580027b9b51188a8/fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f -# pip idna @ https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl#sha256=82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +# pip fonttools @ https://files.pythonhosted.org/packages/a4/22/0a0ad59d9367997fd74a00ad2e88d10559122e09f105e94d34c155aecc0a/fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3 +# pip idna @ https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl#sha256=050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac # pip imagesize @ https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl#sha256=0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b # pip iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 # pip joblib @ https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl#sha256=06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 -# pip kiwisolver @ https://files.pythonhosted.org/packages/c0/a8/841594f11d0b88d8aeb26991bc4dac38baa909dc58d0c4262a4f7893bcbf/kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff -# pip markupsafe @ https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 -# pip meson @ https://files.pythonhosted.org/packages/44/b2/d4433391a7c5e94a39b50ca7295a8ceba736e7c72c455752a60122f52453/meson-1.4.1-py3-none-any.whl#sha256=d5acc3abae2dad3c70ddcbd10acac92b78b144d34d43f40f5b8ac31dfd8a826a -# pip networkx @ https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl#sha256=f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2 +# pip kiwisolver @ https://files.pythonhosted.org/packages/a7/4b/2db7af3ed3af7c35f388d5f53c28e155cd402a55432d800c543dc6deb731/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18 +# pip markupsafe @ https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 +# pip meson @ https://files.pythonhosted.org/packages/b7/33/513a9ca4fd5892463abb38592105b78fd425214f7983033633e2e48cbd30/meson-1.5.1-py3-none-any.whl#sha256=5531e24e6cfd6000bf1c712793cf28dff032841370b1a3b941a894e4fde46e5a +# pip networkx @ https://files.pythonhosted.org/packages/38/e9/5f72929373e1a0e8d142a130f3f97e6ff920070f87f91c4e13e40e0fba5a/networkx-3.3-py3-none-any.whl#sha256=28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2 # pip ninja @ https://files.pythonhosted.org/packages/6d/92/8d7aebd4430ab5ff65df2bfee6d5745f95c004284db2d8ca76dcbfd9de47/ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl#sha256=84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b -# pip numpy @ https://files.pythonhosted.org/packages/54/30/c2a907b9443cf42b90c17ad10c1e8fa801975f01cb9764f3f8eb8aea638b/numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3 +# pip numpy @ https://files.pythonhosted.org/packages/d9/37/108d692f7e2544b9ae972c7bfa06c26717871c273ccec86470bc3132b04d/numpy-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf # pip packaging @ https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl#sha256=5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 -# pip pillow @ https://files.pythonhosted.org/packages/f5/6d/52e82352670e850f468de9e6bccced4202a09f58e7ea5ecdbf08283d85cb/pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl#sha256=1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8 +# pip pillow @ https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl#sha256=76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319 # pip pluggy @ https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl#sha256=44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 # pip pygments @ https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl#sha256=b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a -# pip pyparsing @ https://files.pythonhosted.org/packages/9d/ea/6d76df31432a0e6fdf81681a895f009a4bb47b3c39036db3e1b528191d52/pyparsing-3.1.2-py3-none-any.whl#sha256=f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742 +# pip pyparsing @ https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl#sha256=a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c # pip pytz @ https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl#sha256=328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 # pip six @ https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl#sha256=8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 # pip snowballstemmer @ https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl#sha256=c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a -# pip sphinxcontrib-applehelp @ https://files.pythonhosted.org/packages/56/89/fea3fbf6785b388e6cb8a1beaf62f96e80b37311bdeed6e133388a732426/sphinxcontrib_applehelp-1.0.8-py3-none-any.whl#sha256=cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4 -# pip sphinxcontrib-devhelp @ https://files.pythonhosted.org/packages/a0/52/1049d918d1d1c72857d285c3f0c64c1cbe0be394ce1c93a3d2aa4f39fe3b/sphinxcontrib_devhelp-1.0.6-py3-none-any.whl#sha256=6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f -# pip sphinxcontrib-htmlhelp @ https://files.pythonhosted.org/packages/c2/e9/74c4cda5b409af3222fda38f0774e616011bc935f639dbc0da5ca2d1be7d/sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl#sha256=393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04 +# pip sphinxcontrib-applehelp @ https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl#sha256=4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 +# pip sphinxcontrib-devhelp @ https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl#sha256=aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 +# pip sphinxcontrib-htmlhelp @ https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl#sha256=166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 # pip sphinxcontrib-jsmath @ https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl#sha256=2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 -# pip sphinxcontrib-qthelp @ https://files.pythonhosted.org/packages/80/b3/1beac14a88654d2e5120d0143b49be5ad450b86eb1963523d8dbdcc51eb2/sphinxcontrib_qthelp-1.0.7-py3-none-any.whl#sha256=e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182 -# pip sphinxcontrib-serializinghtml @ https://files.pythonhosted.org/packages/38/24/228bb903ea87b9e08ab33470e6102402a644127108c7117ac9c00d849f82/sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl#sha256=326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7 +# pip sphinxcontrib-qthelp @ https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl#sha256=b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb +# pip sphinxcontrib-serializinghtml @ https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl#sha256=6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 # pip tabulate @ https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl#sha256=024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f # pip threadpoolctl @ https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl#sha256=56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467 -# pip tomli @ https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl#sha256=939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc # pip tzdata @ https://files.pythonhosted.org/packages/65/58/f9c9e6be752e9fcb8b6a0ee9fb87e6e7a1f6bcab2cdc73f02bb7ba91ada0/tzdata-2024.1-py2.py3-none-any.whl#sha256=9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252 -# pip urllib3 @ https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl#sha256=450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d -# pip zipp @ https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl#sha256=f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c -# pip contourpy @ https://files.pythonhosted.org/packages/31/a2/2f12e3a6e45935ff694654b710961b03310b0e1ec997ee9f416d3c873f87/contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445 -# pip coverage @ https://files.pythonhosted.org/packages/07/e0/0e30ca5c6c5bcae86df9583c30807ff26e0b991e76f266b81224410663e4/coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7 -# pip imageio @ https://files.pythonhosted.org/packages/a3/b6/39c7dad203d9984225f47e0aa39ac3ba3a47c77a02d0ef2a7be691855a06/imageio-2.34.1-py3-none-any.whl#sha256=408c1d4d62f72c9e8347e7d1ca9bc11d8673328af3913868db3b828e28b40a4c -# pip importlib-metadata @ https://files.pythonhosted.org/packages/2d/0a/679461c511447ffaf176567d5c496d1de27cbe34a87df6677d7171b2fbd4/importlib_metadata-7.1.0-py3-none-any.whl#sha256=30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 -# pip importlib-resources @ https://files.pythonhosted.org/packages/75/06/4df55e1b7b112d183f65db9503bff189e97179b256e1ea450a3c365241e0/importlib_resources-6.4.0-py3-none-any.whl#sha256=50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c +# pip urllib3 @ https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl#sha256=a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 +# pip array-api-strict @ https://files.pythonhosted.org/packages/08/06/aba69bce257fd1cda0d1db616c12728af0f46878a5cc1923fcbb94201947/array_api_strict-2.0.1-py3-none-any.whl#sha256=f74cbf0d0c182fcb45c5ee7f28f9c7b77e6281610dfbbdd63be60b1a5a7872b3 +# pip contourpy @ https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d +# pip imageio @ https://files.pythonhosted.org/packages/1e/b7/02adac4e42a691008b5cfb31db98c190e1fc348d1521b9be4429f9454ed1/imageio-2.35.1-py3-none-any.whl#sha256=6eb2e5244e7a16b85c10b5c2fe0f7bf961b40fcb9f1a9fd1bd1d2c2f8fb3cd65 # pip jinja2 @ https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # pip lazy-loader @ https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl#sha256=342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc # pip pyproject-metadata @ https://files.pythonhosted.org/packages/aa/5f/bb5970d3d04173b46c9037109f7f05fc8904ff5be073ee49bb6ff00301bc/pyproject_metadata-0.8.0-py3-none-any.whl#sha256=ad858d448e1d3a1fb408ac5bac9ea7743e7a8bbb472f2693aaa334d2db42f526 -# pip pytest @ https://files.pythonhosted.org/packages/4e/e7/81ebdd666d3bff6670d27349b5053605d83d55548e6bd5711f3b0ae7dd23/pytest-8.2.2-py3-none-any.whl#sha256=c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 +# pip pytest @ https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl#sha256=4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 # pip python-dateutil @ https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl#sha256=a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # pip requests @ https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl#sha256=70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 -# pip scipy @ https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d -# pip tifffile @ https://files.pythonhosted.org/packages/d9/6c/740c07588434e86028c24b0653c1eb6b46904d9ce585a20f07590620ec41/tifffile-2024.5.22-py3-none-any.whl#sha256=e281781c15d7d197d7e12749849c965651413aa905f97a48b0f84bd90a3b4c6f -# pip lightgbm @ https://files.pythonhosted.org/packages/ba/11/cb8b67f3cbdca05b59a032bb57963d4fe8c8d18c3870f30bed005b7f174d/lightgbm-4.3.0-py3-none-manylinux_2_28_x86_64.whl#sha256=104496a3404cb2452d3412cbddcfbfadbef9c372ea91e3a9b8794bcc5183bf07 -# pip matplotlib @ https://files.pythonhosted.org/packages/d3/6d/45837c5b3d0005a5a9b04729b218a16bf3aa195701c6b33b2cc39ae943b6/matplotlib-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89 +# pip scipy @ https://files.pythonhosted.org/packages/93/6b/701776d4bd6bdd9b629c387b5140f006185bd8ddea16788a44434376b98f/scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2 +# pip tifffile @ https://files.pythonhosted.org/packages/3a/4f/73714b1c1d339b1545cac28764e39f88c69468b5e10e51f327f9aa9d55b9/tifffile-2024.8.30-py3-none-any.whl#sha256=8bc59a8f02a2665cd50a910ec64961c5373bee0b8850ec89d3b7b485bf7be7ad +# pip lightgbm @ https://files.pythonhosted.org/packages/4e/19/1b928cad70a4e1a3e2c37d5417ca2182510f2451eaadb6c91cd9ec692cae/lightgbm-4.5.0-py3-none-manylinux_2_28_x86_64.whl#sha256=960a0e7c077de0ca3053f1325d3edfc92ea815acf5176adcacdea0f635aeef9b +# pip matplotlib @ https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447 # pip meson-python @ https://files.pythonhosted.org/packages/91/c0/104cb6244c83fe6bc3886f144cc433db0c0c78efac5dc00e409a5a08c87d/meson_python-0.16.0-py3-none-any.whl#sha256=842dc9f5dc29e55fc769ff1b6fe328412fe6c870220fc321060a1d2d395e69e8 -# pip pandas @ https://files.pythonhosted.org/packages/bb/30/f6f1f1ac36250f50c421b1b6af08c35e5a8b5a84385ef928625336b93e6f/pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921 -# pip pyamg @ https://files.pythonhosted.org/packages/68/a9/aed9f557e7eb779d2cb4fa090663f8540979e0c04dadd16e9a0bdc9632c5/pyamg-5.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=5817d4567fb240dab4779bb1630bbb3035b3827731fcdaeb9ecc9c8814319995 +# pip pandas @ https://files.pythonhosted.org/packages/fc/a5/4d82be566f069d7a9a702dcdf6f9106df0e0b042e738043c0cc7ddd7e3f6/pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee +# pip pyamg @ https://files.pythonhosted.org/packages/d3/e8/6898b3b791f369605012e896ed903b6626f3bd1208c6a647d7219c070209/pyamg-5.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=679a5904eac3a4880288c8c0e6a29f110a2627ea15a443a4e9d5997c7dc5fab6 # pip pytest-cov @ https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl#sha256=4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652 # pip pytest-xdist @ https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl#sha256=9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 -# pip scikit-image @ https://files.pythonhosted.org/packages/a3/7e/4cd853a855ac34b4ef3ef6a5c3d1c2e96eaca1154fc6be75db55ffa87393/scikit_image-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=3b7a6c89e8d6252332121b58f50e1625c35f7d6a85489c0b6b7ee4f5155d547a -# pip sphinx @ https://files.pythonhosted.org/packages/b4/fa/130c32ed94cf270e3d0b9ded16fb7b2c8fea86fa7263c29a696a30c1dde7/sphinx-7.3.7-py3-none-any.whl#sha256=413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3 -# pip numpydoc @ https://files.pythonhosted.org/packages/f0/fa/dcfe0f65660661db757ee9ebd84e170ff98edd5d80235f62457d9088f85f/numpydoc-1.7.0-py3-none-any.whl#sha256=5a56419d931310d79a06cfc2a126d1558700feeb9b4f3d8dcae1a8134be829c9 +# pip scikit-image @ https://files.pythonhosted.org/packages/ad/96/138484302b8ec9a69cdf65e8d4ab47a640a3b1a8ea3c437e1da3e1a5a6b8/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=fa27b3a0dbad807b966b8db2d78da734cb812ca4787f7fbb143764800ce2fa9c +# pip sphinx @ https://files.pythonhosted.org/packages/4d/61/2ad169c6ff1226b46e50da0e44671592dbc6d840a52034a0193a99b28579/sphinx-8.0.2-py3-none-any.whl#sha256=56173572ae6c1b9a38911786e206a110c9749116745873feae4f9ce88e59391d +# pip numpydoc @ https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl#sha256=72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 diff --git a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock index 502d425d2adb7..9da78736760b2 100644 --- a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock @@ -3,7 +3,7 @@ # input_hash: 8a4a203136d97ff3b2c8657fce2dd2228215bfbf9c1cfbe271e401f934bdf1a7 @EXPLICIT https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda#c3473ff8bdb3d124ed5ff11ec380d6f9 -https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2024.3.11-h06a4308_0.conda#08529eb3504712baabcbda266a19feb7 +https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2024.7.2-h06a4308_0.conda#5c6799c01e9be4c7ba294f6530b2d562 https://repo.anaconda.com/pkgs/main/linux-64/ld_impl_linux-64-2.38-h1181459_1.conda#68eedfd9c06f2b0e6888d8db345b7f5b https://repo.anaconda.com/pkgs/main/noarch/tzdata-2024a-h04d1e81_0.conda#452af53adae0a5b06eb5d05c707b2f25 https://repo.anaconda.com/pkgs/main/linux-64/libgomp-11.2.0-h1234567_1.conda#b372c0eea9b60732fdae4b817a63c8cd @@ -11,11 +11,11 @@ https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-11.2.0-h1234567_1.cond https://repo.anaconda.com/pkgs/main/linux-64/_openmp_mutex-5.1-1_gnu.conda#71d281e9c2192cb3fa425655a8defb85 https://repo.anaconda.com/pkgs/main/linux-64/libgcc-ng-11.2.0-h1234567_1.conda#a87728dabf3151fb9cfa990bd2eb0464 https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h5eee18b_6.conda#f21a3ff51c1b271977f53ce956a69297 -https://repo.anaconda.com/pkgs/main/linux-64/expat-2.6.2-h6a678d5_0.conda#55049db2772dae035f6b8a95f72b5970 +https://repo.anaconda.com/pkgs/main/linux-64/expat-2.6.3-h6a678d5_0.conda#5e184279ccb8b85331093305cb548f5c https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.4.4-h6a678d5_1.conda#70646cc713f0c43926cfdcfe9b695fe0 https://repo.anaconda.com/pkgs/main/linux-64/libuuid-1.41.5-h5eee18b_0.conda#4a6a2354414c9080327274aa514e5299 https://repo.anaconda.com/pkgs/main/linux-64/ncurses-6.4-h6a678d5_0.conda#5558eec6e2191741a92f832ea826251c -https://repo.anaconda.com/pkgs/main/linux-64/openssl-3.0.14-h5eee18b_0.conda#37b6dad6aa49000a4230a9f0cad172f6 +https://repo.anaconda.com/pkgs/main/linux-64/openssl-3.0.15-h5eee18b_0.conda#019e501b69841c6d4aeaef3b8619a678 https://repo.anaconda.com/pkgs/main/linux-64/xz-5.4.6-h5eee18b_1.conda#1562802f843297ee776a50b9329597ed https://repo.anaconda.com/pkgs/main/linux-64/zlib-1.2.13-h5eee18b_1.conda#92e42d8310108b0a440fb2e60b2b2a25 https://repo.anaconda.com/pkgs/main/linux-64/ccache-3.7.9-hfe4627d_0.conda#bef6fc681c273bb7bd0c67d1a591365e @@ -23,45 +23,45 @@ https://repo.anaconda.com/pkgs/main/linux-64/readline-8.2-h5eee18b_0.conda#be421 https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.14-h39e8969_0.conda#78dbc5e3c69143ebc037fc5d5b22e597 https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.45.3-h5eee18b_0.conda#acf93d6aceb74d6110e20b44cc45939e https://repo.anaconda.com/pkgs/main/linux-64/python-3.12.4-h5148396_1.conda#7863dc035441267f7b617f080c933671 -https://repo.anaconda.com/pkgs/main/linux-64/setuptools-69.5.1-py312h06a4308_0.conda#ce85d9a864a73e0b12d31a97733c9fca +https://repo.anaconda.com/pkgs/main/linux-64/setuptools-72.1.0-py312h06a4308_0.conda#bab64ac5186aa07014788baf1fbe3ca9 https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.43.0-py312h06a4308_0.conda#18d5f3b68a175c72576876db4afc9e9e -https://repo.anaconda.com/pkgs/main/linux-64/pip-24.0-py312h06a4308_0.conda#6d9697bb8b9f3212be10b3b8e01a12b9 -# pip alabaster @ https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl#sha256=b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 -# pip babel @ https://files.pythonhosted.org/packages/27/45/377f7e32a5c93d94cd56542349b34efab5ca3f9e2fd5a68c5e93169aa32d/Babel-2.15.0-py3-none-any.whl#sha256=08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb -# pip certifi @ https://files.pythonhosted.org/packages/5b/11/1e78951465b4a225519b8c3ad29769c49e0d8d157a070f681d5b6d64737f/certifi-2024.6.2-py3-none-any.whl#sha256=ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +https://repo.anaconda.com/pkgs/main/linux-64/pip-24.2-py312h06a4308_0.conda#798cbea8112672434d0cd7551f8fc4b9 +# pip alabaster @ https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl#sha256=fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b +# pip babel @ https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl#sha256=368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b +# pip certifi @ https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl#sha256=922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 # pip charset-normalizer @ https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b -# pip coverage @ https://files.pythonhosted.org/packages/88/52/7054710a881b09d295e93b9889ac204c241a6847a8c05555fc6e1d8799d5/coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555 +# pip coverage @ https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca # pip docutils @ https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl#sha256=dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # pip execnet @ https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl#sha256=26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc -# pip idna @ https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl#sha256=82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +# pip idna @ https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl#sha256=050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac # pip imagesize @ https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl#sha256=0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b # pip iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 # pip markupsafe @ https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 -# pip meson @ https://files.pythonhosted.org/packages/44/b2/d4433391a7c5e94a39b50ca7295a8ceba736e7c72c455752a60122f52453/meson-1.4.1-py3-none-any.whl#sha256=d5acc3abae2dad3c70ddcbd10acac92b78b144d34d43f40f5b8ac31dfd8a826a +# pip meson @ https://files.pythonhosted.org/packages/b7/33/513a9ca4fd5892463abb38592105b78fd425214f7983033633e2e48cbd30/meson-1.5.1-py3-none-any.whl#sha256=5531e24e6cfd6000bf1c712793cf28dff032841370b1a3b941a894e4fde46e5a # pip ninja @ https://files.pythonhosted.org/packages/6d/92/8d7aebd4430ab5ff65df2bfee6d5745f95c004284db2d8ca76dcbfd9de47/ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl#sha256=84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b # pip packaging @ https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl#sha256=5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 -# pip platformdirs @ https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl#sha256=2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee +# pip platformdirs @ https://files.pythonhosted.org/packages/da/8b/d497999c4017b80678017ddce745cf675489c110681ad3c84a55eddfd3e7/platformdirs-4.3.2-py3-none-any.whl#sha256=eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617 # pip pluggy @ https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl#sha256=44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 # pip pygments @ https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl#sha256=b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a # pip six @ https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl#sha256=8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 # pip snowballstemmer @ https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl#sha256=c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a -# pip sphinxcontrib-applehelp @ https://files.pythonhosted.org/packages/56/89/fea3fbf6785b388e6cb8a1beaf62f96e80b37311bdeed6e133388a732426/sphinxcontrib_applehelp-1.0.8-py3-none-any.whl#sha256=cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4 -# pip sphinxcontrib-devhelp @ https://files.pythonhosted.org/packages/a0/52/1049d918d1d1c72857d285c3f0c64c1cbe0be394ce1c93a3d2aa4f39fe3b/sphinxcontrib_devhelp-1.0.6-py3-none-any.whl#sha256=6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f -# pip sphinxcontrib-htmlhelp @ https://files.pythonhosted.org/packages/c2/e9/74c4cda5b409af3222fda38f0774e616011bc935f639dbc0da5ca2d1be7d/sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl#sha256=393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04 +# pip sphinxcontrib-applehelp @ https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl#sha256=4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 +# pip sphinxcontrib-devhelp @ https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl#sha256=aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 +# pip sphinxcontrib-htmlhelp @ https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl#sha256=166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 # pip sphinxcontrib-jsmath @ https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl#sha256=2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 -# pip sphinxcontrib-qthelp @ https://files.pythonhosted.org/packages/80/b3/1beac14a88654d2e5120d0143b49be5ad450b86eb1963523d8dbdcc51eb2/sphinxcontrib_qthelp-1.0.7-py3-none-any.whl#sha256=e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182 -# pip sphinxcontrib-serializinghtml @ https://files.pythonhosted.org/packages/38/24/228bb903ea87b9e08ab33470e6102402a644127108c7117ac9c00d849f82/sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl#sha256=326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7 +# pip sphinxcontrib-qthelp @ https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl#sha256=b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb +# pip sphinxcontrib-serializinghtml @ https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl#sha256=6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 # pip tabulate @ https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl#sha256=024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f # pip threadpoolctl @ https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl#sha256=56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467 # pip urllib3 @ https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl#sha256=a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 # pip jinja2 @ https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # pip pyproject-metadata @ https://files.pythonhosted.org/packages/aa/5f/bb5970d3d04173b46c9037109f7f05fc8904ff5be073ee49bb6ff00301bc/pyproject_metadata-0.8.0-py3-none-any.whl#sha256=ad858d448e1d3a1fb408ac5bac9ea7743e7a8bbb472f2693aaa334d2db42f526 -# pip pytest @ https://files.pythonhosted.org/packages/4e/e7/81ebdd666d3bff6670d27349b5053605d83d55548e6bd5711f3b0ae7dd23/pytest-8.2.2-py3-none-any.whl#sha256=c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 +# pip pytest @ https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl#sha256=4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 # pip python-dateutil @ https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl#sha256=a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # pip requests @ https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl#sha256=70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # pip meson-python @ https://files.pythonhosted.org/packages/91/c0/104cb6244c83fe6bc3886f144cc433db0c0c78efac5dc00e409a5a08c87d/meson_python-0.16.0-py3-none-any.whl#sha256=842dc9f5dc29e55fc769ff1b6fe328412fe6c870220fc321060a1d2d395e69e8 # pip pooch @ https://files.pythonhosted.org/packages/a8/87/77cc11c7a9ea9fd05503def69e3d18605852cd0d4b0d3b8f15bbeb3ef1d1/pooch-1.8.2-py3-none-any.whl#sha256=3529a57096f7198778a5ceefd5ac3ef0e4d06a6ddaf9fc2d609b806f25302c47 # pip pytest-cov @ https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl#sha256=4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652 # pip pytest-xdist @ https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl#sha256=9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 -# pip sphinx @ https://files.pythonhosted.org/packages/b4/fa/130c32ed94cf270e3d0b9ded16fb7b2c8fea86fa7263c29a696a30c1dde7/sphinx-7.3.7-py3-none-any.whl#sha256=413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3 -# pip numpydoc @ https://files.pythonhosted.org/packages/f0/fa/dcfe0f65660661db757ee9ebd84e170ff98edd5d80235f62457d9088f85f/numpydoc-1.7.0-py3-none-any.whl#sha256=5a56419d931310d79a06cfc2a126d1558700feeb9b4f3d8dcae1a8134be829c9 +# pip sphinx @ https://files.pythonhosted.org/packages/4d/61/2ad169c6ff1226b46e50da0e44671592dbc6d840a52034a0193a99b28579/sphinx-8.0.2-py3-none-any.whl#sha256=56173572ae6c1b9a38911786e206a110c9749116745873feae4f9ce88e59391d +# pip numpydoc @ https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl#sha256=72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 diff --git a/build_tools/azure/pymin_conda_defaults_openblas_linux-64_conda.lock b/build_tools/azure/pymin_conda_defaults_openblas_linux-64_conda.lock deleted file mode 100644 index a83d0cef3e063..0000000000000 --- a/build_tools/azure/pymin_conda_defaults_openblas_linux-64_conda.lock +++ /dev/null @@ -1,99 +0,0 @@ -# Generated by conda-lock. -# platform: linux-64 -# input_hash: be0f080ab1974d224952262cd9179ff999d10108421d7e7ded2435e6f08edf0e -@EXPLICIT -https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda#c3473ff8bdb3d124ed5ff11ec380d6f9 -https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 -https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2024.3.11-h06a4308_0.conda#08529eb3504712baabcbda266a19feb7 -https://repo.anaconda.com/pkgs/main/linux-64/ld_impl_linux-64-2.38-h1181459_1.conda#68eedfd9c06f2b0e6888d8db345b7f5b -https://repo.anaconda.com/pkgs/main/linux-64/libgfortran5-11.2.0-h1234567_1.conda#36a01a8c30e0cadf0d3e842c50b73f3b -https://repo.anaconda.com/pkgs/main/noarch/tzdata-2024a-h04d1e81_0.conda#452af53adae0a5b06eb5d05c707b2f25 -https://repo.anaconda.com/pkgs/main/linux-64/libgfortran-ng-11.2.0-h00389a5_1.conda#7429b67ab7b1d7cb99b9d1f3ddaec6e3 -https://repo.anaconda.com/pkgs/main/linux-64/libgomp-11.2.0-h1234567_1.conda#b372c0eea9b60732fdae4b817a63c8cd -https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-11.2.0-h1234567_1.conda#57623d10a70e09e1d048c2b2b6f4e2dd -https://repo.anaconda.com/pkgs/main/linux-64/_openmp_mutex-5.1-1_gnu.conda#71d281e9c2192cb3fa425655a8defb85 -https://repo.anaconda.com/pkgs/main/linux-64/libgcc-ng-11.2.0-h1234567_1.conda#a87728dabf3151fb9cfa990bd2eb0464 -https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h5eee18b_6.conda#f21a3ff51c1b271977f53ce956a69297 -https://repo.anaconda.com/pkgs/main/linux-64/expat-2.6.2-h6a678d5_0.conda#55049db2772dae035f6b8a95f72b5970 -https://repo.anaconda.com/pkgs/main/linux-64/fftw-3.3.9-h5eee18b_2.conda#db1df41113accc18ec59a99f1631bfcd -https://repo.anaconda.com/pkgs/main/linux-64/icu-73.1-h6a678d5_0.conda#6d09df641fc23f7d277a04dc7ea32dd4 -https://repo.anaconda.com/pkgs/main/linux-64/jpeg-9e-h5eee18b_1.conda#ac373800fda872108412d1ccfe3fa572 -https://repo.anaconda.com/pkgs/main/linux-64/lerc-3.0-h295c915_0.conda#b97309770412f10bed8d9448f6f98f87 -https://repo.anaconda.com/pkgs/main/linux-64/libdeflate-1.17-h5eee18b_1.conda#82831ef0b6c9595382d74e0c281f6742 -https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.4.4-h6a678d5_1.conda#70646cc713f0c43926cfdcfe9b695fe0 -https://repo.anaconda.com/pkgs/main/linux-64/libiconv-1.16-h5eee18b_3.conda#197b1a0886a31fccab2167340528eebc -https://repo.anaconda.com/pkgs/main/linux-64/libopenblas-0.3.21-h043d6bf_0.conda#7f7324dcc3c4761a14f3e4ac443235a7 -https://repo.anaconda.com/pkgs/main/linux-64/libuuid-1.41.5-h5eee18b_0.conda#4a6a2354414c9080327274aa514e5299 -https://repo.anaconda.com/pkgs/main/linux-64/libwebp-base-1.3.2-h5eee18b_0.conda#9179fc7baefa1e027f572edbc519d805 -https://repo.anaconda.com/pkgs/main/linux-64/libxcb-1.15-h7f8727e_0.conda#ada518dcadd6aaee9aae47ba9a671553 -https://repo.anaconda.com/pkgs/main/linux-64/lz4-c-1.9.4-h6a678d5_1.conda#2ee58861f2b92b868ce761abb831819d -https://repo.anaconda.com/pkgs/main/linux-64/ncurses-6.4-h6a678d5_0.conda#5558eec6e2191741a92f832ea826251c -https://repo.anaconda.com/pkgs/main/linux-64/openssl-3.0.13-h7f8727e_2.conda#0019453c25f5e72129f99236e60febaa -https://repo.anaconda.com/pkgs/main/linux-64/xz-5.4.6-h5eee18b_1.conda#1562802f843297ee776a50b9329597ed -https://repo.anaconda.com/pkgs/main/linux-64/zlib-1.2.13-h5eee18b_1.conda#92e42d8310108b0a440fb2e60b2b2a25 -https://repo.anaconda.com/pkgs/main/linux-64/ccache-3.7.9-hfe4627d_0.conda#bef6fc681c273bb7bd0c67d1a591365e -https://repo.anaconda.com/pkgs/main/linux-64/libcups-2.4.2-h2d74bed_1.conda#3f265c2172a9e8c90a74037b6fa13685 -https://repo.anaconda.com/pkgs/main/linux-64/libedit-3.1.20230828-h5eee18b_0.conda#850eb5a9d2d7d3c66cce12e84406ca08 -https://repo.anaconda.com/pkgs/main/linux-64/libllvm14-14.0.6-hdb19cb5_3.conda#aefea2b45cf32f12b4f1ffaa70aa3201 -https://repo.anaconda.com/pkgs/main/linux-64/libpng-1.6.39-h5eee18b_0.conda#f6aee38184512eb05b06c2e94d39ab22 -https://repo.anaconda.com/pkgs/main/linux-64/libxml2-2.10.4-hfdd30dd_2.conda#ff7a0e3b92afb3c99b82c9f0ba8b5670 -https://repo.anaconda.com/pkgs/main/linux-64/pcre2-10.42-hebb0a14_1.conda#727e15c3cfa02b032da4eb0c1123e977 -https://repo.anaconda.com/pkgs/main/linux-64/readline-8.2-h5eee18b_0.conda#be42180685cce6e6b0329201d9f48efb -https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.14-h39e8969_0.conda#78dbc5e3c69143ebc037fc5d5b22e597 -https://repo.anaconda.com/pkgs/main/linux-64/zstd-1.5.5-hc292b87_2.conda#3b7fe809e5b429b4f90fe064842a2370 -https://repo.anaconda.com/pkgs/main/linux-64/freetype-2.12.1-h4a9f257_0.conda#bdc7b5952e9c5dca01bc2f4ccef2f974 -https://repo.anaconda.com/pkgs/main/linux-64/krb5-1.20.1-h143b758_1.conda#cf1accc86321fa25d6b978cc748039ae -https://repo.anaconda.com/pkgs/main/linux-64/libclang13-14.0.6-default_he11475f_1.conda#44890feda1cf51639d9c94afbacce011 -https://repo.anaconda.com/pkgs/main/linux-64/libglib-2.78.4-hdc74915_0.conda#2f6d27741e931d5b6ba56e1a1312aaf0 -https://repo.anaconda.com/pkgs/main/linux-64/libtiff-4.5.1-h6a678d5_0.conda#235a671f74f0c4ecad9f9b3b107e3566 -https://repo.anaconda.com/pkgs/main/linux-64/libxkbcommon-1.0.1-h5eee18b_1.conda#888b2e8f1bbf21017c503826e2d24b50 -https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.45.3-h5eee18b_0.conda#acf93d6aceb74d6110e20b44cc45939e -https://repo.anaconda.com/pkgs/main/linux-64/cyrus-sasl-2.1.28-h52b45da_1.conda#d634af1577e4008f9228ae96ce671c44 -https://repo.anaconda.com/pkgs/main/linux-64/fontconfig-2.14.1-h4c34cd2_2.conda#f0b472f5b544f8d57beb09ed4a2932e1 -https://repo.anaconda.com/pkgs/main/linux-64/glib-tools-2.78.4-h6a678d5_0.conda#3dbe6227cd59818dca9afb75ccb70708 -https://repo.anaconda.com/pkgs/main/linux-64/lcms2-2.12-h3be6417_0.conda#719db47afba9f6586eecb5eacac70bff -https://repo.anaconda.com/pkgs/main/linux-64/libclang-14.0.6-default_hc6dbbc7_1.conda#8f12583c4027b2861cff470f6b8837c4 -https://repo.anaconda.com/pkgs/main/linux-64/libpq-12.17-hdbd6064_0.conda#6bed363e25859faff66bf546a11c10e8 -https://repo.anaconda.com/pkgs/main/linux-64/openjpeg-2.4.0-h3ad879b_0.conda#86baecb47ecaa7f7ff2657a1f03b90c9 -https://repo.anaconda.com/pkgs/main/linux-64/python-3.9.19-h955ad1f_1.conda#4b453281859c293c9d577271f3b18a0d -https://repo.anaconda.com/pkgs/main/linux-64/certifi-2024.6.2-py39h06a4308_0.conda#738daf43271605d7291ecae0e8cac41c -https://repo.anaconda.com/pkgs/main/noarch/cycler-0.11.0-pyhd3eb1b0_0.conda#f5e365d2cdb66d547eb8c3ab93843aab -https://repo.anaconda.com/pkgs/main/linux-64/cython-3.0.10-py39h5eee18b_0.conda#1419a658ed2b4d5c3ac1964f33143b64 -https://repo.anaconda.com/pkgs/main/linux-64/exceptiongroup-1.2.0-py39h06a4308_0.conda#960e2cb83ac5134df8e593a130aa11af -https://repo.anaconda.com/pkgs/main/noarch/execnet-1.9.0-pyhd3eb1b0_0.conda#f895937671af67cebb8af617494b3513 -https://repo.anaconda.com/pkgs/main/linux-64/glib-2.78.4-h6a678d5_0.conda#045ff487547f7b2b7ff01648681b8ebe -https://repo.anaconda.com/pkgs/main/noarch/iniconfig-1.1.1-pyhd3eb1b0_0.tar.bz2#e40edff2c5708f342cef43c7f280c507 -https://repo.anaconda.com/pkgs/main/linux-64/joblib-1.2.0-py39h06a4308_0.conda#ac1f5687d70aa1128cbecb26bc9e559d -https://repo.anaconda.com/pkgs/main/linux-64/kiwisolver-1.4.4-py39h6a678d5_0.conda#3d57aedbfbd054ce57fb3c1e4448828c -https://repo.anaconda.com/pkgs/main/linux-64/mysql-5.7.24-h721c034_2.conda#dfc19ca2466d275c4c1f73b62c57f37b -https://repo.anaconda.com/pkgs/main/linux-64/numpy-base-1.21.6-py39h375b286_1.conda#0061d9193658774ab79fc85d143a94fc -https://repo.anaconda.com/pkgs/main/linux-64/packaging-23.2-py39h06a4308_0.conda#b3f88f45f31bde016e49be3e941e5272 -https://repo.anaconda.com/pkgs/main/linux-64/pillow-10.3.0-py39h5eee18b_0.conda#b346d6c71267c1553b6c18d3db5fdf6d -https://repo.anaconda.com/pkgs/main/linux-64/pluggy-1.0.0-py39h06a4308_1.conda#fb4fed11ed43cf727dbd51883cc1d9fa -https://repo.anaconda.com/pkgs/main/linux-64/ply-3.11-py39h06a4308_0.conda#6c89bf6d2fdf6d24126e34cb83fd10f1 -https://repo.anaconda.com/pkgs/main/linux-64/pyparsing-3.0.9-py39h06a4308_0.conda#3a0537468e59760404f63b4f04369828 -https://repo.anaconda.com/pkgs/main/linux-64/pyqt5-sip-12.13.0-py39h5eee18b_0.conda#256840c3841b52346ea5743be8490ede -https://repo.anaconda.com/pkgs/main/linux-64/setuptools-69.5.1-py39h06a4308_0.conda#3eb144d481b39c0fbbced789dd9b76b3 -https://repo.anaconda.com/pkgs/main/noarch/six-1.16.0-pyhd3eb1b0_1.conda#34586824d411d36af2fa40e799c172d0 -https://repo.anaconda.com/pkgs/main/noarch/toml-0.10.2-pyhd3eb1b0_0.conda#cda05f5f6d8509529d1a2743288d197a -https://repo.anaconda.com/pkgs/main/linux-64/tomli-2.0.1-py39h06a4308_0.conda#b06dffe7ddca2645ed72f5116f0a087d -https://repo.anaconda.com/pkgs/main/linux-64/tornado-6.3.3-py39h5eee18b_0.conda#9c4bd985bb8adcd12f47e790e95a9333 -https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.43.0-py39h06a4308_0.conda#40bb60408c7433d767fd8c65b35bc4a0 -https://repo.anaconda.com/pkgs/main/linux-64/coverage-7.2.2-py39h5eee18b_0.conda#e9da151b7e1f56be2cb569c65949a1d2 -https://repo.anaconda.com/pkgs/main/linux-64/dbus-1.13.18-hb2f20db_0.conda#6a6a6f1391f807847404344489ef6cf4 -https://repo.anaconda.com/pkgs/main/linux-64/gstreamer-1.14.1-h5eee18b_1.conda#f2f26e6f869b5d87f41bd059fae47c3e -https://repo.anaconda.com/pkgs/main/linux-64/numpy-1.21.6-py39hac523dd_1.conda#f379f92039f666828a193fadd18c9819 -https://repo.anaconda.com/pkgs/main/linux-64/pip-24.0-py39h06a4308_0.conda#7f8ce3af15cfecd12e4dda8c5cef5fb7 -https://repo.anaconda.com/pkgs/main/linux-64/pytest-7.4.4-py39h06a4308_0.conda#05ff36245067ecb0b6796a4f31a81f1c -https://repo.anaconda.com/pkgs/main/linux-64/python-dateutil-2.9.0post0-py39h06a4308_2.conda#d6566c6d6a0140e45f22787ae58ed6e8 -https://repo.anaconda.com/pkgs/main/linux-64/sip-6.7.12-py39h6a678d5_0.conda#6988a3e12fcacfedcac523c1e4c3167c -https://repo.anaconda.com/pkgs/main/linux-64/gst-plugins-base-1.14.1-h6a678d5_1.conda#afd9cbe949d670d24cc0a007aaec1fe1 -https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-base-3.3.4-py39h62a2d02_0.conda#dbab28222c740af8e21a3e5e2882c178 -https://repo.anaconda.com/pkgs/main/linux-64/pytest-cov-4.1.0-py39h06a4308_1.conda#8f41fce21670b120bf7fa8a7883380d9 -https://repo.anaconda.com/pkgs/main/linux-64/pytest-xdist-3.5.0-py39h06a4308_0.conda#e1d7ffcb1ee2ed9a84800f5c4bbbd7ae -https://repo.anaconda.com/pkgs/main/linux-64/scipy-1.7.3-py39hf838250_2.conda#0667ea5ac14d35e26da19a0f068739da -https://repo.anaconda.com/pkgs/main/linux-64/pyamg-4.2.3-py39h79cecc1_0.conda#afc634da8b81dc504179d53d334e6e55 -https://repo.anaconda.com/pkgs/main/linux-64/qt-main-5.15.2-h53bd1ea_10.conda#bd0c79e82df6323f638bdcb871891b61 -https://repo.anaconda.com/pkgs/main/linux-64/pyqt-5.15.10-py39h6a678d5_0.conda#52da5ff9b1144b078d2f41bab0b213f2 -https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-3.3.4-py39h06a4308_0.conda#384fc5e01ebfcf30e7161119d3029b5a -# pip threadpoolctl @ https://files.pythonhosted.org/packages/61/cf/6e354304bcb9c6413c4e02a747b600061c21d38ba51e7e544ac7bc66aecc/threadpoolctl-3.1.0-py3-none-any.whl#sha256=8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b diff --git a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock index e6fe3ab2d07dd..efe058b97f331 100644 --- a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock @@ -2,117 +2,124 @@ # platform: win-64 # input_hash: ea607aaeb7b1d1f8a1f821a9f505b3601083a218ec4763e2d72d3d3d800e718c @EXPLICIT -https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.6.2-h56e8100_0.conda#12a3a2b3a00a21bbb390d4de5ad8dd0f -https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_966.conda#35d7ea07ad6c878bd7240d2d6c1b8657 -https://conda.anaconda.org/conda-forge/win-64/mkl-include-2024.1.0-h66d3029_692.conda#60233966dc7c0261c9a443120b43c477 +https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda#4c4fd67c18619be5aa65dc5b6c72e490 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f +https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda#2d89243bfb53652c182a7c73182cce4f +https://conda.anaconda.org/conda-forge/win-64/mkl-include-2024.1.0-h66d3029_694.conda#1f80971a50e69c1f7af15707619df49e https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2#b0309b72560df66f71a9d5e34a5efdfa -https://conda.anaconda.org/conda-forge/win-64/python_abi-3.9-4_cp39.conda#948b0d93d4ab1372d8fd45e1560afd47 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/win-64/python_abi-3.9-5_cp39.conda#86ba1bbcf9b259d1592201f3c345c810 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2#72608f6cd3e5898229c3ea16deb1ac43 +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2#53a1c73e1e3d185516d7e3af177596d9 https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2#774130a326dee16f1ceb05cc687ee4f0 -https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-ha82c5b3_20.conda#e39cc4c34c53654ec939558993d9dc5b +https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_20.conda#ad33c7cd933d69b9dee0f48317cdf137 +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2#4289d80fb4d272f1f3b56cfe87ac90bd https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_20.conda#8558f367e1d7700554f7cdb823c46faf https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_20.conda#c21f1b4a3a30bbc3ef35a50957578e0e -https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda#26eb8ca6ea332b675e11704cce84a3be -https://conda.anaconda.org/conda-forge/win-64/icu-73.2-h63175ca_0.conda#0f47d9e3192d9e09ae300da0d28e0f56 +https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda#276e7ffe9ffe39688abc665ef0f45596 +https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.3.0-h63175ca_0.conda#1a8bc18b24014167b2184c5afbe6037e +https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.conda#3194499ee7d1a67404a87d0eefdd92c6 +https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda#8579b6bb8d18be7c0b27fb08adeeeb40 https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2#1900cb3cab5055833cfddb0ba233b074 -https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-hcfcfb64_1.conda#f77f319fb82980166569e1280d5b2864 -https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.20-hcfcfb64_0.conda#b12b5bde5eb201a1df75e49320cc938a +https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda#f7dc9a8f21d74eab46456df301da2972 +https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.21-h2466b09_0.conda#4ebe2206ebf4bf38f6084ad836110361 +https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda#21415fbf4d0de6767a621160b43e5dea https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2#2c96d1b6915b408893f9472569dee135 https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda#e1eb10b1cca179f2baa3601e4efc8712 https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda#3f1b948619c45b1ca714d60c7389092c -https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.4-h8ffe710_1.tar.bz2#04286d905a0dcb7f7d4a12bdfe02516d -https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda#73f5dc8e2d55d9a1e14b11f49c3b4a28 +https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda#8a7c1ad01f58623bfbae8d601db7cf3b https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda#abd61d0ab127ec5cd68f62c2969e6f34 https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda#d4483ca8afc57ddf1f6dded53b36c17f https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2#066552ac6b907ec6d72c0ddab29050dc https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_0.conda#a557dde55343e03c68cd7e29e7f87279 -https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.1-h2466b09_0.conda#27fe798366ef3a81715b13eedf699e2f +https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda#1dc86753693df5e3326bb8a85b74c589 +https://conda.anaconda.org/conda-forge/win-64/pixman-0.43.4-h63175ca_0.conda#b98135614135d5f458b75ab9ebb9558c https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2#e2da8758d7d51ff6aa78a14dfb9dbed4 +https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda#854fbdff64b572b5c0b470f334d34c11 https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda#fc048363eb8f03cd1737600a5d08aafe https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2#515d77642eaa3639413c6b1bc3f94219 -https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.2-heb0366b_0.conda#6e8b0f22b4eef3b3cb3849bb4c3d47f9 -https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-hcfcfb64_1.conda#19ce3e1dacc7912b3d6ff40690ba9ae0 -https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-hcfcfb64_1.conda#71e890a0b361fd58743a13f77e1506b7 -https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_2.conda#aa622c938af057adc119f8b8eecada01 +https://conda.anaconda.org/conda-forge/win-64/expat-2.6.3-he0c23c2_0.conda#a85588222941f75577eb39711058e1de +https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda#31aec030344e962fbd7dbbbbd68e60a9 +https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda#9bae75ce723fa34e98e239d21d752a7e +https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda#85741a24d97954a991e55e34bc55990b +https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda#2cf0cf76cc15d360dfa2f17fd6cf9772 https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.43-h19919ed_0.conda#77e398acc32617a0384553aea29e866b -https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h0e60522_0.tar.bz2#e1a22282de0169c93e4ffe6ce6acc212 -https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_1.conda#7ab2653cc21c44a1370ef3b409261b3d +https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h0f24e4e_4.conda#ed4d301f0d2149b34deb9c4fecafd836 https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2#fe759119b8b3bfa720b8762c6fdc35de -https://conda.anaconda.org/conda-forge/win-64/pcre2-10.43-h17e33f8_0.conda#d0485b8aa2cedb141a7bd27b4efa4c9c +https://conda.anaconda.org/conda-forge/win-64/pcre2-10.44-h3d7b363_2.conda#a3a3baddcfb8c80db84bec3cb7746fb8 https://conda.anaconda.org/conda-forge/win-64/python-3.9.19-h4de0772_0_cpython.conda#b6999bc275e0e6beae7b1c8ea0be1e85 +https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_1.conda#f8e0a35bf6df768ad87ed7bbbc36ab04 https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda#9a17230f95733c04dc40a2b1e5491d74 -https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hcfcfb64_1.conda#0105229d7c5fabaa840043a86c10ec64 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_2.conda#d22534a9be5771fc58eb7564947f669d +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/win-64/cython-3.0.10-py39h99910a6_0.conda#8ebc2fca8a6840d0694f37e698f4e59c -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/win-64/cython-3.0.11-py39ha51f57c_2.conda#a84fdf498fa757da15a1bd0dd967f8ed +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda#3761b23693f768dc75a8fd0a73ca053f https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.5-py39h1f6ef14_1.conda#4fc5bd0a7b535252028c647cc27d6c87 -https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.7-default_h97ce8ae_0.conda#a005e5fd30f14fcd2bc3e5ac57aa45a7 -https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.2-h0df6a38_0.conda#ef9ae80bb2a15aee7a30180c057678ea -https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h8125262_1001.conda#e761885eb4c181074d172220d46319a0 -https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_2.conda#a2ad82fae23975e4ccbfab2847d31d48 -https://conda.anaconda.org/conda-forge/win-64/libtiff-4.6.0-hddb2be6_3.conda#6d1828c9039929e2f185c5fa9d133018 +https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.7-py39h2b77a98_0.conda#c116c25e2e36f770f065559ad2a1da73 +https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.8-default_ha5278ca_4.conda#e9d701da6db17a9638be8dc5569b0327 +https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.3-h7025463_2.conda#b60894793e7e4a555027bfb4e4ed1d54 +https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.1-default_h8125262_1000.conda#933bad6e4658157f1aec9b171374fde2 +https://conda.anaconda.org/conda-forge/win-64/libtiff-4.6.0-hb151862_4.conda#7d35d9aa8f051d548116039f5813c8ec +https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.39-h3df6e99_0.conda#279ee338c9b34871d578cb3c7aa68f70 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda#18c6deb6f9602e32446398203c8f0e91 https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2#a1f820480193ea83582b13249a7e7bd9 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/win-64/tornado-6.4.1-py39ha55e580_0.conda#7d1e87f3036af858ce7e248489c3faec +https://conda.anaconda.org/conda-forge/win-64/tornado-6.4.1-py39ha55e580_1.conda#4a93d22ed5b2cede80fbee7f7f775a9d https://conda.anaconda.org/conda-forge/win-64/unicodedata2-15.1.0-py39ha55989b_0.conda#20ec896e8d97f2ff8be1124e624dc8f2 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda#c46ba8712093cb0114404ae8a7582e1a https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2#46878ebb6b9cbd8afcf8088d7ef00ece -https://conda.anaconda.org/conda-forge/noarch/zipp-3.18.1-pyhd8ed1ab_0.conda#c77c4aabc01b156a8cb4395f0233d335 -https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-hcfcfb64_1.conda#f47f6db2528e38321fb00ae31674c133 -https://conda.anaconda.org/conda-forge/win-64/coverage-7.5.3-py39ha55e580_0.conda#28d426e365cb4ed87d22d1a89c0bd006 -https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.2-h2f9d560_0.conda#42fc785d9db7ab051a206fbf882ecf2e -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 +https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-h2466b09_2.conda#378f1c9421775dfe644731cb121c8979 +https://conda.anaconda.org/conda-forge/win-64/coverage-7.6.1-py39ha55e580_1.conda#762cd375d661c49065ddaba3fd9e6259 +https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.14.2-hbde0cde_0.conda#08767992f1a4f1336a257af1241034bd +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda#d3592435917b62a8becff3a60db674f6 -https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda#090d91b69396f14afef450c285f9758c -https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 +https://conda.anaconda.org/conda-forge/win-64/libxcb-1.16-h013a479_1.conda#f0b599acdc82d5bc7e3b105833e7c5c8 +https://conda.anaconda.org/conda-forge/noarch/meson-1.5.1-pyhd8ed1ab_1.conda#979087ee59bea1355f991a3b738af64e https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda#7e7099ad94ac3b599808950cec30ad4e -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.8.0-pyhd8ed1ab_0.conda#573fe09d7bd0cd4bcc210d8369b5ca47 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py39h99910a6_0.conda#0cc5774390ada632ed7975203057c91c -https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-hc790b64_1.conda#e98333643abc739ebea1bac97a479828 -https://conda.anaconda.org/conda-forge/win-64/fonttools-4.53.0-py39ha55e580_0.conda#7c4625b8a1013dd22e924f1fa9fbc605 -https://conda.anaconda.org/conda-forge/win-64/glib-2.80.2-h0df6a38_0.conda#a728ca6f04c33ecb0f39eeda5fbd0e23 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda#dcbadab7a68738a028e195ab68ab2d2e +https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-hc790b64_0.conda#28496a1e6af43c63927da4f80260348d +https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.0-h32b962e_3.conda#8f43723a4925c51e55c2d81725a97db4 +https://conda.anaconda.org/conda-forge/win-64/fonttools-4.53.1-py39ha55e580_1.conda#ac35799c16313c647f9adafbf12bd768 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.4-pyhd8ed1ab_0.conda#c62e775953b6b65f2079c9ee2a62813c https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 -https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda#b43ec7ed045323edeff31e348eea8652 -https://conda.anaconda.org/conda-forge/win-64/pillow-10.3.0-py39h9ee4981_0.conda#6d69d57c41867acc162ef0205a8efaef -https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py39h99910a6_5.conda#dffbcea794c524c471772a5f697c2aea +https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_694.conda#a17423859d3fb912c8f2e9797603ddb6 +https://conda.anaconda.org/conda-forge/win-64/pillow-10.4.0-py39hfa8c767_0.conda#7b24bccfb14f05019c8a488d4ee084a8 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.4-h5006eae_0.conda#3d7ebad364d5f63a1ae54eecb35aee31 -https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda#65c56ecdeceffd6c32d3d54db7e02c6e -https://conda.anaconda.org/conda-forge/win-64/mkl-devel-2024.1.0-h57928b3_692.conda#9b3d1d4916a56fd32460f6fe784dcb51 -https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.4-hba88be7_0.conda#0b1d683d462029446924fa87a50dda12 -https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda#336c93ab102846c6131cf68e722a68f1 -https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda#c752cc2af9f3d8d7b2fdebb915a33ef7 -https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-22_win64_mkl.conda#db33ffa4bae1d2f6d5602afaa048bf6b -https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py39hddb5d58_0.conda#6e30ff8f2d3f59f45347dfba8bc22a04 -https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-hcef0176_21.conda#76544d3dfeff8fd52250df168cb0005b -https://conda.anaconda.org/conda-forge/win-64/blas-devel-3.9.0-22_win64_mkl.conda#adeb834f3b7b06f3d77cd90b7c9d08f0 -https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.1-py39h1f6ef14_0.conda#03e25c6bae87f4f9595337255b44b0fb -https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.9-py39hb77abff_5.conda#5ed899124a51958336371ff01482b8fd +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/win-64/harfbuzz-9.0.0-h2bedf89_1.conda#254f119aaed2c0be271c1114ae18d09b +https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-23_win64_mkl.conda#693407a31c27e70c750b5ae153251d9a +https://conda.anaconda.org/conda-forge/win-64/mkl-devel-2024.1.0-h57928b3_694.conda#cb1406a70154cdef203167c6a95f6351 +https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-23_win64_mkl.conda#7ffb5b336cefd2e6d1e00ac1f7c9f2c9 +https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-23_win64_mkl.conda#3580796ab7b7d68143f45d4d94d866b7 +https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.7.2-hbb46ec1_5.conda#e14fa5fe2da0bf8cc30d06314ce6ce33 +https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-23_win64_mkl.conda#f6e2619d4359c6806b97b3d405193741 +https://conda.anaconda.org/conda-forge/win-64/numpy-2.0.2-py39h60232e0_0.conda#13c59f25f5d4ad7d1c677667555f6547 +https://conda.anaconda.org/conda-forge/win-64/pyside6-6.7.2-py39h0285922_2.conda#12004e14d1835eca43c4207841c24e4f +https://conda.anaconda.org/conda-forge/win-64/blas-devel-3.9.0-23_win64_mkl.conda#5fd0882b94fa827533f51cc8c2e04392 +https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.0-py39h2b77a98_1.conda#377d7375b3b8f025070254f625ca7f83 https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.1-py39h1a10956_0.conda#9f8e571406af04d2f5fdcbecec704505 -https://conda.anaconda.org/conda-forge/win-64/blas-2.122-mkl.conda#aee642435696de144ddf91dc02101cf8 -https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.4-py39he1095e7_2.conda#5c813b5da86f186d8026b6de6429c212 -https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.4-py39hcbf5309_2.conda#1ecee90b529cb69ec4e95add23323110 +https://conda.anaconda.org/conda-forge/win-64/blas-2.123-mkl.conda#0d089770a9bc073da806864c60a0a173 +https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.9.2-py39h5376392_0.conda#bd0c448492ac46f8ba0d23dac3e2e9ff +https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.9.2-py39hcbf5309_0.conda#0405102feb5b62c7ba7f924346953192 diff --git a/build_tools/azure/pymin_conda_defaults_openblas_environment.yml b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_environment.yml similarity index 69% rename from build_tools/azure/pymin_conda_defaults_openblas_environment.yml rename to build_tools/azure/pymin_conda_forge_openblas_min_dependencies_environment.yml index a82ba18e27980..a1bda8231e958 100644 --- a/build_tools/azure/pymin_conda_defaults_openblas_environment.yml +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_environment.yml @@ -2,22 +2,25 @@ # following script to centralize the configuration for CI builds: # build_tools/update_environments_and_lock_files.py channels: - - defaults + - conda-forge dependencies: - python=3.9 - - numpy=1.21 + - numpy=1.19.5 # min - blas[build=openblas] - - scipy=1.7 + - scipy=1.6.0 # min - cython=3.0.10 # min - joblib=1.2.0 # min + - threadpoolctl=3.1.0 # min - matplotlib=3.3.4 # min + - pandas=1.1.5 # min - pyamg - pytest - pytest-xdist - pillow + - pip + - ninja + - meson-python=0.16.0 # min - pytest-cov - coverage - ccache - - pip - - pip: - - threadpoolctl==3.1.0 # min + - polars=0.20.30 # min diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock new file mode 100644 index 0000000000000..dbb2f7ab0bb50 --- /dev/null +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock @@ -0,0 +1,176 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: da804213459d72ef5fa344326a71a64386dfb5085c8e0b582527e8337cecca32 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-5_cp39.conda#40363a30db350596b5f225d0d5a33328 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2#562b26ba2e19059551a811e72ab7f793 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 +https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a +https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-he02047a_3.conda#fcd2016d1d299f654f81021e27496818 +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 +https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-he02047a_3.conda#efab66b82ec976930b96d62a976de8e7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 +https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 +https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a +https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2#3ceea9668625c18f19530de98b15d5b0 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c +https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda#4fab9799da9571266d05ca5503330655 +https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-he02047a_3.conda#9aba7960731e6b4547b3a52f812ed801 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac +https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-h70512c7_5.conda#4b652e3e572cbb3f297e77c96313faea +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h315aac3_2.conda#b0143a3e98136a680b728fdf9b42a258 +https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.8-hf5423f3_1.conda#8782406a10201b67bd6476ca70cf92a8 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda#82776ee8145b9d1fd6546604de4b351d +https://conda.anaconda.org/conda-forge/linux-64/nss-3.104-hd34e28f_0.conda#0664e59f6937a660eba9f3d2f9123fa8 +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 +https://conda.anaconda.org/conda-forge/linux-64/ccache-4.10.1-h065aff2_0.conda#d6b48c138e0c8170a6fe9c136e063540 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py39h3d6467e_0.conda#76b5d215fb735a6dc43010ffbe78040e +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.3-h8fdd7da_2.conda#9958a1f8faba35260e6b68e3a7bc88d6 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py39h74842e3_0.conda#1bf77976372ff6de02af7b75cf034ce5 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc +https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 +https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef +https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.8-h8b73ec9_2.conda#2e25bb2f53e4a48873a936f8ef53e592 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h2d7952a_1.conda#7e3173fd1299939a02ebf9ec32aa77c4 +https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.25-pthreads_h7a3da1a_0.conda#87661673941b5e702275fdf0fc095ad0 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf +https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda#18c6deb6f9602e32446398203c8f0e91 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/linux-64/setuptools-59.8.0-py39hf3d152e_1.tar.bz2#4252d0c211566a9f65149ba7f6e87aa4 +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.1.0-pyh8a188c0_0.tar.bz2#a2995ee828f65687ac5b1e71a2ab1e0c +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py39h8cd3c5a_1.conda#48d269953fcddbbcde078429d4b27afe +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.42-h4ab18f5_0.conda#b193af204da1bfb8c13882d131a14bd2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hbb29018_2.conda#b6d90276c5aee9b4407dd94eb0cd40a8 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py39h8cd3c5a_1.conda#36d2c4068ef1def501a3331e26709830 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h315aac3_2.conda#00e0da7e4fceb5449f3ddd2bf6b2c351 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2#7583652522d71ad78ba536bba06940eb +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda#d0a9633b53cdc319b8a1a532ae7822b8 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_4.conda#7e3f831d4ae9820999418821be65ff67 +https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.50-h4f305b6_0.conda#0d7ff1a8e69565ca3add6925e18e708f +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda#e2eaefa4de2b7237af7c907b8bbc760a +https://conda.anaconda.org/conda-forge/noarch/meson-1.5.1-pyhd8ed1ab_1.conda#979087ee59bea1355f991a3b738af64e +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py39h16a7006_0.conda#d9a6b19174a6cf5185296b16f781951f +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 +https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.8.0-pyhd8ed1ab_0.conda#573fe09d7bd0cd4bcc210d8369b5ca47 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c +https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda#e667a3ab0df62c54e60e1843d2e6defb +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-h4bc722e_1.conda#0c90ad87101001080484b91bd9d2cdef +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.7-hf3bb09a_0.conda#c78bc4ef0afb3cd2365d9973c71fc876 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hfac3d4d_0.conda#c7b47c64af53e8ecee01d101eeab2342 +https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.11.0-h4ab18f5_1.conda#14858a47d4cc995892e79f2b340682d7 +https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-20_linux64_openblas.conda#05c5862c7dc25e65ba6c471d96429dae +https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e +https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.19.5-py39hd249d9e_3.tar.bz2#0cf333996ebdeeba8d1c8c1c0ee9eff9 +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda#93aff412f3e49fdb43361c0215cbd72d +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-20_linux64_openblas.conda#9932a1d4e9ecf2d35fb19475446e361e +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.7-h0a52356_0.conda#d368425fbd031a2f8e801a40c3415c72 +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-256.5-hb6d7363_0.conda#3b3912077a5515b2a39bda92008bc2c3 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.3.4-py39h2fa2bec_0.tar.bz2#9ec0b2186fab9121c54f4844f93ee5b7 +https://conda.anaconda.org/conda-forge/linux-64/pandas-1.1.5-py39hde0f152_0.tar.bz2#79fc4b5b3a865b90dd3701cecf1ad33c +https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py39ha963410_0.conda#322084e8890afc27fcca6df7a528df25 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.6.0-py39hee8e79c_0.tar.bz2#3afcb78281836e61351a2924f3230060 +https://conda.anaconda.org/conda-forge/linux-64/blas-2.120-openblas.conda#c8f6916a81a340650078171b1d852574 +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b +https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.3-py39hac2352c_1.tar.bz2#6fb0628d6195d8b6caa2422d09296399 +https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h320f8da_24.conda#bec111b67cb8dc63277c6af65d214044 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda#e1f148e57d071b09187719df86f513c1 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.3.4-py39hf3d152e_0.tar.bz2#cbaec993375a908bbe506dc7328d747c diff --git a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock index 6c03c413bb212..81d753d7b72ec 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock @@ -3,203 +3,197 @@ # input_hash: 3974f9847d888a2fd37ba5fcfb76cb09bba4c9b84b6200932500fc94e3b0c4ae @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_3.conda#7c1062eaa78dec4ea8a9a988dbda6045 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda#bfe4b3259a8ac6cdf0037752904da6a7 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-5_cp39.conda#40363a30db350596b5f225d0d5a33328 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_0.conda#e46b5ae31282252e0525713e34ffbe2b https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab +https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_0.conda#35e52d19547cb3265a09c49de146a5ae https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2#562b26ba2e19059551a811e72ab7f793 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda#0bb492cca54017ea314b809b1ee3a176 -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda#172bcc51059416e7ce99e7b528cede83 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 -https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 -https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-recordproto-1.14.2-h7f98852_1002.tar.bz2#2f835e6c386e73c6faaddfe9eda67e98 https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2#3ceea9668625c18f19530de98b15d5b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d -https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda#ee605e794bdc14e2b7f84c4faa0d8c2c https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda#b63d9b6da3653179a278077f0de20014 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b -https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda#784a4df6676c581ca624fbe460703a6d -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h70512c7_0.conda#c567b6fa201bc424e84f1e70f7a36095 +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h315aac3_2.conda#b0143a3e98136a680b728fdf9b42a258 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a -https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef -https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.7-hb77312f_0.conda#bc0ea7e1f75a9b1c8467597fbbd9f86b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.7-ha31de31_0.conda#7234f31acd176e402e91e03feba90f7d -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda#1b50eebe2a738a3146c154d2eceaa8b6 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda#949c4a82290ee58b3c970cef4bcfd4ad +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.8-hf5423f3_1.conda#8782406a10201b67bd6476ca70cf92a8 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-ha479ceb_0.conda#6fd406aef37faad86bd7f37a94fb6f8a https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda#c48418c8b35f1d59ae9ae1174812b40a -https://conda.anaconda.org/conda-forge/linux-64/ccache-4.9.1-h1fcd64f_0.conda#3620f564bcf28c3524951b6f64f5c5ac -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39hf88036b_2.conda#8ea5af6ac902f1a4429190970d9099ce +https://conda.anaconda.org/conda-forge/linux-64/ccache-4.10.1-h065aff2_0.conda#d6b48c138e0c8170a6fe9c136e063540 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py39h3d6467e_0.conda#76b5d215fb735a6dc43010ffbe78040e +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py39hf88036b_2.conda#8cd78166f2350de9b9e1bae1e4fe8589 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda#a965aeaf060289528a3fbe09326edae2 -https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 +https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py39h74842e3_0.conda#1bf77976372ff6de02af7b75cf034ce5 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda#d0a9633b53cdc319b8a1a532ae7822b8 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.7-default_h087397f_0.conda#536526073c2e7f9056fdce8584da779e +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda#dfcfd72c7a430d3616763ecfbefe4ca9 -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_0.conda#b470cc353c5b852e0d830e8d5d23e952 +https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.8-h8b73ec9_2.conda#2e25bb2f53e4a48873a936f8ef53e592 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h2d7952a_1.conda#7e3173fd1299939a02ebf9ec32aa77c4 +https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39h8cd3c5a_1.conda#4e045330e331d55a42ab44618315808e https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.27-pthreads_h7a3da1a_0.conda#4b422ebe8fc6a5320d0c1c22e5a46032 +https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.27-pthreads_h9eca1d5_1.conda#5633a1616bda33f8b815841eba4dbfb8 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda#18c6deb6f9602e32446398203c8f0e91 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2#4759805cce2d914c38472f70bf4d8bcb https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd -https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py39hd3abc70_0.conda#c183e99f9320e5e2d0f9c43efcb3fb22 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py39h8cd3c5a_1.conda#48d269953fcddbbcde078429d4b27afe https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.42-h4ab18f5_0.conda#b193af204da1bfb8c13882d131a14bd2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.18.1-pyhd8ed1ab_0.conda#c77c4aabc01b156a8cb4395f0233d335 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py39hd3abc70_0.conda#9dae301603c88aef61dba733e8931cdd -https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py39h15c3d72_0.conda#7e61b8777f42e00b08ff059f9e8ebc44 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py39h8cd3c5a_1.conda#2da39b9876694c9d0648887303962243 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 -https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 -https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 -https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda#1e3b6af9592be71ce19f0a6aae05d97b -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.8-default_hf981a13_4.conda#7b72d74b57e681251536094b96ba9c46 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_4.conda#7e3f831d4ae9820999418821be65ff67 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_0.conda#3deca8c25851196c28d1c84dd4ae9149 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda#e2eaefa4de2b7237af7c907b8bbc760a +https://conda.anaconda.org/conda-forge/noarch/meson-1.5.1-pyhd8ed1ab_1.conda#979087ee59bea1355f991a3b738af64e +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py39h16a7006_0.conda#d9a6b19174a6cf5185296b16f781951f +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.8.0-pyhd8ed1ab_0.conda#573fe09d7bd0cd4bcc210d8369b5ca47 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda#e667a3ab0df62c54e60e1843d2e6defb -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.conda#926c2c7ee7a0b48d6d70783a33f7bc80 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda#dcbadab7a68738a028e195ab68ab2d2e -https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-22_linux64_openblas.conda#1fd156abd41a4992835952f6f4d951d0 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.4-h4ab18f5_2.conda#79e46d4a6ccecb7ee1912042958a8758 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-h4bc722e_1.conda#0c90ad87101001080484b91bd9d2cdef +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.4-pyhd8ed1ab_0.conda#c62e775953b6b65f2079c9ee2a62813c +https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-23_linux64_openblas.conda#89d7bcdb1e9a72a73e36d8e29d2a2beb https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f -https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda#93aff412f3e49fdb43361c0215cbd72d -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-22_linux64_openblas.conda#63ddb593595c9cf5eb08d3de54d66df8 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda#bdc188e59857d6efab332714e0d01d93 -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.0.2-py39h9cb892a_0.conda#ed28982e8b085c5d47361fc4af0902ac +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-h4bc722e_0.conda#185159d666308204eca00295599b0a5c +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39h08a7858_1.conda#cd9fa334e11886738f17254f52210bc3 +https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-23_linux64_openblas.conda#08b43a5c3d6cc13aeb69bd2cbc293196 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py39h74842e3_1.conda#7f97d682c5c7fdd49a8ddd995636a6ad https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py39hfc16268_1.conda#8b23d2b425035a7468d17e6fe1d54124 -https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.2-hb12f9c5_5.conda#8c662388c2418f293266f5e7f50df7d7 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py39haf93ffa_0.conda#492a2cd65862d16a4aaf535ae9ccb761 -https://conda.anaconda.org/conda-forge/linux-64/blas-2.122-openblas.conda#5065468105542a8b23ea47bd8b6fa55f -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39h10d1fc8_2.conda#c9fb6571b93b1dd490ea627af7344f36 -https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.1.0-py39h85c637f_1.conda#b2b15112d019e27e62f9433e31607d08 -https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda#b325046180590c868ce0dbf267b82eb8 -https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda#e1f148e57d071b09187719df86f513c1 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py39hf3d152e_2.conda#bd956c7563b6a6b27521b83623c74e22 -https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_1.conda#66798cbfdcb003d9fbccd92cd08eb3ac -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 +https://conda.anaconda.org/conda-forge/linux-64/blas-2.123-openblas.conda#7f4b3ea1cdd6e50dca2a226abda6e2d9 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py39h0565ad7_0.conda#14917b240f18eba18576e81530360a0a +https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py39h85c637f_0.conda#0bfaf33b7ebdbadc77bf9a67e281c0b1 +https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.7.2-py39h8242bd1_2.conda#e5c6995331893cf9fcaab45d11e343ff +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.9.2-py39hf3d152e_0.conda#5f49ac6db4d60b2afbb6feb2a85beea7 +https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_0.conda#0a5522bdd3983c52102e75d1307ad8c4 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/build_tools/azure/pypy3_linux-64_conda.lock b/build_tools/azure/pypy3_linux-64_conda.lock index a47c89e5a7aab..1ca180655d4c2 100644 --- a/build_tools/azure/pypy3_linux-64_conda.lock +++ b/build_tools/azure/pypy3_linux-64_conda.lock @@ -1,27 +1,31 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: cb8a71fc5a5762d803c62e60f01aaf1788c4357c1233fd623cecb1225076b9b5 +# input_hash: ec8c4a965912c812ca7f4258c3e1d60ad00e8295469403376fbf7205cdb083de @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_pypy39_pp73.conda#c1b2f29111681a4036ed21eaa3f44620 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-5_pypy39_pp73.conda#b18167e62c910465e17f695c9465a6da +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2#562b26ba2e19059551a811e72ab7f793 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_2.conda#b8934d399b56d73e323403e183d009c5 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 @@ -29,75 +33,75 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.t https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/gdbm-1.18-h0a1914f_2.tar.bz2#b77bc399b07a19c00fe12fdc95ee0297 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.5-ha31de31_0.conda#b923cdb6e567ada84f991ffcc5848afb -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/ccache-4.9.1-h1fcd64f_0.conda#3620f564bcf28c3524951b6f64f5c5ac +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.8-hf5423f3_1.conda#8782406a10201b67bd6476ca70cf92a8 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 +https://conda.anaconda.org/conda-forge/linux-64/ccache-4.10.1-h065aff2_0.conda#d6b48c138e0c8170a6fe9c136e063540 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.27-pthreads_h7a3da1a_0.conda#4b422ebe8fc6a5320d0c1c22e5a46032 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c +https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.27-pthreads_h9eca1d5_1.conda#5633a1616bda33f8b815841eba4dbfb8 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/linux-64/pypy3.9-7.3.15-h9557127_1.conda#0862f2ce457660f1060225d96d468237 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-1_73_pypy.conda#6e0143cd3dd940d3004cd857e37ccd81 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py39hc10206b_0.conda#60c2d58b33a21c32f469e3f6a9eb7e4b -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py39h3f7de3a_1.conda#bce3c3e80b669b02c863819aa2709191 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39ha90811c_1.conda#25edffabcb0760fc1821597c4ce920db -https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-22_linux64_openblas.conda#1fd156abd41a4992835952f6f4d951d0 +https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-23_linux64_openblas.conda#89d7bcdb1e9a72a73e36d8e29d2a2beb https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h6dedee3_0.conda#557d64563e84ff21b14f586c7f662b7f -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90a76f3_0.conda#799e6519cfffe2784db27b1db2ef33f3 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py39hd109e5a_0.conda#414cd17b0c03af1975d1ddbe947b7a64 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pypy-7.3.15-1_pypy39.conda#a418a6c16bd6f7ed56b92194214791a0 -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hf860d4a_0.conda#e7fded713fb466e1e0670afce1761b47 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py39h5dcd7c1_0.conda#471c315d9977a638ebddf5172dc3d324 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hf860d4a_0.conda#f699157518d28d00c87542b4ec1273be -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae -https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a -https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-22_linux64_openblas.conda#63ddb593595c9cf5eb08d3de54d66df8 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39ha90811c_0.conda#07ed14c8326da42356514bcbc0b04802 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py39hf860d4a_0.conda#63421b4dd7222fad555e34ec9af015a1 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 +https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-23_linux64_openblas.conda#08b43a5c3d6cc13aeb69bd2cbc293196 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py39h709b612_0.conda#06137a2914ae1a323a23496d5ed6acd0 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py39hc1bfcc2_0.conda#74eba8ae270cc3c4da7e8d42a44a54ae +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f -https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 +https://conda.anaconda.org/conda-forge/noarch/meson-1.5.1-pyhd8ed1ab_1.conda#979087ee59bea1355f991a3b738af64e +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.8.0-pyhd8ed1ab_0.conda#573fe09d7bd0cd4bcc210d8369b5ca47 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4418e8bdbaa8eea28e047531e6763c8 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h6dedee3_2.conda#6c5d74bac41838f4377dfd45085e1fec -https://conda.anaconda.org/conda-forge/linux-64/blas-2.122-openblas.conda#5065468105542a8b23ea47bd8b6fa55f -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda#dcbadab7a68738a028e195ab68ab2d2e +https://conda.anaconda.org/conda-forge/linux-64/blas-2.123-openblas.conda#7f4b3ea1cdd6e50dca2a226abda6e2d9 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.4-pyhd8ed1ab_0.conda#c62e775953b6b65f2079c9ee2a62813c https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 -https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.1.0-py39h3c335be_1.conda#7278eb55a7e97a0ba2376a6c608e7c46 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39h6fb8a73_2.conda#3212f51613e10b3ee319f3f2bf8ee5a8 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py39h4162558_2.conda#05babd7bae196648bfc6b7e3d9ea7630 +https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py39h3c335be_0.conda#571fd9aeec6fe1b68280363f5b028f0a +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py39h32a45fc_0.conda#8d50b28459357250dd7d2e3540413226 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.9.2-py39h4162558_0.conda#e6bfb3e2d9e2ae8300795692a710e0be diff --git a/build_tools/azure/test_script.sh b/build_tools/azure/test_script.sh index faf48e27efefb..777c61f304bea 100755 --- a/build_tools/azure/test_script.sh +++ b/build_tools/azure/test_script.sh @@ -60,6 +60,12 @@ if [[ -n "$SELECTED_TESTS" ]]; then export SKLEARN_TESTS_GLOBAL_RANDOM_SEED="all" fi +if which lscpu ; then + lscpu +else + echo "Could not inspect CPU architecture." +fi + TEST_CMD="$TEST_CMD --pyargs sklearn" if [[ "$DISTRIB" == "conda-pypy3" ]]; then # Run only common tests for PyPy. Running the full test suite uses too diff --git a/build_tools/azure/ubuntu_atlas_lock.txt b/build_tools/azure/ubuntu_atlas_lock.txt index 3fa5995aafd1e..4e4283d56104e 100644 --- a/build_tools/azure/ubuntu_atlas_lock.txt +++ b/build_tools/azure/ubuntu_atlas_lock.txt @@ -6,7 +6,7 @@ # cython==3.0.10 # via -r build_tools/azure/ubuntu_atlas_requirements.txt -exceptiongroup==1.2.1 +exceptiongroup==1.2.2 # via pytest execnet==2.1.1 # via pytest-xdist @@ -14,7 +14,7 @@ iniconfig==2.0.0 # via pytest joblib==1.2.0 # via -r build_tools/azure/ubuntu_atlas_requirements.txt -meson==1.4.1 +meson==1.5.1 # via meson-python meson-python==0.16.0 # via -r build_tools/azure/ubuntu_atlas_requirements.txt @@ -29,7 +29,7 @@ pluggy==1.5.0 # via pytest pyproject-metadata==0.8.0 # via meson-python -pytest==8.2.2 +pytest==8.3.2 # via # -r build_tools/azure/ubuntu_atlas_requirements.txt # pytest-xdist diff --git a/build_tools/check-meson-openmp-dependencies.py b/build_tools/check-meson-openmp-dependencies.py new file mode 100644 index 0000000000000..43a7426494160 --- /dev/null +++ b/build_tools/check-meson-openmp-dependencies.py @@ -0,0 +1,172 @@ +""" +Check that OpenMP dependencies are correctly defined in meson.build files. + +This is based on trying to make sure the the following two things match: +- the Cython files using OpenMP (based on a git grep regex) +- the Cython extension modules that are built with OpenMP compiler flags (based + on meson introspect json output) +""" + +import json +import re +import subprocess +from pathlib import Path + + +def has_source_openmp_flags(target_source): + return any("openmp" in arg for arg in target_source["parameters"]) + + +def has_openmp_flags(target): + """Return whether target sources use OpenMP flags. + + Make sure that both compiler and linker source use OpenMP. + Look at `get_meson_info` docstring to see what `target` looks like. + """ + target_sources = target["target_sources"] + + target_use_openmp_flags = any( + has_source_openmp_flags(target_source) for target_source in target_sources + ) + + if not target_use_openmp_flags: + return False + + # When the target use OpenMP we expect a compiler + linker source and we + # want to make sure that both the compiler and the linker use OpenMP + assert len(target_sources) == 2 + compiler_source, linker_source = target_sources + assert "compiler" in compiler_source + assert "linker" in linker_source + + compiler_use_openmp_flags = any( + "openmp" in arg for arg in compiler_source["parameters"] + ) + linker_use_openmp_flags = any( + "openmp" in arg for arg in linker_source["parameters"] + ) + + assert compiler_use_openmp_flags == linker_use_openmp_flags + return compiler_use_openmp_flags + + +def get_canonical_name_meson(target, build_path): + """Return a name based on generated shared library. + + The goal is to return a name that can be easily matched with the output + from `git_grep_info`. + + Look at `get_meson_info` docstring to see what `target` looks like. + """ + # Expect a list with one element with the name of the shared library + assert len(target["filename"]) == 1 + shared_library_path = Path(target["filename"][0]) + shared_library_relative_path = shared_library_path.relative_to( + build_path.absolute() + ) + # Needed on Windows to match git grep output + rel_path = shared_library_relative_path.as_posix() + # OS-specific naming of the shared library .cpython- on POSIX and + # something like .cp312- on Windows + pattern = r"\.(cpython|cp\d+)-.+" + return re.sub(pattern, "", str(rel_path)) + + +def get_canonical_name_git_grep(filename): + """Return name based on filename. + + The goal is to return a name that can easily be matched with the output + from `get_meson_info`. + """ + return re.sub(r"\.pyx(\.tp)?", "", filename) + + +def get_meson_info(): + """Return names of extension that use OpenMP based on meson introspect output. + + The meson introspect json info is a list of targets where a target is a dict + that looks like this (parts not used in this script are not shown for simplicity): + { + 'name': '_k_means_elkan.cpython-312-x86_64-linux-gnu', + 'filename': [ + '/sklearn/cluster/_k_means_elkan.cpython-312-x86_64-linux-gnu.so' + ], + 'target_sources': [ + { + 'compiler': ['ccache', 'cc'], + 'parameters': [ + '-Wall', + '-std=c11', + '-fopenmp', + ... + ], + ... + }, + { + 'linker': ['cc'], + 'parameters': [ + '-shared', + '-fPIC', + '-fopenmp', + ... + ] + } + ] + } + """ + build_path = Path("build/introspect") + subprocess.check_call(["meson", "setup", build_path, "--reconfigure"]) + + json_out = subprocess.check_output( + ["meson", "introspect", build_path, "--targets"], text=True + ) + target_list = json.loads(json_out) + meson_targets = [target for target in target_list if has_openmp_flags(target)] + + return [get_canonical_name_meson(each, build_path) for each in meson_targets] + + +def get_git_grep_info(): + """Return names of extensions that use OpenMP based on git grep regex.""" + git_grep_filenames = subprocess.check_output( + ["git", "grep", "-lP", "cython.*parallel|_openmp_helpers"], text=True + ).splitlines() + git_grep_filenames = [f for f in git_grep_filenames if ".pyx" in f] + + return [get_canonical_name_git_grep(each) for each in git_grep_filenames] + + +def main(): + from_meson = set(get_meson_info()) + from_git_grep = set(get_git_grep_info()) + + only_in_git_grep = from_git_grep - from_meson + only_in_meson = from_meson - from_git_grep + + msg = "" + if only_in_git_grep: + only_in_git_grep_msg = "\n".join( + [f" {each}" for each in sorted(only_in_git_grep)] + ) + msg += ( + "Some Cython files use OpenMP," + " but their meson.build is missing the openmp_dep dependency:\n" + f"{only_in_git_grep_msg}\n\n" + ) + + if only_in_meson: + only_in_meson_msg = "\n".join([f" {each}" for each in sorted(only_in_meson)]) + msg += ( + "Some Cython files do not use OpenMP," + " you should remove openmp_dep from their meson.build:\n" + f"{only_in_meson_msg}\n\n" + ) + + if from_meson != from_git_grep: + raise ValueError( + f"Some issues have been found in Meson OpenMP dependencies:\n\n{msg}" + ) + + +if __name__ == "__main__": + main() diff --git a/build_tools/circle/build_doc.sh b/build_tools/circle/build_doc.sh index 014ac0fac8d7a..1938bd504f2c1 100755 --- a/build_tools/circle/build_doc.sh +++ b/build_tools/circle/build_doc.sh @@ -179,7 +179,7 @@ show_installed_libraries # Set parallelism to 3 to overlap IO bound tasks with CPU bound tasks on CI # workers with 2 cores when building the compiled extensions of scikit-learn. export SKLEARN_BUILD_PARALLEL=3 -pip install -e . --no-build-isolation +pip install -e . --no-build-isolation --config-settings=compile-args="-j4" echo "ccache build summary:" ccache -s diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock index 57908c8c4026f..585c802b6a4fb 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -3,280 +3,277 @@ # input_hash: f6f3862aafcafa139a322e498517c3db58e1b8db95f1b1ca8c18f5b70d446dc9 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/noarch/_sysroot_linux-64_curr_repodata_hack-3-h69a702a_16.conda#1c005af0c6ff22814b7c52ee448d4bea +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f -https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_17.conda#d731b543793afc0433c4fd593e693fce -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_3.conda#7c1062eaa78dec4ea8a9a988dbda6045 -https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-12.3.0-h0223996_107.conda#851e9651c9e4cd5dc19f80398eba9a1c -https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-12.3.0-h0223996_107.conda#167a1f5d77d8f3c2a638f7eb418429f1 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda#bfe4b3259a8ac6cdf0037752904da6a7 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-5_cp39.conda#40363a30db350596b5f225d0d5a33328 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 -https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.12-he073ed8_17.conda#595db67e32b276298ff3d94d07d47fbf -https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_3.conda#2b0c0d451353cde73295d799ea8886b1 +https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-h4a8ded7_16.conda#ff7f38675b226cfb855aebfc32a13e31 +https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-h84ea5a7_101.conda#0ce69d40c142915ac9734bc6134e514a +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_0.conda#e46b5ae31282252e0525713e34ffbe2b +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-h84ea5a7_101.conda#29b5a4ed4613fa81a07c21045e3f5bf6 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/binutils-2.40-h4852527_3.conda#abcdaa12050c40a74330701f22418e5a -https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.40-hb3c18ed_4.conda#19286994c03c5207a70c7cfabe294570 +https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_0.conda#35e52d19547cb3265a09c49de146a5ae +https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_16.conda#223fe8a3ff6d5e78484a9d58eb34d055 +https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_7.conda#3f840c7ed70a96b5ebde8044b2f36f32 +https://conda.anaconda.org/conda-forge/linux-64/binutils-2.40-h4852527_7.conda#df53aa8418f8c289ae9b9665986034f8 +https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.40-hb3c18ed_2.conda#e8255f2cf0772d7cde80d40c26028f53 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2#562b26ba2e19059551a811e72ab7f793 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda#0bb492cca54017ea314b809b1ee3a176 -https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.0-hac33072_0.conda#93a3bf248e5bc729807db198a9c89f07 -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 -https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda#172bcc51059416e7ce99e7b528cede83 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf -https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 -https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f -https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.3.0-hb8811af_7.conda#ee573415c47ce17f65101d0b3fba396d +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 +https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-heb74ff8_1.conda#c4cb22f270f501f5c59a122dc2adf20a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 -https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 -https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.0-hac33072_0.conda#2a08edb7cd75e56623f2712292a97325 +https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-recordproto-1.14.2-h7f98852_1002.tar.bz2#2f835e6c386e73c6faaddfe9eda67e98 https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2#3ceea9668625c18f19530de98b15d5b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 -https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h59595ed_0.conda#fd486bffbf0d6841cf1456a8f2e3a995 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.0.7-h0b41bf4_0.conda#49e8329110001f04923fe7e864990b0c -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 -https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.3.0-h58ffeeb_7.conda#95f78565a09852783d3e90e0389cfa5f -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 -https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.0.4-hd2f8ffe_4.conda#cb911b3e0d863ca9caafd767525f7cac -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d -https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 +https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 +https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-hfea6d02_1.conda#0d043dbc126b64f79d915a0e96d3a1d5 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda#ee605e794bdc14e2b7f84c4faa0d8c2c https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda#b63d9b6da3653179a278077f0de20014 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d +https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b -https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda#784a4df6676c581ca624fbe460703a6d -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 +https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h70512c7_0.conda#c567b6fa201bc424e84f1e70f7a36095 +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda#0d9c441855be3d8dfdb2e800fe755059 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 +https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-hac33072_1.conda#df96b7266e49529d82de467b23977452 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.1-he02047a_0.conda#8fd1654184917db2cb74fc84cb4fff79 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba -https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.14.4-hb4ffafa_1.conda#84eb54e92644c328e087e1c725773317 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.1-hc57e6cf_0.conda#5f84961d86d0ef78851cb34f9d5e31fe https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gcc-12.3.0-h915e2ae_7.conda#84b1c5cebd0a0443f3d7f90a4be93fc6 -https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.3.0-h6b3dd4b_4.conda#4b76ee727fca36fd83ef58586516c46a -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 -https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-12.3.0-h1645026_7.conda#2d9d4058c433c9ce2a811c76658c4efd -https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.3.0-h2a574ab_7.conda#265caa78b979f112fc241cecd0015c91 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 -https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.2-hcae5a98_0.conda#901db891e1e21afd8524cd636a8c8e3b -https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef -https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.7-hb77312f_0.conda#bc0ea7e1f75a9b1c8467597fbbd9f86b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.7-ha31de31_0.conda#7234f31acd176e402e91e03feba90f7d -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda#1b50eebe2a738a3146c154d2eceaa8b6 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda#949c4a82290ee58b3c970cef4bcfd4ad +https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_1.conda#606924335b5bcdf90e9aed9a2f5d22ed +https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_2.conda#fc9381129eccc8eb9ccac7dc5bdff487 +https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.3.0-h10434e7_1.conda#6709e113709b6ba67cc0f4b0de58ef7f +https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hdbfa832_1.conda#806367e23a0a6ad21e51875b34c57d7e +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h104a339_1.conda#9ef052c2eee74c792833ac2e820e481e +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h315aac3_2.conda#b0143a3e98136a680b728fdf9b42a258 +https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.3-h66b40c8_0.conda#a394f85083195ab8aa33911f40d76870 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.8-hf5423f3_1.conda#8782406a10201b67bd6476ca70cf92a8 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-ha479ceb_0.conda#6fd406aef37faad86bd7f37a94fb6f8a https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda#c48418c8b35f1d59ae9ae1174812b40a -https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.7.0-hd590300_1.conda#e9dffe1056994133616378309f932d77 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39hf88036b_2.conda#8ea5af6ac902f1a4429190970d9099ce +https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad +https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.8.0-h2b85faf_0.conda#1e7d93b16ce10cdc68228dde0844980b +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py39h3d6467e_0.conda#76b5d215fb735a6dc43010ffbe78040e +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py39hf88036b_2.conda#8cd78166f2350de9b9e1bae1e4fe8589 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/linux-64/gfortran-12.3.0-h915e2ae_7.conda#8efa768f7f74085629f3e1090e7f0569 -https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-12.3.0-h5877db1_4.conda#aa5735fc506449d6bc2ec27bc066364e -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda#a965aeaf060289528a3fbe09326edae2 -https://conda.anaconda.org/conda-forge/linux-64/gxx-12.3.0-h915e2ae_7.conda#721c5433122a02bf3a081db10a2e68e2 -https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.3.0-ha28b414_4.conda#a2046880d7a1a377824bac6538d85aff -https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca +https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_1.conda#5e5e3b592d5174eb49607a973c77825b +https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_2.conda#892435e6ccc3aa872c900d1f3621ec63 +https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_1.conda#209182ca6b20aeff62f442e843961d81 +https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_2.conda#b2d6c882e578b90802f9bf6ea0b13593 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 +https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py39h74842e3_0.conda#1bf77976372ff6de02af7b75cf034ce5 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda#d0a9633b53cdc319b8a1a532ae7822b8 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.7-default_h087397f_0.conda#536526073c2e7f9056fdce8584da779e +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda#dfcfd72c7a430d3616763ecfbefe4ca9 -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_0.conda#b470cc353c5b852e0d830e8d5d23e952 +https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.8-h8b73ec9_2.conda#2e25bb2f53e4a48873a936f8ef53e592 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h2d7952a_1.conda#7e3173fd1299939a02ebf9ec32aa77c4 +https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39h8cd3c5a_1.conda#4e045330e331d55a42ab44618315808e https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda#425fce3b531bed6ec3c74fab3e5f0a1c -https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.27-pthreads_h7a3da1a_0.conda#4b422ebe8fc6a5320d0c1c22e5a46032 +https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.27-pthreads_h9eca1d5_1.conda#5633a1616bda33f8b815841eba4dbfb8 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.2-pyhd8ed1ab_0.conda#e1a2dfcd5695f0744f1bcd3bbfe02523 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda#18c6deb6f9602e32446398203c8f0e91 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py39hd1e30aa_0.conda#ec86403fde8793ac1c36f8afa3d15902 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py39h8cd3c5a_1.conda#45a3a1bbc95b90e35af5976c3d957c9f +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2#4759805cce2d914c38472f70bf4d8bcb -https://conda.anaconda.org/conda-forge/noarch/tenacity-8.3.0-pyhd8ed1ab_0.conda#216cfa8e32bcd1447646768351df6059 +https://conda.anaconda.org/conda-forge/noarch/tenacity-9.0.0-pyhd8ed1ab_0.conda#42af51ad3b654ece73572628ad2882ae https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd -https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py39hd3abc70_0.conda#c183e99f9320e5e2d0f9c43efcb3fb22 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py39h8cd3c5a_1.conda#48d269953fcddbbcde078429d4b27afe https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.42-h4ab18f5_0.conda#b193af204da1bfb8c13882d131a14bd2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.18.1-pyhd8ed1ab_0.conda#c77c4aabc01b156a8cb4395f0233d335 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.7.0-h00ab1b0_1.conda#28de2e073db9ca9b72858bee9fb6f571 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py39hd3abc70_0.conda#9dae301603c88aef61dba733e8931cdd -https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.7.0-heb67821_1.conda#cf4b0e7c4c78bb0662aed9b27c414a3c -https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py39h15c3d72_0.conda#7e61b8777f42e00b08ff059f9e8ebc44 +https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.8.0-h1a2810e_0.conda#36848c05490b8cb46221517ca12aa4bf +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py39h8cd3c5a_1.conda#2da39b9876694c9d0648887303962243 +https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.8.0-h36df796_0.conda#53932a433fcb479d509fc5eeff3c6d5d +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 -https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 -https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.8-default_hf981a13_4.conda#7b72d74b57e681251536094b96ba9c46 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_4.conda#7e3f831d4ae9820999418821be65ff67 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_0.conda#3deca8c25851196c28d1c84dd4ae9149 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda#e2eaefa4de2b7237af7c907b8bbc760a https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_0.tar.bz2#8b45f9f2b2f7a98b0ec179c8991a4a9b -https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda#1e3b6af9592be71ce19f0a6aae05d97b -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/noarch/plotly-5.22.0-pyhd8ed1ab_0.conda#5b409a5f738e7d76c2b426eddb7e9956 +https://conda.anaconda.org/conda-forge/noarch/meson-1.5.1-pyhd8ed1ab_1.conda#979087ee59bea1355f991a3b738af64e +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py39h16a7006_0.conda#d9a6b19174a6cf5185296b16f781951f +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 +https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.0-pyhd8ed1ab_0.conda#80a4a0867ded2a66687e78bca0bc70fc https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.8.0-pyhd8ed1ab_0.conda#573fe09d7bd0cd4bcc210d8369b5ca47 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda#e667a3ab0df62c54e60e1843d2e6defb -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/linux-64/compilers-1.7.0-ha770c72_1.conda#d8d07866ac3b5b6937213c89a1874f08 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.conda#926c2c7ee7a0b48d6d70783a33f7bc80 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda#dcbadab7a68738a028e195ab68ab2d2e -https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_0.conda#a284ff318fbdb0dd83928275b4b6087c -https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-22_linux64_openblas.conda#1fd156abd41a4992835952f6f4d951d0 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.4-h4ab18f5_2.conda#79e46d4a6ccecb7ee1912042958a8758 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-h4bc722e_1.conda#0c90ad87101001080484b91bd9d2cdef +https://conda.anaconda.org/conda-forge/linux-64/compilers-1.8.0-ha770c72_0.conda#e08e569c1b7e923654d1fe9e76dadb3d +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.4-pyhd8ed1ab_0.conda#c62e775953b6b65f2079c9ee2a62813c +https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_1.conda#4809b9f4c6ce106d443c3f90b8e10db2 +https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-23_linux64_openblas.conda#89d7bcdb1e9a72a73e36d8e29d2a2beb https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f -https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda#93aff412f3e49fdb43361c0215cbd72d -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-22_linux64_openblas.conda#63ddb593595c9cf5eb08d3de54d66df8 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda#bdc188e59857d6efab332714e0d01d93 -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py39hbbab4d9_0.conda#bc3c956def472cc1562a325198db91c0 -https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda#bcf6a6f4c6889ca083e8d33afbafb8d5 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.0.2-py39h9cb892a_0.conda#ed28982e8b085c5d47361fc4af0902ac +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-h4bc722e_0.conda#185159d666308204eca00295599b0a5c +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39h08a7858_1.conda#cd9fa334e11886738f17254f52210bc3 +https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-23_linux64_openblas.conda#08b43a5c3d6cc13aeb69bd2cbc293196 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py39h74842e3_1.conda#7f97d682c5c7fdd49a8ddd995636a6ad +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py39h9d013fb_3.conda#f3bcbaa497af215e86d966244d683289 +https://conda.anaconda.org/conda-forge/noarch/imageio-2.35.1-pyh12aca89_0.conda#b03ff3631329c8ef17bae35d2bb216f7 +https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py39hfc16268_1.conda#8b23d2b425035a7468d17e6fe1d54124 https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 -https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.31-py39ha963410_0.conda#ef7ffefe34eae8f69a2ed0cdf2a27678 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed -https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py39h44dd56e_1.conda#d037c20e3da2e85f03ebd20ad480c359 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.6.0-py39hd0e0a0c_0.conda#52e9db726eddaa2396b9e2e9f5b9b50c +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py39hd92a3bb_0.conda#32e26e16f60c568b17a82e3033a4d309 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.2-hb12f9c5_5.conda#8c662388c2418f293266f5e7f50df7d7 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py39haf93ffa_0.conda#492a2cd65862d16a4aaf535ae9ccb761 -https://conda.anaconda.org/conda-forge/linux-64/blas-2.122-openblas.conda#5065468105542a8b23ea47bd8b6fa55f -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39h10d1fc8_2.conda#c9fb6571b93b1dd490ea627af7344f36 -https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.1.0-py39h85c637f_1.conda#b2b15112d019e27e62f9433e31607d08 -https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda#b325046180590c868ce0dbf267b82eb8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 +https://conda.anaconda.org/conda-forge/linux-64/blas-2.123-openblas.conda#7f4b3ea1cdd6e50dca2a226abda6e2d9 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py39h0565ad7_0.conda#14917b240f18eba18576e81530360a0a +https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py39h85c637f_0.conda#0bfaf33b7ebdbadc77bf9a67e281c0b1 +https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.7.2-py39h8242bd1_2.conda#e5c6995331893cf9fcaab45d11e343ff +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py39hd92a3bb_0.conda#2f6c03d60e71f13d92d511b06193f007 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.5.22-pyhd8ed1ab_0.conda#3930cabe8ca8c8594026fa8768cae75c -https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda#e1f148e57d071b09187719df86f513c1 -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.22.0-py39hddac248_2.conda#8d502a4d2cbe5a45ff35ca8af8cbec0a +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.6.18-pyhd8ed1ab_0.conda#7c3077529bfe3b86f9425d526d73bd24 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.9.2-py39hf3d152e_0.conda#5f49ac6db4d60b2afbb6feb2a85beea7 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py39h5114956_2.conda#3d33123e655e3279a7aa39ec974612f5 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py39hf3d152e_2.conda#bd956c7563b6a6b27521b83623c74e22 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e -https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_1.conda#66798cbfdcb003d9fbccd92cd08eb3ac -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 +https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_0.conda#0a5522bdd3983c52102e75d1307ad8c4 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 -https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda#264b3c697fa9cdade87eb0abe4440d54 -https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda#add28691ee89e875b190eda07929d5d4 +https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda#db0f1eb28b6df3a11e89437597309009 +https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.17.1-pyhd8ed1ab_0.conda#0adfccc6e7269a29a63c1c8ee3c6d8ba https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2#88ee91e8679603f2a5bd036d52919cc2 https://conda.anaconda.org/conda-forge/noarch/sphinx-remove-toctrees-1.0.0.post1-pyhd8ed1ab_0.conda#6dee8412218288a17f99f2cfffab334d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1ab_0.conda#286283e05a1eff606f55e7cd70f6d7f7 -# pip attrs @ https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl#sha256=99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 +# pip attrs @ https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl#sha256=81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 # pip cloudpickle @ https://files.pythonhosted.org/packages/96/43/dae06432d0c4b1dc9e9149ad37b4ca8384cf6eb7700cd9215b177b914f0a/cloudpickle-3.0.0-py3-none-any.whl#sha256=246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7 # pip defusedxml @ https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl#sha256=a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 -# pip fastjsonschema @ https://files.pythonhosted.org/packages/9c/b9/79691036d4a8f9857e74d1728b23f34f583b81350a27492edda58d5604e1/fastjsonschema-2.19.1-py3-none-any.whl#sha256=3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0 +# pip fastjsonschema @ https://files.pythonhosted.org/packages/6d/ca/086311cdfc017ec964b2436fe0c98c1f4efcb7e4c328956a22456e497655/fastjsonschema-2.20.0-py3-none-any.whl#sha256=5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a # pip fqdn @ https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl#sha256=3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014 # pip json5 @ https://files.pythonhosted.org/packages/8a/3c/4f8791ee53ab9eeb0b022205aa79387119a74cc9429582ce04098e6fc540/json5-0.9.25-py3-none-any.whl#sha256=34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f -# pip jsonpointer @ https://files.pythonhosted.org/packages/12/f6/0232cc0c617e195f06f810534d00b74d2f348fe71b2118009ad8ad31f878/jsonpointer-2.4-py2.py3-none-any.whl#sha256=15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a +# pip jsonpointer @ https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl#sha256=13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942 # pip jupyterlab-pygments @ https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl#sha256=841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780 # pip libsass @ https://files.pythonhosted.org/packages/fd/5a/eb5b62641df0459a3291fc206cf5bd669c0feed7814dded8edef4ade8512/libsass-0.23.0-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl#sha256=4a218406d605f325d234e4678bd57126a66a88841cb95bee2caeafdc6f138306 # pip mistune @ https://files.pythonhosted.org/packages/f0/74/c95adcdf032956d9ef6c89a9b8a5152bf73915f8c633f3e3d88d06bd699c/mistune-3.0.2-py3-none-any.whl#sha256=71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205 @@ -285,44 +282,42 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip pkginfo @ https://files.pythonhosted.org/packages/c0/38/d617739840a2f576e400f03fea0a75703f93cc274002635b4b998bbb9de4/pkginfo-1.11.1-py3-none-any.whl#sha256=bfa76a714fdfc18a045fcd684dbfc3816b603d9d075febef17cb6582bea29573 # pip prometheus-client @ https://files.pythonhosted.org/packages/c7/98/745b810d822103adca2df8decd4c0bbe839ba7ad3511af3f0d09692fc0f0/prometheus_client-0.20.0-py3-none-any.whl#sha256=cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7 # pip ptyprocess @ https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl#sha256=4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 -# pip pycparser @ https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl#sha256=c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc # pip python-json-logger @ https://files.pythonhosted.org/packages/35/a6/145655273568ee78a581e734cf35beb9e33a370b29c5d3c8fee3744de29f/python_json_logger-2.0.7-py3-none-any.whl#sha256=f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd -# pip pyyaml @ https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c +# pip pyyaml @ https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 # pip rfc3986-validator @ https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl#sha256=2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9 -# pip rpds-py @ https://files.pythonhosted.org/packages/97/b1/12238bd8cdf3cef71e85188af133399bfde1bddf319007361cc869d6f6a7/rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab +# pip rpds-py @ https://files.pythonhosted.org/packages/04/d8/e73d56b1908a6c0e3e5982365eb293170cd458cc25a19363f69c76e00fd2/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda # pip send2trash @ https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl#sha256=0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9 # pip sniffio @ https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl#sha256=2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 # pip traitlets @ https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl#sha256=b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f -# pip types-python-dateutil @ https://files.pythonhosted.org/packages/c7/1b/af4f4c4f3f7339a4b7eb3c0ab13416db98f8ac09de3399129ee5fdfa282b/types_python_dateutil-2.9.0.20240316-py3-none-any.whl#sha256=6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b +# pip types-python-dateutil @ https://files.pythonhosted.org/packages/aa/4c/5c684b333135a6fb085bb5a5bdfd962937f80bec06745a88fd551e29f4d9/types_python_dateutil-2.9.0.20240906-py3-none-any.whl#sha256=27c8cc2d058ccb14946eebcaaa503088f4f6dbc4fb6093d3d456a49aef2753f6 # pip uri-template @ https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl#sha256=a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 -# pip webcolors @ https://files.pythonhosted.org/packages/3b/45/0c30e10a2ac52606476394e4ba11cf3b12ba5823e7fbb9167f80eee6000a/webcolors-24.6.0-py3-none-any.whl#sha256=8cf5bc7e28defd1d48b9e83d5fc30741328305a8195c29a8e668fa45586568a1 +# pip webcolors @ https://files.pythonhosted.org/packages/f0/33/12020ba99beaff91682b28dc0bbf0345bbc3244a4afbae7644e4fa348f23/webcolors-24.8.0-py3-none-any.whl#sha256=fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a # pip webencodings @ https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl#sha256=a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 # pip websocket-client @ https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl#sha256=17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526 # pip anyio @ https://files.pythonhosted.org/packages/7b/a2/10639a79341f6c019dedc95bd48a4928eed9f1d1197f4c04f546fc7ae0ff/anyio-4.4.0-py3-none-any.whl#sha256=c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7 +# pip argon2-cffi-bindings @ https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae # pip arrow @ https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl#sha256=c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 # pip bleach @ https://files.pythonhosted.org/packages/ea/63/da7237f805089ecc28a3f36bca6a21c31fcbc2eb380f3b8f1be3312abd14/bleach-6.1.0-py3-none-any.whl#sha256=3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6 -# pip cffi @ https://files.pythonhosted.org/packages/ea/ac/e9e77bc385729035143e54cc8c4785bd480eaca9df17565963556b0b7a93/cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 # pip doit @ https://files.pythonhosted.org/packages/44/83/a2960d2c975836daa629a73995134fd86520c101412578c57da3d2aa71ee/doit-0.36.0-py3-none-any.whl#sha256=ebc285f6666871b5300091c26eafdff3de968a6bd60ea35dd1e3fc6f2e32479a # pip jupyter-core @ https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl#sha256=4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 +# pip pyzmq @ https://files.pythonhosted.org/packages/6e/bd/3ff3e1172f12f55769793a3a334e956ec2886805ebfb2f64756b6b5c6a1a/pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9 # pip referencing @ https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl#sha256=eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de # pip rfc3339-validator @ https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl#sha256=24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa # pip sphinxcontrib-sass @ https://files.pythonhosted.org/packages/2e/87/7c2eb08e3ca1d6baae32c0a5e005330fe1cec93a36aa085e714c3b3a3c7d/sphinxcontrib_sass-0.3.4-py2.py3-none-any.whl#sha256=a0c79a44ae8b8935c02dc340ebe40c9e002c839331201c899dc93708970c355a # pip terminado @ https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl#sha256=a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0 # pip tinycss2 @ https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl#sha256=54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7 -# pip argon2-cffi-bindings @ https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae +# pip argon2-cffi @ https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl#sha256=c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea # pip isoduration @ https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl#sha256=b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042 # pip jsonschema-specifications @ https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl#sha256=87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c -# pip jupyter-server-terminals @ https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl#sha256=41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa -# pip jupyterlite-core @ https://files.pythonhosted.org/packages/05/d2/1d59d9a70d684b1eb3eb3a0b80a36b4e1d691e94af5d53aee56b1ad5240b/jupyterlite_core-0.3.0-py3-none-any.whl#sha256=247cc34ae6fedda41b15ce4778997164508b2039bc92480665cadfe955193467 -# pip pyzmq @ https://files.pythonhosted.org/packages/64/b8/1c181c13e118cabccfd25bd3e169e44958c649180b0d78b798a66899e08b/pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8 -# pip argon2-cffi @ https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl#sha256=c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea -# pip jsonschema @ https://files.pythonhosted.org/packages/c8/2f/324fab4be6fe37fb7b521546e8a557e6cf08c1c1b3d0b4839a00f589d9ef/jsonschema-4.22.0-py3-none-any.whl#sha256=ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802 # pip jupyter-client @ https://files.pythonhosted.org/packages/cf/d3/c4bb02580bc0db807edb9a29b2d0c56031be1ef0d804336deb2699a470f6/jupyter_client-8.6.2-py3-none-any.whl#sha256=50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f -# pip jupyterlite-pyodide-kernel @ https://files.pythonhosted.org/packages/42/ce/87fadd7eaa01caaa564d3345025b983f72b4200abc82245068bd2664fb56/jupyterlite_pyodide_kernel-0.3.2-py3-none-any.whl#sha256=ae600571fa755b6fd7a2633a171de3fe490f2b1264bef32cdd7e8c34c95cd5ff +# pip jupyter-server-terminals @ https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl#sha256=41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa +# pip jupyterlite-core @ https://files.pythonhosted.org/packages/5c/da/20f28adfa38f3a89b69fc3fa803591c5016b2ca905fad8c25954067fea92/jupyterlite_core-0.4.1-py3-none-any.whl#sha256=62dba3adf1e379596c629226389353992804cd8d2c5907dcddee06218c6d8cdd +# pip jsonschema @ https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl#sha256=fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 +# pip jupyterlite-pyodide-kernel @ https://files.pythonhosted.org/packages/9a/38/8d94eb15014a8c1107128b8bfb88101f28b39628eee5cdc2daacbe92b82e/jupyterlite_pyodide_kernel-0.4.2-py3-none-any.whl#sha256=d78fd12f1ac08eb98c55b476275b53e7d011fb46a01c631ed182da3f00d5895a # pip jupyter-events @ https://files.pythonhosted.org/packages/a5/94/059180ea70a9a326e1815176b2370da56376da347a796f8c4f0b830208ef/jupyter_events-0.10.0-py3-none-any.whl#sha256=4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960 # pip nbformat @ https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl#sha256=3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b # pip nbclient @ https://files.pythonhosted.org/packages/66/e8/00517a23d3eeaed0513e718fbc94aab26eaa1758f5690fc8578839791c79/nbclient-0.10.0-py3-none-any.whl#sha256=f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f # pip nbconvert @ https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl#sha256=05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3 -# pip jupyter-server @ https://files.pythonhosted.org/packages/26/f5/be75c159deda5b54e15cf54029915ad28337fcfef402d671566c45f9e61f/jupyter_server-2.14.1-py3-none-any.whl#sha256=16f7177c3a4ea8fe37784e2d31271981a812f0b2874af17339031dc3510cc2a5 -# pip jupyterlab-server @ https://files.pythonhosted.org/packages/cb/46/d5ffd7c0f63db4e9f0982c3d58efeea10fc5f47e79fb328431df78843772/jupyterlab_server-2.27.2-py3-none-any.whl#sha256=54aa2d64fd86383b5438d9f0c032f043c4d8c0264b8af9f60bd061157466ea43 -# pip jupyterlite-sphinx @ https://files.pythonhosted.org/packages/71/2c/bd797dc46a7281d43444c79ff312d4f8d27d41a0de05f48cad81c7939966/jupyterlite_sphinx-0.15.0-py3-none-any.whl#sha256=344d1f9ee5a20b141a4a4139874eae30a68216f0c995d03ea2e3b3e9d29c4cd5 +# pip jupyter-server @ https://files.pythonhosted.org/packages/57/e1/085edea6187a127ca8ea053eb01f4e1792d778b4d192c74d32eb6730fed6/jupyter_server-2.14.2-py3-none-any.whl#sha256=47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd +# pip jupyterlab-server @ https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl#sha256=e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4 +# pip jupyterlite-sphinx @ https://files.pythonhosted.org/packages/f6/71/d7fa0b7d802f359539019dfe2ec9e4b0b11b14ce815748b5adc8d28bb283/jupyterlite_sphinx-0.16.5-py3-none-any.whl#sha256=9429bfd0310d18c3cd4273e342a7e67e5a07b6baf21b150c26a54fae1b2a0077 diff --git a/build_tools/circle/doc_min_dependencies_environment.yml b/build_tools/circle/doc_min_dependencies_environment.yml index e27c3a700fdad..4ccadd4439958 100644 --- a/build_tools/circle/doc_min_dependencies_environment.yml +++ b/build_tools/circle/doc_min_dependencies_environment.yml @@ -30,10 +30,10 @@ dependencies: - numpydoc=1.2.0 # min - sphinx-prompt=1.4.0 # min - plotly=5.14.0 # min - - polars=0.20.23 # min + - polars=0.20.30 # min - pooch=1.6.0 # min - sphinx-remove-toctrees=1.0.0.post1 # min - - sphinx-design=0.5.0 # min + - sphinx-design=0.6.0 # min - pydata-sphinx-theme=0.15.3 # min - pip - pip: diff --git a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock index f445fe196a6da..2779e25b8a454 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -1,63 +1,67 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: aa64e81a701c97b7c4cf149f108c3ca59fc65572bfda79dbaeb2d093afc8a665 +# input_hash: 5c8271fa578693d01da90fd519c56b90a86857bdb8b28024e74528f3d937d440 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/noarch/_sysroot_linux-64_curr_repodata_hack-3-h69a702a_16.conda#1c005af0c6ff22814b7c52ee448d4bea +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f -https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_17.conda#d731b543793afc0433c4fd593e693fce -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_3.conda#7c1062eaa78dec4ea8a9a988dbda6045 -https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-12.3.0-h0223996_107.conda#851e9651c9e4cd5dc19f80398eba9a1c -https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-12.3.0-h0223996_107.conda#167a1f5d77d8f3c2a638f7eb418429f1 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2024.1.0-ha957f24_693.conda#249c91c2186d236c6d180342241db2ec -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda#bfe4b3259a8ac6cdf0037752904da6a7 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-5_cp39.conda#40363a30db350596b5f225d0d5a33328 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 -https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.12-he073ed8_17.conda#595db67e32b276298ff3d94d07d47fbf -https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_3.conda#2b0c0d451353cde73295d799ea8886b1 +https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-h4a8ded7_16.conda#ff7f38675b226cfb855aebfc32a13e31 +https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-h84ea5a7_101.conda#0ce69d40c142915ac9734bc6134e514a +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-h84ea5a7_101.conda#29b5a4ed4613fa81a07c21045e3f5bf6 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/binutils-2.40-h4852527_3.conda#abcdaa12050c40a74330701f22418e5a -https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.40-hb3c18ed_4.conda#19286994c03c5207a70c7cfabe294570 +https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_16.conda#223fe8a3ff6d5e78484a9d58eb34d055 +https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_7.conda#3f840c7ed70a96b5ebde8044b2f36f32 +https://conda.anaconda.org/conda-forge/linux-64/binutils-2.40-h4852527_7.conda#df53aa8418f8c289ae9b9665986034f8 +https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.40-hb3c18ed_2.conda#e8255f2cf0772d7cde80d40c26028f53 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2#562b26ba2e19059551a811e72ab7f793 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda#0bb492cca54017ea314b809b1ee3a176 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a +https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-he02047a_3.conda#fcd2016d1d299f654f81021e27496818 +https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 +https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 +https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda#172bcc51059416e7ce99e7b528cede83 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-he02047a_3.conda#efab66b82ec976930b96d62a976de8e7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f -https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.3.0-hb8811af_7.conda#ee573415c47ce17f65101d0b3fba396d +https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-heb74ff8_1.conda#c4cb22f270f501f5c59a122dc2adf20a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 -https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 @@ -68,52 +72,71 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f9 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 -https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.3.0-h58ffeeb_7.conda#95f78565a09852783d3e90e0389cfa5f -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 +https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-hfea6d02_1.conda#0d043dbc126b64f79d915a0e96d3a1d5 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c +https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda#4fab9799da9571266d05ca5503330655 https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda#b63d9b6da3653179a278077f0de20014 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-he02047a_3.conda#9aba7960731e6b4547b3a52f812ed801 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d +https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda#784a4df6676c581ca624fbe460703a6d -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 +https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-h70512c7_5.conda#4b652e3e572cbb3f297e77c96313faea +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda#0d9c441855be3d8dfdb2e800fe755059 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 +https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-hac33072_1.conda#df96b7266e49529d82de467b23977452 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.1-he02047a_0.conda#8fd1654184917db2cb74fc84cb4fff79 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.1-hc57e6cf_0.conda#5f84961d86d0ef78851cb34f9d5e31fe https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gcc-12.3.0-h915e2ae_7.conda#84b1c5cebd0a0443f3d7f90a4be93fc6 -https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.3.0-h6b3dd4b_4.conda#4b76ee727fca36fd83ef58586516c46a -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 -https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-12.3.0-h1645026_7.conda#2d9d4058c433c9ce2a811c76658c4efd -https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.3.0-h2a574ab_7.conda#265caa78b979f112fc241cecd0015c91 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h5622ce7_1001.conda#fc2d5b79c2d3f8568fbab31db7ae02f3 -https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef -https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.7-hb77312f_0.conda#bc0ea7e1f75a9b1c8467597fbbd9f86b -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.7-ha31de31_0.conda#7234f31acd176e402e91e03feba90f7d -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda#1b50eebe2a738a3146c154d2eceaa8b6 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda#949c4a82290ee58b3c970cef4bcfd4ad +https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_1.conda#606924335b5bcdf90e9aed9a2f5d22ed +https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_2.conda#fc9381129eccc8eb9ccac7dc5bdff487 +https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.3.0-h10434e7_1.conda#6709e113709b6ba67cc0f4b0de58ef7f +https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hdbfa832_1.conda#806367e23a0a6ad21e51875b34c57d7e +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h104a339_1.conda#9ef052c2eee74c792833ac2e820e481e +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h315aac3_2.conda#b0143a3e98136a680b728fdf9b42a258 +https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.3-h66b40c8_0.conda#a394f85083195ab8aa33911f40d76870 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-18.1.8-hf5423f3_1.conda#8782406a10201b67bd6476ca70cf92a8 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda#82776ee8145b9d1fd6546604de4b351d +https://conda.anaconda.org/conda-forge/linux-64/nss-3.104-hd34e28f_0.conda#0664e59f6937a660eba9f3d2f9123fa8 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2#5f095bc6454094e96f146491fd03633b -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda#c48418c8b35f1d59ae9ae1174812b40a -https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.7.0-hd590300_1.conda#e9dffe1056994133616378309f932d77 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39hf88036b_2.conda#8ea5af6ac902f1a4429190970d9099ce +https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad +https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.8.0-h2b85faf_0.conda#1e7d93b16ce10cdc68228dde0844980b +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f @@ -122,133 +145,144 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py39h3d6467e_0.conda#76b5d215fb735a6dc43010ffbe78040e https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 -https://conda.anaconda.org/conda-forge/linux-64/gfortran-12.3.0-h915e2ae_7.conda#8efa768f7f74085629f3e1090e7f0569 -https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-12.3.0-h5877db1_4.conda#aa5735fc506449d6bc2ec27bc066364e -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda#a965aeaf060289528a3fbe09326edae2 -https://conda.anaconda.org/conda-forge/linux-64/gxx-12.3.0-h915e2ae_7.conda#721c5433122a02bf3a081db10a2e68e2 -https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.3.0-ha28b414_4.conda#a2046880d7a1a377824bac6538d85aff -https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e +https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_1.conda#5e5e3b592d5174eb49607a973c77825b +https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_2.conda#892435e6ccc3aa872c900d1f3621ec63 +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.3-h8fdd7da_2.conda#9958a1f8faba35260e6b68e3a7bc88d6 +https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_1.conda#209182ca6b20aeff62f442e843961d81 +https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_2.conda#b2d6c882e578b90802f9bf6ea0b13593 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 +https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py39h74842e3_0.conda#1bf77976372ff6de02af7b75cf034ce5 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda#d0a9633b53cdc319b8a1a532ae7822b8 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.7-default_h087397f_0.conda#536526073c2e7f9056fdce8584da779e https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda#dfcfd72c7a430d3616763ecfbefe4ca9 -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a +https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef +https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.8-h8b73ec9_2.conda#2e25bb2f53e4a48873a936f8ef53e592 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h2d7952a_1.conda#7e3173fd1299939a02ebf9ec32aa77c4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39h8cd3c5a_1.conda#4e045330e331d55a42ab44618315808e https://conda.anaconda.org/conda-forge/noarch/networkx-3.2-pyhd8ed1ab_0.conda#cec8cc498664cc00a070676aa89e69a7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda#18c6deb6f9602e32446398203c8f0e91 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py39hd1e30aa_0.conda#ec86403fde8793ac1c36f8afa3d15902 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py39h8cd3c5a_1.conda#45a3a1bbc95b90e35af5976c3d957c9f +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py39h8cd3c5a_1.conda#76e82e62b7bda86a7fceb1f32585abad https://conda.anaconda.org/conda-forge/linux-64/setuptools-59.8.0-py39hf3d152e_1.tar.bz2#4252d0c211566a9f65149ba7f6e87aa4 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h297d8ca_1.conda#3ff978d8994f591818a506640c6a7071 -https://conda.anaconda.org/conda-forge/noarch/tenacity-8.3.0-pyhd8ed1ab_0.conda#216cfa8e32bcd1447646768351df6059 +https://conda.anaconda.org/conda-forge/noarch/tenacity-9.0.0-pyhd8ed1ab_0.conda#42af51ad3b654ece73572628ad2882ae https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py39hd3abc70_0.conda#c183e99f9320e5e2d0f9c43efcb3fb22 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py39h8cd3c5a_1.conda#48d269953fcddbbcde078429d4b27afe https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.42-h4ab18f5_0.conda#b193af204da1bfb8c13882d131a14bd2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.18.1-pyhd8ed1ab_0.conda#c77c4aabc01b156a8cb4395f0233d335 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.7.0-h00ab1b0_1.conda#28de2e073db9ca9b72858bee9fb6f571 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hbb29018_2.conda#b6d90276c5aee9b4407dd94eb0cd40a8 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py39h15c3d72_0.conda#7e61b8777f42e00b08ff059f9e8ebc44 +https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.8.0-h1a2810e_0.conda#36848c05490b8cb46221517ca12aa4bf https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py39hd1e30aa_0.conda#dc0fb8e157c7caba4c98f1e1f9d2e5f4 -https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.7.0-heb67821_1.conda#cf4b0e7c4c78bb0662aed9b27c414a3c -https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 +https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.8.0-h36df796_0.conda#53932a433fcb479d509fc5eeff3c6d5d +https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h315aac3_2.conda#00e0da7e4fceb5449f3ddd2bf6b2c351 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f -https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 -https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda#d0a9633b53cdc319b8a1a532ae7822b8 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_4.conda#7e3f831d4ae9820999418821be65ff67 +https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.50-h4f305b6_0.conda#0d7ff1a8e69565ca3add6925e18e708f +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda#e2eaefa4de2b7237af7c907b8bbc760a https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_0.tar.bz2#8b45f9f2b2f7a98b0ec179c8991a4a9b -https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 -https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.1.0-ha957f24_693.conda#ff0f4abf6f94e36a918f1ef4dbeb9769 +https://conda.anaconda.org/conda-forge/noarch/meson-1.5.1-pyhd8ed1ab_1.conda#979087ee59bea1355f991a3b738af64e https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda#1e3b6af9592be71ce19f0a6aae05d97b -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py39h16a7006_0.conda#d9a6b19174a6cf5185296b16f781951f +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/noarch/plotly-5.14.0-pyhd8ed1ab_0.conda#6a7bcc42ef58dd6cf3da9333ea102433 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.8.0-pyhd8ed1ab_0.conda#573fe09d7bd0cd4bcc210d8369b5ca47 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda#e667a3ab0df62c54e60e1843d2e6defb -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/linux-64/compilers-1.7.0-ha770c72_1.conda#d8d07866ac3b5b6937213c89a1874f08 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.conda#926c2c7ee7a0b48d6d70783a33f7bc80 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_mkl.conda#eb6deb4ba6f92ea3f31c09cb8b764738 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda#ee6f7fd1e76061ef1fa307d41fa86a96 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-h4bc722e_1.conda#0c90ad87101001080484b91bd9d2cdef +https://conda.anaconda.org/conda-forge/linux-64/compilers-1.8.0-ha770c72_0.conda#e08e569c1b7e923654d1fe9e76dadb3d +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.7-hf3bb09a_0.conda#c78bc4ef0afb3cd2365d9973c71fc876 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hfac3d4d_0.conda#c7b47c64af53e8ecee01d101eeab2342 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd +https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.11.0-h4ab18f5_1.conda#14858a47d4cc995892e79f2b340682d7 +https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 -https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.1.0-ha770c72_693.conda#7f422e2cf549a3fb920c95288393870d +https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.1.0-ha957f24_693.conda#ff0f4abf6f94e36a918f1ef4dbeb9769 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda#93aff412f3e49fdb43361c0215cbd72d -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.conda#1a57a819915e1c169b74933720b138f2 -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_mkl.conda#d6f942423116553f068b2f2d93ffea2e -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_mkl.conda#4edf2e7ce63920e4f539d12e32fb478e -https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2#6429e1d1091c51f626b5dcfdd38bf429 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39h08a7858_1.conda#cd9fa334e11886738f17254f52210bc3 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.0-pyhd8ed1ab_0.conda#bf68bf9ff9a18f1b17aa8c817225aee0 +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.7-h0a52356_0.conda#d368425fbd031a2f8e801a40c3415c72 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_mkl.conda#5bdaf561cf48f95093dedaa665083874 +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-256.5-hb6d7363_0.conda#3b3912077a5515b2a39bda92008bc2c3 +https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.1.0-ha770c72_693.conda#7f422e2cf549a3fb920c95288393870d +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_mkl.conda#e0219f401906533e26346d8634ef35f4 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_mkl.conda#157fa1f6fa92aa21c7d55f3c701afc9f https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b -https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-22_linux64_mkl.conda#aa0a5a70e1c957d5911e76ac98e471e1 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 +https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-23_linux64_mkl.conda#11f5d6ba1108647192fffe2baa042094 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.19.5-py39hd249d9e_3.tar.bz2#0cf333996ebdeeba8d1c8c1c0ee9eff9 -https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda#b325046180590c868ce0dbf267b82eb8 -https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-22_linux64_mkl.conda#3cb0e51433c88d2f4cdfb50c5c08a683 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-lite-2019.12.3-py39hd92a3bb_8.conda#5eb64443d4d973c31e179a498e1bb4a2 -https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda#bcf6a6f4c6889ca083e8d33afbafb8d5 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2#6429e1d1091c51f626b5dcfdd38bf429 +https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h320f8da_24.conda#bec111b67cb8dc63277c6af65d214044 +https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-23_linux64_mkl.conda#c8f8d0ebf2e7fd3a90ec68e3bb008995 +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py39h9d013fb_3.conda#f3bcbaa497af215e86d966244d683289 +https://conda.anaconda.org/conda-forge/noarch/imageio-2.35.1-pyh12aca89_0.conda#b03ff3631329c8ef17bae35d2bb216f7 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.3.4-py39h2fa2bec_0.tar.bz2#9ec0b2186fab9121c54f4844f93ee5b7 https://conda.anaconda.org/conda-forge/linux-64/pandas-1.1.5-py39hde0f152_0.tar.bz2#79fc4b5b3a865b90dd3701cecf1ad33c https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 -https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.23-py39ha963410_0.conda#4871f09d653e979d598d2d4cd5fa868d +https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py39ha963410_0.conda#322084e8890afc27fcca6df7a528df25 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda#e1f148e57d071b09187719df86f513c1 -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.3.0-py39hd257fcd_1.tar.bz2#c4b698994b2d8d2e659ae02202e6abe4 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py39hd92a3bb_0.conda#32e26e16f60c568b17a82e3033a4d309 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.6.0-py39hee8e79c_0.tar.bz2#3afcb78281836e61351a2924f3230060 -https://conda.anaconda.org/conda-forge/linux-64/blas-2.122-mkl.conda#ead856637ff8a7feba572e2cf23b453b +https://conda.anaconda.org/conda-forge/linux-64/blas-2.123-mkl.conda#f11a9d598ec5b312fad52789fa415c66 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.3.4-py39hf3d152e_0.tar.bz2#cbaec993375a908bbe506dc7328d747c https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.3-py39hac2352c_1.tar.bz2#6fb0628d6195d8b6caa2422d09296399 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.12.2-pyhd8ed1ab_0.conda#cf88f3a1c11536bc3c10c14ad00ccc42 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.13.2-py39hd257fcd_0.tar.bz2#bd7cdadf70e34a19333c3aacc40206e8 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2020.6.3-py_0.tar.bz2#1fb771bb25b2eecbc73abf5143fa35bd +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.6.18-pyhd8ed1ab_0.conda#7c3077529bfe3b86f9425d526d73bd24 https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.17.2-py39hde0f152_4.tar.bz2#2a58a7e382317b03f023b2fddf40f8a1 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.12.2-hd8ed1ab_0.conda#50847a47c07812f88581081c620f5160 https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.2-pyhd8ed1ab_0.tar.bz2#025ad7ca2c7f65007ab6b6f5d93a56eb https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 -https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda#264b3c697fa9cdade87eb0abe4440d54 +https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.0-pyhd8ed1ab_0.conda#b04f3c04e4f7939c6207dc0c0355f468 https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda#add28691ee89e875b190eda07929d5d4 https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2#88ee91e8679603f2a5bd036d52919cc2 https://conda.anaconda.org/conda-forge/noarch/sphinx-remove-toctrees-1.0.0.post1-pyhd8ed1ab_0.conda#6dee8412218288a17f99f2cfffab334d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e # pip libsass @ https://files.pythonhosted.org/packages/fd/5a/eb5b62641df0459a3291fc206cf5bd669c0feed7814dded8edef4ade8512/libsass-0.23.0-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl#sha256=4a218406d605f325d234e4678bd57126a66a88841cb95bee2caeafdc6f138306 diff --git a/build_tools/cirrus/arm_wheel.yml b/build_tools/cirrus/arm_wheel.yml index c3dfcfbc53ad9..7ce7ac41961cb 100644 --- a/build_tools/cirrus/arm_wheel.yml +++ b/build_tools/cirrus/arm_wheel.yml @@ -29,6 +29,11 @@ linux_arm64_wheel_task: CIBW_TEST_SKIP: "*_aarch64" - env: CIBW_BUILD: cp312-manylinux_aarch64 + - env: + CIBW_BUILD: cp313-manylinux_aarch64 + # TODO remove next line when Python 3.13 is relased and add + # CIBW_TEST_SKIP for Python 3.12 above + CIBW_TEST_SKIP: "*_aarch64" cibuildwheel_script: - apt install -y python3 python-is-python3 diff --git a/build_tools/cirrus/pymin_conda_forge_linux-aarch64_conda.lock b/build_tools/cirrus/pymin_conda_forge_linux-aarch64_conda.lock index edc83e3689ccc..cef592f5fa906 100644 --- a/build_tools/cirrus/pymin_conda_forge_linux-aarch64_conda.lock +++ b/build_tools/cirrus/pymin_conda_forge_linux-aarch64_conda.lock @@ -2,93 +2,152 @@ # platform: linux-aarch64 # input_hash: 2d8c526ab7c0c2f0ca509bfec3f035e5bd33b8096f194f0747f167c8aff66383 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.6.2-hcefe29a_0.conda#3ef6b1a30375f8a973a593698e317191 +https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.8.30-hcefe29a_0.conda#70e57e8f59d2c98f86b49c69e5074be5 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h9fc2d93_7.conda#1b0feef706f4d03eff0b76626ead64fc -https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.9-4_cp39.conda#c191905a08694e4a5cb1238e90233878 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.9-5_cp39.conda#2d2843f11ec622f556137d72d9c72d89 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2#98a1185182fec3c434069fa74e6473d6 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he277a41_0.conda#47ecd1292a3fd78b616640b35dd9632c -https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h31becfc_5.conda#a64e35f01e0b7a2a152eca87d33b9c87 -https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h31becfc_1.conda#1b219fd801eddb7a94df5bd001053ad9 -https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.20-h31becfc_0.conda#018592a3d691662f451f89d0de474a20 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.1.0-he277a41_1.conda#2cb475709e327bb76f74645784582e6a +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda#3ee026955c688f551a9999840cff4c67 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.3-h5ad3122_0.conda#1d2b842bb76e268625e8ee8d0a9fe8c3 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he9431aa_1.conda#842a1a0cf6f995091734a723e5d291ef +https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.1.0-h9420597_1.conda#f30cf31e474062ea51481d4181ee15df +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.1.0-h3f4de04_1.conda#6c2afef2109372440a90c566bcb6391c +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.2-h86ecc28_0.conda#9e1e477b3f8ee3789297883faffa708b +https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.12-h68df207_0.conda#65448d015f05afb3c68ea92d0483a466 +https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 +https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.3-h5ad3122_0.conda#901a44b341632b0c233756ed5abcd78b +https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda#e64d0f3b59c7c4047446b97a8624a72d +https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda#0e9bd365480c72b25c71a448257b537d +https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.21-h68df207_0.conda#806c74df6dcf96adea47c7829b264f80 https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2#dddd85f4d52121fab0a8b099c5e06501 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.1.0-h9420597_0.conda#b907b29b964b8ebd7be215e47a659179 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.1.0-he9431aa_1.conda#c0b5e52811ae0997f9df25a99846eb9e +https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda#9a8eb13f14de7d761555a98712e6df65 https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda#ed24e702928be089d9ba3f05618515c6 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-h3f4de04_0.conda#2f84852b723ac4389eb188db695526bb +https://conda.anaconda.org/conda-forge/linux-aarch64/libpciaccess-0.18-h31becfc_0.conda#6d48179630f00e8c9ad9e30879ce1e54 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-hf1166c9_1.conda#51f54efdd1d2ed5d7e9c67381b75fdb1 https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.4.0-h31becfc_0.conda#5fd7ab3e5f382c70607fbac6335e6e19 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda#b13fb82f88902e34dd0638cd7d378c21 -https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda#38362af7bfac0efef69675acee564458 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h68df207_1.conda#8349df397000d7a7acb514d97879fe09 +https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda#91d49c85cacd92caa40cf375ef72a25d https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-hb9de7d4_1001.tar.bz2#d0183ec6ce0b5aaa3486df25fa5f0ded +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-kbproto-1.0.7-h3557bc0_1002.tar.bz2#ec8ce6b3dac3945a4010559a6284b755 +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.1-h7935292_0.conda#025968e2637bca910b9b3e7f6743beff https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.11-h31becfc_0.conda#13de34f69cb73165dbe08c1e9148bedb https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.3-h3557bc0_0.tar.bz2#a6c9016ae1ca5c47a3603ed4cd65fedd +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-renderproto-0.11.1-h3557bc0_1002.tar.bz2#01cbfe96ce66b78a9a270ac305791dd2 +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xextproto-7.3.0-h2a766a3_1003.conda#32de1e4422c986e3b6eff59e7edc4d04 +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xproto-7.0.31-h3557bc0_1007.tar.bz2#987e98faa0ad2c667bbea6b6aae260bc https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2#83baad393a31d59c20b63ba4da6592df +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.1.0-h86ecc28_2.conda#7d48b185fe1f722f8cda4539bb931f85 +https://conda.anaconda.org/conda-forge/linux-aarch64/double-conversion-3.3.0-h2f0025b_0.conda#3b34b29f68d60abc1ce132b87f5a213c +https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.13-h2f0025b_1003.conda#f33009add6a08358bc12d114ceec1304 +https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2#1a0ffc65e03ce81559dbcb0695ad1476 -https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h31becfc_1.conda#8db7cff89510bec0b863a0a8ee6a7bce -https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h31becfc_1.conda#ad3d3a826b5848d99936e4466ebbaa26 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.1.0-he9431aa_0.conda#a50ae662c1e7f26f0f2c99e31d1bf614 +https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.123-h86ecc28_0.conda#4e3c67f6999ea7ccac41611f930d19d4 +https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#29371161d77933a54fccf1bb66b96529 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.1.0-he9431aa_1.conda#494514d173c7a4eb00957dc203b4d784 https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.43-h194ca79_0.conda#1123e504d9254dd9494267ab9aba95f0 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.0-hf51ef55_0.conda#a8ae63fd6fb7d007f74ef3df95e5edf3 -https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.16-h7935292_0.conda#93c0136e9cba96657339dfe25fba4da7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda#cd559337c1bd9545ecbeaad017e7d878 +https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.16-h57736b2_1.conda#8d502f235bf4f3ce1f288cb1ff3a90b6 +https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-common-8.3.0-h940b476_5.conda#f027f6c56a5ee03d21e6e32c963e2fbd https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.1-h70be974_0.conda#216635cea46498d8045c7cf0f03eaf72 +https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda#94022de9682cb1a0bb18a99cbc3541b3 +https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.43.4-h2f0025b_0.conda#81b2ddea4b0eca188da9c5a7aa4b0cff +https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda#bb138086d938e2b64f5f364945793ebf https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda#105eb1e16bf83bfb2eb380a48032b655 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc +https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.23.1-h698ed42_0.conda#2661f9252065051914f1cdf5835e7430 +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.4-h5a01bc2_0.conda#d788eca20ecd63bad8eea7219e5c5fb7 +https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h68df207_1.conda#6031f9e32654fbdb9fdba406ab980517 https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda#be8d5f8cf21aed237b8b182ea86b3dd6 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.1.0-h31becfc_1.conda#9e4a13596ab651ea8d77aae023d0ce3f +https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.1.0-h86ecc28_2.conda#5094acc34eb173f74205c0b55f0dd4a4 https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda#a5ab74c5bd158c3d5532b66d8d83d907 +https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 +https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.3-haee52c6_2.conda#937a787ab5789a1e0c818b9545b6deb9 https://conda.anaconda.org/conda-forge/linux-aarch64/libhiredis-1.0.2-h05efe27_0.tar.bz2#a87f068744fd20334cd41489eb163bee -https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h5a5ec62_0.conda#ffecca8f4f31cd50b92c0e6e6bfe4416 -https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.6.0-hf980d43_3.conda#b6f3abf5726ae33094bee238b4eb492f -https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-18.1.8-hb063fc5_0.conda#f0cf07feda9ed87092833cd8fca012f5 +https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h076ed1e_1.conda#cc0a15e3a6f92f454b6132ca6aca8e8d +https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.6.0-h395e79b_4.conda#07ac339fcab2d44ddfd9b8ac58e80a05 +https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h00a45b3_4.conda#d25c3e16ee77cd25342e4e235424c758 +https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-18.1.8-hb063fc5_1.conda#1656aad33930dad81fdc552fe8b44e13 +https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-libs-8.3.0-h0c23661_5.conda#c5447423bf6ba4f4ad398033bd66998f https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.9.19-h4ac3b42_0_cpython.conda#1501507cd9451472ec8900d587ce872f -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.1.0-h31becfc_1.conda#e41f5862ac746428407f3fd44d2ed01f -https://conda.anaconda.org/conda-forge/linux-aarch64/ccache-4.9.1-h6552966_0.conda#758b202f61f6bbfd2c6adf0fde043276 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a +https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-0.4.1-h5c728e9_2.conda#b4cf8ba6cff9cdf1249bcfe1314222b0 +https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-keysyms-0.4.1-h5c728e9_0.conda#57ca8564599ddf8b633c4ea6afee6f3a +https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-renderutil-0.3.10-h5c728e9_0.conda#7beeda4223c5484ef72d89fb66b7e8c1 +https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-wm-0.4.2-h5c728e9_0.conda#f14dcda6894722e421da2b7dcffb0b78 +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.9-h08be655_1.conda#66470f69e83673153ef02a2ebc018915 +https://conda.anaconda.org/conda-forge/linux-aarch64/ccache-4.10.1-ha3bccff_0.conda#7cd24a038d2727b5e6377975237a6cfa +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.0.10-py39h387a81e_0.conda#0e917a89f77c978d152099357bd75b22 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.0.11-py39h7dbf29c_2.conda#10e704f42cb0c74a29a2f48da784c9e9 +https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2#f3d63805602166bac09386741e00935e +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 +https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.14.2-ha9a116f_0.conda#6d2d19ea85f9d41534cd28fdefd59a25 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.4.5-py39had2cf8c_1.conda#ddb99610f7b950fdd5ff2aff19136363 +https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.4.7-py39h78c8b8d_0.conda#8dc5516dd121089f14c1a557ecec3224 https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.16-h922389a_0.conda#ffdd8267a04c515e7ce69c727b051414 -https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-22_linuxaarch64_openblas.conda#068ab33f2382cda4dd0b72a715ad33b5 +https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-23_linuxaarch64_openblas.conda#3ac1ad627e1a07fae62556d6aabafdfd +https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h405e4a8_4.conda#d42c670b0c96c1795fd859d5e0275a55 +https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm18-18.1.8-h36f4c5c_2.conda#e42436ab11417326ca4c317a9a78124b +https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-16.4-hb7c570e_1.conda#89e92105d664ac0fdb9720b9c3f24179 +https://conda.anaconda.org/conda-forge/linux-aarch64/libxslt-1.1.39-h1cc9640_0.conda#13e1d3f9188e85c6d59a98651aced002 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-aarch64/openblas-0.3.27-pthreads_h339cbfa_0.conda#cb06c34a3056f59e9e244c20836add8a +https://conda.anaconda.org/conda-forge/linux-aarch64/openblas-0.3.27-pthreads_hd33deab_1.conda#70c0aa7d1dd049fffae952bfe8f2c4e9 https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.2-h0d9d63b_0.conda#fd2898519e839d5ceb778343f39a3176 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.1-pyhd8ed1ab_0.conda#985e9e86e1b0fc75a74a9bfab9309ef7 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.1-py39ha3e8b56_0.conda#60ad0fcecca6af49fe5888a408618d8a +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.1-py39h3e3acee_1.conda#a4d4b0a58bf2fadfa1285f4710b72f99 https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-15.1.0-py39h898b7ef_0.conda#8c072c9329aeea97a46005625267a851 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae -https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 -https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.53.0-py39he257ee7_0.conda#de1dc44f6b1a4393b37f4264d8e31e2a -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-image-0.4.0-h5c728e9_2.conda#b82e5c78dbbfa931980e8bfe83bce913 +https://conda.anaconda.org/conda-forge/linux-aarch64/xkeyboard-config-2.42-h68df207_0.conda#910ed255de2a0ec218a3c3db12d20a4d +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.4-h2a766a3_2.conda#0cea7d840c8eeaa4e349e0b4775c826d +https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.11-h7935292_0.conda#8c96b84f7fb97a3cd533a14dbdcd6626 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 +https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.0-hdb1a16f_3.conda#080659f02bf2202c57f1cda4f9e51f21 +https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.53.1-py39h060674a_1.conda#e45b07efca11dedaa27ab4131485541f +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.4-pyhd8ed1ab_0.conda#99aa3edd3f452d61c305a30e78140513 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f -https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-22_linuxaarch64_openblas.conda#fbe7fe553f2cc78a0311e009b26f180d -https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-22_linuxaarch64_openblas.conda#8c709d281609792c39b1d5c0241f90f1 -https://conda.anaconda.org/conda-forge/noarch/meson-1.4.1-pyhd8ed1ab_0.conda#714ca123839eeebb25d12b443067ea64 -https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.3.0-py39h4a8821f_1.conda#12b4464ffbad162e28b7bf6e81129501 -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 +https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-23_linuxaarch64_openblas.conda#65a4f18036c0f5419146fddee6653a96 +https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp18.1-18.1.8-default_h14d1da3_4.conda#8bcade3ee01ba095a3fa42fec64261ae +https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-18.1.8-default_h465fbfb_4.conda#71334cadd10653dfd8eafc57cef45820 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-23_linuxaarch64_openblas.conda#85c4fec3847027ca7402f3bd7d2de4c1 +https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.7.0-h46f2afe_1.conda#78a24e611ab9c09c518f519be49c2e46 +https://conda.anaconda.org/conda-forge/noarch/meson-1.5.1-pyhd8ed1ab_1.conda#979087ee59bea1355f991a3b738af64e +https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.4.0-py39h4a8821f_0.conda#318861157594972acc05a8715d3018a8 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.8.0-pyhd8ed1ab_0.conda#573fe09d7bd0cd4bcc210d8369b5ca47 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda#dcbadab7a68738a028e195ab68ab2d2e -https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-22_linuxaarch64_openblas.conda#5acf669e0be669f30f4b813d2ecda7b8 +https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-cursor-0.1.4-h68df207_2.conda#9a1c7ed78dff58f6c7b22981ab5c9d39 +https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-9.0.0-hbf49d6b_1.conda#ceb458f664cab8550fcd74fff26451db +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.4-pyhd8ed1ab_0.conda#c62e775953b6b65f2079c9ee2a62813c +https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-23_linuxaarch64_openblas.conda#d71af7934d6dcef05a3c9b0379e1cdfa https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 -https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.0.0-py39hcdcdb6f_0.conda#8ba5676e972e45d1c0d947f169c6e914 +https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.0.2-py39h4a34e27_0.conda#4d6edcc002364ced01e4fc947832eee6 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 -https://conda.anaconda.org/conda-forge/linux-aarch64/blas-devel-3.9.0-22_linuxaarch64_openblas.conda#a5b77b6c6807661afd716f33e85814b3 -https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.2.1-py39hd16970a_0.conda#66b9718539ecdd38876b0176c315bcad +https://conda.anaconda.org/conda-forge/linux-aarch64/blas-devel-3.9.0-23_linuxaarch64_openblas.conda#0270f72a50c9d64fb8b67ae6681011c8 +https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.0-py39hbd2ca3f_1.conda#bbd779f52a946eb629a6a786aa150bde +https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.7.2-h288a8fd_4.conda#f6771673fad8025bb1d4dd765bc3caad https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.13.1-py39hb921187_0.conda#1aac9080de661e03d286f18fb71e5240 -https://conda.anaconda.org/conda-forge/linux-aarch64/blas-2.122-openblas.conda#65bc48b3bc85f8eeeab54311443a83aa -https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.8.4-py39hf44f4b6_2.conda#fadf734d38ed608c9f0b5c91fe79cfb4 -https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.8.4-py39ha65689a_2.conda#c0472e3c4b3f007de6d643317c30963b +https://conda.anaconda.org/conda-forge/linux-aarch64/blas-2.123-openblas.conda#43772c0a1ae8f29c9a223c21fd89262b +https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.9.2-py39hf3ba65a_0.conda#45cb5c6c0ffab8fce4070bdd481fe2d3 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.7.2-py39hb23dda1_2.conda#f4e3d54705d9aaddc4cadf200c30f330 +https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.9.2-py39ha65689a_0.conda#ab4bdeddf031205e3789f14685b5c8a0 diff --git a/build_tools/github/Windows b/build_tools/github/Windows deleted file mode 100644 index a9971aa525581..0000000000000 --- a/build_tools/github/Windows +++ /dev/null @@ -1,13 +0,0 @@ -# Get the Python version of the base image from a build argument -ARG PYTHON_VERSION -FROM winamd64/python:$PYTHON_VERSION-windowsservercore - -ARG WHEEL_NAME -ARG CIBW_TEST_REQUIRES - -# Copy and install the Windows wheel -COPY $WHEEL_NAME $WHEEL_NAME -RUN pip install $env:WHEEL_NAME - -# Install the testing dependencies -RUN pip install $env:CIBW_TEST_REQUIRES.split(" ") diff --git a/build_tools/github/build_minimal_windows_image.sh b/build_tools/github/build_minimal_windows_image.sh index 2995b6906c535..adac06f02bb9a 100755 --- a/build_tools/github/build_minimal_windows_image.sh +++ b/build_tools/github/build_minimal_windows_image.sh @@ -11,15 +11,37 @@ WHEEL_NAME=$(basename $WHEEL_PATH) cp $WHEEL_PATH $WHEEL_NAME -# Dot the Python version for identyfing the base Docker image -PYTHON_VERSION=$(echo ${PYTHON_VERSION:0:1}.${PYTHON_VERSION:1:2}) +# Dot the Python version for identifying the base Docker image +PYTHON_DOCKER_IMAGE_PART=$(echo ${PYTHON_VERSION:0:1}.${PYTHON_VERSION:1:2}) -if [[ "$CIBW_PRERELEASE_PYTHONS" == "True" ]]; then - PYTHON_VERSION="$PYTHON_VERSION-rc" +if [[ "$CIBW_PRERELEASE_PYTHONS" =~ [tT]rue ]]; then + PYTHON_DOCKER_IMAGE_PART="${PYTHON_DOCKER_IMAGE_PART}-rc" fi -# Build a minimal Windows Docker image for testing the wheels -docker build --build-arg PYTHON_VERSION=$PYTHON_VERSION \ - --build-arg WHEEL_NAME=$WHEEL_NAME \ - --build-arg CIBW_TEST_REQUIRES="$CIBW_TEST_REQUIRES" \ - -f build_tools/github/Windows \ - -t scikit-learn/minimal-windows . + +# We could have all of the following logic in a Dockerfile but it's a lot +# easier to do it in bash rather than figure out how to do it in Powershell +# inside the Dockerfile ... +DOCKER_IMAGE="winamd64/python:${PYTHON_DOCKER_IMAGE_PART}-windowsservercore" +MNT_FOLDER="C:/mnt" +CONTAINER_ID=$(docker run -it -v "$(cygpath -w $PWD):$MNT_FOLDER" -d $DOCKER_IMAGE) + +function exec_inside_container() { + docker exec $CONTAINER_ID powershell -Command $1 +} + +exec_inside_container "python -m pip install $MNT_FOLDER/$WHEEL_NAME" + +if [[ "$PYTHON_VERSION" == "313" ]]; then + # TODO: remove when pandas has a release with python 3.13 wheels + # First install numpy release + exec_inside_container "python -m pip install numpy" + # Then install pandas-dev + exec_inside_container "python -m pip install --pre --extra-index https://pypi.anaconda.org/scientific-python-nightly-wheels/simple pandas --only-binary :all:" +fi + +exec_inside_container "python -m pip install $CIBW_TEST_REQUIRES" + +# Save container state to scikit-learn/minimal-windows image. On Windows the +# container needs to be stopped first. +docker stop $CONTAINER_ID +docker commit $CONTAINER_ID scikit-learn/minimal-windows diff --git a/build_tools/github/upload_anaconda.sh b/build_tools/github/upload_anaconda.sh index 42e06f17c5c47..51401dd1d40ac 100755 --- a/build_tools/github/upload_anaconda.sh +++ b/build_tools/github/upload_anaconda.sh @@ -3,7 +3,6 @@ set -e set -x -# Note: build_wheels.sh has the same branch (only for NumPy 2.0 transition) if [[ "$GITHUB_EVENT_NAME" == "schedule" \ || "$GITHUB_EVENT_NAME" == "workflow_dispatch" \ || "$CIRRUS_CRON" == "nightly" ]]; then diff --git a/build_tools/update_environments_and_lock_files.py b/build_tools/update_environments_and_lock_files.py index ce457cabb1e53..2a5a353b6b314 100644 --- a/build_tools/update_environments_and_lock_files.py +++ b/build_tools/update_environments_and_lock_files.py @@ -146,36 +146,35 @@ def remove_from(alist, to_remove): # TODO: release scipy constraint when 1.13 is available in the "default" # channel. "scipy": "<1.12", + # TODO temporary to avoid a timeout in the no-OpenMP build, see + # https://github.com/scikit-learn/scikit-learn/pull/29486#issuecomment-2242359516 + "meson": "<1.5", }, # TODO: put cython, threadpoolctl and meson-python back to conda # dependencies when required version is available on the main channel - "pip_dependencies": ["cython", "threadpoolctl", "meson-python"], + "pip_dependencies": ["cython", "threadpoolctl", "meson-python", "meson"], }, { - "name": "pymin_conda_defaults_openblas", + "name": "pymin_conda_forge_openblas_min_dependencies", "type": "conda", "tag": "main-ci", "folder": "build_tools/azure", "platform": "linux-64", - "channel": "defaults", - "conda_dependencies": remove_from( - common_dependencies, - ["pandas", "threadpoolctl", "pip", "ninja", "meson-python"], - ) - + ["ccache"], + "channel": "conda-forge", + "conda_dependencies": common_dependencies + ["ccache", "polars"], "package_constraints": { "python": "3.9", "blas": "[build=openblas]", - "numpy": "1.21", # the min version is not available on the defaults channel - "scipy": "1.7", # the min version has some low level crashes + "numpy": "min", + "scipy": "min", "matplotlib": "min", "cython": "min", "joblib": "min", "threadpoolctl": "min", + "meson-python": "min", + "pandas": "min", + "polars": "min", }, - # TODO: put pip dependencies back to conda dependencies when required - # version is available on the defaults channel. - "pip_dependencies": ["threadpoolctl"], }, { "name": "pymin_conda_forge_openblas_ubuntu_2204", @@ -205,10 +204,16 @@ def remove_from(alist, to_remove): "pip_dependencies": ( remove_from(common_dependencies, ["python", "blas", "pip"]) + docstring_test_dependencies + # Test with some optional dependencies + ["lightgbm", "scikit-image"] + # Test array API on CPU without PyTorch + + ["array-api-compat", "array-api-strict"] ), "package_constraints": { - "python": "3.9", + # XXX: we would like to use the latest Python version, but for now using + # Python 3.12 makes the CI much slower so we use Python 3.11. See + # https://github.com/scikit-learn/scikit-learn/pull/29444#issuecomment-2219550662. + "python": "3.11", }, }, { @@ -384,7 +389,7 @@ def remove_from(alist, to_remove): }, }, { - "name": "debian_atlas_32bit", + "name": "debian_32bit", "type": "pip", "tag": "main-ci", "folder": "build_tools/azure", @@ -397,16 +402,9 @@ def remove_from(alist, to_remove): "ninja", "meson-python", ], - "package_constraints": { - "joblib": "min", - "threadpoolctl": "3.1.0", - "pytest": "min", - "pytest-cov": "min", - # no pytest-xdist because it causes issue on 32bit - "cython": "min", - }, - # same Python version as in debian-32 build - "python_version": "3.9.2", + # Python version from the python3 APT package in the debian-32 docker + # image. + "python_version": "3.12.5", }, { "name": "ubuntu_atlas", diff --git a/build_tools/wheels/build_wheels.sh b/build_tools/wheels/build_wheels.sh index 90bf64e979b0e..1ff3ed282f775 100755 --- a/build_tools/wheels/build_wheels.sh +++ b/build_tools/wheels/build_wheels.sh @@ -49,15 +49,17 @@ if [[ $(uname) == "Darwin" ]]; then export LDFLAGS="$LDFLAGS -Wl,-rpath,$PREFIX/lib -L$PREFIX/lib -lomp" fi +if [[ "$CIBW_FREE_THREADED_SUPPORT" =~ [tT]rue ]]; then + # Numpy, scipy, Cython only have free-threaded wheels on scientific-python-nightly-wheels + # TODO: remove this after CPython 3.13 is released (scheduled October 2024) + # and our dependencies have free-threaded wheels on PyPI + export CIBW_BUILD_FRONTEND='pip; args: --pre --extra-index-url "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" --only-binary :all:' +fi -if [[ "$GITHUB_EVENT_NAME" == "schedule" \ - || "$GITHUB_EVENT_NAME" == "workflow_dispatch" \ - || "$CIRRUS_CRON" == "nightly" ]]; then - # Nightly build: See also `../github/upload_anaconda.sh` (same branching). - # To help with NumPy 2.0 transition, ensure that we use the NumPy 2.0 - # nightlies. This lives on the edge and opts-in to all pre-releases. - # That could be an issue, in which case no-build-isolation and a targeted - # NumPy install may be necessary, instead. +if [[ "$CIBW_FREE_THREADED_SUPPORT" =~ [tT]rue ]]; then + # Numpy, scipy, Cython only have free-threaded wheels on scientific-python-nightly-wheels + # TODO: remove this after CPython 3.13 is released (scheduled October 2024) + # and our dependencies have free-threaded wheels on PyPI export CIBW_BUILD_FRONTEND='pip; args: --pre --extra-index-url "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"' fi diff --git a/build_tools/wheels/cibw_before_test.sh b/build_tools/wheels/cibw_before_test.sh new file mode 100755 index 0000000000000..193a3890530b4 --- /dev/null +++ b/build_tools/wheels/cibw_before_test.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -e +set -x + +FREE_THREADED_BUILD="$(python -c"import sysconfig; print(bool(sysconfig.get_config_var('Py_GIL_DISABLED')))")" +PY_VERSION=$(python -c 'import sys; print(f"{sys.version_info.major}{sys.version_info.minor}")') + +if [[ $FREE_THREADED_BUILD == "True" ]]; then + # TODO: remove when numpy, scipy and pandas have releases with free-threaded wheels + python -m pip install --pre --extra-index https://pypi.anaconda.org/scientific-python-nightly-wheels/simple numpy scipy pandas --only-binary :all: + +elif [[ "$PY_VERSION" == "313" ]]; then + # TODO: remove when pandas has a release with python 3.13 wheels + # First install numpy release + python -m pip install numpy --only-binary :all: + # Then install pandas-dev + python -m pip install --pre --extra-index https://pypi.anaconda.org/scientific-python-nightly-wheels/simple pandas --only-binary :all: +fi diff --git a/build_tools/wheels/test_wheels.sh b/build_tools/wheels/test_wheels.sh index e8cdf4b3ea8a2..da2c458c52903 100755 --- a/build_tools/wheels/test_wheels.sh +++ b/build_tools/wheels/test_wheels.sh @@ -6,6 +6,14 @@ set -x python -c "import joblib; print(f'Number of cores (physical): \ {joblib.cpu_count()} ({joblib.cpu_count(only_physical_cores=True)})')" +FREE_THREADED_BUILD="$(python -c"import sysconfig; print(bool(sysconfig.get_config_var('Py_GIL_DISABLED')))")" +if [[ $FREE_THREADED_BUILD == "True" ]]; then + # TODO: delete when importing numpy no longer enables the GIL + # setting to zero ensures the GIL is disabled while running the + # tests under free-threaded python + export PYTHON_GIL=0 +fi + # Test that there are no links to system libraries in the # threadpoolctl output section of the show_versions output: python -c "import sklearn; sklearn.show_versions()" diff --git a/doc/about.rst b/doc/about.rst index 47d57e4737318..840049114d9cf 100644 --- a/doc/about.rst +++ b/doc/about.rst @@ -174,8 +174,9 @@ The project would like to thank the following funders. .. div:: text-box - `:probabl. `_ funds Adrin Jalali, Arturo Amor, François Goupil, - Guillaume Lemaitre, Jérémie du Boisberranger, Olivier Grisel, and Stefanie Senger. + `:probabl. `_ employs Adrin Jalali, Arturo Amor, + François Goupil, Guillaume Lemaitre, Jérémie du Boisberranger, Loïc Estève, + Olivier Grisel, and Stefanie Senger. .. div:: image-box @@ -196,9 +197,6 @@ The project would like to thank the following funders. .. |dataiku| image:: images/dataiku.png :target: https://www.dataiku.com/ -.. |hf| image:: images/huggingface_logo-noborder.png - :target: https://huggingface.co - .. |nvidia| image:: images/nvidia.png :target: https://www.nvidia.com @@ -243,7 +241,7 @@ The project would like to thank the following funders. +----------+-----------+ | |axa| | |bnp| | +----------+-----------+ - | |nvidia| | |hf| | + | |nvidia| | +----------+-----------+ | |dataiku| | +----------+-----------+ @@ -292,6 +290,35 @@ The project would like to thank the following funders. ........... +.. |czi| image:: images/czi.png + :target: https://chanzuckerberg.com + +.. |wellcome| image:: images/wellcome-trust.png + :target: https://wellcome.org/ + +.. div:: sk-text-image-grid-small + + .. div:: text-box + + `The Chan-Zuckerberg Initiative `_ and + `Wellcome Trust `_ fund scikit-learn through the + `Essential Open Source Software for Science (EOSS) `_ + cycle 6. + + It supports Lucy Liu and diversity & inclusion initiatives that will + be announced in the future. + + .. div:: image-box + + .. table:: + :class: image-subtable + + +----------+----------------+ + | |czi| | |wellcome| | + +----------+----------------+ + +........... + .. div:: sk-text-image-grid-small .. div:: text-box @@ -455,7 +482,7 @@ Past Sponsors .. div:: image-box - .. image:: images/czi_logo.svg + .. image:: images/czi.png :target: https://chanzuckerberg.com ...................... @@ -499,6 +526,9 @@ the past: .. |aphp| image:: images/logo_APHP_text.png :target: https://aphp.fr/ +.. |hf| image:: images/huggingface_logo-noborder.png + :target: https://huggingface.co + .. raw:: html

-

Lauren Burke

+

Lauren Burke-McCarthy


diff --git a/doc/conf.py b/doc/conf.py index 9923a24260267..8a8cc1b313acc 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -10,12 +10,14 @@ # All configuration values have a default; values that are commented out # serve to show the default. +import json import os import re import sys import warnings from datetime import datetime from pathlib import Path +from urllib.request import urlopen from sklearn.externals._packaging.version import parse from sklearn.utils._testing import turn_warnings_into_errors @@ -30,9 +32,12 @@ import jinja2 import sphinx_gallery from github_link import make_linkcode_resolve +from sphinx.util.logging import getLogger from sphinx_gallery.notebook import add_code_cell, add_markdown_cell from sphinx_gallery.sorting import ExampleTitleSortKey +logger = getLogger(__name__) + try: # Configure plotly to integrate its output into the HTML pages generated by # sphinx-gallery. @@ -202,6 +207,11 @@ # Sphinx are currently 'default' and 'sphinxdoc'. html_theme = "pydata_sphinx_theme" +# This config option is used to generate the canonical links in the header +# of every page. The canonical link is needed to prevent search engines from +# returning results pointing to old scikit-learn versions. +html_baseurl = "https://scikit-learn.org/stable/" + # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. @@ -364,8 +374,6 @@ def add_js_css_files(app, pagename, templatename, context, doctree): app.add_css_file("styles/api-search.css") elif pagename == "index": app.add_css_file("styles/index.css") - elif pagename == "install": - app.add_css_file("styles/install.css") elif pagename.startswith("modules/generated/"): app.add_css_file("styles/api.css") @@ -422,6 +430,7 @@ def add_js_css_files(app, pagename, templatename, context, doctree): "contents": "index", "preface": "index", "modules/classes": "api/index", + "tutorial/machine_learning_map/index": "machine_learning_map", "auto_examples/feature_selection/plot_permutation_test_for_classification": ( "auto_examples/model_selection/plot_permutation_tests_for_classification" ), @@ -891,6 +900,51 @@ def setup(app): } +def infer_next_release_versions(): + """Infer the most likely next release versions to make.""" + all_version_full = {"rc": "0.99.0rc1", "final": "0.99.0", "bf": "0.98.1"} + all_version_short = {"rc": "0.99", "final": "0.99", "bf": "0.98"} + all_previous_tag = {"rc": "unused", "final": "0.98.33", "bf": "0.97.22"} + + try: + # Fetch the version switcher JSON; see `html_theme_options` for more details + versions_json = json.loads( + urlopen(html_theme_options["switcher"]["json_url"], timeout=10).read() + ) + + # See `build_tools/circle/list_versions.py`, stable is always the second entry + stable_version = parse(versions_json[1]["version"]) + last_stable_version = parse(versions_json[2]["version"]) + next_major_minor = f"{stable_version.major}.{stable_version.minor + 1}" + + # RC + all_version_full["rc"] = f"{next_major_minor}.0rc1" + all_version_short["rc"] = next_major_minor + + # Major/Minor final + all_version_full["final"] = f"{next_major_minor}.0" + all_version_short["final"] = next_major_minor + all_previous_tag["final"] = stable_version.base_version + + # Bug-fix + all_version_full["bf"] = ( + f"{stable_version.major}.{stable_version.minor}.{stable_version.micro + 1}" + ) + all_version_short["bf"] = f"{stable_version.major}.{stable_version.minor}" + all_previous_tag["bf"] = last_stable_version.base_version + except Exception as e: + logger.warning( + "Failed to infer all possible next release versions because of " + f"{type(e).__name__}: {e}" + ) + + return { + "version_full": all_version_full, + "version_short": all_version_short, + "previous_tag": all_previous_tag, + } + + # -- Convert .rst.template files to .rst --------------------------------------- from api_reference import API_REFERENCE, DEPRECATED_API_REFERENCE @@ -908,6 +962,11 @@ def setup(app): # Each entry is in the format (template name, file name, kwargs for rendering) rst_templates = [ ("index", "index", {"development_link": development_link}), + ( + "developers/maintainer", + "developers/maintainer", + {"inferred": infer_next_release_versions()}, + ), ( "min_dependency_table", "min_dependency_table", diff --git a/doc/conftest.py b/doc/conftest.py index 7081e8b8bf698..2998194e86930 100644 --- a/doc/conftest.py +++ b/doc/conftest.py @@ -10,7 +10,7 @@ from sklearn.datasets._base import _pkl_filepath from sklearn.datasets._twenty_newsgroups import CACHE_NAME from sklearn.utils._testing import SkipTest, check_skip_network -from sklearn.utils.fixes import _IS_PYPY, np_base_version, parse_version +from sklearn.utils.fixes import _IS_PYPY, np_base_version, parse_version, sp_version def setup_labeled_faces(): @@ -179,6 +179,10 @@ def pytest_collection_modifyitems(config, items): reason = "Due to NEP 51 numpy scalar repr has changed in numpy 2" skip_doctests = True + if sp_version < parse_version("1.14"): + reason = "Scipy sparse matrix repr has changed in scipy 1.14" + skip_doctests = True + # Normally doctest has the entire module's scope. Here we set globs to an empty dict # to remove the module's scope: # https://docs.python.org/3/library/doctest.html#what-s-the-execution-context diff --git a/doc/datasets.rst b/doc/datasets.rst index ee767e5843256..d381e4152990d 100644 --- a/doc/datasets.rst +++ b/doc/datasets.rst @@ -6,12 +6,9 @@ Dataset loading utilities .. currentmodule:: sklearn.datasets -The ``sklearn.datasets`` package embeds some small toy datasets -as introduced in the :ref:`Getting Started ` section. - -This package also features helpers to fetch larger datasets commonly -used by the machine learning community to benchmark algorithms on data -that comes from the 'real world'. +The ``sklearn.datasets`` package embeds some small toy datasets and provides helpers +to fetch larger datasets commonly used by the machine learning community to benchmark +algorithms on data that comes from the 'real world'. To evaluate the impact of the scale of the dataset (``n_samples`` and ``n_features``) while controlling the statistical properties of the data diff --git a/doc/developers/advanced_installation.rst b/doc/developers/advanced_installation.rst index 88521c6c51867..9490d1c05de18 100644 --- a/doc/developers/advanced_installation.rst +++ b/doc/developers/advanced_installation.rst @@ -52,14 +52,14 @@ feature, code or documentation improvement). .. prompt:: bash $ - git clone git://github.com/scikit-learn/scikit-learn.git # add --depth 1 if your connection is slow + git clone git@github.com:scikit-learn/scikit-learn.git # add --depth 1 if your connection is slow cd scikit-learn If you plan on submitting a pull-request, you should clone from your fork instead. #. Install a recent version of Python (3.9 or later at the time of writing) for - instance using Miniforge3_. Miniforge provides a conda-based distribution of + instance using Condaforge_. Conda-forge provides a conda-based distribution of Python and the most popular scientific libraries. If you installed Python with conda, we recommend to create a dedicated @@ -255,8 +255,8 @@ to enable OpenMP support: For Apple Silicon M1 hardware, only the conda-forge method below is known to work at the time of writing (January 2021). You can install the `macos/arm64` -distribution of conda using the `miniforge installer -`_ +distribution of conda using the `conda-forge installer +`_ macOS compilers from conda-forge ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -480,6 +480,7 @@ the base system and these steps will not be necessary. .. _virtualenv: https://docs.python.org/3/tutorial/venv.html .. _conda environment: https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html .. _Miniforge3: https://github.com/conda-forge/miniforge#miniforge3 +.. _Condaforge: https://conda-forge.org/download/ Alternative compilers ===================== diff --git a/doc/developers/contributing.rst b/doc/developers/contributing.rst index 3184d71426c95..5bfaec3e2555f 100644 --- a/doc/developers/contributing.rst +++ b/doc/developers/contributing.rst @@ -751,6 +751,7 @@ We are glad to accept any sort of documentation: * Add one or two snippets of code in "Example" section to show how it can be used. +.. dropdown:: Guidelines for writing references .. dropdown:: Guidelines for writing the user guide and other reStructuredText documents @@ -786,7 +787,7 @@ We are glad to accept any sort of documentation: * Too much information makes it difficult for users to access the content they are interested in. Use dropdowns to factorize it by using the following syntax - .. code-block:: rst + .. _my-section: .. dropdown:: Dropdown title @@ -921,8 +922,8 @@ To build the documentation, you need to be in the ``doc`` folder: cd doc -In the vast majority of cases, you only need to generate the full web site, -without the example gallery: +In the vast majority of cases, you only need to generate the web site without +the example gallery: .. prompt:: bash @@ -937,13 +938,14 @@ To also generate the example gallery you can use: make html -This will run all the examples, which takes a while. If you only want to generate a few -examples, which is particularly useful if you are modifying only a few examples, you can -use: +This will run all the examples, which takes a while. You can also run only a few examples based on their file names. +Here is a way to run all examples with filenames containing `plot_calibration`: .. prompt:: bash - EXAMPLES_PATTERN=your_regex_goes_here make html + EXAMPLES_PATTERN="plot_calibration" make html + +You can use regular expressions for more advanced use cases. Set the environment variable `NO_MATHJAX=1` if you intend to view the documentation in an offline setting. To build the PDF manual, run: diff --git a/doc/developers/index.rst b/doc/developers/index.rst index cca77b6a015c9..c4307ec826b50 100644 --- a/doc/developers/index.rst +++ b/doc/developers/index.rst @@ -1,3 +1,5 @@ +:orphan: + .. _developers_guide: ================= diff --git a/doc/developers/maintainer.rst b/doc/developers/maintainer.rst deleted file mode 100644 index ffc9b73156fa8..0000000000000 --- a/doc/developers/maintainer.rst +++ /dev/null @@ -1,458 +0,0 @@ -Maintainer/Core-Developer Information -====================================== - -Releasing ---------- - -This section is about preparing a major release, incrementing the minor -version, or a bug fix release incrementing the patch version. Our convention is -that we release one or more release candidates (0.RRrcN) before releasing the -final distributions. We follow the `PEP101 -`_ to indicate release candidates, -post, and minor releases. - -Before a release -................ - -1. Update authors table: - - Create a `classic token on GitHub `_ - with the ``read:org`` following permission. - - Run the following script, entering the token in: - - .. prompt:: bash $ - - cd build_tools; make authors; cd .. - - and commit. This is only needed if the authors have changed since the last - release. This step is sometimes done independent of the release. This - updates the maintainer list and is not the contributor list for the release. - -2. Confirm any blockers tagged for the milestone are resolved, and that other - issues tagged for the milestone can be postponed. - -3. Ensure the change log and commits correspond (within reason!), and that the - change log is reasonably well curated. Some tools for these tasks include: - - - ``maint_tools/sort_whats_new.py`` can put what's new entries into - sections. It's not perfect, and requires manual checking of the changes. - If the what's new list is well curated, it may not be necessary. - - - The ``maint_tools/whats_missing.sh`` script may be used to identify pull - requests that were merged but likely missing from What's New. - -4. Make sure the deprecations, FIXME and TODOs tagged for the release have - been taken care of. - -**Permissions** - -The release manager must be a *maintainer* of the ``scikit-learn/scikit-learn`` -repository to be able to publish on ``pypi.org`` and ``test.pypi.org`` -(via a manual trigger of a dedicated Github Actions workflow). - -The release manager does not need extra permissions on ``pypi.org`` to publish a -release in particular. - -The release manager must be a *maintainer* of the ``conda-forge/scikit-learn-feedstock`` -repository. This can be changed by editing the ``recipe/meta.yaml`` file in the -first release pull-request. - -.. _preparing_a_release_pr: - -Preparing a release PR -...................... - -Major version release -~~~~~~~~~~~~~~~~~~~~~ - -Prior to branching please do not forget to prepare a Release Highlights page as -a runnable example and check that its HTML rendering looks correct. These -release highlights should be linked from the ``doc/whats_new/v0.99.rst`` file -for the new version of scikit-learn. - -Releasing the first RC of e.g. version `0.99.0` involves creating the release -branch `0.99.X` directly on the main repo, where `X` really is the letter X, -**not a placeholder**. The development for the major and minor releases of `0.99` -should **also** happen under `0.99.X`. Each release (rc, major, or minor) is a -tag under that branch. - -This is done only once, as the major and minor releases happen on the same -branch: - -.. prompt:: bash $ - - # Assuming upstream is an alias for the main scikit-learn repo: - git fetch upstream main - git checkout upstream/main - git checkout -b 0.99.X - git push --set-upstream upstream 0.99.X - -Again, `X` is literal here, and `99` is replaced by the release number. -The branches are called ``0.19.X``, ``0.20.X``, etc. - -In terms of including changes, the first RC ideally counts as a *feature -freeze*. Each coming release candidate and the final release afterwards will -include only minor documentation changes and bug fixes. Any major enhancement -or feature should be excluded. - -Then you can prepare a local branch for the release itself, for instance: -``release-0.99.0rc1``, push it to your github fork and open a PR **to the** -`scikit-learn/0.99.X` **branch**. Copy the :ref:`release_checklist` templates -in the description of the Pull Request to track progress. - -This PR will be used to push commits related to the release as explained in -:ref:`making_a_release`. - -You can also create a second PR from main and targeting main to increment the -``__version__`` variable in `sklearn/__init__.py` and in `pyproject.toml` to increment -the dev version. This means while we're in the release candidate period, the latest -stable is two versions behind the main branch, instead of one. In this PR targeting -main you should also include a new file for the matching version under the -``doc/whats_new/`` folder so PRs that target the next version can contribute their -changelog entries to this file in parallel to the release process. - -Minor version release (also known as bug-fix release) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The minor releases should include bug fixes and some relevant documentation -changes only. Any PR resulting in a behavior change which is not a bug fix -should be excluded. As an example, instructions are given for the `1.2.2` release. - -- Create a branch, **on your own fork** (here referred to as `fork`) for the release - from `upstream/main`. - - .. prompt:: bash $ - - git fetch upstream/main - git checkout -b release-1.2.2 upstream/main - git push -u fork release-1.2.2:release-1.2.2 - -- Create a **draft** PR to the `upstream/1.2.X` branch (not to `upstream/main`) - with all the desired changes. - -- Do not push anything on that branch yet. - -- Locally rebase `release-1.2.2` from the `upstream/1.2.X` branch using: - - .. prompt:: bash $ - - git rebase -i upstream/1.2.X - - This will open an interactive rebase with the `git-rebase-todo` containing all - the latest commit on `main`. At this stage, you have to perform - this interactive rebase with at least someone else (being three people rebasing - is better not to forget something and to avoid any doubt). - - - **Do not remove lines but drop commit by replace** ``pick`` **with** ``drop`` - - - Commits to pick for bug-fix release *generally* are prefixed with: `FIX`, `CI`, - `DOC`. They should at least include all the commits of the merged PRs - that were milestoned for this release on GitHub and/or documented as such in - the changelog. It's likely that some bugfixes were documented in the - changelog of the main major release instead of the next bugfix release, - in which case, the matching changelog entries will need to be moved, - first in the `main` branch then backported in the release PR. - - - Commits to drop for bug-fix release *generally* are prefixed with: `FEAT`, - `MAINT`, `ENH`, `API`. Reasons for not including them is to prevent change of - behavior (which only must feature in breaking or major releases). - - - After having dropped or picked commit, **do no exit** but paste the content - of the `git-rebase-todo` message in the PR. - This file is located at `.git/rebase-merge/git-rebase-todo`. - - - Save and exit, starting the interactive rebase. - - - Resolve merge conflicts when they happen. - -- Force push the result of the rebase and the extra release commits to the release PR: - - .. prompt:: bash $ - - git push -f fork release-1.2.2:release-1.2.2 - -- Copy the :ref:`release_checklist` template and paste it in the description of the - Pull Request to track progress. - -- Review all the commits included in the release to make sure that they do not - introduce any new feature. We should not blindly trust the commit message prefixes. - -- Remove the draft status of the release PR and invite other maintainers to review the - list of included commits. - -.. _making_a_release: - -Making a release -................ - -0. Ensure that you have checked out the branch of the release PR as explained - in :ref:`preparing_a_release_pr` above. - -1. Update docs. Note that this is for the final release, not necessarily for - the RC releases. These changes should be made in main and cherry-picked - into the release branch, only before the final release. - - - Edit the ``doc/whats_new/v0.99.rst`` file to add release title and list of - contributors. - You can retrieve the list of contributor names with: - - :: - - $ git shortlog -s 0.98.33.. | cut -f2- | sort --ignore-case | tr '\n' ';' | sed 's/;/, /g;s/, $//' | fold -s - - - For major releases, link the release highlights example from the ``doc/whats_new/v0.99.rst`` file. - - - Update the release date in ``whats_new.rst`` - - - Edit the ``doc/templates/index.html`` to change the 'News' entry of the - front page (with the release month as well). Do not forget to remove - the old entries (two years or three releases are typically good - enough) and to update the on-going development entry. - -2. On the branch for releasing, update the version number in ``sklearn/__init__.py``, - the ``__version__`` variable, and in `pyproject.toml`. - - For major releases, please add a 0 at the end: `0.99.0` instead of `0.99`. - - For the first release candidate, use the `rc1` suffix on the expected final - release number: `0.99.0rc1`. - -3. Trigger the wheel builder with the ``[cd build]`` commit marker using - the command: - - .. prompt:: bash $ - - git commit --allow-empty -m "Trigger wheel builder workflow: [cd build]" - - The wheel building workflow is managed by GitHub Actions and the results be browsed at: - https://github.com/scikit-learn/scikit-learn/actions?query=workflow%3A%22Wheel+builder%22 - -.. note:: - - Before building the wheels, make sure that the ``pyproject.toml`` file is - up to date and using the oldest version of ``numpy`` for each Python version - to avoid `ABI `_ - incompatibility issues. Moreover, a new line have to be included in the - ``pyproject.toml`` file for each new supported version of Python. - -.. note:: - - The acronym CD in `[cd build]` stands for `Continuous Delivery - `_ and refers to the - automation used to generate the release artifacts (binary and source - packages). This can be seen as an extension to CI which stands for - `Continuous Integration - `_. The CD workflow on - GitHub Actions is also used to automatically create nightly builds and - publish packages for the development branch of scikit-learn. See - :ref:`install_nightly_builds`. - -4. Once all the CD jobs have completed successfully in the PR, merge it, - again with the `[cd build]` marker in the commit message. This time - the results will be uploaded to the staging area. - - You should then be able to upload the generated artifacts (.tar.gz and .whl - files) to https://test.pypi.org using the "Run workflow" form for the - following GitHub Actions workflow: - - https://github.com/scikit-learn/scikit-learn/actions?query=workflow%3A%22Publish+to+Pypi%22 - -5. If this went fine, you can proceed with tagging. Proceed with caution. - Ideally, tags should be created when you're almost certain that the release - is ready, since adding a tag to the main repo can trigger certain automated - processes. - - Create the tag and push it (if it's an RC, it can be ``0.xx.0rc1`` for - instance): - - .. prompt:: bash $ - - git tag -a 0.99.0 # in the 0.99.X branch - git push git@github.com:scikit-learn/scikit-learn.git 0.99.0 - -6. Confirm that the bot has detected the tag on the conda-forge feedstock repo: - https://github.com/conda-forge/scikit-learn-feedstock. If not, submit a PR for the - release. If you want to publish an RC release on conda-forge, the PR should target - the `rc` branch as opposed to the `main` branch. The two branches need to be kept - sync together otherwise. - -7. Trigger the GitHub Actions workflow again but this time to upload the artifacts - to the real https://pypi.org (replace "testpypi" by "pypi" in the "Run - workflow" form). - -8. **Alternative to step 7**: it's possible to collect locally the generated binary - wheel packages and source tarball and upload them all to PyPI by running the - following commands in the scikit-learn source folder (checked out at the - release tag): - - .. prompt:: bash $ - - rm -r dist - pip install -U wheelhouse_uploader twine - python -m wheelhouse_uploader fetch \ - --version 0.99.0 \ - --local-folder dist \ - scikit-learn \ - https://pypi.anaconda.org/scikit-learn-wheels-staging/simple/scikit-learn/ - - This command will download all the binary packages accumulated in the - `staging area on the anaconda.org hosting service - `_ and - put them in your local `./dist` folder. - - Check the content of the `./dist` folder: it should contain all the wheels - along with the source tarball ("scikit-learn-RRR.tar.gz"). - - Make sure that you do not have developer versions or older versions of - the scikit-learn package in that folder. - - Before uploading to pypi, you can test upload to test.pypi.org: - - .. prompt:: bash $ - - twine upload --verbose --repository-url https://test.pypi.org/legacy/ dist/* - - Upload everything at once to https://pypi.org: - - .. prompt:: bash $ - - twine upload dist/* - -9. For major/minor (not bug-fix release or release candidates), update the symlink for - ``stable`` and the ``latestStable`` variable in - https://github.com/scikit-learn/scikit-learn.github.io: - - .. prompt:: bash $ - - cd /tmp - git clone --depth 1 --no-checkout git@github.com:scikit-learn/scikit-learn.github.io.git - cd scikit-learn.github.io - echo stable > .git/info/sparse-checkout - git checkout main - rm stable - ln -s 0.999 stable - sed -i "s/latestStable = '.*/latestStable = '0.999';/" versionwarning.js - git add stable versionwarning.js - git commit -m "Update stable to point to 0.999" - git push origin main - -10. Update ``SECURITY.md`` to reflect the latest supported version. - -.. _release_checklist: - -Release checklist -................. - -The following GitHub checklist might be helpful in a release PR:: - - * [ ] update news and what's new date in release branch - * [ ] update news and what's new date and sklearn dev0 version in main branch - * [ ] check that the wheels for the release can be built successfully - * [ ] merge the PR with `[cd build]` commit message to upload wheels to the staging repo - * [ ] upload the wheels and source tarball to https://test.pypi.org - * [ ] create tag on the main github repo - * [ ] confirm bot detected at - https://github.com/conda-forge/scikit-learn-feedstock and wait for merge - * [ ] upload the wheels and source tarball to PyPI - * [ ] https://github.com/scikit-learn/scikit-learn/releases publish (except for RC) - * [ ] announce on mailing list and on Twitter, and LinkedIn - * [ ] update symlink for stable in - https://github.com/scikit-learn/scikit-learn.github.io (only major/minor) - * [ ] update SECURITY.md in main branch (except for RC) - -Merging Pull Requests ---------------------- - -Individual commits are squashed when a Pull Request (PR) is merged on Github. -Before merging, - -- the resulting commit title can be edited if necessary. Note - that this will rename the PR title by default. -- the detailed description, containing the titles of all the commits, can - be edited or deleted. -- for PRs with multiple code contributors care must be taken to keep - the `Co-authored-by: name ` tags in the detailed - description. This will mark the PR as having `multiple co-authors - `_. - Whether code contributions are significantly enough to merit co-authorship is - left to the maintainer's discretion, same as for the "what's new" entry. - - -The scikit-learn.org web site ------------------------------ - -The scikit-learn web site (https://scikit-learn.org) is hosted at GitHub, -but should rarely be updated manually by pushing to the -https://github.com/scikit-learn/scikit-learn.github.io repository. Most -updates can be made by pushing to master (for /dev) or a release branch -like 0.99.X, from which Circle CI builds and uploads the documentation -automatically. - -Experimental features ---------------------- - -The :mod:`sklearn.experimental` module was introduced in 0.21 and contains -experimental features / estimators that are subject to change without -deprecation cycle. - -To create an experimental module, you can just copy and modify the content of -`enable_halving_search_cv.py -`__, -or -`enable_iterative_imputer.py -`_. - -.. note:: - - These are permalink as in 0.24, where these estimators are still - experimental. They might be stable at the time of reading - hence the - permalink. See below for instructions on the transition from experimental - to stable. - -Note that the public import path must be to a public subpackage (like -``sklearn/ensemble`` or ``sklearn/impute``), not just a ``.py`` module. -Also, the (private) experimental features that are imported must be in a -submodule/subpackage of the public subpackage, e.g. -``sklearn/ensemble/_hist_gradient_boosting/`` or -``sklearn/impute/_iterative.py``. This is needed so that pickles still work -in the future when the features aren't experimental anymore. - -To avoid type checker (e.g. mypy) errors a direct import of experimental -estimators should be done in the parent module, protected by the -``if typing.TYPE_CHECKING`` check. See `sklearn/ensemble/__init__.py -`_, -or `sklearn/impute/__init__.py -`_ -for an example. - -Please also write basic tests following those in -`test_enable_hist_gradient_boosting.py -`__. - - -Make sure every user-facing code you write explicitly mentions that the feature -is experimental, and add a ``# noqa`` comment to avoid pep8-related warnings:: - - # To use this experimental feature, we need to explicitly ask for it: - from sklearn.experimental import enable_hist_gradient_boosting # noqa - from sklearn.ensemble import HistGradientBoostingRegressor - -For the docs to render properly, please also import -``enable_my_experimental_feature`` in ``doc/conf.py``, else sphinx won't be -able to import the corresponding modules. Note that using ``from -sklearn.experimental import *`` **does not work**. - -Note that some experimental classes / functions are not included in the -:mod:`sklearn.experimental` module: ``sklearn.datasets.fetch_openml``. - -Once the feature become stable, remove all `enable_my_experimental_feature` -in the scikit-learn code (even feature highlights etc.) and make the -`enable_my_experimental_feature` a no-op that just raises a warning: -`enable_hist_gradient_boosting.py -`__. -The file should stay there indefinitely as we don't want to break users code: -we just incentivize them to remove that import with the warning. - -Also update the tests accordingly: `test_enable_hist_gradient_boosting.py -`__. diff --git a/doc/developers/maintainer.rst.template b/doc/developers/maintainer.rst.template new file mode 100644 index 0000000000000..977d5185ce98b --- /dev/null +++ b/doc/developers/maintainer.rst.template @@ -0,0 +1,395 @@ +Maintainer Information +====================== + +Releasing +--------- + +This section is about preparing a major/minor release, a release candidate (RC), or a +bug-fix release. We follow `PEP440 `_ for +the version scheme and to indicate different types of releases. Our convention is to +follow the "major.minor.micro" scheme, although in practice there is no fundamental +difference between major and minor releases and micro releases are bug-fix releases. + +We adopted the following release schedule: + +- Major/Minor releases every 6 months, usually in May and November. These releases + are numbered `X.Y.0` and are preceded by one or more release candidates `X.Y.0rcN`. +- Bug-fix releases are done as needed between major/minor releases and only apply to + the last stable version. These releases are numbered `X.Y.Z`. + +.. rubric:: Preparation + +- Confirm that all blockers tagged for the milestone have been resolved, and that other + issues tagged for the milestone can be postponed. + +- Make sure the deprecations, FIXMEs, and TODOs tagged for the release have been taken + care of. + +- For major/minor final releases, make sure that a *Release Highlights* page has been + done as a runnable example and check that its HTML rendering looks correct. It should + be linked from the what's new file for the new version of scikit-learn. + +- Ensure that the changelog and commits correspond, and that the changelog is reasonably + well curated. In particular, make sure that the changelog entries are labeled and + ordered within each section. The order of the labels should be `|MajorFeature|`, + `|Feature|`, `|Efficiency|`, `|Enhancement|`, `|Fix|`, and `|API|`. + +.. rubric:: Permissions + +- The release manager must be a **maintainer** of the + https://github.com/scikit-learn/scikit-learn repository to be able to publish on + `pypi.org` and `test.pypi.org` (via a manual trigger of a dedicated Github Actions + workflow). + +- The release manager must be a **maintainer** of the + https://github.com/conda-forge/scikit-learn-feedstock repository to be able to publish + on `conda-forge`. This can be changed by editing the `recipe/meta.yaml` file in the + first release pull request. + +Reference Steps +^^^^^^^^^^^^^^^ + +.. tab-set:: + + {% for key in ["rc", "final", "bf"] %} + {%- if key == "rc" -%} + {%- set title = "Major/Minor RC" -%} + {%- elif key == "final" -%} + {%- set title = "Major/Minor Final" -%} + {%- else -%} + {%- set title = "Bug-fix" -%} + {%- endif -%} + + {%- set version_full = inferred["version_full"][key] -%} + {%- set version_short = inferred["version_short"][key] -%} + {%- set previous_tag = inferred["previous_tag"][key] -%} + + .. tab-item:: {{ title }} + :class-label: tab-4 + + Suppose that we are preparing the release `{{ version_full }}`. + + {% if key == "rc" %} + The first RC ideally counts as a **feature freeze**. Each coming release candidate + and the final release afterwards should include only minor documentation changes + and bug fixes. Any major enhancement or new feature should be excluded. + + - Create the release branch `{{ version_short }}.X` directly in the main repository, + where `X` is really the letter X, **not a placeholder**. The development for the + final and subsequent bug-fix releases of `{{ version_short }}` should also happen + under this branch with different tags. + + .. prompt:: bash + + git fetch upstream main + git checkout upstream/main + git checkout -b {{ version_short }}.X + git push --set-upstream upstream {{ version_short }}.X + {% endif %} + + - Create a PR from the `main` branch targeting the `{{ version_short }}.X` branch. + Copy the following release checklist to the description of this PR to track the + progress. + + .. code-block:: markdown + + * [ ] Update news and what's new date in release branch + * [ ] Backport news and what's new date in release branch + {%- if key == "rc" %} + * [ ] Update the sklearn dev0 version in main branch + {%- endif %} + * [ ] Set the version number in the release branch + * [ ] Check that the wheels for the release can be built successfully + * [ ] Merge the PR with `[cd build]` commit message to upload wheels to the staging repo + * [ ] Upload the wheels and source tarball to https://test.pypi.org + * [ ] Create tag on the main repo + * [ ] Confirm bot detected at https://github.com/conda-forge/scikit-learn-feedstock + and wait for merge + * [ ] Upload the wheels and source tarball to PyPI + {%- if key != "rc" %} + * [ ] Publish to https://github.com/scikit-learn/scikit-learn/releases + {%- endif %} + * [ ] Announce on mailing list and on Twitter, and LinkedIn + {%- if key == "final" %} + * [ ] Update symlink for stable in https://github.com/scikit-learn/scikit-learn.github.io + {%- endif %} + {%- if key != "rc" %} + * [ ] Update SECURITY.md in main branch + {%- endif %} + + {% if key != "rc" %} + - Rebase this PR from the `{{ version_short }}.X` branch: + + .. prompt:: bash + + git rebase -i upstream/{{ version_short }}.X + + This will open an interactive rebase with the `git-rebase-todo` containing all the + latest commits on `main`. At this stage, you have to perform this interactive + rebase with at least someone else (to not forget something and to avoid doubts). + + - Do not remove lines but drop commit by replacing `pick` with `drop`. + - Commits to pick for a bug-fix release are *generally* prefixed with `FIX`, `CI`, + and `DOC`. They should at least include all the commits of the merged PRs that + were milestoned for this release and/or documented as such in the changelog. + - Commits to `drop` for a bug-fix release are *generally* prefixed with `FEAT`, + `MAINT`, `ENH`, and `API`. Reasons for not including them is to prevent change + of behavior (which should only happen in major/minor releases). + - After having dropped or picked commits, **do not exit** but paste the content of + the `git-rebase-todo` message in the PR. This file is located at + `.git/rebase-merge/git-rebase-todo`. + - Save and exit to start the interactive rebase. Resolve merge conflicts when + necessary. + {% endif %} + + {% if key == "rc" %} + - Create a PR from `main` and targeting `main` to increment the dev0 `__version__` + variable in `sklearn/__init__.py`. This means while we are in the release + candidate period, the latest stable is two version behind the `main` branch, + instead of one. In this PR targeting `main`, you should also include a new what's + new file under the `doc/whats_new/` directory so PRs that target the next version + can contribute their changelog entries to this file in parallel to the release + process. + {% endif %} + + - In the `{{ version_short }}.X` branch, change the version number `__version__` in + `sklearn/__init__.py` to `{{ version_full }}`. + + {% if key != "rc" %} + - In the `main` branch, edit the corresponding file in the `doc/whats_new` directory + to update the release date + {%- if key == "final" %}, link the release highlights example,{% endif %} + and add the list of contributor names. Suppose that the tag of the last release in + the previous major/minor version is `{{ previous_tag }}`, then you can use the + following command to retrieve the list of contributor names: + + .. prompt:: bash + + git shortlog -s {{ previous_tag }}.. | + cut -f2- | + sort --ignore-case | + tr "\n" ";" | + sed "s/;/, /g;s/, $//" | + fold -s + + Then cherry-pick it in the `{{ version_short }}.X` release branch. + + - In the `main` branch, edit `doc/templates/index.html` to change the "News" section + in the landing page, along with the month of the release. + {%- if key == "final" %} + Do not forget to remove old entries (two years or three releases ago) and update + the "On-going development" entry. + {%- endif %} + Then cherry-pick it in the `{{ version_short }}.X` release branch. + {% endif %} + + - Trigger the wheel builder with the `[cd build]` commit marker. See also the + `workflow runs of the wheel builder + `_. + + .. prompt:: bash + + git commit --allow-empty -m "[cd build] Trigger wheel builder workflow" + + .. note:: + + The acronym CD in `[cd build]` stands for `Continuous Delivery + `_ and refers to the + automation used to generate the release artifacts (binary and source + packages). This can be seen as an extension to CI which stands for `Continuous + Integration `_. The CD + workflow on GitHub Actions is also used to automatically create nightly builds + and publish packages for the development branch of scikit-learn. See also + :ref:`install_nightly_builds`. + + - Once all the CD jobs have completed successfully in the PR, merge it with the + `[cd build]` marker in the commit message. This time the results will be + uploaded to the staging area. You should then be able to upload the generated + artifacts (`.tar.gz` and `.whl` files) to https://test.pypi.org/ using the "Run + workflow" form for the `PyPI publishing workflow + `_. + + .. warning:: + + This PR should be merged with the rebase mode instead of the usual squash mode + because we want to keep the history in the `{{ version_short }}.X` branch close + to the history of the main branch which will help for future bug fix releases. + + In addition if on merging, the last commit, containing the `[cd build]` marker, + is empty, the CD jobs won't be triggered. In this case, you can directly push + a commit with the marker in the `{{ version_short }}.X` to trigger them. + + - If the steps above went fine, proceed **with caution** to create a new tag for the + release. This should be done only when you are almost certain that the release is + ready, since adding a new tag to the main repository can trigger certain automated + processes. + + .. prompt:: bash + + git tag -a {{ version_full }} # in the {{ version_short }}.X branch + git push git@github.com:scikit-learn/scikit-learn.git {{ version_full }} + + - Confirm that the bot has detected the tag on the conda-forge feedstock repository + https://github.com/conda-forge/scikit-learn-feedstock. If not, submit a PR for the + release, targeting the `{% if key == "rc" %}rc{% else %}main{% endif %}` branch. + + - Trigger the `PyPI publishing workflow + `_ + again, but this time to upload the artifacts to the real https://pypi.org/. To do + so, replace `testpypi` with `pypi` in the "Run workflow" form. + + **Alternatively**, it is possible to collect locally the generated binary wheel + packages and source tarball and upload them all to PyPI. + + .. dropdown:: Uploading artifacts from local + + Check out at the release tag and run the following commands. + + .. prompt:: bash + + rm -r dist + python -m pip install -U wheelhouse_uploader twine + python -m wheelhouse_uploader fetch \ + --version 0.99.0rc1 --local-folder dist scikit-learn \ + https://pypi.anaconda.org/scikit-learn-wheels-staging/simple/scikit-learn/ + + These commands will download all the binary packages accumulated in the `staging + area on the anaconda.org hosting service + `_ and put + them in your local `./dist` folder. Check the contents of the `./dist` folder: + it should contain all the wheels along with the source tarball `.tar.gz`. Make + sure you do not have developer versions or older versions of the scikit-learn + package in that folder. Before uploading to PyPI, you can test uploading to + `test.pypi.org` first. + + .. prompt:: bash + + twine upload --verbose --repository-url https://test.pypi.org/legacy/ dist/* + + Then upload everything at once to `pypi.org`. + + .. prompt:: bash + + twine upload dist/* + + {% if key == "final" %} + - Update the symlink for `stable` and the `latestStable` variable in + `versionwarning.js` in https://github.com/scikit-learn/scikit-learn.github.io. + + .. prompt:: bash + + cd /tmp + git clone --depth 1 --no-checkout git@github.com:scikit-learn/scikit-learn.github.io.git + cd scikit-learn.github.io + echo stable > .git/info/sparse-checkout + git checkout main + rm stable + ln -s {{ version_short }} stable + sed -i "s/latestStable = '.*/latestStable = '{{ version_short }}';/" versionwarning.js + git add stable versionwarning.js + git commit -m "Update stable to point to {{ version_short }}" + git push origin main + {% endif %} + + {% if key != "rc" %} + - Update `SECURITY.md` to reflect the latest supported version `{{ version_full }}`. + {% endif %} + {% endfor %} + +Updating Authors List +--------------------- + +This section is about updating :ref:`authors`. First create a `classic token on GitHub +`_ with the `read:org` permission. Then run the +following script and enter the token when prompted: + +.. prompt:: bash + + cd build_tools + make authors # Enter the token when prompted + +Merging Pull Requests +--------------------- + +Individual commits are squashed when a PR is merged on GitHub. Before merging: + +- The resulting commit title can be edited if necessary. Note that this will rename the + PR title by default. +- The detailed description, containing the titles of all the commits, can be edited or + deleted. +- For PRs with multiple code contributors, care must be taken to keep the + `Co-authored-by: name ` tags in the detailed description. This will + mark the PR as having `multiple co-authors + `_. + Whether code contributions are significantly enough to merit co-authorship is left to + the maintainer's discretion, same as for the what's new entry. + +The `scikit-learn.org` Website +------------------------------ + +The scikit-learn website (https://scikit-learn.org) is hosted on GitHub, but should +rarely be updated manually by pushing to the +https://github.com/scikit-learn/scikit-learn.github.io repository. Most updates can be +made by pushing to `main` (for `/dev`) or a release branch `A.B.X`, from which Circle CI +builds and uploads the documentation automatically. + +Experimental Features +--------------------- + +The :mod:`sklearn.experimental` module was introduced in 0.21 and contains +experimental features and estimators that are subject to change without +deprecation cycle. + +To create an experimental module, refer to the contents of `enable_halving_search_cv.py +`__, +or `enable_iterative_imputer.py +`__. + +.. note:: + + These are permalinks as in 0.24, where these estimators are still experimental. They + might be stable at the time of reading, hence the permalink. See below for + instructions on the transition from experimental to stable. + +Note that the public import path must be to a public subpackage (like `sklearn/ensemble` +or `sklearn/impute`), not just a `.py` module. Also, the (private) experimental features +that are imported must be in a submodule/subpackage of the public subpackage, e.g. +`sklearn/ensemble/_hist_gradient_boosting/` or `sklearn/impute/_iterative.py`. This is +needed so that pickles still work in the future when the features aren't experimental +anymore. + +To avoid type checker (e.g. `mypy`) errors a direct import of experimental estimators +should be done in the parent module, protected by the `if typing.TYPE_CHECKING` check. +See `sklearn/ensemble/__init__.py +`__, +or `sklearn/impute/__init__.py +`__ +for an example. Please also write basic tests following those in +`test_enable_hist_gradient_boosting.py +`__. + +Make sure every user-facing code you write explicitly mentions that the feature is +experimental, and add a `# noqa` comment to avoid PEP8-related warnings:: + + # To use this experimental feature, we need to explicitly ask for it + from sklearn.experimental import enable_iterative_imputer # noqa + from sklearn.impute import IterativeImputer + +For the docs to render properly, please also import `enable_my_experimental_feature` in +`doc/conf.py`, otherwise sphinx will not be able to detect and import the corresponding +modules. Note that using `from sklearn.experimental import *` **does not work**. + +.. note:: + + Some experimental classes and functions may not be included in the + :mod:`sklearn.experimental` module, e.g., `sklearn.datasets.fetch_openml`. + +Once the feature becomes stable, remove all occurrences of +`enable_my_experimental_feature` in the scikit-learn code base and make the +`enable_my_experimental_feature` a no-op that just raises a warning, as in +`enable_hist_gradient_boosting.py +`__. +The file should stay there indefinitely as we do not want to break users' code; we just +incentivize them to remove that import with the warning. Also remember to update the +tests accordingly, see `test_enable_hist_gradient_boosting.py +`__. diff --git a/doc/developers/tips.rst b/doc/developers/tips.rst index 3dbc35cec68d0..1c6ea5ba6f6f4 100644 --- a/doc/developers/tips.rst +++ b/doc/developers/tips.rst @@ -242,6 +242,57 @@ PR: Don't change unrelated Please do not change unrelated lines. It makes your contribution harder to review and may introduce merge conflicts to other pull requests. +.. _debugging_ci_issues: + +Debugging CI issues +------------------- + +CI issues may arise for a variety of reasons, so this is by no means a +comprehensive guide, but rather a list of useful tips and tricks. + +Using a lock-file to get an environment close to the CI ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +`conda-lock` can be used to create a conda environment with the exact same +conda and pip packages as on the CI. For example, the following command will +create a conda environment named `scikit-learn-doc` that is similar to the CI: + +.. prompt:: bash $ + + conda-lock install -n scikit-learn-doc build_tools/circle/doc_linux-64_conda.lock + +.. note:: + + It only works if you have the same OS as the CI build (check `platform:` in + the lock-file). For example, the previous command will only work if you are + on a Linux machine. Also this may not allow you to reproduce some of the + issues that are more tied to the particularities of the CI environment, for + example CPU architecture reported by OpenBLAS in `sklearn.show_versions()`. + +If you don't have the same OS as the CI build you can still create a conda +environment from the right environment yaml file, although it won't be as close +as the CI environment as using the associated lock-file. For example for the +doc build: + +.. prompt:: bash $ + + conda env create -n scikit-learn-doc -f build_tools/circle/doc_environment.yml -y + +This may not give you exactly the same package versions as in the CI for a +variety of reasons, for example: + +- some packages may have had new releases between the time the lock files were + last updated in the `main` branch and the time you run the `conda create` + command. You can always try to look at the version in the lock-file and + specify the versions by hand for some specific packages that you think would + help reproducing the issue. +- different packages may be installed by default depending on the OS. For + example, the default BLAS library when installing numpy is OpenBLAS on Linux + and MKL on Windows. + +Also the problem may be OS specific so the only way to be able to reproduce +would be to have the same OS as the CI build. + .. highlight:: default Debugging memory errors in Cython with valgrind diff --git a/doc/images/czi-small.png b/doc/images/czi-small.png new file mode 100644 index 0000000000000..7a6c81acb44a0 Binary files /dev/null and b/doc/images/czi-small.png differ diff --git a/doc/images/czi.png b/doc/images/czi.png new file mode 100644 index 0000000000000..9f2b6ebb26c5c Binary files /dev/null and b/doc/images/czi.png differ diff --git a/doc/images/czi_logo.svg b/doc/images/czi_logo.svg deleted file mode 100644 index c63b53cae25ac..0000000000000 --- a/doc/images/czi_logo.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - nav / elements / czi_mark_red - Created with Sketch. - - - - - - - - - - - - - - \ No newline at end of file diff --git a/doc/images/ml_map.svg b/doc/images/ml_map.svg index 7c587cef011b9..2dedc6cf054df 100644 --- a/doc/images/ml_map.svg +++ b/doc/images/ml_map.svg @@ -1,4 +1,4 @@ -
START
START
>50
samples
>50...
get
more
data
get...
NO
NO
predicting a
category
predicting...
YES
YES
do you have
labeled
data
do you hav...
YES
YES
predicting a
quantity
predicting...
NO
NO
just
looking
just...
NO
NO
predicting
structure
predicting...
NO
NO
tough
luck
tough...
<100K
samples
<100K...
YES
YES
SGD
Classifier
SGD...
NO
NO
Linear
SVC
Linear...
YES
YES
text
data
text...
😭
😭
Kernel
Approximation
Kernel...
😭
😭
KNeighbors
Classifier
KNeighbors...
NO
NO
SVC
SVC
Ensemble
Classifiers
Ensemble...
😭
😭
Naive
Bayes
Naive...
YES
YES
classification
classification
number of
categories
known
number of...
NO
NO
<10K
samples
<10K...
<10K
samples
<10K...
NO
NO
NO
NO
YES
YES
MeanShift
MeanShift
VBGMM
VBGMM
YES
YES
MiniBatch
KMeans
MiniBatch...
NO
NO
clustering
clustering
KMeans
KMeans
YES
YES
Spectral
Clustering
Spectral...
GMM
GMM
😭
😭
<100K
samples
<100K...
YES
YES
few features
should be
important
few features...
YES
YES
SGD
Regressor
SGD...
NO
NO
Lasso
Lasso
ElasticNet
ElasticNet
YES
YES
RidgeRegression
RidgeRegression
SVR(kernel="linear")
SVR(kernel="linea...
NO
NO
SVR(kernel="rbf")
SVR(kernel="rbf...
Ensemble
Regressors
Ensemble...
😭
😭
regression
regression
Ramdomized
PCA
Ramdomized...
YES
YES
<10K
samples
<10K...
😭
😭
Kernel
Approximation
Kernel...
NO
NO
IsoMap
IsoMap
Spectral
Embedding
Spectral...
YES
YES
LLE
LLE
😭
😭
dimensionality
reduction
dimensionality...
scikit-learn
algorithm cheat sheet
scikit-learn...
Text is not SVG - cannot display
+
START
START
>50
samples
>50...
get
more
data
get...
NO
NO
predicting a
category
predicting...
YES
YES
do you have
labeled
data
do you hav...
YES
YES
predicting a
quantity
predicting...
NO
NO
just
looking
just...
NO
NO
predicting
structure
predicting...
NO
NO
tough
luck
tough...
<100K
samples
<100K...
YES
YES
SGD
Classifier
SGD...
NO
NO
Linear
SVC
Linear...
YES
YES
text
data
text...
😭
😭
Kernel
Approximation
Kernel...
😭
😭
KNeighbors
Classifier
KNeighbors...
NO
NO
SVC
SVC
Ensemble
Classifiers
Ensemble...
😭
😭
Naive
Bayes
Naive...
YES
YES
classification
classification
number of
categories
known
number of...
NO
NO
<10K
samples
<10K...
<10K
samples
<10K...
NO
NO
NO
NO
YES
YES
MeanShift
MeanShift
VBGMM
VBGMM
YES
YES
MiniBatch
KMeans
MiniBatch...
NO
NO
clustering
clustering
KMeans
KMeans
YES
YES
Spectral
Clustering
Spectral...
GMM
GMM
😭
😭
<100K
samples
<100K...
YES
YES
few features
should be
important
few features...
YES
YES
SGD
Regressor
SGD...
NO
NO
Lasso
Lasso
ElasticNet
ElasticNet
YES
YES
RidgeRegression
RidgeRegression
SVR(kernel="linear")
SVR(kernel="linea...
NO
NO
SVR(kernel="rbf")
SVR(kernel="rbf...
Ensemble
Regressors
Ensemble...
😭
😭
regression
regression
Ramdomized
PCA
Ramdomized...
YES
YES
<10K
samples
<10K...
😭
😭
Kernel
Approximation
Kernel...
NO
NO
IsoMap
IsoMap
Spectral
Embedding
Spectral...
YES
YES
LLE
LLE
😭
😭
dimensionality
reduction
dimensionality...
scikit-learn
algorithm cheat sheet
scikit-learn...
Text is not SVG - cannot display
diff --git a/doc/images/wellcome-trust-small.png b/doc/images/wellcome-trust-small.png new file mode 100644 index 0000000000000..32be045a080a2 Binary files /dev/null and b/doc/images/wellcome-trust-small.png differ diff --git a/doc/images/wellcome-trust.png b/doc/images/wellcome-trust.png new file mode 100644 index 0000000000000..4e74b033f0647 Binary files /dev/null and b/doc/images/wellcome-trust.png differ diff --git a/doc/install.rst b/doc/install.rst index be924b012ce65..145d3fa7d583d 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -28,21 +28,39 @@ There are different ways to install scikit-learn: Installing the latest release ============================= -.. `scss/install.scss` overrides some default sphinx-design styling for the tabs +.. raw:: html + + .. div:: install-instructions .. tab-set:: + :class: tabs-os - .. tab-item:: pip - :class-label: tab-6 - :sync: packager-pip + .. tab-item:: Windows + :class-label: tab-4 .. tab-set:: + :class: tabs-package-manager - .. tab-item:: Windows - :class-label: tab-4 - :sync: os-windows + .. tab-item:: pip + :class-label: tab-6 + :sync: package-manager-pip Install the 64-bit version of Python 3, for instance from the `official website `__. @@ -66,9 +84,21 @@ Installing the latest release python -m pip freeze # show all installed packages in the environment python -c "import sklearn; sklearn.show_versions()" - .. tab-item:: macOS - :class-label: tab-4 - :sync: os-macos + .. tab-item:: conda + :class-label: tab-6 + :sync: package-manager-conda + + .. include:: ./install_instructions_conda.rst + + .. tab-item:: MacOS + :class-label: tab-4 + + .. tab-set:: + :class: tabs-package-manager + + .. tab-item:: pip + :class-label: tab-6 + :sync: package-manager-pip Install Python 3 using `homebrew `_ (`brew install python`) or by manually installing the package from the `official website @@ -93,9 +123,21 @@ Installing the latest release python -m pip freeze # show all installed packages in the environment python -c "import sklearn; sklearn.show_versions()" - .. tab-item:: Linux - :class-label: tab-4 - :sync: os-linux + .. tab-item:: conda + :class-label: tab-6 + :sync: package-manager-conda + + .. include:: ./install_instructions_conda.rst + + .. tab-item:: Linux + :class-label: tab-4 + + .. tab-set:: + :class: tabs-package-manager + + .. tab-item:: pip + :class-label: tab-6 + :sync: package-manager-pip Python 3 is usually installed by default on most Linux distributions. To check if you have it installed, try: @@ -127,28 +169,12 @@ Installing the latest release python3 -m pip freeze # show all installed packages in the environment python3 -c "import sklearn; sklearn.show_versions()" - .. tab-item:: conda - :class-label: tab-6 - :sync: packager-conda - - Install conda using the `Anaconda or miniconda installers - `__ - or the `miniforge installers - `__ (no administrator - permission required for any of those). Then run: - - .. prompt:: bash - - conda create -n sklearn-env -c conda-forge scikit-learn - conda activate sklearn-env - - In order to check your installation, you can use: + .. tab-item:: conda + :class-label: tab-6 + :sync: package-manager-conda - .. prompt:: bash + .. include:: ./install_instructions_conda.rst - conda list scikit-learn # show scikit-learn version and location - conda list # show all installed packages in the environment - python -c "import sklearn; sklearn.show_versions()" Using an isolated environment such as pip venv or conda makes it possible to install a specific version of scikit-learn with pip or conda and its dependencies diff --git a/doc/install_instructions_conda.rst b/doc/install_instructions_conda.rst new file mode 100644 index 0000000000000..0b5a57b747021 --- /dev/null +++ b/doc/install_instructions_conda.rst @@ -0,0 +1,16 @@ +Install conda using the +`conda-forge installers `__ (no +administrator permission required). Then run: + +.. prompt:: bash + + conda create -n sklearn-env -c conda-forge scikit-learn + conda activate sklearn-env + +In order to check your installation, you can use: + +.. prompt:: bash + + conda list scikit-learn # show scikit-learn version and location + conda list # show all installed packages in the environment + python -c "import sklearn; sklearn.show_versions()" diff --git a/doc/js/scripts/dropdown.js b/doc/js/scripts/dropdown.js index ec2e6d9419a28..d76b7f943bf8a 100644 --- a/doc/js/scripts/dropdown.js +++ b/doc/js/scripts/dropdown.js @@ -8,54 +8,54 @@ * want them to show up in that case. */ -function addToggleAllButtons() { +document.addEventListener("DOMContentLoaded", () => { // Get all sphinx-design dropdowns const allDropdowns = document.querySelectorAll("details.sd-dropdown"); - function collapseAll() { - // Function to collapse all dropdowns on the page - console.log("[SK] Collapsing all dropdowns..."); - allDropdowns.forEach((dropdown) => { - dropdown.removeAttribute("open"); - }); - } - - function expandAll() { - // Function to expand all dropdowns on the page - console.log("[SK] Expanding all dropdowns..."); - allDropdowns.forEach((dropdown) => { - dropdown.setAttribute("open", ""); - }); - } - - const buttonConfigs = new Map([ - ["up", { desc: "Collapse", action: collapseAll }], - ["down", { desc: "Expand", action: expandAll }], - ]); - allDropdowns.forEach((dropdown) => { // Get the summary element of the dropdown, where we will place the buttons const summaryTitle = dropdown.querySelector("summary.sd-summary-title"); - for (const [direction, config] of buttonConfigs) { - // Button with icon inside - var newButton = document.createElement("button"); - var newIcon = document.createElement("i"); - newIcon.classList.add("fa-solid", `fa-angles-${direction}`); - newButton.appendChild(newIcon); - // Class for styling; `sd-summary-up/down` is implemented by sphinx-design; - // `sk-toggle-all` is implemented by us - newButton.classList.add(`sd-summary-${direction}`, `sk-toggle-all`); - // Bootstrap tooltip configurations - newButton.setAttribute("data-bs-toggle", "tooltip"); - newButton.setAttribute("data-bs-placement", "top"); - newButton.setAttribute("data-bs-offset", "0,10"); - newButton.setAttribute("data-bs-title", `${config.desc} all dropdowns`); - // Assign the collapse/expand action to the button - newButton.onclick = config.action; - // Append the button to the summary element - summaryTitle.appendChild(newButton); - } - }); -} -document.addEventListener("DOMContentLoaded", addToggleAllButtons); + // The state marker with the toggle all icon inside + const newStateMarker = document.createElement("span"); + const newIcon = document.createElement("i"); + newIcon.classList.add("fa-solid", "fa-angles-right"); + newStateMarker.appendChild(newIcon); + + // Classes for styling; `sd-summary-state-marker` and `sd-summary-chevron-right` are + // implemented by sphinx-design; `sk-toggle-all` is implemented by us + newStateMarker.classList.add( + "sd-summary-state-marker", + "sd-summary-chevron-right", + "sk-toggle-all" + ); + + // Bootstrap tooltip configurations + newStateMarker.setAttribute("data-bs-toggle", "tooltip"); + newStateMarker.setAttribute("data-bs-placement", "top"); + newStateMarker.setAttribute("data-bs-offset", "0,10"); + newStateMarker.setAttribute("data-bs-title", "Toggle all dropdowns"); + + // Assign the collapse/expand action to the state marker + newStateMarker.addEventListener("click", () => { + if (dropdown.open) { + console.log("[SK] Collapsing all dropdowns..."); + allDropdowns.forEach((node) => { + if (node !== dropdown) { + node.removeAttribute("open"); + } + }); + } else { + console.log("[SK] Expanding all dropdowns..."); + allDropdowns.forEach((node) => { + if (node !== dropdown) { + node.setAttribute("open", ""); + } + }); + } + }); + + // Append the state marker to the summary element + summaryTitle.insertBefore(newStateMarker, summaryTitle.lastElementChild); + }); +}); diff --git a/doc/maintainers.rst b/doc/maintainers.rst index 0ba69d8afa60d..72ba579ec63c9 100644 --- a/doc/maintainers.rst +++ b/doc/maintainers.rst @@ -54,6 +54,10 @@

Guillaume Lemaitre

+
+

Adam Li

+
+

Christian Lorentzen

diff --git a/doc/model_persistence.rst b/doc/model_persistence.rst index cd5347d302123..afa460a2fcea3 100644 --- a/doc/model_persistence.rst +++ b/doc/model_persistence.rst @@ -4,6 +4,47 @@ Model persistence ================= +.. list-table:: Summary of model persistence methods + :widths: 25 50 50 + :header-rows: 1 + + * - Persistence method + - Pros + - Risks / Cons + * - :ref:`ONNX ` + - * Serve models without a Python environment + * Serving and training environments independent of one another + * Most secure option + - * Not all scikit-learn models are supported + * Custom estimators require more work to support + * Original Python object is lost and cannot be reconstructed + * - :ref:`skops_persistence` + - * More secure than `pickle` based formats + * Contents can be partly validated without loading + - * Not as fast as `pickle` based formats + * Supports less types than `pickle` based formats + * Requires the same environment as the training environment + * - :mod:`pickle` + - * Native to Python + * Can serialize most Python objects + * Efficient memory usage with `protocol=5` + - * Loading can execute arbitrary code + * Requires the same environment as the training environment + * - :mod:`joblib` + - * Efficient memory usage + * Supports memory mapping + * Easy shortcuts for compression and decompression + - * Pickle based format + * Loading can execute arbitrary code + * Requires the same environment as the training environment + * - `cloudpickle`_ + - * Can serialize non-packaged, custom Python code + * Comparable loading efficiency as :mod:`pickle` with `protocol=5` + - * Pickle based format + * Loading can execute arbitrary code + * No forward compatibility guarantees + * Requires the same environment as the training environment + After training a scikit-learn model, it is desirable to have a way to persist the model for future use without having to retrain. Based on your use-case, there are a few different ways to persist a scikit-learn model, and here we @@ -78,7 +119,7 @@ persist and plan to serve the model: to get predictions. This environment can be minimal and does not necessarily even require Python to be installed to load the model and compute predictions. Also note that `onnxruntime` typically requires much less RAM - than Python to to compute predictions from small models. + than Python to compute predictions from small models. - :mod:`skops.io`, :mod:`pickle`, :mod:`joblib`, `cloudpickle`_: You need a Python environment with the appropriate dependencies installed to load the diff --git a/doc/modules/biclustering.rst b/doc/modules/biclustering.rst index 503a535c408f0..4370c56f63e9d 100644 --- a/doc/modules/biclustering.rst +++ b/doc/modules/biclustering.rst @@ -288,7 +288,8 @@ available: 2. Assign biclusters from one set to another in a one-to-one fashion to maximize the sum of their similarities. This step is performed - using the Hungarian algorithm. + using :func:`scipy.optimize.linear_sum_assignment`, which uses a + modified Jonker-Volgenant algorithm. 3. The final sum of similarities is divided by the size of the larger set. @@ -302,4 +303,4 @@ are identical. * Hochreiter, Bodenhofer, et. al., 2010. `FABIA: factor analysis for bicluster acquisition - `__. + `__. \ No newline at end of file diff --git a/doc/modules/calibration.rst b/doc/modules/calibration.rst index a2bfa152d2b26..ad183aa79c6c4 100644 --- a/doc/modules/calibration.rst +++ b/doc/modules/calibration.rst @@ -149,9 +149,14 @@ The :class:`CalibratedClassifierCV` class is used to calibrate a classifier. unbiased data is always used to fit the calibrator. The data is split into k `(train_set, test_set)` couples (as determined by `cv`). When `ensemble=True` (default), the following procedure is repeated independently for each -cross-validation split: a clone of `base_estimator` is first trained on the -train subset. Then its predictions on the test subset are used to fit a -calibrator (either a sigmoid or isotonic regressor). This results in an +cross-validation split: + +1. a clone of `base_estimator` is trained on the train subset +2. the trained `base_estimator` makes predictions on the test subset +3. the predictions are used to fit a calibrator (either a sigmoid or isotonic + regressor) (when the data is multiclass, a calibrator is fit for every class) + +This results in an ensemble of k `(classifier, calibrator)` couples where each calibrator maps the output of its corresponding classifier into [0, 1]. Each couple is exposed in the `calibrated_classifiers_` attribute, where each entry is a calibrated @@ -162,6 +167,15 @@ predicted probabilities of the `k` estimators in the `calibrated_classifiers_` list. The output of :term:`predict` is the class that has the highest probability. +It is important to choose `cv` carefully when using `ensemble=True`. +All classes should be present in both train and test subsets for every split. +When a class is absent in the train subset, the predicted probability for that +class will default to 0 for the `(classifier, calibrator)` couple of that split. +This skews the :term:`predict_proba` as it averages across all couples. +When a class is absent in the test subset, the calibrator for that class +(within the `(classifier, calibrator)` couple of that split) is +fit on data with no positive class. This results in ineffective calibration. + When `ensemble=False`, cross-validation is used to obtain 'unbiased' predictions for all the data, via :func:`~sklearn.model_selection.cross_val_predict`. diff --git a/doc/modules/clustering.rst b/doc/modules/clustering.rst index 2de39d0317bf5..3a055abb65c8b 100644 --- a/doc/modules/clustering.rst +++ b/doc/modules/clustering.rst @@ -1370,7 +1370,7 @@ will not necessarily be close to zero.:: - **Bounded range**: Lower values indicate different labelings, similar clusterings have a high (adjusted or unadjusted) Rand index, 1.0 is the perfect match score. The score range is [0, 1] for the unadjusted Rand index - and [-1, 1] for the adjusted Rand index. + and [-0.5, 1] for the adjusted Rand index. - **No assumption is made on the cluster structure**: The (adjusted or unadjusted) Rand index can be used to compare all kinds of clustering @@ -1444,6 +1444,8 @@ will not necessarily be close to zero.:: * `Wikipedia entry for the Rand index `_ + * :doi:`Minimum adjusted Rand index for two clusterings of a given size, 2022, J. E. Chacón and A. I. Rastrojo <10.1007/s11634-022-00491-w>` + .. _mutual_info_score: @@ -1789,20 +1791,25 @@ homogeneous but not complete:: Fowlkes-Mallows scores ---------------------- -The Fowlkes-Mallows index (:func:`sklearn.metrics.fowlkes_mallows_score`) can be -used when the ground truth class assignments of the samples is known. The -Fowlkes-Mallows score FMI is defined as the geometric mean of the -pairwise precision and recall: +The original Fowlkes-Mallows index (FMI) was intended to measure the similarity +between two clustering results, which is inherently an unsupervised comparison. +The supervised adaptation of the Fowlkes-Mallows index +(as implemented in :func:`sklearn.metrics.fowlkes_mallows_score`) can be used +when the ground truth class assignments of the samples are known. +The FMI is defined as the geometric mean of the pairwise precision and recall: .. math:: \text{FMI} = \frac{\text{TP}}{\sqrt{(\text{TP} + \text{FP}) (\text{TP} + \text{FN})}} -Where ``TP`` is the number of **True Positive** (i.e. the number of pair -of points that belong to the same clusters in both the true labels and the -predicted labels), ``FP`` is the number of **False Positive** (i.e. the number -of pair of points that belong to the same clusters in the true labels and not -in the predicted labels) and ``FN`` is the number of **False Negative** (i.e. the -number of pair of points that belongs in the same clusters in the predicted -labels and not in the true labels). +In the above formula: + +* ``TP`` (**True Positive**): The number of pairs of points that are clustered together + both in the true labels and in the predicted labels. + +* ``FP`` (**False Positive**): The number of pairs of points that are clustered together + in the predicted labels but not in the true labels. + +* ``FN`` (**False Negative**): The number of pairs of points that are clustered together + in the true labels but not in the predicted labels. The score ranges from 0 to 1. A high value indicates a good similarity between two clusters. diff --git a/doc/modules/ensemble.rst b/doc/modules/ensemble.rst index 58ac09583ea6c..3160ff24d57f3 100644 --- a/doc/modules/ensemble.rst +++ b/doc/modules/ensemble.rst @@ -98,14 +98,21 @@ controls the number of iterations of the boosting process:: >>> clf.score(X_test, y_test) 0.8965 -Available losses for regression are 'squared_error', -'absolute_error', which is less sensitive to outliers, and -'poisson', which is well suited to model counts and frequencies. For -classification, 'log_loss' is the only option. For binary classification it uses the -binary log loss, also known as binomial deviance or binary cross-entropy. For -`n_classes >= 3`, it uses the multi-class log loss function, with multinomial deviance -and categorical cross-entropy as alternative names. The appropriate loss version is -selected based on :term:`y` passed to :term:`fit`. +Available losses for **regression** are: + +- 'squared_error', which is the default loss; +- 'absolute_error', which is less sensitive to outliers than the squared error; +- 'gamma', which is well suited to model strictly positive outcomes; +- 'poisson', which is well suited to model counts and frequencies; +- 'quantile', which allows for estimating a conditional quantile that can later + be used to obtain prediction intervals. + +For **classification**, 'log_loss' is the only option. For binary classification +it uses the binary log loss, also known as binomial deviance or binary +cross-entropy. For `n_classes >= 3`, it uses the multi-class log loss function, +with multinomial deviance and categorical cross-entropy as alternative names. +The appropriate loss version is selected based on :term:`y` passed to +:term:`fit`. The size of the trees can be controlled through the ``max_leaf_nodes``, ``max_depth``, and ``min_samples_leaf`` parameters. diff --git a/doc/modules/feature_extraction.rst b/doc/modules/feature_extraction.rst index 2181014644e15..2dd670891b434 100644 --- a/doc/modules/feature_extraction.rst +++ b/doc/modules/feature_extraction.rst @@ -106,8 +106,8 @@ suitable for feeding into a classifier (maybe after being piped into a >>> vec = DictVectorizer() >>> pos_vectorized = vec.fit_transform(pos_window) >>> pos_vectorized - <1x6 sparse matrix of type '<... 'numpy.float64'>' - with 6 stored elements in Compressed Sparse ... format> + >>> pos_vectorized.toarray() array([[1., 1., 1., 1., 1., 1.]]) >>> vec.get_feature_names_out() @@ -324,8 +324,8 @@ corpus of text documents:: ... ] >>> X = vectorizer.fit_transform(corpus) >>> X - <4x9 sparse matrix of type '<... 'numpy.int64'>' - with 19 stored elements in Compressed Sparse ... format> + The default configuration tokenizes the string by extracting words of at least 2 letters. The specific function that does this step can be @@ -507,8 +507,8 @@ Again please see the :ref:`reference documentation ... >>> tfidf = transformer.fit_transform(counts) >>> tfidf - <6x3 sparse matrix of type '<... 'numpy.float64'>' - with 9 stored elements in Compressed Sparse ... format> + >>> tfidf.toarray() array([[0.81940995, 0. , 0.57320793], @@ -592,8 +592,8 @@ Again please see the :ref:`reference documentation >>> from sklearn.feature_extraction.text import TfidfVectorizer >>> vectorizer = TfidfVectorizer() >>> vectorizer.fit_transform(corpus) - <4x9 sparse matrix of type '<... 'numpy.float64'>' - with 19 stored elements in Compressed Sparse ... format> + While the tf-idf normalization is often very useful, there might be cases where the binary occurrence markers might offer better @@ -755,15 +755,16 @@ span across words:: >>> ngram_vectorizer = CountVectorizer(analyzer='char_wb', ngram_range=(5, 5)) >>> ngram_vectorizer.fit_transform(['jumpy fox']) - <1x4 sparse matrix of type '<... 'numpy.int64'>' - with 4 stored elements in Compressed Sparse ... format> + + >>> ngram_vectorizer.get_feature_names_out() array([' fox ', ' jump', 'jumpy', 'umpy '], ...) >>> ngram_vectorizer = CountVectorizer(analyzer='char', ngram_range=(5, 5)) >>> ngram_vectorizer.fit_transform(['jumpy fox']) - <1x5 sparse matrix of type '<... 'numpy.int64'>' - with 5 stored elements in Compressed Sparse ... format> + >>> ngram_vectorizer.get_feature_names_out() array(['jumpy', 'mpy f', 'py fo', 'umpy ', 'y fox'], ...) @@ -829,8 +830,8 @@ meaning that you don't have to call ``fit`` on it:: >>> from sklearn.feature_extraction.text import HashingVectorizer >>> hv = HashingVectorizer(n_features=10) >>> hv.transform(corpus) - <4x10 sparse matrix of type '<... 'numpy.float64'>' - with 16 stored elements in Compressed Sparse ... format> + You can see that 16 non-zero feature tokens were extracted in the vector output: this is less than the 19 non-zeros extracted previously by the @@ -853,8 +854,8 @@ Let's try again with the default setting:: >>> hv = HashingVectorizer() >>> hv.transform(corpus) - <4x1048576 sparse matrix of type '<... 'numpy.float64'>' - with 19 stored elements in Compressed Sparse ... format> + We no longer get the collisions, but this comes at the expense of a much larger dimensionality of the output space. diff --git a/doc/modules/grid_search.rst b/doc/modules/grid_search.rst index 12ee76d8e4d39..f91f070e644be 100644 --- a/doc/modules/grid_search.rst +++ b/doc/modules/grid_search.rst @@ -74,8 +74,10 @@ evaluated and the best combination is retained. .. rubric:: Examples -- See :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_digits.py` for an example of - Grid Search computation on the digits dataset. +- See :ref:`sphx_glr_auto_examples_model_selection_plot_nested_cross_validation_iris.py` + for an example of Grid Search within a cross validation loop on the iris + dataset. This is the best practice for evaluating the performance of a + model with grid search. - See :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_text_feature_extraction.py` for an example of Grid Search coupling parameters from a text documents feature @@ -83,24 +85,28 @@ evaluated and the best combination is retained. classifier (here a linear SVM trained with SGD with either elastic net or L2 penalty) using a :class:`~sklearn.pipeline.Pipeline` instance. -- See :ref:`sphx_glr_auto_examples_model_selection_plot_nested_cross_validation_iris.py` - for an example of Grid Search within a cross validation loop on the iris - dataset. This is the best practice for evaluating the performance of a - model with grid search. -- See :ref:`sphx_glr_auto_examples_model_selection_plot_multi_metric_evaluation.py` - for an example of :class:`GridSearchCV` being used to evaluate multiple - metrics simultaneously. +.. dropdown:: Advanced examples + + - See :ref:`sphx_glr_auto_examples_model_selection_plot_nested_cross_validation_iris.py` + for an example of Grid Search within a cross validation loop on the iris + dataset. This is the best practice for evaluating the performance of a + model with grid search. + + - See :ref:`sphx_glr_auto_examples_model_selection_plot_multi_metric_evaluation.py` + for an example of :class:`GridSearchCV` being used to evaluate multiple + metrics simultaneously. -- See :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_refit_callable.py` - for an example of using ``refit=callable`` interface in - :class:`GridSearchCV`. The example shows how this interface adds certain - amount of flexibility in identifying the "best" estimator. This interface - can also be used in multiple metrics evaluation. + - See :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_refit_callable.py` + for an example of using ``refit=callable`` interface in + :class:`GridSearchCV`. The example shows how this interface adds certain + amount of flexibility in identifying the "best" estimator. This interface + can also be used in multiple metrics evaluation. + + - See :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_stats.py` + for an example of how to do a statistical comparison on the outputs of + :class:`GridSearchCV`. -- See :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_stats.py` - for an example of how to do a statistical comparison on the outputs of - :class:`GridSearchCV`. .. _randomized_parameter_search: @@ -188,6 +194,11 @@ iteration, which will be allocated more resources. For parameter tuning, the resource is typically the number of training samples, but it can also be an arbitrary numeric parameter such as `n_estimators` in a random forest. +.. note:: + + The resource increase chosen should be large enough so that a large improvement + in scores is obtained when taking into account statistical significance. + As illustrated in the figure below, only a subset of candidates 'survive' until the last iteration. These are the candidates that have consistently ranked among the top-scoring candidates across all iterations. @@ -199,7 +210,7 @@ here the number of samples. :align: center We here briefly describe the main parameters, but each parameter and their -interactions are described in more details in the sections below. The +interactions are described more in detail in the dropdown section below. The ``factor`` (> 1) parameter controls the rate at which the resources grow, and the rate at which the number of candidates decreases. In each iteration, the number of resources per candidate is multiplied by ``factor`` and the number @@ -216,9 +227,7 @@ These estimators are still **experimental**: their predictions and their API might change without any deprecation cycle. To use them, you need to explicitly import ``enable_halving_search_cv``:: - >>> # explicitly require this experimental feature >>> from sklearn.experimental import enable_halving_search_cv # noqa - >>> # now you can import normally from model_selection >>> from sklearn.model_selection import HalvingGridSearchCV >>> from sklearn.model_selection import HalvingRandomSearchCV @@ -227,268 +236,263 @@ need to explicitly import ``enable_halving_search_cv``:: * :ref:`sphx_glr_auto_examples_model_selection_plot_successive_halving_heatmap.py` * :ref:`sphx_glr_auto_examples_model_selection_plot_successive_halving_iterations.py` -Choosing ``min_resources`` and the number of candidates -------------------------------------------------------- - -Beside ``factor``, the two main parameters that influence the behaviour of a -successive halving search are the ``min_resources`` parameter, and the -number of candidates (or parameter combinations) that are evaluated. -``min_resources`` is the amount of resources allocated at the first -iteration for each candidate. The number of candidates is specified directly -in :class:`HalvingRandomSearchCV`, and is determined from the ``param_grid`` -parameter of :class:`HalvingGridSearchCV`. - -Consider a case where the resource is the number of samples, and where we -have 1000 samples. In theory, with ``min_resources=10`` and ``factor=2``, we -are able to run **at most** 7 iterations with the following number of -samples: ``[10, 20, 40, 80, 160, 320, 640]``. - -But depending on the number of candidates, we might run less than 7 -iterations: if we start with a **small** number of candidates, the last -iteration might use less than 640 samples, which means not using all the -available resources (samples). For example if we start with 5 candidates, we -only need 2 iterations: 5 candidates for the first iteration, then -`5 // 2 = 2` candidates at the second iteration, after which we know which -candidate performs the best (so we don't need a third one). We would only be -using at most 20 samples which is a waste since we have 1000 samples at our -disposal. On the other hand, if we start with a **high** number of -candidates, we might end up with a lot of candidates at the last iteration, -which may not always be ideal: it means that many candidates will run with -the full resources, basically reducing the procedure to standard search. - -In the case of :class:`HalvingRandomSearchCV`, the number of candidates is set -by default such that the last iteration uses as much of the available -resources as possible. For :class:`HalvingGridSearchCV`, the number of -candidates is determined by the `param_grid` parameter. Changing the value of -``min_resources`` will impact the number of possible iterations, and as a -result will also have an effect on the ideal number of candidates. - -Another consideration when choosing ``min_resources`` is whether or not it -is easy to discriminate between good and bad candidates with a small amount -of resources. For example, if you need a lot of samples to distinguish -between good and bad parameters, a high ``min_resources`` is recommended. On -the other hand if the distinction is clear even with a small amount of -samples, then a small ``min_resources`` may be preferable since it would -speed up the computation. - -Notice in the example above that the last iteration does not use the maximum -amount of resources available: 1000 samples are available, yet only 640 are -used, at most. By default, both :class:`HalvingRandomSearchCV` and -:class:`HalvingGridSearchCV` try to use as many resources as possible in the -last iteration, with the constraint that this amount of resources must be a -multiple of both `min_resources` and `factor` (this constraint will be clear -in the next section). :class:`HalvingRandomSearchCV` achieves this by -sampling the right amount of candidates, while :class:`HalvingGridSearchCV` -achieves this by properly setting `min_resources`. Please see -:ref:`exhausting_the_resources` for details. - -.. _amount_of_resource_and_number_of_candidates: - -Amount of resource and number of candidates at each iteration -------------------------------------------------------------- - -At any iteration `i`, each candidate is allocated a given amount of resources -which we denote `n_resources_i`. This quantity is controlled by the -parameters ``factor`` and ``min_resources`` as follows (`factor` is strictly -greater than 1):: - - n_resources_i = factor**i * min_resources, - -or equivalently:: - - n_resources_{i+1} = n_resources_i * factor - -where ``min_resources == n_resources_0`` is the amount of resources used at -the first iteration. ``factor`` also defines the proportions of candidates -that will be selected for the next iteration:: - - n_candidates_i = n_candidates // (factor ** i) - -or equivalently:: - - n_candidates_0 = n_candidates - n_candidates_{i+1} = n_candidates_i // factor - -So in the first iteration, we use ``min_resources`` resources -``n_candidates`` times. In the second iteration, we use ``min_resources * -factor`` resources ``n_candidates // factor`` times. The third again -multiplies the resources per candidate and divides the number of candidates. -This process stops when the maximum amount of resource per candidate is -reached, or when we have identified the best candidate. The best candidate -is identified at the iteration that is evaluating `factor` or less candidates -(see just below for an explanation). - -Here is an example with ``min_resources=3`` and ``factor=2``, starting with -70 candidates: - -+-----------------------+-----------------------+ -| ``n_resources_i`` | ``n_candidates_i`` | -+=======================+=======================+ -| 3 (=min_resources) | 70 (=n_candidates) | -+-----------------------+-----------------------+ -| 3 * 2 = 6 | 70 // 2 = 35 | -+-----------------------+-----------------------+ -| 6 * 2 = 12 | 35 // 2 = 17 | -+-----------------------+-----------------------+ -| 12 * 2 = 24 | 17 // 2 = 8 | -+-----------------------+-----------------------+ -| 24 * 2 = 48 | 8 // 2 = 4 | -+-----------------------+-----------------------+ -| 48 * 2 = 96 | 4 // 2 = 2 | -+-----------------------+-----------------------+ - -We can note that: - -- the process stops at the first iteration which evaluates `factor=2` - candidates: the best candidate is the best out of these 2 candidates. It - is not necessary to run an additional iteration, since it would only - evaluate one candidate (namely the best one, which we have already - identified). For this reason, in general, we want the last iteration to - run at most ``factor`` candidates. If the last iteration evaluates more - than `factor` candidates, then this last iteration reduces to a regular - search (as in :class:`RandomizedSearchCV` or :class:`GridSearchCV`). -- each ``n_resources_i`` is a multiple of both ``factor`` and - ``min_resources`` (which is confirmed by its definition above). - -The amount of resources that is used at each iteration can be found in the -`n_resources_` attribute. - -Choosing a resource -------------------- - -By default, the resource is defined in terms of number of samples. That is, -each iteration will use an increasing amount of samples to train on. You can -however manually specify a parameter to use as the resource with the -``resource`` parameter. Here is an example where the resource is defined in -terms of the number of estimators of a random forest:: - - >>> from sklearn.datasets import make_classification - >>> from sklearn.ensemble import RandomForestClassifier - >>> from sklearn.experimental import enable_halving_search_cv # noqa - >>> from sklearn.model_selection import HalvingGridSearchCV - >>> import pandas as pd - >>> - >>> param_grid = {'max_depth': [3, 5, 10], - ... 'min_samples_split': [2, 5, 10]} - >>> base_estimator = RandomForestClassifier(random_state=0) - >>> X, y = make_classification(n_samples=1000, random_state=0) - >>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, - ... factor=2, resource='n_estimators', - ... max_resources=30).fit(X, y) - >>> sh.best_estimator_ - RandomForestClassifier(max_depth=5, n_estimators=24, random_state=0) - -Note that it is not possible to budget on a parameter that is part of the -parameter grid. - -.. _exhausting_the_resources: - -Exhausting the available resources ----------------------------------- - -As mentioned above, the number of resources that is used at each iteration -depends on the `min_resources` parameter. -If you have a lot of resources available but start with a low number of -resources, some of them might be wasted (i.e. not used):: - - >>> from sklearn.datasets import make_classification - >>> from sklearn.svm import SVC - >>> from sklearn.experimental import enable_halving_search_cv # noqa - >>> from sklearn.model_selection import HalvingGridSearchCV - >>> import pandas as pd - >>> param_grid= {'kernel': ('linear', 'rbf'), - ... 'C': [1, 10, 100]} - >>> base_estimator = SVC(gamma='scale') - >>> X, y = make_classification(n_samples=1000) - >>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, - ... factor=2, min_resources=20).fit(X, y) - >>> sh.n_resources_ - [20, 40, 80] - -The search process will only use 80 resources at most, while our maximum -amount of available resources is ``n_samples=1000``. Here, we have -``min_resources = r_0 = 20``. - -For :class:`HalvingGridSearchCV`, by default, the `min_resources` parameter -is set to 'exhaust'. This means that `min_resources` is automatically set -such that the last iteration can use as many resources as possible, within -the `max_resources` limit:: - - >>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, - ... factor=2, min_resources='exhaust').fit(X, y) - >>> sh.n_resources_ - [250, 500, 1000] - -`min_resources` was here automatically set to 250, which results in the last -iteration using all the resources. The exact value that is used depends on -the number of candidate parameter, on `max_resources` and on `factor`. - -For :class:`HalvingRandomSearchCV`, exhausting the resources can be done in 2 -ways: - -- by setting `min_resources='exhaust'`, just like for - :class:`HalvingGridSearchCV`; -- by setting `n_candidates='exhaust'`. - -Both options are mutually exclusive: using `min_resources='exhaust'` requires -knowing the number of candidates, and symmetrically `n_candidates='exhaust'` -requires knowing `min_resources`. - -In general, exhausting the total number of resources leads to a better final -candidate parameter, and is slightly more time-intensive. +The sections below dive into technical aspects of successive halving. + +.. dropdown:: Choosing ``min_resources`` and the number of candidates + + Beside ``factor``, the two main parameters that influence the behaviour of a + successive halving search are the ``min_resources`` parameter, and the + number of candidates (or parameter combinations) that are evaluated. + ``min_resources`` is the amount of resources allocated at the first + iteration for each candidate. The number of candidates is specified directly + in :class:`HalvingRandomSearchCV`, and is determined from the ``param_grid`` + parameter of :class:`HalvingGridSearchCV`. + + Consider a case where the resource is the number of samples, and where we + have 1000 samples. In theory, with ``min_resources=10`` and ``factor=2``, we + are able to run **at most** 7 iterations with the following number of + samples: ``[10, 20, 40, 80, 160, 320, 640]``. + + But depending on the number of candidates, we might run less than 7 + iterations: if we start with a **small** number of candidates, the last + iteration might use less than 640 samples, which means not using all the + available resources (samples). For example if we start with 5 candidates, we + only need 2 iterations: 5 candidates for the first iteration, then + `5 // 2 = 2` candidates at the second iteration, after which we know which + candidate performs the best (so we don't need a third one). We would only be + using at most 20 samples which is a waste since we have 1000 samples at our + disposal. On the other hand, if we start with a **high** number of + candidates, we might end up with a lot of candidates at the last iteration, + which may not always be ideal: it means that many candidates will run with + the full resources, basically reducing the procedure to standard search. + + In the case of :class:`HalvingRandomSearchCV`, the number of candidates is set + by default such that the last iteration uses as much of the available + resources as possible. For :class:`HalvingGridSearchCV`, the number of + candidates is determined by the `param_grid` parameter. Changing the value of + ``min_resources`` will impact the number of possible iterations, and as a + result will also have an effect on the ideal number of candidates. + + Another consideration when choosing ``min_resources`` is whether or not it + is easy to discriminate between good and bad candidates with a small amount + of resources. For example, if you need a lot of samples to distinguish + between good and bad parameters, a high ``min_resources`` is recommended. On + the other hand if the distinction is clear even with a small amount of + samples, then a small ``min_resources`` may be preferable since it would + speed up the computation. + + Notice in the example above that the last iteration does not use the maximum + amount of resources available: 1000 samples are available, yet only 640 are + used, at most. By default, both :class:`HalvingRandomSearchCV` and + :class:`HalvingGridSearchCV` try to use as many resources as possible in the + last iteration, with the constraint that this amount of resources must be a + multiple of both `min_resources` and `factor` (this constraint will be clear + in the next section). :class:`HalvingRandomSearchCV` achieves this by + sampling the right amount of candidates, while :class:`HalvingGridSearchCV` + achieves this by properly setting `min_resources`. + + +.. dropdown:: Amount of resource and number of candidates at each iteration + + At any iteration `i`, each candidate is allocated a given amount of resources + which we denote `n_resources_i`. This quantity is controlled by the + parameters ``factor`` and ``min_resources`` as follows (`factor` is strictly + greater than 1):: + + n_resources_i = factor**i * min_resources, + + or equivalently:: + + n_resources_{i+1} = n_resources_i * factor + + where ``min_resources == n_resources_0`` is the amount of resources used at + the first iteration. ``factor`` also defines the proportions of candidates + that will be selected for the next iteration:: + + n_candidates_i = n_candidates // (factor ** i) + + or equivalently:: + + n_candidates_0 = n_candidates + n_candidates_{i+1} = n_candidates_i // factor + + So in the first iteration, we use ``min_resources`` resources + ``n_candidates`` times. In the second iteration, we use ``min_resources * + factor`` resources ``n_candidates // factor`` times. The third again + multiplies the resources per candidate and divides the number of candidates. + This process stops when the maximum amount of resource per candidate is + reached, or when we have identified the best candidate. The best candidate + is identified at the iteration that is evaluating `factor` or less candidates + (see just below for an explanation). + + Here is an example with ``min_resources=3`` and ``factor=2``, starting with + 70 candidates: + + +-----------------------+-----------------------+ + | ``n_resources_i`` | ``n_candidates_i`` | + +=======================+=======================+ + | 3 (=min_resources) | 70 (=n_candidates) | + +-----------------------+-----------------------+ + | 3 * 2 = 6 | 70 // 2 = 35 | + +-----------------------+-----------------------+ + | 6 * 2 = 12 | 35 // 2 = 17 | + +-----------------------+-----------------------+ + | 12 * 2 = 24 | 17 // 2 = 8 | + +-----------------------+-----------------------+ + | 24 * 2 = 48 | 8 // 2 = 4 | + +-----------------------+-----------------------+ + | 48 * 2 = 96 | 4 // 2 = 2 | + +-----------------------+-----------------------+ + + We can note that: + + - the process stops at the first iteration which evaluates `factor=2` + candidates: the best candidate is the best out of these 2 candidates. It + is not necessary to run an additional iteration, since it would only + evaluate one candidate (namely the best one, which we have already + identified). For this reason, in general, we want the last iteration to + run at most ``factor`` candidates. If the last iteration evaluates more + than `factor` candidates, then this last iteration reduces to a regular + search (as in :class:`RandomizedSearchCV` or :class:`GridSearchCV`). + - each ``n_resources_i`` is a multiple of both ``factor`` and + ``min_resources`` (which is confirmed by its definition above). + + The amount of resources that is used at each iteration can be found in the + `n_resources_` attribute. + +.. dropdown:: Choosing a resource + + By default, the resource is defined in terms of number of samples. That is, + each iteration will use an increasing amount of samples to train on. You can + however manually specify a parameter to use as the resource with the + ``resource`` parameter. Here is an example where the resource is defined in + terms of the number of estimators of a random forest:: + + >>> from sklearn.datasets import make_classification + >>> from sklearn.ensemble import RandomForestClassifier + >>> from sklearn.experimental import enable_halving_search_cv # noqa + >>> from sklearn.model_selection import HalvingGridSearchCV + >>> import pandas as pd + >>> param_grid = {'max_depth': [3, 5, 10], + ... 'min_samples_split': [2, 5, 10]} + >>> base_estimator = RandomForestClassifier(random_state=0) + >>> X, y = make_classification(n_samples=1000, random_state=0) + >>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, + ... factor=2, resource='n_estimators', + ... max_resources=30).fit(X, y) + >>> sh.best_estimator_ + RandomForestClassifier(max_depth=5, n_estimators=24, random_state=0) + + Note that it is not possible to budget on a parameter that is part of the + parameter grid. + + +.. dropdown:: Exhausting the available resources + + As mentioned above, the number of resources that is used at each iteration + depends on the `min_resources` parameter. + If you have a lot of resources available but start with a low number of + resources, some of them might be wasted (i.e. not used):: + + >>> from sklearn.datasets import make_classification + >>> from sklearn.svm import SVC + >>> from sklearn.experimental import enable_halving_search_cv # noqa + >>> from sklearn.model_selection import HalvingGridSearchCV + >>> import pandas as pd + >>> param_grid= {'kernel': ('linear', 'rbf'), + ... 'C': [1, 10, 100]} + >>> base_estimator = SVC(gamma='scale') + >>> X, y = make_classification(n_samples=1000) + >>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, + ... factor=2, min_resources=20).fit(X, y) + >>> sh.n_resources_ + [20, 40, 80] + + The search process will only use 80 resources at most, while our maximum + amount of available resources is ``n_samples=1000``. Here, we have + ``min_resources = r_0 = 20``. + + For :class:`HalvingGridSearchCV`, by default, the `min_resources` parameter + is set to 'exhaust'. This means that `min_resources` is automatically set + such that the last iteration can use as many resources as possible, within + the `max_resources` limit:: + + >>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, + ... factor=2, min_resources='exhaust').fit(X, y) + >>> sh.n_resources_ + [250, 500, 1000] + + `min_resources` was here automatically set to 250, which results in the last + iteration using all the resources. The exact value that is used depends on + the number of candidate parameter, on `max_resources` and on `factor`. + + For :class:`HalvingRandomSearchCV`, exhausting the resources can be done in 2 + ways: + + - by setting `min_resources='exhaust'`, just like for + :class:`HalvingGridSearchCV`; + - by setting `n_candidates='exhaust'`. + + Both options are mutually exclusive: using `min_resources='exhaust'` requires + knowing the number of candidates, and symmetrically `n_candidates='exhaust'` + requires knowing `min_resources`. + + In general, exhausting the total number of resources leads to a better final + candidate parameter, and is slightly more time-intensive. .. _aggressive_elimination: Aggressive elimination of candidates ------------------------------------ -Ideally, we want the last iteration to evaluate ``factor`` candidates (see -:ref:`amount_of_resource_and_number_of_candidates`). We then just have to -pick the best one. When the number of available resources is small with -respect to the number of candidates, the last iteration may have to evaluate -more than ``factor`` candidates:: - - >>> from sklearn.datasets import make_classification - >>> from sklearn.svm import SVC - >>> from sklearn.experimental import enable_halving_search_cv # noqa - >>> from sklearn.model_selection import HalvingGridSearchCV - >>> import pandas as pd - >>> - >>> - >>> param_grid = {'kernel': ('linear', 'rbf'), - ... 'C': [1, 10, 100]} - >>> base_estimator = SVC(gamma='scale') - >>> X, y = make_classification(n_samples=1000) - >>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, - ... factor=2, max_resources=40, - ... aggressive_elimination=False).fit(X, y) - >>> sh.n_resources_ - [20, 40] - >>> sh.n_candidates_ - [6, 3] - -Since we cannot use more than ``max_resources=40`` resources, the process -has to stop at the second iteration which evaluates more than ``factor=2`` -candidates. - Using the ``aggressive_elimination`` parameter, you can force the search process to end up with less than ``factor`` candidates at the last -iteration. To do this, the process will eliminate as many candidates as -necessary using ``min_resources`` resources:: - - >>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, - ... factor=2, - ... max_resources=40, - ... aggressive_elimination=True, - ... ).fit(X, y) - >>> sh.n_resources_ - [20, 20, 40] - >>> sh.n_candidates_ - [6, 3, 2] - -Notice that we end with 2 candidates at the last iteration since we have -eliminated enough candidates during the first iterations, using ``n_resources = -min_resources = 20``. +iteration. + +.. dropdown:: Code example of aggressive elimination + + Ideally, we want the last iteration to evaluate ``factor`` candidates. We + then just have to pick the best one. When the number of available resources is + small with respect to the number of candidates, the last iteration may have to + evaluate more than ``factor`` candidates:: + + >>> from sklearn.datasets import make_classification + >>> from sklearn.svm import SVC + >>> from sklearn.experimental import enable_halving_search_cv # noqa + >>> from sklearn.model_selection import HalvingGridSearchCV + >>> import pandas as pd + >>> param_grid = {'kernel': ('linear', 'rbf'), + ... 'C': [1, 10, 100]} + >>> base_estimator = SVC(gamma='scale') + >>> X, y = make_classification(n_samples=1000) + >>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, + ... factor=2, max_resources=40, + ... aggressive_elimination=False).fit(X, y) + >>> sh.n_resources_ + [20, 40] + >>> sh.n_candidates_ + [6, 3] + + Since we cannot use more than ``max_resources=40`` resources, the process + has to stop at the second iteration which evaluates more than ``factor=2`` + candidates. + + When using ``aggressive_elimination``, the process will eliminate as many + candidates as necessary using ``min_resources`` resources:: + + >>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, + ... factor=2, + ... max_resources=40, + ... aggressive_elimination=True, + ... ).fit(X, y) + >>> sh.n_resources_ + [20, 20, 40] + >>> sh.n_candidates_ + [6, 3, 2] + + Notice that we end with 2 candidates at the last iteration since we have + eliminated enough candidates during the first iterations, using ``n_resources = + min_resources = 20``. .. _successive_halving_cv_results: @@ -502,42 +506,44 @@ pd.DataFrame(est.cv_results_)``. The ``cv_results_`` attribute of to that of :class:`GridSearchCV` and :class:`RandomizedSearchCV`, with additional information related to the successive halving process. -Here is an example with some of the columns of a (truncated) dataframe: - -==== ====== =============== ================= ======================================================================================== - .. iter n_resources mean_test_score params -==== ====== =============== ================= ======================================================================================== - 0 0 125 0.983667 {'criterion': 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 5} - 1 0 125 0.983667 {'criterion': 'gini', 'max_depth': None, 'max_features': 8, 'min_samples_split': 7} - 2 0 125 0.983667 {'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 10} - 3 0 125 0.983667 {'criterion': 'log_loss', 'max_depth': None, 'max_features': 6, 'min_samples_split': 6} - ... ... ... ... ... - 15 2 500 0.951958 {'criterion': 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 10} - 16 2 500 0.947958 {'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 10} - 17 2 500 0.951958 {'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 4} - 18 3 1000 0.961009 {'criterion': 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 10} - 19 3 1000 0.955989 {'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 4} -==== ====== =============== ================= ======================================================================================== - -Each row corresponds to a given parameter combination (a candidate) and a given -iteration. The iteration is given by the ``iter`` column. The ``n_resources`` -column tells you how many resources were used. - -In the example above, the best parameter combination is ``{'criterion': -'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 10}`` -since it has reached the last iteration (3) with the highest score: -0.96. +.. dropdown:: Example of a (truncated) output dataframe: -.. rubric:: References + ==== ====== =============== ================= ======================================================================================== + .. iter n_resources mean_test_score params + ==== ====== =============== ================= ======================================================================================== + 0 0 125 0.983667 {'criterion': 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 5} + 1 0 125 0.983667 {'criterion': 'gini', 'max_depth': None, 'max_features': 8, 'min_samples_split': 7} + 2 0 125 0.983667 {'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 10} + 3 0 125 0.983667 {'criterion': 'log_loss', 'max_depth': None, 'max_features': 6, 'min_samples_split': 6} + ... ... ... ... ... + 15 2 500 0.951958 {'criterion': 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 10} + 16 2 500 0.947958 {'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 10} + 17 2 500 0.951958 {'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 4} + 18 3 1000 0.961009 {'criterion': 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 10} + 19 3 1000 0.955989 {'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 4} + ==== ====== =============== ================= ======================================================================================== + + Each row corresponds to a given parameter combination (a candidate) and a given + iteration. The iteration is given by the ``iter`` column. The ``n_resources`` + column tells you how many resources were used. + + In the example above, the best parameter combination is ``{'criterion': + 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 10}`` + since it has reached the last iteration (3) with the highest score: + 0.96. + + .. rubric:: References + + .. [1] K. Jamieson, A. Talwalkar, + `Non-stochastic Best Arm Identification and Hyperparameter + Optimization `_, in + proc. of Machine Learning Research, 2016. + + .. [2] L. Li, K. Jamieson, G. DeSalvo, A. Rostamizadeh, A. Talwalkar, + :arxiv:`Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization + <1603.06560>`, in Machine Learning Research 18, 2018. -.. [1] K. Jamieson, A. Talwalkar, - `Non-stochastic Best Arm Identification and Hyperparameter - Optimization `_, in - proc. of Machine Learning Research, 2016. -.. [2] L. Li, K. Jamieson, G. DeSalvo, A. Rostamizadeh, A. Talwalkar, - :arxiv:`Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization - <1603.06560>`, in Machine Learning Research 18, 2018. .. _grid_search_tips: @@ -606,7 +612,7 @@ parameters of composite or nested estimators such as >>> search = GridSearchCV(calibrated_forest, param_grid, cv=5) >>> search.fit(X, y) GridSearchCV(cv=5, - estimator=CalibratedClassifierCV(...), + estimator=CalibratedClassifierCV(estimator=RandomForestClassifier(n_estimators=10)), param_grid={'estimator__max_depth': [2, 4, 6, 8]}) Here, ```` is the parameter name of the nested estimator, @@ -655,12 +661,11 @@ entry for :term:`n_jobs`. Robustness to failure --------------------- -Some parameter settings may result in a failure to ``fit`` one or more folds -of the data. By default, this will cause the entire search to fail, even if -some parameter settings could be fully evaluated. Setting ``error_score=0`` -(or `=np.nan`) will make the procedure robust to such failure, issuing a -warning and setting the score for that fold to 0 (or `nan`), but completing -the search. +Some parameter settings may result in a failure to ``fit`` one or more folds of +the data. By default, the score for those settings will be `np.nan`. This can +be controlled by setting `error_score="raise"` to raise an exception if one fit +fails, or for example `error_score=0` to set another value for the score of +failing parameter combinations. .. _alternative_cv: diff --git a/doc/modules/mixture.rst b/doc/modules/mixture.rst index 1fd72c3158336..1dec761ae813d 100644 --- a/doc/modules/mixture.rst +++ b/doc/modules/mixture.rst @@ -279,7 +279,7 @@ from the two resulting mixtures. .. rubric:: Pros - :Automatic selection: when ``weight_concentration_prior`` is small enough and + :Automatic selection: When ``weight_concentration_prior`` is small enough and ``n_components`` is larger than what is found necessary by the model, the Variational Bayesian mixture model has a natural tendency to set some mixture weights values close to zero. This makes it possible to let the model choose @@ -288,26 +288,26 @@ from the two resulting mixtures. active components is very application specific and is typically ill-defined in a data exploration setting. - :Less sensitivity to the number of parameters: unlike finite models, which will + :Less sensitivity to the number of parameters: Unlike finite models, which will almost always use all components as much as they can, and hence will produce wildly different solutions for different numbers of components, the variational inference with a Dirichlet process prior (``weight_concentration_prior_type='dirichlet_process'``) won't change much with changes to the parameters, leading to more stability and less tuning. - :Regularization: due to the incorporation of prior information, + :Regularization: Due to the incorporation of prior information, variational solutions have less pathological special cases than expectation-maximization solutions. .. rubric:: Cons - :Speed: the extra parametrization necessary for variational inference makes + :Speed: The extra parametrization necessary for variational inference makes inference slower, although not by much. - :Hyperparameters: this algorithm needs an extra hyperparameter + :Hyperparameters: This algorithm needs an extra hyperparameter that might need experimental tuning via cross-validation. - :Bias: there are many implicit biases in the inference algorithms (and also in + :Bias: There are many implicit biases in the inference algorithms (and also in the Dirichlet process if used), and whenever there is a mismatch between these biases and the data it might be possible to fit better models using a finite mixture. diff --git a/doc/modules/model_evaluation.rst b/doc/modules/model_evaluation.rst index eff6684458deb..46ebd053bef1b 100644 --- a/doc/modules/model_evaluation.rst +++ b/doc/modules/model_evaluation.rst @@ -2485,6 +2485,22 @@ the small magnitude values and only reflected the error in prediction of highest magnitude value. But that problem is resolved in case of MAPE because it calculates relative percentage error with respect to actual output. +.. note:: + + The MAPE formula here represents a relative error and outputs a value in the + range [0, 1]. It is not a percentage in the range [0, 100] and a value of 100 + does not mean 100% but 1e2. The motivation for the MAPE formula here to be in + the range [0, 1] is to be consistent with other error metrics in scikit-learn + such as `accuracy_score`. + + To obtain the mean absolute percentage error as per the Wikipedia formula, + multiply the `mean_absolute_percentage_error` computed here by 100. + +.. dropdown:: References + + * `Wikipedia entry for Mean Absolute Percentage Error + `_ + .. _median_absolute_error: Median absolute error diff --git a/doc/modules/multiclass.rst b/doc/modules/multiclass.rst index b5f7611bdfd91..07d7c9d221a73 100644 --- a/doc/modules/multiclass.rst +++ b/doc/modules/multiclass.rst @@ -172,6 +172,9 @@ Valid :term:`multiclass` representations for >>> from scipy import sparse >>> y_sparse = sparse.csr_matrix(y_dense) >>> print(y_sparse) + + Coords Values (0, 0) 1 (1, 2) 1 (2, 0) 1 @@ -377,6 +380,9 @@ An example of the same ``y`` in sparse matrix form: >>> y_sparse = sparse.csr_matrix(y) >>> print(y_sparse) + + Coords Values (0, 0) 1 (0, 3) 1 (1, 2) 1 diff --git a/doc/modules/outlier_detection.rst b/doc/modules/outlier_detection.rst index 0c6891ed119bd..a8740a68d5586 100644 --- a/doc/modules/outlier_detection.rst +++ b/doc/modules/outlier_detection.rst @@ -246,6 +246,10 @@ This strategy is illustrated below. (:class:`covariance.MinCovDet`) of location and covariance to assess the degree of outlyingness of an observation. +* See :ref:`sphx_glr_auto_examples_applications_plot_outlier_detection_wine.py` + for an example of robust covariance estimation on a real data set. + + .. rubric:: References * Rousseeuw, P.J., Van Driessen, K. "A fast algorithm for the minimum diff --git a/doc/modules/svm.rst b/doc/modules/svm.rst index 47115e43a89e0..99e66e1dd69ce 100644 --- a/doc/modules/svm.rst +++ b/doc/modules/svm.rst @@ -125,7 +125,8 @@ classifiers are constructed and each one trains data from two classes. To provide a consistent interface with other classifiers, the ``decision_function_shape`` option allows to monotonically transform the results of the "one-versus-one" classifiers to a "one-vs-rest" decision -function of shape ``(n_samples, n_classes)``. +function of shape ``(n_samples, n_classes)``, which is the default setting +of the parameter (default='ovr'). >>> X = [[0], [1], [2], [3]] >>> Y = [0, 1, 2, 3] diff --git a/doc/modules/tree.rst b/doc/modules/tree.rst index 9b475d6c09f5f..5094dc4cb05bd 100644 --- a/doc/modules/tree.rst +++ b/doc/modules/tree.rst @@ -552,17 +552,18 @@ Mean Squared Error: H(Q_m) = \frac{1}{n_m} \sum_{y \in Q_m} (y - \bar{y}_m)^2 -Half Poisson deviance: +Mean Poisson deviance: .. math:: - H(Q_m) = \frac{1}{n_m} \sum_{y \in Q_m} (y \log\frac{y}{\bar{y}_m} + H(Q_m) = \frac{2}{n_m} \sum_{y \in Q_m} (y \log\frac{y}{\bar{y}_m} - y + \bar{y}_m) Setting `criterion="poisson"` might be a good choice if your target is a count or a frequency (count per some unit). In any case, :math:`y >= 0` is a necessary condition to use this criterion. Note that it fits much slower than -the MSE criterion. +the MSE criterion. For performance reasons the actual implementation minimizes +the half mean poisson deviance, i.e. the mean poisson deviance divided by 2. Mean Absolute Error: diff --git a/doc/related_projects.rst b/doc/related_projects.rst index e6d0bd83f0a16..4814cddb75ea9 100644 --- a/doc/related_projects.rst +++ b/doc/related_projects.rst @@ -19,14 +19,6 @@ Interoperability and framework enhancements These tools adapt scikit-learn for use with other technologies or otherwise enhance the functionality of scikit-learn's estimators. -**Data formats** - -- `sklearn_pandas `_ bridge for - scikit-learn pipelines and pandas data frame with dedicated transformers. - -- `sklearn_xarray `_ provides - compatibility of scikit-learn estimators with xarray data structures. - **Auto-ML** - `auto-sklearn `_ @@ -48,19 +40,16 @@ enhance the functionality of scikit-learn's estimators. transforming temporal and relational datasets into feature matrices for machine learning. -- `Neuraxle `_ - A library for building neat pipelines, providing the right abstractions to - both ease research, development, and deployment of machine learning - applications. Compatible with deep learning frameworks and scikit-learn API, - it can stream minibatches, use data checkpoints, build funky pipelines, and - serialize models with custom per-step savers. - - `EvalML `_ EvalML is an AutoML library which builds, optimizes, and evaluates machine learning pipelines using domain-specific objective functions. It incorporates multiple modeling libraries under one API, and the objects that EvalML creates use an sklearn-compatible API. +- `MLJAR AutoML `_ + Python package for AutoML on Tabular Data with Feature Engineering, + Hyper-Parameters Tuning, Explanations and Automatic Documentation. + **Experimentation and model registry frameworks** - `MLFlow `_ MLflow is an open source platform to manage the ML @@ -85,10 +74,6 @@ enhance the functionality of scikit-learn's estimators. - `dtreeviz `_ A python library for decision tree visualization and model interpretation. -- `eli5 `_ A library for - debugging/inspecting machine learning models and explaining their - predictions. - - `sklearn-evaluation `_ Machine learning model evaluation made easy: plots, tables, HTML reports, experiment tracking and Jupyter notebook analysis. Visual analysis, model @@ -98,17 +83,6 @@ enhance the functionality of scikit-learn's estimators. custom matplotlib visualizers for scikit-learn estimators to support visual feature analysis, model selection, evaluation, and diagnostics. -**Model selection** - -- `scikit-optimize `_ - A library to minimize (very) expensive and noisy black-box functions. It - implements several methods for sequential model-based optimization, and - includes a replacement for ``GridSearchCV`` or ``RandomizedSearchCV`` to do - cross-validated parameter search using any of these strategies. - -- `sklearn-deap `_ Use evolutionary - algorithms instead of gridsearch in scikit-learn. - **Model export for production** - `sklearn-onnx `_ Serialization of many @@ -124,22 +98,10 @@ enhance the functionality of scikit-learn's estimators. into PMML with the help of `JPMML-SkLearn `_ library. -- `sklearn-porter `_ - Transpile trained scikit-learn models to C, Java, Javascript and others. - -- `m2cgen `_ - A lightweight library which allows to transpile trained machine learning - models including many scikit-learn estimators into a native code of C, Java, - Go, R, PHP, Dart, Haskell, Rust and many other programming languages. - - `treelite `_ Compiles tree-based ensemble models into C code for minimizing prediction latency. -- `micromlgen `_ - MicroML brings Machine Learning algorithms to microcontrollers. - Supports several scikit-learn classifiers by transpiling them to C code. - - `emlearn `_ Implements scikit-learn estimators in C99 for embedded devices and microcontrollers. Supports several classifier, regression and outlier detection models. @@ -202,18 +164,9 @@ Note scikit-learn own modern gradient boosting estimators - `HMMLearn `_ Implementation of hidden markov models that was previously part of scikit-learn. -- `PyStruct `_ General conditional random fields - and structured prediction. - - `pomegranate `_ Probabilistic modelling for Python, with an emphasis on hidden Markov models. -- `sklearn-crfsuite `_ - Linear-chain conditional random fields - (`CRFsuite `_ wrapper with - sklearn-like API). - - **Deep neural networks etc.** - `skorch `_ A scikit-learn compatible @@ -246,13 +199,6 @@ Note scikit-learn own modern gradient boosting estimators **Other regression and classification** -- `ML-Ensemble `_ Generalized - ensemble learning (stacking, blending, subsemble, deep ensembles, - etc.). - -- `lightning `_ Fast - state-of-the-art linear model solvers (SDCA, AdaGrad, SVRG, SAG, etc...). - - `py-earth `_ Multivariate adaptive regression splines @@ -262,12 +208,6 @@ Note scikit-learn own modern gradient boosting estimators - `scikit-multilearn `_ Multi-label classification with focus on label space manipulation. -- `seglearn `_ Time series and sequence - learning using sliding window segmentation. - -- `fastFM `_ Fast factorization machine - implementation compatible with scikit-learn - **Decomposition and clustering** - `lda `_: Fast implementation of latent @@ -286,10 +226,6 @@ Note scikit-learn own modern gradient boosting estimators Linkage clustering algorithms for robust variable density clustering. As of scikit-learn version 1.3.0, there is :class:`~sklearn.cluster.HDBSCAN`. -- `spherecluster `_ Spherical - K-means and mixture of von Mises Fisher clustering routines for data on the - unit hypersphere. - **Pre-processing** - `categorical-encoding @@ -349,9 +285,6 @@ Recommendation Engine packages - `lightfm `_ A Python/Cython implementation of a hybrid recommender system. -- `OpenRec `_ TensorFlow-based - neural-network inspired recommendation algorithms. - - `Surprise Lib `_ Library for explicit feedback datasets. diff --git a/doc/scss/custom.scss b/doc/scss/custom.scss index ce4451fce4467..5256a6c83befb 100644 --- a/doc/scss/custom.scss +++ b/doc/scss/custom.scss @@ -86,32 +86,74 @@ code.literal { /* Dropdowns (sphinx-design) */ details.sd-dropdown { - &:hover > summary.sd-summary-title > a.headerlink { - visibility: visible; + &:hover > summary.sd-summary-title { + > .sd-summary-text > a.headerlink { + visibility: visible; + } + + > .sk-toggle-all { + opacity: 1; + } } > summary.sd-summary-title { - > a.headerlink { + > .sd-summary-text > a.headerlink { font-size: 1rem; } // See `js/scripts/dropdown.js`: this is styling the "expand/collapse all" button - > button.sk-toggle-all { + > .sk-toggle-all { color: var(--pst-sd-dropdown-color); - top: 0.9rem !important; - right: 3rem !important; + margin-right: 0.5rem; pointer-events: auto !important; - display: none; - border: none; - background: transparent; + opacity: 0; + } + } +} + +/* Tabs (sphinx-design) */ + +.sd-tab-set { + --tab-caption-width: 0%; // No tab caption by default + margin-top: 1.5rem; + + &::before { + // Set `content` for tab caption + width: var(--tab-caption-width); + display: flex; + align-items: center; + font-weight: bold; + } + + .sd-tab-content { + padding: 0.5rem 0 0 0 !important; + background-color: transparent !important; + border: none !important; + + > p:first-child { + margin-top: 1rem !important; + } + } + + > label.sd-tab-label { + margin: 0 3px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 5px !important; + + &.tab-6 { + width: calc((100% - var(--tab-caption-width)) / 2 - 6px) !important; + } + + &.tab-4 { + width: calc((100% - var(--tab-caption-width)) / 3 - 6px) !important; } } - &[open] > summary.sd-summary-title:hover > .sd-summary-up.sk-toggle-all, - &:not([open]) - > summary.sd-summary-title:hover - > .sd-summary-down.sk-toggle-all { - display: block; + > input:checked + label.sd-tab-label { + transform: unset; + border: 2px solid var(--pst-color-primary); } } diff --git a/doc/scss/install.scss b/doc/scss/install.scss deleted file mode 100644 index 92e201f00a107..0000000000000 --- a/doc/scss/install.scss +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Styling for the installation page, including overriding some default styling of - * sphinx-design. This style sheet should be included only for the install page. - * - * This file is compiled into styles/install.css by sphinxcontrib.sass, see: - * https://sass-lang.com/guide/ - */ - -.install-instructions .sd-tab-set > label.sd-tab-label { - margin: 0; - text-align: center; - - &.tab-6 { - width: 50% !important; - } - - &.tab-4 { - width: calc(100% / 3) !important; - } -} diff --git a/doc/sphinxext/dropdown_anchors.py b/doc/sphinxext/dropdown_anchors.py index eb0b414de6ae8..a001dfa11d403 100644 --- a/doc/sphinxext/dropdown_anchors.py +++ b/doc/sphinxext/dropdown_anchors.py @@ -2,7 +2,7 @@ from docutils import nodes from sphinx.transforms.post_transforms import SphinxPostTransform -from sphinx_design.dropdown import dropdown_main, dropdown_title +from sphinx_design.dropdown import dropdown_main class DropdownAnchorAdder(SphinxPostTransform): @@ -12,26 +12,8 @@ class DropdownAnchorAdder(SphinxPostTransform): need to make sure that the old anchors still work. See the original implementation (in JS): https://github.com/scikit-learn/scikit-learn/pull/27409 - The structure of each sphinx-design dropdown node is expected to be: - - - - ...icon <-- This exists if the "icon" option of the sphinx-design - dropdown is set; we do not use it in our documentation - - ...title <-- This may contain multiple nodes, e.g. literal nodes if - there are inline codes; we use the concatenated text of - all these nodes to generate the anchor ID - - Here we insert the anchor link! - - <-- The "dropdown closed" marker - <-- The "dropdown open" marker - - - ...main contents - - + The anchor links are inserted at the end of the node with class "sd-summary-text" + which includes only the title text part of the dropdown (no icon, markers, etc). """ default_priority = 9999 # Apply later than everything else @@ -44,15 +26,13 @@ def run(self): anchor_id_counters = {} for sd_dropdown in self.document.findall(dropdown_main): - # Grab the dropdown title - sd_dropdown_title = sd_dropdown.next_node(dropdown_title) + # Grab the summary text node + sd_summary_text = sd_dropdown.next_node( + lambda node: "sd-summary-text" in node.get("classes", []) + ) # Concatenate the text of relevant nodes as the title text - # Since we do not have the prefix icon, the relevant nodes are the very - # first child node until the third last node (last two are markers) - title_text = "".join( - node.astext() for node in sd_dropdown_title.children[:-2] - ) + title_text = "".join(node.astext() for node in sd_summary_text.children) # The ID uses the first line, lowercased, with spaces replaced by dashes; # suffix the anchor ID with a counter if it already exists @@ -71,7 +51,7 @@ def run(self): 'title="Link to this dropdown">#' ) anchor_node = nodes.raw("", anchor_html, format="html") - sd_dropdown_title.insert(-2, anchor_node) # before the two markers + sd_summary_text.append(anchor_node) def setup(app): diff --git a/doc/templates/index.html b/doc/templates/index.html index a440a69354d0a..2893718365e2e 100644 --- a/doc/templates/index.html +++ b/doc/templates/index.html @@ -207,6 +207,7 @@

News

  • On-going development: scikit-learn 1.6 (Changelog).
  • +
  • September 2024. scikit-learn 1.5.2 is available for download (Changelog).
  • July 2024. scikit-learn 1.5.1 is available for download (Changelog).
  • May 2024. scikit-learn 1.5.0 is available for download (Changelog).
  • April 2024. scikit-learn 1.4.2 is available for download (Changelog).
  • @@ -298,9 +299,10 @@

    Who uses scikit-learn?

    - + + diff --git a/doc/tutorial/machine_learning_map/README.md b/doc/tutorial/machine_learning_map/README.md new file mode 100644 index 0000000000000..006b1e5e1a38c --- /dev/null +++ b/doc/tutorial/machine_learning_map/README.md @@ -0,0 +1,17 @@ +The scikit-learn machine learning cheat sheet was originally created by Andreas Mueller: +https://peekaboo-vision.blogspot.de/2013/01/machine-learning-cheat-sheet-for-scikit.html + +The current version of the chart is located at `doc/images/ml_map.svg` in SVG+XML +format, created using [draw.io](https://draw.io/). To edit the chart, open the file in +draw.io, make changes, and export as SVG with the same filename. Export configurations +are: + +- Zoom: 100% +- Border width: 15 +- Size: Diagram +- Transparent Background: False +- Appearance: Light + +Each node in the chart that contains an estimator should have a link, where the root +directory is at `../../`. Note that after exporting the SVG, the links may be prefixed +with e.g. `https://app.diagrams.net/`. Remember to check and remove them. diff --git a/doc/whats_new/v1.4.rst b/doc/whats_new/v1.4.rst index 7865ff38adb79..96715e49277b3 100644 --- a/doc/whats_new/v1.4.rst +++ b/doc/whats_new/v1.4.rst @@ -29,6 +29,15 @@ Version 1.4.1 **February 2024** +Changed models +-------------- + +- |API| The `tree_.value` attribute in :class:`tree.DecisionTreeClassifier`, + :class:`tree.DecisionTreeRegressor`, :class:`tree.ExtraTreeClassifier` and + :class:`tree.ExtraTreeRegressor` changed from an weighted absolute count + of number of samples to a weighted fraction of the total number of samples. + :pr:`27639` by :user:`Samuel Ronsin `. + Metadata Routing ---------------- diff --git a/doc/whats_new/v1.5.rst b/doc/whats_new/v1.5.rst index 20184bbd2a551..bcea1edf6bb83 100644 --- a/doc/whats_new/v1.5.rst +++ b/doc/whats_new/v1.5.rst @@ -13,6 +13,61 @@ For a short description of the main highlights of the release, please refer to .. include:: changelog_legend.inc +.. _changes_1_5_2: + +Version 1.5.2 +============= + +**September 2024** + +Changes impacting many modules +------------------------------ + +- |Fix| Fixed performance regression in a few Cython modules in + `sklearn._loss`, `sklearn.manifold`, `sklearn.metrics` and `sklearn.utils`, + which were built without OpenMP support. + :pr:`29694` by :user:`Loïc Estèvce `. + +Changelog +--------- + +:mod:`sklearn.calibration` +.......................... + +- |Fix| Raise error when :class:`~sklearn.model_selection.LeaveOneOut` used in + `cv`, matching what would happen if `KFold(n_splits=n_samples)` was used. + :pr:`29545` by :user:`Lucy Liu ` + +:mod:`sklearn.compose` +...................... + +- |Fix| Fixed :class:`compose.TransformedTargetRegressor` not to raise `UserWarning` if + transform output is set to `pandas` or `polars`, since it isn't a transformer. + :pr:`29401` by :user:`Stefanie Senger `. + +:mod:`sklearn.decomposition` +............................ + +- |Fix| Increase rank defficiency threshold in the whitening step of + :class:`decomposition.FastICA` with `whiten_solver="eigh"` to improve the + platform-agnosticity of the estimator. + :pr:`29612` by :user:`Olivier Grisel `. + +:mod:`sklearn.metrics` +...................... + +- |Fix| Fix a regression in :func:`metrics.accuracy_score` and in + :func:`metrics.zero_one_loss` causing an error for Array API dispatch with multilabel + inputs. + :pr:`29336` by :user:`Edoardo Abati `. + +:mod:`sklearn.svm` +.................. + +- |Fix| Fixed a regression in :class:`svm.SVC` and :class:`svm.SVR` such that we accept + `C=float("inf")`. + :pr:`29780` by :user:`Guillaume Lemaitre `. + .. _changes_1_5_1: Version 1.5.1 @@ -48,11 +103,10 @@ Changelog instead of implicitly converting those inputs as regular NumPy arrays. :pr:`29119` by :user:`Olivier Grisel`. -- |Fix| Fix a regression in :func:`metrics.accuracy_score` and in +- |Fix| Fix a regression in :func:`metrics.zero_one_loss` causing an error for Array API dispatch with multilabel inputs. - :pr:`29269` by :user:`Yaroslav Korobko ` and - :pr:`29336` by :user:`Edoardo Abati `. + :pr:`29269` by :user:`Yaroslav Korobko `. :mod:`sklearn.model_selection` .............................. @@ -622,29 +676,38 @@ Changelog Thanks to everyone who has contributed to the maintenance and improvement of the project since version 1.4, including: -101AlexMartin, Abdulaziz Aloqeely, Adam J. Stewart, Adam Li, Adarsh Wase, Adrin -Jalali, Advik Sinha, Akash Srivastava, Akihiro Kuno, Alan Guedes, Alexis -IMBERT, Ana Paula Gomes, Anderson Nelson, Andrei Dzis, Arnaud Capitaine, Arturo -Amor, Aswathavicky, Bharat Raghunathan, Brendan Lu, Bruno, Cemlyn, Christian -Lorentzen, Christian Veenhuis, Cindy Liang, Claudio Salvatore Arcidiacono, -Connor Boyle, Conrad Stevens, crispinlogan, davidleon123, DerWeh, Dipan Banik, -Duarte São José, DUONG, Eddie Bergman, Edoardo Abati, Egehan Gunduz, Emad -Izadifar, Erich Schubert, Filip Karlo Došilović, Franck Charras, Gael -Varoquaux, Gönül Aycı, Guillaume Lemaitre, Gyeongjae Choi, Harmanan Kohli, -Hong Xiang Yue, Ian Faust, itsaphel, Ivan Wiryadi, Jack Bowyer, Javier Marin -Tur, Jérémie du Boisberranger, Jérôme Dockès, Jiawei Zhang, Joel Nothman, -Johanna Bayer, John Cant, John Hopfensperger, jpcars, jpienaar-tuks, Julian -Libiseller-Egger, Julien Jerphanion, KanchiMoe, Kaushik Amar Das, keyber, -Koustav Ghosh, kraktus, Krsto Proroković, ldwy4, LeoGrin, lihaitao, Linus -Sommer, Loic Esteve, Lucy Liu, Lukas Geiger, manasimj, Manuel Labbé, Manuel -Morales, Marco Edward Gorelli, Maren Westermann, Marija Vlajic, Mark Elliot, -Mateusz Sokół, Mavs, Michael Higgins, Michael Mayer, miguelcsilva, Miki -Watanabe, Mohammed Hamdy, myenugula, Nathan Goldbaum, Naziya Mahimkar, Neto, -Olivier Grisel, Omar Salman, Patrick Wang, Pierre de Fréminville, Priyash -Shah, Puneeth K, Rahil Parikh, raisadz, Raj Pulapakura, Ralf Gommers, Ralph -Urlus, Randolf Scholz, Reshama Shaikh, Richard Barnes, Rodrigo Romero, Saad -Mahmood, Salim Dohri, Sandip Dutta, SarahRemus, scikit-learn-bot, Shaharyar -Choudhry, Shubham, sperret6, Stefanie Senger, Suha Siddiqui, Thanh Lam DANG, -thebabush, Thomas J. Fan, Thomas Lazarus, Thomas Li, Tialo, Tim Head, Tuhin -Sharma, VarunChaduvula, Vineet Joshi, virchan, Waël Boukhobza, Weyb, Will -Dean, Xavier Beltran, Xiao Yuan, Xuefeng Xu, Yao Xiao +101AlexMartin, Abdulaziz Aloqeely, Adam J. Stewart, Adam Li, Adarsh Wase, +Adeyemi Biola, Aditi Juneja, Adrin Jalali, Advik Sinha, Aisha, Akash +Srivastava, Akihiro Kuno, Alan Guedes, Alberto Torres, Alexis IMBERT, alexqiao, +Ana Paula Gomes, Anderson Nelson, Andrei Dzis, Arif Qodari, Arnaud Capitaine, +Arturo Amor, Aswathavicky, Audrey Flanders, awwwyan, baggiponte, Bharat +Raghunathan, bme-git, brdav, Brendan Lu, Brigitta Sipőcz, Bruno, Cailean +Carter, Cemlyn, Christian Lorentzen, Christian Veenhuis, Cindy Liang, Claudio +Salvatore Arcidiacono, Connor Boyle, Conrad Stevens, crispinlogan, David +Matthew Cherney, Davide Chicco, davidleon123, dependabot[bot], DerWeh, dinga92, +Dipan Banik, Drew Craeton, Duarte São José, DUONG, Eddie Bergman, Edoardo +Abati, Egehan Gunduz, Emad Izadifar, EmilyXinyi, Erich Schubert, Evelyn, Filip +Karlo Došilović, Franck Charras, Gael Varoquaux, Gönül Aycı, Guillaume +Lemaitre, Gyeongjae Choi, Harmanan Kohli, Hong Xiang Yue, Ian Faust, Ilya +Komarov, itsaphel, Ivan Wiryadi, Jack Bowyer, Javier Marin Tur, Jérémie du +Boisberranger, Jérôme Dockès, Jiawei Zhang, João Morais, Joe Cainey, Joel +Nothman, Johanna Bayer, John Cant, John Enblom, John Hopfensperger, jpcars, +jpienaar-tuks, Julian Chan, Julian Libiseller-Egger, Julien Jerphanion, +KanchiMoe, Kaushik Amar Das, keyber, Koustav Ghosh, kraktus, Krsto Proroković, +Lars, ldwy4, LeoGrin, lihaitao, Linus Sommer, Loic Esteve, Lucy Liu, Lukas +Geiger, m-maggi, manasimj, Manuel Labbé, Manuel Morales, Marco Edward Gorelli, +Marco Wolsza, Maren Westermann, Marija Vlajic, Mark Elliot, Martin Helm, +Mateusz Sokół, mathurinm, Mavs, Michael Dawson, Michael Higgins, Michael Mayer, +miguelcsilva, Miki Watanabe, Mohammed Hamdy, myenugula, Nathan Goldbaum, Naziya +Mahimkar, nbrown-ScottLogic, Neto, Nithish Bolleddula, notPlancha, Olivier +Grisel, Omar Salman, ParsifalXu, Patrick Wang, Pierre de Fréminville, Piotr, +Priyank Shroff, Priyansh Gupta, Priyash Shah, Puneeth K, Rahil Parikh, raisadz, +Raj Pulapakura, Ralf Gommers, Ralph Urlus, Randolf Scholz, renaissance0ne, +Reshama Shaikh, Richard Barnes, Robert Pollak, Roberto Rosati, Rodrigo Romero, +rwelsch427, Saad Mahmood, Salim Dohri, Sandip Dutta, SarahRemus, +scikit-learn-bot, Shaharyar Choudhry, Shubham, sperret6, Stefanie Senger, +Steffen Schneider, Suha Siddiqui, Thanh Lam DANG, thebabush, Thomas, Thomas J. +Fan, Thomas Lazarus, Tialo, Tim Head, Tuhin Sharma, Tushar Parimi, +VarunChaduvula, Vineet Joshi, virchan, Waël Boukhobza, Weyb, Will Dean, Xavier +Beltran, Xiao Yuan, Xuefeng Xu, Yao Xiao, yareyaredesuyo, Ziad Amerr, Štěpán +Sršeň diff --git a/examples/applications/plot_species_distribution_modeling.py b/examples/applications/plot_species_distribution_modeling.py index bdf50918840c2..612123c149897 100644 --- a/examples/applications/plot_species_distribution_modeling.py +++ b/examples/applications/plot_species_distribution_modeling.py @@ -17,13 +17,13 @@ The two species are: - - `"Bradypus variegatus" - `_ , - the Brown-throated Sloth. + - `Bradypus variegatus + `_, + the brown-throated sloth. - - `"Microryzomys minutus" - `_ , - also known as the Forest Small Rice Rat, a rodent that lives in Peru, + - `Microryzomys minutus + `_, + also known as the forest small rice rat, a rodent that lives in Peru, Colombia, Ecuador, Peru, and Venezuela. References diff --git a/examples/decomposition/plot_ica_vs_pca.py b/examples/decomposition/plot_ica_vs_pca.py index 07f6327e9922f..18010e5358971 100644 --- a/examples/decomposition/plot_ica_vs_pca.py +++ b/examples/decomposition/plot_ica_vs_pca.py @@ -67,8 +67,7 @@ def plot_samples(S, axis_list=None): ) if axis_list is not None: for axis, color, label in axis_list: - axis /= axis.std() - x_axis, y_axis = axis + x_axis, y_axis = axis / axis.std() plt.quiver( (0, 0), (0, 0), @@ -81,10 +80,11 @@ def plot_samples(S, axis_list=None): label=label, ) - plt.hlines(0, -3, 3) - plt.vlines(0, -3, 3) - plt.xlim(-3, 3) + plt.hlines(0, -5, 5, color="black", linewidth=0.5) + plt.vlines(0, -3, 3, color="black", linewidth=0.5) + plt.xlim(-5, 5) plt.ylim(-3, 3) + plt.gca().set_aspect("equal") plt.xlabel("x") plt.ylabel("y") @@ -97,13 +97,13 @@ def plot_samples(S, axis_list=None): axis_list = [(pca.components_.T, "orange", "PCA"), (ica.mixing_, "red", "ICA")] plt.subplot(2, 2, 2) plot_samples(X / np.std(X), axis_list=axis_list) -legend = plt.legend(loc="lower right") +legend = plt.legend(loc="upper left") legend.set_zorder(100) plt.title("Observations") plt.subplot(2, 2, 3) -plot_samples(S_pca_ / np.std(S_pca_, axis=0)) +plot_samples(S_pca_ / np.std(S_pca_)) plt.title("PCA recovered signals") plt.subplot(2, 2, 4) diff --git a/examples/ensemble/plot_gradient_boosting_regression.py b/examples/ensemble/plot_gradient_boosting_regression.py index 76437680708be..dca13dc811247 100644 --- a/examples/ensemble/plot_gradient_boosting_regression.py +++ b/examples/ensemble/plot_gradient_boosting_regression.py @@ -24,6 +24,7 @@ # # License: BSD 3 clause +import matplotlib import matplotlib.pyplot as plt import numpy as np @@ -31,6 +32,7 @@ from sklearn.inspection import permutation_importance from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split +from sklearn.utils.fixes import parse_version # %% # Load the data @@ -148,11 +150,20 @@ ) sorted_idx = result.importances_mean.argsort() plt.subplot(1, 2, 2) -plt.boxplot( - result.importances[sorted_idx].T, - vert=False, - labels=np.array(diabetes.feature_names)[sorted_idx], + +# `labels` argument in boxplot is deprecated in matplotlib 3.9 and has been +# renamed to `tick_labels`. The following code handles this, but as a +# scikit-learn user you probably can write simpler code by using `labels=...` +# (matplotlib < 3.9) or `tick_labels=...` (matplotlib >= 3.9). +tick_labels_parameter_name = ( + "tick_labels" + if parse_version(matplotlib.__version__) >= parse_version("3.9") + else "labels" ) +tick_labels_dict = { + tick_labels_parameter_name: np.array(diabetes.feature_names)[sorted_idx] +} +plt.boxplot(result.importances[sorted_idx].T, vert=False, **tick_labels_dict) plt.title("Permutation Importance (test set)") fig.tight_layout() plt.show() diff --git a/examples/gaussian_process/plot_gpr_noisy.py b/examples/gaussian_process/plot_gpr_noisy.py index 31d3b149aa47f..f61c594634b41 100644 --- a/examples/gaussian_process/plot_gpr_noisy.py +++ b/examples/gaussian_process/plot_gpr_noisy.py @@ -34,7 +34,7 @@ def target_generator(X, add_noise=False): # %% # Let's have a look to the target generator where we will not add any noise to # observe the signal that we would like to predict. -X = np.linspace(0, 5, num=30).reshape(-1, 1) +X = np.linspace(0, 5, num=80).reshape(-1, 1) y = target_generator(X, add_noise=False) # %% @@ -89,7 +89,7 @@ def target_generator(X, add_noise=False): from sklearn.gaussian_process.kernels import RBF, WhiteKernel kernel = 1.0 * RBF(length_scale=1e1, length_scale_bounds=(1e-2, 1e3)) + WhiteKernel( - noise_level=1, noise_level_bounds=(1e-5, 1e1) + noise_level=1, noise_level_bounds=(1e-10, 1e1) ) gpr = GaussianProcessRegressor(kernel=kernel, alpha=0.0) gpr.fit(X_train, y_train) @@ -98,7 +98,7 @@ def target_generator(X, add_noise=False): # %% plt.plot(X, y, label="Expected signal") plt.scatter(x=X_train[:, 0], y=y_train, color="black", alpha=0.4, label="Observations") -plt.errorbar(X, y_mean, y_std) +plt.errorbar(X, y_mean, y_std, label="Posterior mean ± std") plt.legend() plt.xlabel("X") plt.ylabel("y") @@ -110,15 +110,18 @@ def target_generator(X, add_noise=False): fontsize=8, ) # %% -# We see that the optimum kernel found still have a high noise level and -# an even larger length scale. Furthermore, we observe that the -# model does not provide faithful predictions. +# We see that the optimum kernel found still has a high noise level and an even +# larger length scale. The length scale reaches the maximum bound that we +# allowed for this parameter and we got a warning as a result. # -# Now, we will initialize the -# :class:`~sklearn.gaussian_process.kernels.RBF` with a -# larger `length_scale` and the -# :class:`~sklearn.gaussian_process.kernels.WhiteKernel` -# with a smaller noise level lower bound. +# More importantly, we observe that the model does not provide useful +# predictions: the mean prediction seems to be constant: it does not follow the +# expected noise-free signal. +# +# Now, we will initialize the :class:`~sklearn.gaussian_process.kernels.RBF` +# with a larger `length_scale` initial value and the +# :class:`~sklearn.gaussian_process.kernels.WhiteKernel` with a smaller initial +# noise level lower while keeping the parameter bounds unchanged. kernel = 1.0 * RBF(length_scale=1e-1, length_scale_bounds=(1e-2, 1e3)) + WhiteKernel( noise_level=1e-2, noise_level_bounds=(1e-10, 1e1) ) @@ -129,7 +132,7 @@ def target_generator(X, add_noise=False): # %% plt.plot(X, y, label="Expected signal") plt.scatter(x=X_train[:, 0], y=y_train, color="black", alpha=0.4, label="Observations") -plt.errorbar(X, y_mean, y_std) +plt.errorbar(X, y_mean, y_std, label="Posterior mean ± std") plt.legend() plt.xlabel("X") plt.ylabel("y") @@ -154,21 +157,19 @@ def target_generator(X, add_noise=False): # for different hyperparameters to get a sense of the local minima. from matplotlib.colors import LogNorm -length_scale = np.logspace(-2, 4, num=50) -noise_level = np.logspace(-2, 1, num=50) +length_scale = np.logspace(-2, 4, num=80) +noise_level = np.logspace(-2, 1, num=80) length_scale_grid, noise_level_grid = np.meshgrid(length_scale, noise_level) log_marginal_likelihood = [ gpr.log_marginal_likelihood(theta=np.log([0.36, scale, noise])) for scale, noise in zip(length_scale_grid.ravel(), noise_level_grid.ravel()) ] -log_marginal_likelihood = np.reshape( - log_marginal_likelihood, newshape=noise_level_grid.shape -) +log_marginal_likelihood = np.reshape(log_marginal_likelihood, noise_level_grid.shape) # %% vmin, vmax = (-log_marginal_likelihood).min(), 50 -level = np.around(np.logspace(np.log10(vmin), np.log10(vmax), num=50), decimals=1) +level = np.around(np.logspace(np.log10(vmin), np.log10(vmax), num=20), decimals=1) plt.contour( length_scale_grid, noise_level_grid, @@ -185,8 +186,43 @@ def target_generator(X, add_noise=False): plt.show() # %% -# We see that there are two local minima that correspond to the combination -# of hyperparameters previously found. Depending on the initial values for the -# hyperparameters, the gradient-based optimization might converge whether or -# not to the best model. It is thus important to repeat the optimization -# several times for different initializations. +# +# We see that there are two local minima that correspond to the combination of +# hyperparameters previously found. Depending on the initial values for the +# hyperparameters, the gradient-based optimization might or might not +# converge to the best model. It is thus important to repeat the optimization +# several times for different initializations. This can be done by setting the +# `n_restarts_optimizer` parameter of the +# :class:`~sklearn.gaussian_process.GaussianProcessRegressor` class. +# +# Let's try again to fit our model with the bad initial values but this time +# with 10 random restarts. + +kernel = 1.0 * RBF(length_scale=1e1, length_scale_bounds=(1e-2, 1e3)) + WhiteKernel( + noise_level=1, noise_level_bounds=(1e-10, 1e1) +) +gpr = GaussianProcessRegressor( + kernel=kernel, alpha=0.0, n_restarts_optimizer=10, random_state=0 +) +gpr.fit(X_train, y_train) +y_mean, y_std = gpr.predict(X, return_std=True) + +# %% +plt.plot(X, y, label="Expected signal") +plt.scatter(x=X_train[:, 0], y=y_train, color="black", alpha=0.4, label="Observations") +plt.errorbar(X, y_mean, y_std, label="Posterior mean ± std") +plt.legend() +plt.xlabel("X") +plt.ylabel("y") +_ = plt.title( + ( + f"Initial: {kernel}\nOptimum: {gpr.kernel_}\nLog-Marginal-Likelihood: " + f"{gpr.log_marginal_likelihood(gpr.kernel_.theta)}" + ), + fontsize=8, +) + +# %% +# +# As we hoped, random restarts allow the optimization to find the best set +# of hyperparameters despite the bad initial values. diff --git a/examples/gaussian_process/plot_gpr_prior_posterior.py b/examples/gaussian_process/plot_gpr_prior_posterior.py index f889eba202748..44e6984437d13 100644 --- a/examples/gaussian_process/plot_gpr_prior_posterior.py +++ b/examples/gaussian_process/plot_gpr_prior_posterior.py @@ -127,8 +127,8 @@ def plot_gpr_samples(gpr_model, n_samples, ax): ) # %% -# Rational Quadradtic kernel -# .......................... +# Rational Quadratic kernel +# ......................... from sklearn.gaussian_process.kernels import RationalQuadratic kernel = 1.0 * RationalQuadratic(length_scale=1.0, alpha=0.1, alpha_bounds=(1e-5, 1e15)) @@ -201,7 +201,7 @@ def plot_gpr_samples(gpr_model, n_samples, ax): kernel = ConstantKernel(0.1, (0.01, 10.0)) * ( DotProduct(sigma_0=1.0, sigma_0_bounds=(0.1, 10.0)) ** 2 ) -gpr = GaussianProcessRegressor(kernel=kernel, random_state=0) +gpr = GaussianProcessRegressor(kernel=kernel, random_state=0, normalize_y=True) fig, axs = plt.subplots(nrows=2, sharex=True, sharey=True, figsize=(10, 8)) diff --git a/examples/inspection/plot_permutation_importance_multicollinear.py b/examples/inspection/plot_permutation_importance_multicollinear.py index a8fe52b1565d9..d9faca695e24d 100644 --- a/examples/inspection/plot_permutation_importance_multicollinear.py +++ b/examples/inspection/plot_permutation_importance_multicollinear.py @@ -26,18 +26,27 @@ # ------------------------------------------------------ # # First, we define a function to ease the plotting: +import matplotlib + from sklearn.inspection import permutation_importance +from sklearn.utils.fixes import parse_version def plot_permutation_importance(clf, X, y, ax): result = permutation_importance(clf, X, y, n_repeats=10, random_state=42, n_jobs=2) perm_sorted_idx = result.importances_mean.argsort() - ax.boxplot( - result.importances[perm_sorted_idx].T, - vert=False, - labels=X.columns[perm_sorted_idx], + # `labels` argument in boxplot is deprecated in matplotlib 3.9 and has been + # renamed to `tick_labels`. The following code handles this, but as a + # scikit-learn user you probably can write simpler code by using `labels=...` + # (matplotlib < 3.9) or `tick_labels=...` (matplotlib >= 3.9). + tick_labels_parameter_name = ( + "tick_labels" + if parse_version(matplotlib.__version__) >= parse_version("3.9") + else "labels" ) + tick_labels_dict = {tick_labels_parameter_name: X.columns[perm_sorted_idx]} + ax.boxplot(result.importances[perm_sorted_idx].T, vert=False, **tick_labels_dict) ax.axvline(x=0, color="k", linestyle="--") return ax @@ -66,7 +75,6 @@ def plot_permutation_importance(clf, X, y, ax): mdi_importances = pd.Series(clf.feature_importances_, index=X_train.columns) tree_importance_sorted_idx = np.argsort(clf.feature_importances_) -tree_indices = np.arange(0, len(clf.feature_importances_)) + 0.5 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 8)) mdi_importances.sort_values().plot.barh(ax=ax1) diff --git a/examples/linear_model/plot_tweedie_regression_insurance_claims.py b/examples/linear_model/plot_tweedie_regression_insurance_claims.py index 31a91fb37c766..b18702bdef2b6 100644 --- a/examples/linear_model/plot_tweedie_regression_insurance_claims.py +++ b/examples/linear_model/plot_tweedie_regression_insurance_claims.py @@ -79,7 +79,7 @@ def load_mtpl2(n_samples=None): df["ClaimAmount"] = df["ClaimAmount"].fillna(0) # unquote string fields - for column_name in df.columns[df.dtypes.values == object]: + for column_name in df.columns[[t is object for t in df.dtypes.values]]: df[column_name] = df[column_name].str.strip("'") return df.iloc[:n_samples] diff --git a/examples/model_selection/plot_precision_recall.py b/examples/model_selection/plot_precision_recall.py index 19a93c7324cbb..6934f0f49ddde 100644 --- a/examples/model_selection/plot_precision_recall.py +++ b/examples/model_selection/plot_precision_recall.py @@ -7,44 +7,42 @@ Precision-Recall is a useful measure of success of prediction when the classes are very imbalanced. In information retrieval, precision is a -measure of result relevancy, while recall is a measure of how many truly -relevant results are returned. - -The precision-recall curve shows the tradeoff between precision and -recall for different threshold. A high area under the curve represents -both high recall and high precision, where high precision relates to a -low false positive rate, and high recall relates to a low false negative -rate. High scores for both show that the classifier is returning accurate -results (high precision), as well as returning a majority of all positive -results (high recall). - -A system with high recall but low precision returns many results, but most of -its predicted labels are incorrect when compared to the training labels. A -system with high precision but low recall is just the opposite, returning very -few results, but most of its predicted labels are correct when compared to the -training labels. An ideal system with high precision and high recall will -return many results, with all results labeled correctly. +measure of the fraction of relevant items among actually returned items while recall +is a measure of the fraction of items that were returned among all items that should +have been returned. 'Relevancy' here refers to items that are +postively labeled, i.e., true positives and false negatives. Precision (:math:`P`) is defined as the number of true positives (:math:`T_p`) over the number of true positives plus the number of false positives (:math:`F_p`). -:math:`P = \\frac{T_p}{T_p+F_p}` +.. math:: + P = \\frac{T_p}{T_p+F_p} Recall (:math:`R`) is defined as the number of true positives (:math:`T_p`) over the number of true positives plus the number of false negatives (:math:`F_n`). -:math:`R = \\frac{T_p}{T_p + F_n}` +.. math:: + R = \\frac{T_p}{T_p + F_n} -These quantities are also related to the :math:`F_1` score, which is the -harmonic mean of precision and recall. Thus, we can compute the :math:`F_1` -using the following formula: +The precision-recall curve shows the tradeoff between precision and +recall for different thresholds. A high area under the curve represents +both high recall and high precision. High precision is achieved by having +few false positives in the returned results, and high recall is achieved by +having few false negatives in the relevant results. +High scores for both show that the classifier is returning +accurate results (high precision), as well as returning a majority of all relevant +results (high recall). -:math:`F_1 = \\frac{2T_p}{2T_p + F_p + F_n}` +A system with high recall but low precision returns most of the relevant items, but +the proportion of returned results that are incorrectly labeled is high. A +system with high precision but low recall is just the opposite, returning very +few of the relevant items, but most of its predicted labels are correct when compared +to the actual labels. An ideal system with high precision and high recall will +return most of the relevant items, with most results labeled correctly. -Note that the precision may not decrease with recall. The -definition of precision (:math:`\\frac{T_p}{T_p + F_p}`) shows that lowering +The definition of precision (:math:`\\frac{T_p}{T_p + F_p}`) shows that lowering the threshold of a classifier may increase the denominator, by increasing the number of results returned. If the threshold was previously set too high, the new results may all be true positives, which will increase precision. If the @@ -52,10 +50,12 @@ will introduce false positives, decreasing precision. Recall is defined as :math:`\\frac{T_p}{T_p+F_n}`, where :math:`T_p+F_n` does -not depend on the classifier threshold. This means that lowering the classifier +not depend on the classifier threshold. Changing the classifier threshold can only +change the numerator, :math:`T_p`. Lowering the classifier threshold may increase recall, by increasing the number of true positive results. It is also possible that lowering the threshold may leave recall -unchanged, while the precision fluctuates. +unchanged, while the precision fluctuates. Thus, precision does not necessarily +decrease with recall. The relationship between recall and precision can be observed in the stairstep area of the plot - at the edges of these steps a small change @@ -82,7 +82,7 @@ average precision to multi-class or multi-label classification, it is necessary to binarize the output. One curve can be drawn per label, but one can also draw a precision-recall curve by considering each element of the label indicator -matrix as a binary prediction (micro-averaging). +matrix as a binary prediction (:ref:`micro-averaging `). .. note:: diff --git a/examples/neighbors/plot_regression.py b/examples/neighbors/plot_regression.py index d5ceba8a34860..bca2cd7251229 100644 --- a/examples/neighbors/plot_regression.py +++ b/examples/neighbors/plot_regression.py @@ -6,7 +6,6 @@ Demonstrate the resolution of a regression problem using a k-Nearest Neighbor and the interpolation of the target using both barycenter and constant weights. - """ # Author: Alexandre Gramfort @@ -14,19 +13,21 @@ # # License: BSD 3 clause (C) INRIA - # %% # Generate sample data # -------------------- +# Here we generate a few data points to use to train the model. We also generate +# data in the whole range of the training data to visualize how the model would +# react in that whole region. import matplotlib.pyplot as plt import numpy as np from sklearn import neighbors -np.random.seed(0) -X = np.sort(5 * np.random.rand(40, 1), axis=0) -T = np.linspace(0, 5, 500)[:, np.newaxis] -y = np.sin(X).ravel() +rng = np.random.RandomState(0) +X_train = np.sort(5 * rng.rand(40, 1), axis=0) +X_test = np.linspace(0, 5, 500)[:, np.newaxis] +y = np.sin(X_train).ravel() # Add noise to targets y[::5] += 1 * (0.5 - np.random.rand(8)) @@ -34,15 +35,17 @@ # %% # Fit regression model # -------------------- +# Here we train a model and visualize how `uniform` and `distance` +# weights in prediction effect predicted values. n_neighbors = 5 for i, weights in enumerate(["uniform", "distance"]): knn = neighbors.KNeighborsRegressor(n_neighbors, weights=weights) - y_ = knn.fit(X, y).predict(T) + y_ = knn.fit(X_train, y).predict(X_test) plt.subplot(2, 1, i + 1) - plt.scatter(X, y, color="darkorange", label="data") - plt.plot(T, y_, color="navy", label="prediction") + plt.scatter(X_train, y, color="darkorange", label="data") + plt.plot(X_test, y_, color="navy", label="prediction") plt.axis("tight") plt.legend() plt.title("KNeighborsRegressor (k = %i, weights = '%s')" % (n_neighbors, weights)) diff --git a/examples/release_highlights/plot_release_highlights_0_22_0.py b/examples/release_highlights/plot_release_highlights_0_22_0.py index 2e4c9185365a9..03120c781140c 100644 --- a/examples/release_highlights/plot_release_highlights_0_22_0.py +++ b/examples/release_highlights/plot_release_highlights_0_22_0.py @@ -34,6 +34,7 @@ # `plot_confusion_matrix`. Read more about this new API in the # :ref:`User Guide `. +import matplotlib import matplotlib.pyplot as plt from sklearn.datasets import make_classification @@ -43,6 +44,7 @@ from sklearn.metrics import RocCurveDisplay from sklearn.model_selection import train_test_split from sklearn.svm import SVC +from sklearn.utils.fixes import parse_version X, y = make_classification(random_state=0) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) @@ -117,9 +119,18 @@ fig, ax = plt.subplots() sorted_idx = result.importances_mean.argsort() -ax.boxplot( - result.importances[sorted_idx].T, vert=False, labels=feature_names[sorted_idx] + +# `labels` argument in boxplot is deprecated in matplotlib 3.9 and has been +# renamed to `tick_labels`. The following code handles this, but as a +# scikit-learn user you probably can write simpler code by using `labels=...` +# (matplotlib < 3.9) or `tick_labels=...` (matplotlib >= 3.9). +tick_labels_parameter_name = ( + "tick_labels" + if parse_version(matplotlib.__version__) >= parse_version("3.9") + else "labels" ) +tick_labels_dict = {tick_labels_parameter_name: feature_names[sorted_idx]} +ax.boxplot(result.importances[sorted_idx].T, vert=False, **tick_labels_dict) ax.set_title("Permutation Importance of each feature") ax.set_ylabel("Features") fig.tight_layout() diff --git a/examples/tree/plot_unveil_tree_structure.py b/examples/tree/plot_unveil_tree_structure.py index 19b7c643ec0f7..508c3c304f4d9 100644 --- a/examples/tree/plot_unveil_tree_structure.py +++ b/examples/tree/plot_unveil_tree_structure.py @@ -68,7 +68,8 @@ # - ``weighted_n_node_samples[i]``: the weighted number of training samples # reaching node ``i`` # - ``value[i, j, k]``: the summary of the training samples that reached node i for -# output j and class k (for regression tree, class is set to 1). +# output j and class k (for regression tree, class is set to 1). See below +# for more information about ``value``. # # Using the arrays, we can traverse the tree structure to compute various # properties. Below, we will compute the depth of each node and whether or not @@ -108,7 +109,7 @@ if is_leaves[i]: print( "{space}node={node} is a leaf node with value={value}.".format( - space=node_depth[i] * "\t", node=i, value=values[i] + space=node_depth[i] * "\t", node=i, value=np.around(values[i], 3) ) ) else: @@ -122,7 +123,7 @@ feature=feature[i], threshold=threshold[i], right=children_right[i], - value=values[i], + value=np.around(values[i], 3), ) ) @@ -130,16 +131,28 @@ # What is the values array used here? # ----------------------------------- # The `tree_.value` array is a 3D array of shape -# [``n_nodes``, ``n_classes``, ``n_outputs``] which provides the count of samples -# reaching a node for each class and for each output. Each node has a ``value`` -# array which is the number of weighted samples reaching this -# node for each output and class. +# [``n_nodes``, ``n_classes``, ``n_outputs``] which provides the proportion of samples +# reaching a node for each class and for each output. +# Each node has a ``value`` array which is the proportion of weighted samples reaching +# this node for each output and class with respect to the parent node. +# +# One could convert this to the absolute weighted number of samples reaching a node, +# by multiplying this number by `tree_.weighted_n_node_samples[node_idx]` for the +# given node. Note sample weights are not used in this example, so the weighted +# number of samples is the number of samples reaching the node because each sample +# has a weight of 1 by default. # # For example, in the above tree built on the iris dataset, the root node has -# ``value = [37, 34, 41]``, indicating there are 37 samples +# ``value = [0.33, 0.304, 0.366]`` indicating there are 33% of class 0 samples, +# 30.4% of class 1 samples, and 36.6% of class 2 samples at the root node. One can +# convert this to the absolute number of samples by multiplying by the number of +# samples reaching the root node, which is `tree_.weighted_n_node_samples[0]`. +# Then the root node has ``value = [37, 34, 41]``, indicating there are 37 samples # of class 0, 34 samples of class 1, and 41 samples of class 2 at the root node. +# # Traversing the tree, the samples are split and as a result, the ``value`` array -# reaching each node changes. The left child of the root node has ``value = [37, 0, 0]`` +# reaching each node changes. The left child of the root node has ``value = [1., 0, 0]`` +# (or ``value = [37, 0, 0]`` when converted to the absolute number of samples) # because all 37 samples in the left child node are from class 0. # # Note: In this example, `n_outputs=1`, but the tree classifier can also handle @@ -148,8 +161,10 @@ ############################################################################## # We can compare the above output to the plot of the decision tree. +# Here, we show the proportions of samples of each class that reach each +# node corresponding to the actual elements of `tree_.value` array. -tree.plot_tree(clf) +tree.plot_tree(clf, proportion=True) plt.show() ############################################################################## diff --git a/meson.build b/meson.build index b6b3652a82268..3f14108f77998 100644 --- a/meson.build +++ b/meson.build @@ -5,7 +5,6 @@ project( license: 'BSD-3', meson_version: '>= 1.1.0', default_options: [ - 'buildtype=debugoptimized', 'c_std=c11', 'cpp_std=c++14', ], @@ -13,6 +12,7 @@ project( cc = meson.get_compiler('c') cpp = meson.get_compiler('cpp') +cython = meson.get_compiler('cython') # Check compiler is recent enough (see "Toolchain Roadmap" for details) if cc.get_id() == 'gcc' diff --git a/pyproject.toml b/pyproject.toml index 277bd1446799d..d5af6d80af75b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "scikit-learn" -version = "1.5.1" +dynamic = ["version"] description = "A set of python modules for machine learning and data mining" readme = "README.rst" maintainers = [ @@ -13,7 +13,7 @@ dependencies = [ "threadpoolctl>=3.1.0", ] requires-python = ">=3.9" -license = {text = "new BSD"} +license = {file = "COPYING"} classifiers=[ "Intended Audience :: Science/Research", "Intended Audience :: Developers", @@ -62,8 +62,9 @@ docs = [ "sphinx-prompt>=1.4.0", "sphinxext-opengraph>=0.9.1", "plotly>=5.14.0", - "polars>=0.20.23", + "polars>=0.20.30", "sphinx-design>=0.5.0", + "sphinx-design>=0.6.0", "sphinxcontrib-sass>=0.3.4", "pydata-sphinx-theme>=0.15.3", "sphinx-remove-toctrees>=1.0.0.post1", @@ -86,7 +87,7 @@ tests = [ "black>=24.3.0", "mypy>=1.9", "pyamg>=4.0.0", - "polars>=0.20.23", + "polars>=0.20.30", "pyarrow>=12.0.0", "numpydoc>=1.2.0", "pooch>=1.6.0", @@ -99,7 +100,7 @@ build-backend = "mesonpy" requires = [ "meson-python>=0.16.0", "Cython>=3.0.10", - "numpy>=2.0.0rc2", + "numpy>=2", "scipy>=1.6.0", ] diff --git a/sklearn/__init__.py b/sklearn/__init__.py index 58ff42284e698..38e79e2d3abd8 100644 --- a/sklearn/__init__.py +++ b/sklearn/__init__.py @@ -39,7 +39,7 @@ # Dev branch marker is: 'X.Y.dev' or 'X.Y.devN' where N is an integer. # 'X.Y.dev0' is the canonical version of 'X.Y.dev' # -__version__ = "1.5.1" +__version__ = "1.5.2" # On OSX, we can get a runtime error due to multiple OpenMP libraries loaded diff --git a/sklearn/_build_utils/version.py b/sklearn/_build_utils/version.py index 49a3cfb82bebd..124c6cc3a0cdc 100644 --- a/sklearn/_build_utils/version.py +++ b/sklearn/_build_utils/version.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Extract version number from __init__.py""" import os diff --git a/sklearn/_loss/meson.build b/sklearn/_loss/meson.build index 7978fa56139c6..bb187fd03f71b 100644 --- a/sklearn/_loss/meson.build +++ b/sklearn/_loss/meson.build @@ -17,6 +17,7 @@ _loss_pyx = custom_target( py.extension_module( '_loss', _loss_pyx, + dependencies: [openmp_dep], cython_args: cython_args, install: true, subdir: 'sklearn/_loss', diff --git a/sklearn/_min_dependencies.py b/sklearn/_min_dependencies.py index 9c108791b45bc..40a1e60b87d45 100644 --- a/sklearn/_min_dependencies.py +++ b/sklearn/_min_dependencies.py @@ -33,7 +33,7 @@ "black": ("24.3.0", "tests"), "mypy": ("1.9", "tests"), "pyamg": ("4.0.0", "tests"), - "polars": ("0.20.23", "docs, tests"), + "polars": ("0.20.30", "docs, tests"), "pyarrow": ("12.0.0", "tests"), "sphinx": ("7.3.7", "docs"), "sphinx-copybutton": ("0.5.2", "docs"), @@ -46,7 +46,7 @@ "plotly": ("5.14.0", "docs, examples"), "sphinxcontrib-sass": ("0.3.4", "docs"), "sphinx-remove-toctrees": ("1.0.0.post1", "docs"), - "sphinx-design": ("0.5.0", "docs"), + "sphinx-design": ("0.6.0", "docs"), "pydata-sphinx-theme": ("0.15.3", "docs"), # XXX: Pin conda-lock to the latest released version (needs manual update # from time to time) diff --git a/sklearn/calibration.py b/sklearn/calibration.py index 4fb0c508dba71..ad6d8bfd0559c 100644 --- a/sklearn/calibration.py +++ b/sklearn/calibration.py @@ -28,7 +28,7 @@ clone, ) from .isotonic import IsotonicRegression -from .model_selection import check_cv, cross_val_predict +from .model_selection import LeaveOneOut, check_cv, cross_val_predict from .preprocessing import LabelEncoder, label_binarize from .svm import LinearSVC from .utils import ( @@ -88,6 +88,11 @@ class CalibratedClassifierCV(ClassifierMixin, MetaEstimatorMixin, BaseEstimator) `estimator` if it exists, else on :term:`predict_proba`. Read more in the :ref:`User Guide `. + In order to learn more on the CalibratedClassifierCV class, see the + following calibration examples: + :ref:`sphx_glr_auto_examples_calibration_plot_calibration.py`, + :ref:`sphx_glr_auto_examples_calibration_plot_calibration_curve.py`, and + :ref:`sphx_glr_auto_examples_calibration_plot_calibration_multiclass.py`. Parameters ---------- @@ -394,6 +399,13 @@ def fit(self, X, y, sample_weight=None, **fit_params): "cross-validation but provided less than " f"{n_folds} examples for at least one class." ) + if isinstance(self.cv, LeaveOneOut): + raise ValueError( + "LeaveOneOut cross-validation does not allow" + "all classes to be present in test splits. " + "Please use a cross-validation generator that allows " + "all classes to appear in every test and train split." + ) cv = check_cv(self.cv, y, classifier=True) if self.ensemble: @@ -1044,6 +1056,9 @@ class CalibrationDisplay(_BinaryClassifierCurveDisplayMixin): Read more about calibration in the :ref:`User Guide ` and more about the scikit-learn visualization API in :ref:`visualizations`. + For an example on how to use the visualization, see + :ref:`sphx_glr_auto_examples_calibration_plot_calibration_curve.py`. + .. versionadded:: 1.0 Parameters diff --git a/sklearn/cluster/_agglomerative.py b/sklearn/cluster/_agglomerative.py index 55215d2a0312c..bec45b6a206bc 100644 --- a/sklearn/cluster/_agglomerative.py +++ b/sklearn/cluster/_agglomerative.py @@ -996,7 +996,7 @@ def _fit(self, X): ---------- X : ndarray of shape (n_samples, n_features) or (n_samples, n_samples) Training instances to cluster, or distances between instances if - ``affinity='precomputed'``. + ``metric='precomputed'``. Returns ------- diff --git a/sklearn/cluster/_bicluster.py b/sklearn/cluster/_bicluster.py index b22f6a369fcc1..6731a22c37aef 100644 --- a/sklearn/cluster/_bicluster.py +++ b/sklearn/cluster/_bicluster.py @@ -486,6 +486,9 @@ class SpectralBiclustering(BaseSpectral): array([1, 0], dtype=int32) >>> clustering SpectralBiclustering(n_clusters=2, random_state=0) + + For a more detailed example, see + :ref:`sphx_glr_auto_examples_bicluster_plot_spectral_biclustering.py` """ _parameter_constraints: dict = { diff --git a/sklearn/cluster/_hdbscan/_reachability.pyx b/sklearn/cluster/_hdbscan/_reachability.pyx index 7c37b795cbd14..86eb4612acc01 100644 --- a/sklearn/cluster/_hdbscan/_reachability.pyx +++ b/sklearn/cluster/_hdbscan/_reachability.pyx @@ -62,8 +62,8 @@ def mutual_reachability_graph( `CSR` format. min_samples : int, default=5 - The number of points in a neighbourhood for a point to be considered - a core point. + The parameter `k` used to calculate the distance between a point + `x_p` and its k-th nearest neighbor. max_distance : float, default=0.0 The distance which `np.inf` is replaced with. When the true mutual- diff --git a/sklearn/cluster/_hdbscan/hdbscan.py b/sklearn/cluster/_hdbscan/hdbscan.py index d20e745309fca..8caa639a6de69 100644 --- a/sklearn/cluster/_hdbscan/hdbscan.py +++ b/sklearn/cluster/_hdbscan/hdbscan.py @@ -441,8 +441,8 @@ class HDBSCAN(ClusterMixin, BaseEstimator): as noise. min_samples : int, default=None - The number of samples in a neighborhood for a point - to be considered as a core point. This includes the point itself. + The parameter `k` used to calculate the distance between a point + `x_p` and its k-th nearest neighbor. When `None`, defaults to `min_cluster_size`. cluster_selection_epsilon : float, default=0.0 diff --git a/sklearn/cluster/_mean_shift.py b/sklearn/cluster/_mean_shift.py index a99a607f3cf0d..cfff674b4c30b 100644 --- a/sklearn/cluster/_mean_shift.py +++ b/sklearn/cluster/_mean_shift.py @@ -84,7 +84,7 @@ def estimate_bandwidth(X, *, quantile=0.3, n_samples=None, random_state=0, n_job >>> X = np.array([[1, 1], [2, 1], [1, 0], ... [4, 7], [3, 5], [3, 6]]) >>> estimate_bandwidth(X, quantile=0.5) - 1.61... + np.float64(1.61...) """ X = check_array(X) @@ -218,8 +218,8 @@ def mean_shift( Notes ----- - For an example, see :ref:`examples/cluster/plot_mean_shift.py - `. + For a usage example, see + :ref:`sphx_glr_auto_examples_cluster_plot_mean_shift.py`. Examples -------- @@ -310,6 +310,9 @@ class MeanShift(ClusterMixin, BaseEstimator): Seeding is performed using a binning technique for scalability. + For an example of how to use MeanShift clustering, refer to: + :ref:`sphx_glr_auto_examples_cluster_plot_mean_shift.py`. + Read more in the :ref:`User Guide `. Parameters diff --git a/sklearn/cluster/_optics.py b/sklearn/cluster/_optics.py index b2a0c4d642a00..70eee67b0a98b 100755 --- a/sklearn/cluster/_optics.py +++ b/sklearn/cluster/_optics.py @@ -324,7 +324,7 @@ def fit(self, X, y=None): Returns a fitted instance of self. """ dtype = bool if self.metric in PAIRWISE_BOOLEAN_FUNCTIONS else float - if dtype == bool and X.dtype != bool: + if dtype is bool and X.dtype != bool: msg = ( "Data will be converted to boolean for" f" metric {self.metric}, to avoid this warning," diff --git a/sklearn/cluster/meson.build b/sklearn/cluster/meson.build index afc066797a659..9031d11d56319 100644 --- a/sklearn/cluster/meson.build +++ b/sklearn/cluster/meson.build @@ -5,20 +5,20 @@ cluster_extension_metadata = { {'sources': ['_hierarchical_fast.pyx', metrics_cython_tree], 'override_options': ['cython_language=cpp']}, '_k_means_common': - {'sources': ['_k_means_common.pyx']}, + {'sources': ['_k_means_common.pyx'], 'dependencies': [openmp_dep]}, '_k_means_lloyd': - {'sources': ['_k_means_lloyd.pyx']}, + {'sources': ['_k_means_lloyd.pyx'], 'dependencies': [openmp_dep]}, '_k_means_elkan': - {'sources': ['_k_means_elkan.pyx']}, + {'sources': ['_k_means_elkan.pyx'], 'dependencies': [openmp_dep]}, '_k_means_minibatch': - {'sources': ['_k_means_minibatch.pyx']}, + {'sources': ['_k_means_minibatch.pyx'], 'dependencies': [openmp_dep]}, } foreach ext_name, ext_dict : cluster_extension_metadata py.extension_module( ext_name, [ext_dict.get('sources'), utils_cython_tree], - dependencies: [np_dep, openmp_dep], + dependencies: [np_dep] + ext_dict.get('dependencies', []), override_options : ext_dict.get('override_options', []), cython_args: cython_args, subdir: 'sklearn/cluster', diff --git a/sklearn/cluster/tests/test_dbscan.py b/sklearn/cluster/tests/test_dbscan.py index d42cc2b17d518..556f89312d2fc 100644 --- a/sklearn/cluster/tests/test_dbscan.py +++ b/sklearn/cluster/tests/test_dbscan.py @@ -291,7 +291,7 @@ def test_input_validation(): def test_pickle(): obj = DBSCAN() s = pickle.dumps(obj) - assert type(pickle.loads(s)) == obj.__class__ + assert type(pickle.loads(s)) is obj.__class__ def test_boundaries(): diff --git a/sklearn/compose/_target.py b/sklearn/compose/_target.py index 3e6c94df8267a..9da45860d8f9c 100644 --- a/sklearn/compose/_target.py +++ b/sklearn/compose/_target.py @@ -193,6 +193,10 @@ def _fit_transformer(self, y): validate=True, check_inverse=self.check_inverse, ) + # We are transforming the target here and not the features, so we set the + # output of FunctionTransformer() to be a numpy array (default) and to not + # depend on the global configuration: + self.transformer_.set_output(transform="default") # XXX: sample_weight is not currently passed to the # transformer. However, if transformer starts using sample_weight, the # code should be modified accordingly. At the time to consider the diff --git a/sklearn/compose/tests/test_target.py b/sklearn/compose/tests/test_target.py index a971553b64739..fd885459e76d1 100644 --- a/sklearn/compose/tests/test_target.py +++ b/sklearn/compose/tests/test_target.py @@ -1,7 +1,9 @@ +import warnings + import numpy as np import pytest -from sklearn import datasets +from sklearn import config_context, datasets from sklearn.base import BaseEstimator, TransformerMixin, clone from sklearn.compose import TransformedTargetRegressor from sklearn.dummy import DummyRegressor @@ -393,3 +395,18 @@ def test_transform_target_regressor_pass_extra_predict_parameters(): regr.fit(X, y) regr.predict(X, check_input=False) assert regr.regressor_.predict_called + + +@pytest.mark.parametrize("output_format", ["pandas", "polars"]) +def test_transform_target_regressor_not_warns_with_global_output_set(output_format): + """Test that TransformedTargetRegressor will not raise warnings if + set_config(transform_output="pandas"/"polars") is set globally; regression test for + issue #29361.""" + X, y = datasets.make_regression() + y = np.abs(y) + 1 + with config_context(transform_output=output_format): + with warnings.catch_warnings(): + warnings.simplefilter("error") + TransformedTargetRegressor( + regressor=LinearRegression(), func=np.log, inverse_func=np.exp + ).fit(X, y) diff --git a/sklearn/conftest.py b/sklearn/conftest.py index 203c524561fdd..92a5c3279bde1 100644 --- a/sklearn/conftest.py +++ b/sklearn/conftest.py @@ -207,10 +207,17 @@ def pytest_collection_modifyitems(config, items): ) skip_doctests = True - if np_base_version >= parse_version("2"): + if np_base_version < parse_version("2"): + # TODO: configure numpy to output scalar arrays as regular Python scalars + # once possible to improve readability of the tests docstrings. + # https://numpy.org/neps/nep-0051-scalar-representation.html#implementation reason = "Due to NEP 51 numpy scalar repr has changed in numpy 2" skip_doctests = True + if sp_version < parse_version("1.14"): + reason = "Scipy sparse matrix repr has changed in scipy 1.14" + skip_doctests = True + # Normally doctest has the entire module's scope. Here we set globs to an empty dict # to remove the module's scope: # https://docs.python.org/3/library/doctest.html#what-s-the-execution-context diff --git a/sklearn/covariance/_graph_lasso.py b/sklearn/covariance/_graph_lasso.py index 75bfc396340c9..953d50f3012a5 100644 --- a/sklearn/covariance/_graph_lasso.py +++ b/sklearn/covariance/_graph_lasso.py @@ -391,6 +391,9 @@ def __init__( class GraphicalLasso(BaseGraphicalLasso): """Sparse inverse covariance estimation with an l1-penalized estimator. + For a usage example see + :ref:`sphx_glr_auto_examples_applications_plot_stock_market.py`. + Read more in the :ref:`User Guide `. .. versionchanged:: v0.20 diff --git a/sklearn/covariance/_shrunk_covariance.py b/sklearn/covariance/_shrunk_covariance.py index caf23ffaf687e..95d12ec4cff24 100644 --- a/sklearn/covariance/_shrunk_covariance.py +++ b/sklearn/covariance/_shrunk_covariance.py @@ -338,7 +338,7 @@ def ledoit_wolf_shrinkage(X, assume_centered=False, block_size=1000): >>> X = rng.multivariate_normal(mean=[0, 0], cov=real_cov, size=50) >>> shrinkage_coefficient = ledoit_wolf_shrinkage(X) >>> shrinkage_coefficient - 0.23... + np.float64(0.23...) """ X = check_array(X) # for only one feature, the result is the same whatever the shrinkage @@ -455,7 +455,7 @@ def ledoit_wolf(X, *, assume_centered=False, block_size=1000): array([[0.44..., 0.16...], [0.16..., 0.80...]]) >>> shrinkage - 0.23... + np.float64(0.23...) """ estimator = LedoitWolf( assume_centered=assume_centered, @@ -675,7 +675,7 @@ def oas(X, *, assume_centered=False): array([[0.7533..., 0.2763...], [0.2763..., 0.3964...]]) >>> shrinkage - 0.0195... + np.float64(0.0195...) """ estimator = OAS( assume_centered=assume_centered, @@ -781,7 +781,7 @@ class OAS(EmpiricalCovariance): array([[ 1.7833..., -1.2431... ], [-1.2431..., 3.3889...]]) >>> oas.shrinkage_ - 0.0195... + np.float64(0.0195...) """ @_fit_context(prefer_skip_nested_validation=True) diff --git a/sklearn/datasets/_base.py b/sklearn/datasets/_base.py index aa145384c042d..62296490580bb 100644 --- a/sklearn/datasets/_base.py +++ b/sklearn/datasets/_base.py @@ -568,7 +568,7 @@ def load_wine(*, return_X_y=False, as_frame=False): >>> data.target[[10, 80, 140]] array([0, 1, 2]) >>> list(data.target_names) - ['class_0', 'class_1', 'class_2'] + [np.str_('class_0'), np.str_('class_1'), np.str_('class_2')] """ data, target, target_names, fdescr = load_csv_data( @@ -702,7 +702,7 @@ def load_iris(*, return_X_y=False, as_frame=False): >>> data.target[[10, 25, 50]] array([0, 0, 1]) >>> list(data.target_names) - ['setosa', 'versicolor', 'virginica'] + [np.str_('setosa'), np.str_('versicolor'), np.str_('virginica')] See :ref:`sphx_glr_auto_examples_datasets_plot_iris_dataset.py` for a more detailed example of how to work with the iris dataset. @@ -830,7 +830,7 @@ def load_breast_cancer(*, return_X_y=False, as_frame=False): >>> data.target[[10, 50, 85]] array([0, 1, 0]) >>> list(data.target_names) - ['malignant', 'benign'] + [np.str_('malignant'), np.str_('benign')] """ data_file_name = "breast_cancer.csv" data, target, target_names, fdescr = load_csv_data( diff --git a/sklearn/datasets/_lfw.py b/sklearn/datasets/_lfw.py index be72baa981da7..a394b8ca7b2d5 100644 --- a/sklearn/datasets/_lfw.py +++ b/sklearn/datasets/_lfw.py @@ -595,7 +595,7 @@ def fetch_lfw_pairs( >>> from sklearn.datasets import fetch_lfw_pairs >>> lfw_pairs_train = fetch_lfw_pairs(subset='train') >>> list(lfw_pairs_train.target_names) - ['Different persons', 'Same person'] + [np.str_('Different persons'), np.str_('Same person')] >>> lfw_pairs_train.pairs.shape (2200, 2, 62, 47) >>> lfw_pairs_train.data.shape diff --git a/sklearn/datasets/_samples_generator.py b/sklearn/datasets/_samples_generator.py index e4fabcd892d7e..4d24bf620cacf 100644 --- a/sklearn/datasets/_samples_generator.py +++ b/sklearn/datasets/_samples_generator.py @@ -205,7 +205,7 @@ def make_classification( >>> y.shape (100,) >>> list(y[:5]) - [0, 0, 1, 1, 0] + [np.int64(0), np.int64(0), np.int64(1), np.int64(1), np.int64(0)] """ generator = check_random_state(random_state) @@ -557,7 +557,8 @@ def make_hastie_10_2(n_samples=12000, *, random_state=None): >>> y.shape (24000,) >>> list(y[:5]) - [-1.0, 1.0, -1.0, 1.0, -1.0] + [np.float64(-1.0), np.float64(1.0), np.float64(-1.0), np.float64(1.0), + np.float64(-1.0)] """ rs = check_random_state(random_state) @@ -797,7 +798,7 @@ def make_circles( >>> y.shape (100,) >>> list(y[:5]) - [1, 1, 1, 0, 0] + [np.int64(1), np.int64(1), np.int64(1), np.int64(0), np.int64(0)] """ if isinstance(n_samples, numbers.Integral): n_samples_out = n_samples // 2 @@ -1169,7 +1170,7 @@ def make_friedman1(n_samples=100, n_features=10, *, noise=0.0, random_state=None >>> y.shape (100,) >>> list(y[:3]) - [16.8..., 5.8..., 9.4...] + [np.float64(16.8...), np.float64(5.8...), np.float64(9.4...)] """ generator = check_random_state(random_state) @@ -1251,7 +1252,7 @@ def make_friedman2(n_samples=100, *, noise=0.0, random_state=None): >>> y.shape (100,) >>> list(y[:3]) - [1229.4..., 27.0..., 65.6...] + [np.float64(1229.4...), np.float64(27.0...), np.float64(65.6...)] """ generator = check_random_state(random_state) @@ -1335,7 +1336,7 @@ def make_friedman3(n_samples=100, *, noise=0.0, random_state=None): >>> y.shape (100,) >>> list(y[:3]) - [1.5..., 0.9..., 0.4...] + [np.float64(1.5...), np.float64(0.9...), np.float64(0.4...)] """ generator = check_random_state(random_state) @@ -2050,7 +2051,7 @@ def make_gaussian_quantiles( >>> y.shape (100,) >>> list(y[:5]) - [2, 0, 1, 0, 2] + [np.int64(2), np.int64(0), np.int64(1), np.int64(0), np.int64(2)] """ if n_samples < n_classes: raise ValueError("n_samples must be at least n_classes") diff --git a/sklearn/decomposition/_dict_learning.py b/sklearn/decomposition/_dict_learning.py index 267e1cbfe756b..a2e3496e43941 100644 --- a/sklearn/decomposition/_dict_learning.py +++ b/sklearn/decomposition/_dict_learning.py @@ -847,7 +847,7 @@ def dict_learning_online( We can check the level of sparsity of `U`: >>> np.mean(U == 0) - 0.53... + np.float64(0.53...) We can compare the average squared euclidean norm of the reconstruction error of the sparse coded signal relative to the squared euclidean norm of @@ -855,7 +855,7 @@ def dict_learning_online( >>> X_hat = U @ V >>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1)) - 0.05... + np.float64(0.05...) """ # TODO(1.6): remove in 1.6 if max_iter is None: @@ -1049,7 +1049,7 @@ def dict_learning( We can check the level of sparsity of `U`: >>> np.mean(U == 0) - 0.6... + np.float64(0.6...) We can compare the average squared euclidean norm of the reconstruction error of the sparse coded signal relative to the squared euclidean norm of @@ -1057,7 +1057,7 @@ def dict_learning( >>> X_hat = U @ V >>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1)) - 0.01... + np.float64(0.01...) """ estimator = DictionaryLearning( n_components=n_components, @@ -1551,7 +1551,7 @@ class DictionaryLearning(_BaseSparseCoding, BaseEstimator): We can check the level of sparsity of `X_transformed`: >>> np.mean(X_transformed == 0) - 0.52... + np.float64(0.52...) We can compare the average squared euclidean norm of the reconstruction error of the sparse coded signal relative to the squared euclidean norm of @@ -1559,7 +1559,7 @@ class DictionaryLearning(_BaseSparseCoding, BaseEstimator): >>> X_hat = X_transformed @ dict_learner.components_ >>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1)) - 0.05... + np.float64(0.05...) """ _parameter_constraints: dict = { @@ -1914,7 +1914,7 @@ class MiniBatchDictionaryLearning(_BaseSparseCoding, BaseEstimator): We can check the level of sparsity of `X_transformed`: >>> np.mean(X_transformed == 0) > 0.5 - True + np.True_ We can compare the average squared euclidean norm of the reconstruction error of the sparse coded signal relative to the squared euclidean norm of @@ -1922,7 +1922,7 @@ class MiniBatchDictionaryLearning(_BaseSparseCoding, BaseEstimator): >>> X_hat = X_transformed @ dict_learner.components_ >>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1)) - 0.052... + np.float64(0.052...) """ _parameter_constraints: dict = { diff --git a/sklearn/decomposition/_fastica.py b/sklearn/decomposition/_fastica.py index a4f36e5ba87db..c875d830eafb7 100644 --- a/sklearn/decomposition/_fastica.py +++ b/sklearn/decomposition/_fastica.py @@ -606,7 +606,7 @@ def g(x, fun_args): # Faster when num_samples >> n_features d, u = linalg.eigh(XT.dot(X)) sort_indices = np.argsort(d)[::-1] - eps = np.finfo(d.dtype).eps + eps = np.finfo(d.dtype).eps * 10 degenerate_idx = d < eps if np.any(degenerate_idx): warnings.warn( diff --git a/sklearn/decomposition/_lda.py b/sklearn/decomposition/_lda.py index 4f91483a468a9..37b425a727a88 100644 --- a/sklearn/decomposition/_lda.py +++ b/sklearn/decomposition/_lda.py @@ -194,15 +194,14 @@ class LatentDirichletAllocation( In general, if the data size is large, the online update will be much faster than the batch update. - Valid options:: - - 'batch': Batch variational Bayes method. Use all training data in - each EM update. - Old `components_` will be overwritten in each iteration. - 'online': Online variational Bayes method. In each EM update, use - mini-batch of training data to update the ``components_`` - variable incrementally. The learning rate is controlled by the - ``learning_decay`` and the ``learning_offset`` parameters. + Valid options: + + - 'batch': Batch variational Bayes method. Use all training data in each EM + update. Old `components_` will be overwritten in each iteration. + - 'online': Online variational Bayes method. In each EM update, use mini-batch + of training data to update the ``components_`` variable incrementally. The + learning rate is controlled by the ``learning_decay`` and the + ``learning_offset`` parameters. .. versionchanged:: 0.20 The default learning method is now ``"batch"``. diff --git a/sklearn/decomposition/_sparse_pca.py b/sklearn/decomposition/_sparse_pca.py index b284e784d4466..39f01325a1515 100644 --- a/sklearn/decomposition/_sparse_pca.py +++ b/sklearn/decomposition/_sparse_pca.py @@ -267,7 +267,7 @@ class SparsePCA(_BaseSparsePCA): (200, 5) >>> # most values in the components_ are zero (sparsity) >>> np.mean(transformer.components_ == 0) - 0.9666... + np.float64(0.9666...) """ _parameter_constraints: dict = { @@ -473,7 +473,7 @@ class MiniBatchSparsePCA(_BaseSparsePCA): (200, 5) >>> # most values in the components_ are zero (sparsity) >>> np.mean(transformer.components_ == 0) - 0.9... + np.float64(0.9...) """ _parameter_constraints: dict = { diff --git a/sklearn/decomposition/tests/test_fastica.py b/sklearn/decomposition/tests/test_fastica.py index bd7a35bb8a96f..0066d9faf17f2 100644 --- a/sklearn/decomposition/tests/test_fastica.py +++ b/sklearn/decomposition/tests/test_fastica.py @@ -13,7 +13,7 @@ from sklearn.decomposition import PCA, FastICA, fastica from sklearn.decomposition._fastica import _gs_decorrelation from sklearn.exceptions import ConvergenceWarning -from sklearn.utils._testing import assert_allclose +from sklearn.utils._testing import assert_allclose, ignore_warnings def center_and_norm(x, axis=-1): @@ -448,5 +448,10 @@ def test_fastica_eigh_low_rank_warning(global_random_seed): X = A @ A.T ica = FastICA(random_state=0, whiten="unit-variance", whiten_solver="eigh") msg = "There are some small singular values" + with pytest.warns(UserWarning, match=msg): - ica.fit(X) + with ignore_warnings(category=ConvergenceWarning): + # The FastICA solver may not converge for some data with specific + # random seeds but this happens after the whiten step so this is + # not want we want to test here. + ica.fit(X) diff --git a/sklearn/ensemble/_gb.py b/sklearn/ensemble/_gb.py index 18d89b21f5512..0ce85a43bd310 100644 --- a/sklearn/ensemble/_gb.py +++ b/sklearn/ensemble/_gb.py @@ -1124,8 +1124,9 @@ class GradientBoostingClassifier(ClassifierMixin, BaseGradientBoosting): classification is a special case where only a single regression tree is induced. - :class:`sklearn.ensemble.HistGradientBoostingClassifier` is a much faster - variant of this algorithm for intermediate datasets (`n_samples >= 10_000`). + :class:`~sklearn.ensemble.HistGradientBoostingClassifier` is a much faster variant + of this algorithm for intermediate and large datasets (`n_samples >= 10_000`) and + supports monotonic constraints. Read more in the :ref:`User Guide `. @@ -1727,8 +1728,9 @@ class GradientBoostingRegressor(RegressorMixin, BaseGradientBoosting): each stage a regression tree is fit on the negative gradient of the given loss function. - :class:`sklearn.ensemble.HistGradientBoostingRegressor` is a much faster - variant of this algorithm for intermediate datasets (`n_samples >= 10_000`). + :class:`~sklearn.ensemble.HistGradientBoostingRegressor` is a much faster variant + of this algorithm for intermediate and large datasets (`n_samples >= 10_000`) and + supports monotonic constraints. Read more in the :ref:`User Guide `. diff --git a/sklearn/ensemble/_hist_gradient_boosting/meson.build b/sklearn/ensemble/_hist_gradient_boosting/meson.build index 70327fb15c3d3..362bd5efb82d5 100644 --- a/sklearn/ensemble/_hist_gradient_boosting/meson.build +++ b/sklearn/ensemble/_hist_gradient_boosting/meson.build @@ -1,9 +1,9 @@ hist_gradient_boosting_extension_metadata = { - '_gradient_boosting': {'sources': ['_gradient_boosting.pyx']}, - 'histogram': {'sources': ['histogram.pyx']}, - 'splitting': {'sources': ['splitting.pyx']}, - '_binning': {'sources': ['_binning.pyx']}, - '_predictor': {'sources': ['_predictor.pyx']}, + '_gradient_boosting': {'sources': ['_gradient_boosting.pyx'], 'dependencies': [openmp_dep]}, + 'histogram': {'sources': ['histogram.pyx'], 'dependencies': [openmp_dep]}, + 'splitting': {'sources': ['splitting.pyx'], 'dependencies': [openmp_dep]}, + '_binning': {'sources': ['_binning.pyx'], 'dependencies': [openmp_dep]}, + '_predictor': {'sources': ['_predictor.pyx'], 'dependencies': [openmp_dep]}, '_bitset': {'sources': ['_bitset.pyx']}, 'common': {'sources': ['common.pyx']}, } @@ -12,7 +12,7 @@ foreach ext_name, ext_dict : hist_gradient_boosting_extension_metadata py.extension_module( ext_name, ext_dict.get('sources'), - dependencies: [openmp_dep], + dependencies: ext_dict.get('dependencies', []), cython_args: cython_args, subdir: 'sklearn/ensemble/_hist_gradient_boosting', install: true diff --git a/sklearn/ensemble/tests/test_forest.py b/sklearn/ensemble/tests/test_forest.py index 2468f8fc5b590..a36e73cd301a2 100644 --- a/sklearn/ensemble/tests/test_forest.py +++ b/sklearn/ensemble/tests/test_forest.py @@ -515,7 +515,8 @@ def test_forest_classifier_oob( test_score = classifier.score(X_test, y_test) assert classifier.oob_score_ >= lower_bound_accuracy - assert abs(test_score - classifier.oob_score_) <= 0.1 + abs_diff = abs(test_score - classifier.oob_score_) + assert abs_diff <= 0.11, f"{abs_diff=} is greater than 0.11" assert hasattr(classifier, "oob_score_") assert not hasattr(classifier, "oob_prediction_") diff --git a/sklearn/feature_extraction/image.py b/sklearn/feature_extraction/image.py index 66dfc6f872b59..f6d93caa87284 100644 --- a/sklearn/feature_extraction/image.py +++ b/sklearn/feature_extraction/image.py @@ -237,6 +237,9 @@ def grid_to_graph( >>> mask[[1, 2], [1, 2], :] = True >>> graph = grid_to_graph(*shape_img, mask=mask) >>> print(graph) + + Coords Values (0, 0) 1 (1, 1) 1 """ diff --git a/sklearn/feature_selection/_from_model.py b/sklearn/feature_selection/_from_model.py index 46c2b9ebbb163..b6c3fc9ed5601 100644 --- a/sklearn/feature_selection/_from_model.py +++ b/sklearn/feature_selection/_from_model.py @@ -219,7 +219,7 @@ class SelectFromModel(MetaEstimatorMixin, SelectorMixin, BaseEstimator): >>> selector.estimator_.coef_ array([[-0.3252..., 0.8345..., 0.4976...]]) >>> selector.threshold_ - 0.55249... + np.float64(0.55249...) >>> selector.get_support() array([False, True, False]) >>> selector.transform(X) diff --git a/sklearn/feature_selection/_rfe.py b/sklearn/feature_selection/_rfe.py index 7c5cd8d45b8d1..d02e9ba874400 100644 --- a/sklearn/feature_selection/_rfe.py +++ b/sklearn/feature_selection/_rfe.py @@ -529,7 +529,7 @@ class RFECV(RFE): For integer/None inputs, if ``y`` is binary or multiclass, :class:`~sklearn.model_selection.StratifiedKFold` is used. If the - estimator is a classifier or if ``y`` is neither binary nor multiclass, + estimator is not a classifier or if ``y`` is neither binary nor multiclass, :class:`~sklearn.model_selection.KFold` is used. Refer :ref:`User Guide ` for the various diff --git a/sklearn/feature_selection/_sequential.py b/sklearn/feature_selection/_sequential.py index 9c393724f9cea..91e9410fc657c 100644 --- a/sklearn/feature_selection/_sequential.py +++ b/sklearn/feature_selection/_sequential.py @@ -58,6 +58,7 @@ class SequentialFeatureSelector( consecutive feature additions or removals, stop adding or removing. `tol` can be negative when removing features using `direction="backward"`. + `tol` is required to be strictly positive when doing forward selection. It can be useful to reduce the number of features at the cost of a small decrease in the score. @@ -230,7 +231,9 @@ def fit(self, X, y=None): self.n_features_to_select_ = int(n_features * self.n_features_to_select) if self.tol is not None and self.tol < 0 and self.direction == "forward": - raise ValueError("tol must be positive when doing forward selection") + raise ValueError( + "tol must be strictly positive when doing forward selection" + ) cv = check_cv(self.cv, y, classifier=is_classifier(self.estimator)) diff --git a/sklearn/feature_selection/tests/test_sequential.py b/sklearn/feature_selection/tests/test_sequential.py index 82d65c55a0195..e1e0e2cdde938 100644 --- a/sklearn/feature_selection/tests/test_sequential.py +++ b/sklearn/feature_selection/tests/test_sequential.py @@ -278,7 +278,7 @@ def test_forward_neg_tol_error(): tol=-1e-3, ) - with pytest.raises(ValueError, match="tol must be positive"): + with pytest.raises(ValueError, match="tol must be strictly positive"): sfs.fit(X, y) diff --git a/sklearn/impute/_knn.py b/sklearn/impute/_knn.py index 59aba2b2f2d38..da5f4a81a7095 100644 --- a/sklearn/impute/_knn.py +++ b/sklearn/impute/_knn.py @@ -56,9 +56,9 @@ class KNNImputer(_BaseImputer): - 'nan_euclidean' - callable : a user-defined function which conforms to the definition - of ``_pairwise_callable(X, Y, metric, **kwds)``. The function - accepts two arrays, X and Y, and a `missing_values` keyword in - `kwds` and returns a scalar distance value. + of ``func_metric(x, y, *, missing_values=np.nan)``. `x` and `y` + corresponds to a row (i.e. 1-D arrays) of `X` and `Y`, respectively. + The callable should returns a scalar distance value. copy : bool, default=True If True, a copy of X will be created. If False, imputation will diff --git a/sklearn/inspection/_plot/decision_boundary.py b/sklearn/inspection/_plot/decision_boundary.py index 92e1a2527400e..87c97be848d33 100644 --- a/sklearn/inspection/_plot/decision_boundary.py +++ b/sklearn/inspection/_plot/decision_boundary.py @@ -30,8 +30,8 @@ def _check_boundary_response_method(estimator, response_method, class_of_interes :term:`decision_function`, :term:`predict_proba`, :term:`predict`. class_of_interest : int, float, bool, str or None - The class considered when plotting the decision. If the label is specified, it - is then possible to plot the decision boundary in multiclass settings. + The class considered when plotting the decision. Cannot be None if + multiclass and `response_method` is 'predict_proba' or 'decision_function'. .. versionadded:: 1.4 @@ -257,8 +257,9 @@ def from_estimator( class_of_interest : int, float, bool or str, default=None The class considered when plotting the decision. If None, `estimator.classes_[1]` is considered as the positive class - for binary classifiers. For multiclass classifiers, passing - an explicit value for `class_of_interest` is mandatory. + for binary classifiers. Must have an explicit value for + multiclass classifiers when `response_method` is 'predict_proba' + or 'decision_function'. .. versionadded:: 1.4 diff --git a/sklearn/isotonic.py b/sklearn/isotonic.py index b77ffc04185c0..71ca0b177f13c 100644 --- a/sklearn/isotonic.py +++ b/sklearn/isotonic.py @@ -66,10 +66,10 @@ def check_increasing(x, y): >>> from sklearn.isotonic import check_increasing >>> x, y = [1, 2, 3, 4, 5], [2, 4, 6, 8, 10] >>> check_increasing(x, y) - True + np.True_ >>> y = [10, 8, 6, 4, 2] >>> check_increasing(x, y) - False + np.False_ """ # Calculate Spearman rho estimate and set return accordingly. diff --git a/sklearn/linear_model/_base.py b/sklearn/linear_model/_base.py index 56beba93f6f98..02a72355e3602 100644 --- a/sklearn/linear_model/_base.py +++ b/sklearn/linear_model/_base.py @@ -553,7 +553,7 @@ class LinearRegression(MultiOutputMixin, RegressorMixin, LinearModel): >>> reg.coef_ array([1., 2.]) >>> reg.intercept_ - 3.0... + np.float64(3.0...) >>> reg.predict(np.array([[3, 5]])) array([16.]) """ diff --git a/sklearn/linear_model/_coordinate_descent.py b/sklearn/linear_model/_coordinate_descent.py index 9987304652b08..3996c994bfa3b 100644 --- a/sklearn/linear_model/_coordinate_descent.py +++ b/sklearn/linear_model/_coordinate_descent.py @@ -2087,6 +2087,46 @@ def _is_multitask(self): def _more_tags(self): return {"multioutput": False} + def fit(self, X, y, sample_weight=None, **params): + """Fit Lasso model with coordinate descent. + + Fit is on grid of alphas and best alpha estimated by cross-validation. + + Parameters + ---------- + X : {array-like, sparse matrix} of shape (n_samples, n_features) + Training data. Pass directly as Fortran-contiguous data + to avoid unnecessary memory duplication. If y is mono-output, + X can be sparse. Note that large sparse matrices and arrays + requiring `int64` indices are not accepted. + + y : array-like of shape (n_samples,) + Target values. + + sample_weight : float or array-like of shape (n_samples,), \ + default=None + Sample weights used for fitting and evaluation of the weighted + mean squared error of each cv-fold. Note that the cross validated + MSE that is finally used to find the best model is the unweighted + mean over the (weighted) MSEs of each test fold. + + **params : dict, default=None + Parameters to be passed to the CV splitter. + + .. versionadded:: 1.4 + Only available if `enable_metadata_routing=True`, + which can be set by using + ``sklearn.set_config(enable_metadata_routing=True)``. + See :ref:`Metadata Routing User Guide ` for + more details. + + Returns + ------- + self : object + Returns an instance of fitted model. + """ + return super().fit(X, y, sample_weight=sample_weight, **params) + class ElasticNetCV(RegressorMixin, LinearModelCV): """Elastic Net model with iterative fitting along a regularization path. @@ -2326,6 +2366,46 @@ def _is_multitask(self): def _more_tags(self): return {"multioutput": False} + def fit(self, X, y, sample_weight=None, **params): + """Fit ElasticNet model with coordinate descent. + + Fit is on grid of alphas and best alpha estimated by cross-validation. + + Parameters + ---------- + X : {array-like, sparse matrix} of shape (n_samples, n_features) + Training data. Pass directly as Fortran-contiguous data + to avoid unnecessary memory duplication. If y is mono-output, + X can be sparse. Note that large sparse matrices and arrays + requiring `int64` indices are not accepted. + + y : array-like of shape (n_samples,) + Target values. + + sample_weight : float or array-like of shape (n_samples,), \ + default=None + Sample weights used for fitting and evaluation of the weighted + mean squared error of each cv-fold. Note that the cross validated + MSE that is finally used to find the best model is the unweighted + mean over the (weighted) MSEs of each test fold. + + **params : dict, default=None + Parameters to be passed to the CV splitter. + + .. versionadded:: 1.4 + Only available if `enable_metadata_routing=True`, + which can be set by using + ``sklearn.set_config(enable_metadata_routing=True)``. + See :ref:`Metadata Routing User Guide ` for + more details. + + Returns + ------- + self : object + Returns an instance of fitted model. + """ + return super().fit(X, y, sample_weight=sample_weight, **params) + ############################################################################### # Multi Task ElasticNet and Lasso models (with joint feature selection) @@ -2947,7 +3027,7 @@ def _more_tags(self): return {"multioutput_only": True} # This is necessary as LinearModelCV now supports sample_weight while - # MultiTaskElasticNet does not (yet). + # MultiTaskElasticNetCV does not (yet). def fit(self, X, y, **params): """Fit MultiTaskElasticNet model with coordinate descent. @@ -3131,7 +3211,7 @@ class MultiTaskLassoCV(RegressorMixin, LinearModelCV): >>> r2_score(y, reg.predict(X)) 0.9994... >>> reg.alpha_ - 0.5713... + np.float64(0.5713...) >>> reg.predict(X[:1,]) array([[153.7971..., 94.9015...]]) """ @@ -3185,7 +3265,7 @@ def _more_tags(self): return {"multioutput_only": True} # This is necessary as LinearModelCV now supports sample_weight while - # MultiTaskElasticNet does not (yet). + # MultiTaskLassoCV does not (yet). def fit(self, X, y, **params): """Fit MultiTaskLasso model with coordinate descent. diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 14caa4fd733c2..92d1aaa6077e6 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -552,11 +552,11 @@ class PoissonRegressor(_GeneralizedLinearRegressor): >>> clf.fit(X, y) PoissonRegressor() >>> clf.score(X, y) - 0.990... + np.float64(0.990...) >>> clf.coef_ array([0.121..., 0.158...]) >>> clf.intercept_ - 2.088... + np.float64(2.088...) >>> clf.predict([[1, 1], [3, 4]]) array([10.676..., 21.875...]) """ @@ -684,11 +684,11 @@ class GammaRegressor(_GeneralizedLinearRegressor): >>> clf.fit(X, y) GammaRegressor() >>> clf.score(X, y) - 0.773... + np.float64(0.773...) >>> clf.coef_ array([0.072..., 0.066...]) >>> clf.intercept_ - 2.896... + np.float64(2.896...) >>> clf.predict([[1, 0], [2, 8]]) array([19.483..., 35.795...]) """ @@ -846,11 +846,11 @@ class TweedieRegressor(_GeneralizedLinearRegressor): >>> clf.fit(X, y) TweedieRegressor() >>> clf.score(X, y) - 0.839... + np.float64(0.839...) >>> clf.coef_ array([0.599..., 0.299...]) >>> clf.intercept_ - 1.600... + np.float64(1.600...) >>> clf.predict([[1, 1], [3, 4]]) array([2.500..., 4.599...]) """ diff --git a/sklearn/linear_model/_least_angle.py b/sklearn/linear_model/_least_angle.py index 5f0715135d57b..7d5b11431c583 100644 --- a/sklearn/linear_model/_least_angle.py +++ b/sklearn/linear_model/_least_angle.py @@ -1646,7 +1646,7 @@ class LarsCV(Lars): >>> reg.score(X, y) 0.9996... >>> reg.alpha_ - 0.2961... + np.float64(0.2961...) >>> reg.predict(X[:1,]) array([154.3996...]) """ @@ -1986,7 +1986,7 @@ class LassoLarsCV(LarsCV): >>> reg.score(X, y) 0.9993... >>> reg.alpha_ - 0.3972... + np.float64(0.3972...) >>> reg.predict(X[:1,]) array([-78.4831...]) """ diff --git a/sklearn/linear_model/_omp.py b/sklearn/linear_model/_omp.py index f52ef553eab4c..03549b46b385d 100644 --- a/sklearn/linear_model/_omp.py +++ b/sklearn/linear_model/_omp.py @@ -996,7 +996,7 @@ class OrthogonalMatchingPursuitCV(RegressorMixin, LinearModel): >>> reg.score(X, y) 0.9991... >>> reg.n_nonzero_coefs_ - 10 + np.int64(10) >>> reg.predict(X[:1,]) array([-78.3854...]) """ diff --git a/sklearn/linear_model/_quantile.py b/sklearn/linear_model/_quantile.py index 33451d8640bff..021328eb361ff 100644 --- a/sklearn/linear_model/_quantile.py +++ b/sklearn/linear_model/_quantile.py @@ -104,7 +104,7 @@ class QuantileRegressor(LinearModel, RegressorMixin, BaseEstimator): >>> solver = "highs" if sp_version >= parse_version("1.6.0") else "interior-point" >>> reg = QuantileRegressor(quantile=0.8, solver=solver).fit(X, y) >>> np.mean(y <= reg.predict(X)) - 0.8 + np.float64(0.8) """ _parameter_constraints: dict = { diff --git a/sklearn/linear_model/_ransac.py b/sklearn/linear_model/_ransac.py index b6bf7b082fc5e..46276632d6b45 100644 --- a/sklearn/linear_model/_ransac.py +++ b/sklearn/linear_model/_ransac.py @@ -252,6 +252,9 @@ class RANSACRegressor( 0.9885... >>> reg.predict(X[:1,]) array([-31.9417...]) + + For a more detailed example, see + :ref:`sphx_glr_auto_examples_linear_model_plot_ransac.py` """ # noqa: E501 _parameter_constraints: dict = { diff --git a/sklearn/linear_model/_ridge.py b/sklearn/linear_model/_ridge.py index 7890875a76032..5960d6c7cb170 100644 --- a/sklearn/linear_model/_ridge.py +++ b/sklearn/linear_model/_ridge.py @@ -573,9 +573,9 @@ def ridge_regression( >>> y = 2.0 * X[:, 0] - 1.0 * X[:, 1] + 0.1 * rng.standard_normal(100) >>> coef, intercept = ridge_regression(X, y, alpha=1.0, return_intercept=True) >>> list(coef) - [1.9..., -1.0..., -0.0..., -0.0...] + [np.float64(1.9...), np.float64(-1.0...), np.float64(-0.0...), np.float64(-0.0...)] >>> intercept - -0.0... + np.float64(-0.0...) """ return _ridge_regression( X, diff --git a/sklearn/linear_model/tests/test_ridge.py b/sklearn/linear_model/tests/test_ridge.py index 167ce0bac4cba..9be28cac141b1 100644 --- a/sklearn/linear_model/tests/test_ridge.py +++ b/sklearn/linear_model/tests/test_ridge.py @@ -1020,7 +1020,7 @@ def _test_ridge_cv(sparse_container): ridge_cv.predict(X) assert len(ridge_cv.coef_.shape) == 1 - assert type(ridge_cv.intercept_) == np.float64 + assert type(ridge_cv.intercept_) is np.float64 cv = KFold(5) ridge_cv.set_params(cv=cv) @@ -1028,7 +1028,7 @@ def _test_ridge_cv(sparse_container): ridge_cv.predict(X) assert len(ridge_cv.coef_.shape) == 1 - assert type(ridge_cv.intercept_) == np.float64 + assert type(ridge_cv.intercept_) is np.float64 @pytest.mark.parametrize( diff --git a/sklearn/manifold/_mds.py b/sklearn/manifold/_mds.py index 760336da52e9f..d7e4877bf2f34 100644 --- a/sklearn/manifold/_mds.py +++ b/sklearn/manifold/_mds.py @@ -322,7 +322,7 @@ def smacof( [ 1.74..., -0.75...], [-1.79..., 1.83...]]) >>> stress - 0.0012... + np.float64(0.0012...) """ dissimilarities = check_array(dissimilarities) @@ -524,8 +524,11 @@ class MDS(BaseEstimator): >>> X_transformed.shape (100, 2) - For a more detailed example of usage, see: - :ref:`sphx_glr_auto_examples_manifold_plot_mds.py` + For a more detailed example of usage, see + :ref:`sphx_glr_auto_examples_manifold_plot_mds.py`. + + For a comparison of manifold learning techniques, see + :ref:`sphx_glr_auto_examples_manifold_plot_compare_methods.py`. """ _parameter_constraints: dict = { diff --git a/sklearn/manifold/meson.build b/sklearn/manifold/meson.build index b112f63dd4f2d..ee83e8afc5019 100644 --- a/sklearn/manifold/meson.build +++ b/sklearn/manifold/meson.build @@ -9,7 +9,7 @@ py.extension_module( py.extension_module( '_barnes_hut_tsne', '_barnes_hut_tsne.pyx', - dependencies: [np_dep], + dependencies: [np_dep, openmp_dep], cython_args: cython_args, subdir: 'sklearn/manifold', install: true diff --git a/sklearn/meson.build b/sklearn/meson.build index 4552082801337..4bf896fcdeaef 100644 --- a/sklearn/meson.build +++ b/sklearn/meson.build @@ -18,6 +18,48 @@ if is_mingw add_project_arguments('-mlong-double-64', language: 'c') endif +# Only check build dependencies version when not cross-compiling, as running +# Python interpreter can be tricky in cross-compilation settings. For more +# details, see https://docs.scipy.org/doc/scipy/building/cross_compilation.html +if not meson.is_cross_build() + if not py.version().version_compare('>=3.9') + error('scikit-learn requires Python>=3.9, got ' + py.version() + ' instead') + endif + + cython_min_version = run_command(py, ['_min_dependencies.py', 'cython'], check: true).stdout().strip() + if not cython.version().version_compare('>=' + cython_min_version) + error('scikit-learn requires Cython>=' + cython_min_version + ', got ' + cython.version() + ' instead') + endif + + numpy_version = run_command(py, + ['-c', 'import numpy; print(numpy.__version__)'], check: true).stdout().strip() + numpy_min_version = run_command(py, ['_min_dependencies.py', 'numpy'], check: true).stdout().strip() + if not numpy_version.version_compare('>=' + numpy_min_version) + error('scikit-learn requires numpy>=' + numpy_min_version + ', got ' + numpy_version + ' instead') + endif + + scipy_version = run_command(py, + ['-c', 'import scipy; print(scipy.__version__)'], check: true).stdout().strip() + scipy_min_version = run_command(py, ['_min_dependencies.py', 'scipy'], check: true).stdout().strip() + if not scipy_version.version_compare('>=' + scipy_min_version) + error('scikit-learn requires scipy>=' + scipy_min_version + ', got ' + scipy_version + ' instead') + endif + + # meson-python is required only when going through pip. Using meson directly + # should not check meson-python version. + meson_python_version_command_result = run_command(py, + ['-c', 'import mesonpy; print(mesonpy.__version__)'], check: false) + meson_python_installed = meson_python_version_command_result.returncode() == 0 + if meson_python_installed + meson_python_version = meson_python_version_command_result.stdout().strip() + meson_python_min_version = run_command(py, ['_min_dependencies.py', 'meson-python'], check: true).stdout().strip() + if not meson_python_version.version_compare('>=' + meson_python_min_version) + error('scikit-learn requires meson-python>=' + meson_python_min_version + ', got ' + meson_python_version + ' instead') + endif + endif + +endif + # Adapted from scipy, each project seems to have its own tweaks for this. One # day using dependency('numpy') will be a thing, see # https://github.com/mesonbuild/meson/issues/9598. diff --git a/sklearn/metrics/_classification.py b/sklearn/metrics/_classification.py index 703fe18b0d67c..3f11d95c0c7ab 100644 --- a/sklearn/metrics/_classification.py +++ b/sklearn/metrics/_classification.py @@ -337,7 +337,7 @@ def confusion_matrix( >>> tn, fp, fn, tp = confusion_matrix([0, 1, 0, 1], [1, 1, 1, 0]).ravel() >>> (tn, fp, fn, tp) - (0, 2, 1, 1) + (np.int64(0), np.int64(2), np.int64(1), np.int64(1)) """ y_type, y_true, y_pred = _check_targets(y_true, y_pred) if y_type not in ("binary", "multiclass"): @@ -708,7 +708,7 @@ class labels [2]_. >>> y1 = ["negative", "positive", "negative", "neutral", "positive"] >>> y2 = ["negative", "positive", "negative", "neutral", "negative"] >>> cohen_kappa_score(y1, y2) - 0.6875 + np.float64(0.6875) """ confusion = confusion_matrix(y1, y2, labels=labels, sample_weight=sample_weight) n_classes = confusion.shape[0] @@ -867,19 +867,19 @@ def jaccard_score( In the binary case: >>> jaccard_score(y_true[0], y_pred[0]) - 0.6666... + np.float64(0.6666...) In the 2D comparison case (e.g. image similarity): >>> jaccard_score(y_true, y_pred, average="micro") - 0.6 + np.float64(0.6) In the multilabel case: >>> jaccard_score(y_true, y_pred, average='samples') - 0.5833... + np.float64(0.5833...) >>> jaccard_score(y_true, y_pred, average='macro') - 0.6666... + np.float64(0.6666...) >>> jaccard_score(y_true, y_pred, average=None) array([0.5, 0.5, 1. ]) @@ -998,7 +998,7 @@ def matthews_corrcoef(y_true, y_pred, *, sample_weight=None): >>> y_true = [+1, +1, +1, -1] >>> y_pred = [+1, -1, +1, +1] >>> matthews_corrcoef(y_true, y_pred) - -0.33... + np.float64(-0.33...) """ y_type, y_true, y_pred = _check_targets(y_true, y_pred) check_consistent_length(y_true, y_pred, sample_weight) @@ -1266,11 +1266,11 @@ def f1_score( >>> y_true = [0, 1, 2, 0, 1, 2] >>> y_pred = [0, 2, 1, 0, 0, 1] >>> f1_score(y_true, y_pred, average='macro') - 0.26... + np.float64(0.26...) >>> f1_score(y_true, y_pred, average='micro') - 0.33... + np.float64(0.33...) >>> f1_score(y_true, y_pred, average='weighted') - 0.26... + np.float64(0.26...) >>> f1_score(y_true, y_pred, average=None) array([0.8, 0. , 0. ]) @@ -1278,9 +1278,9 @@ def f1_score( >>> y_true_empty = [0, 0, 0, 0, 0, 0] >>> y_pred_empty = [0, 0, 0, 0, 0, 0] >>> f1_score(y_true_empty, y_pred_empty) - 0.0... + np.float64(0.0...) >>> f1_score(y_true_empty, y_pred_empty, zero_division=1.0) - 1.0... + np.float64(1.0...) >>> f1_score(y_true_empty, y_pred_empty, zero_division=np.nan) nan... @@ -1469,17 +1469,17 @@ def fbeta_score( >>> y_true = [0, 1, 2, 0, 1, 2] >>> y_pred = [0, 2, 1, 0, 0, 1] >>> fbeta_score(y_true, y_pred, average='macro', beta=0.5) - 0.23... + np.float64(0.23...) >>> fbeta_score(y_true, y_pred, average='micro', beta=0.5) - 0.33... + np.float64(0.33...) >>> fbeta_score(y_true, y_pred, average='weighted', beta=0.5) - 0.23... + np.float64(0.23...) >>> fbeta_score(y_true, y_pred, average=None, beta=0.5) array([0.71..., 0. , 0. ]) >>> y_pred_empty = [0, 0, 0, 0, 0, 0] >>> fbeta_score(y_true, y_pred_empty, ... average="macro", zero_division=np.nan, beta=0.5) - 0.12... + np.float64(0.12...) """ _, _, f, _ = precision_recall_fscore_support( @@ -1770,11 +1770,11 @@ def precision_recall_fscore_support( >>> y_true = np.array(['cat', 'dog', 'pig', 'cat', 'dog', 'pig']) >>> y_pred = np.array(['cat', 'pig', 'dog', 'cat', 'cat', 'dog']) >>> precision_recall_fscore_support(y_true, y_pred, average='macro') - (0.22..., 0.33..., 0.26..., None) + (np.float64(0.22...), np.float64(0.33...), np.float64(0.26...), None) >>> precision_recall_fscore_support(y_true, y_pred, average='micro') - (0.33..., 0.33..., 0.33..., None) + (np.float64(0.33...), np.float64(0.33...), np.float64(0.33...), None) >>> precision_recall_fscore_support(y_true, y_pred, average='weighted') - (0.22..., 0.33..., 0.26..., None) + (np.float64(0.22...), np.float64(0.33...), np.float64(0.26...), None) It is possible to compute per-label precisions, recalls, F1-scores and supports instead of averaging: @@ -1955,15 +1955,15 @@ class after being classified as negative. This is the case when the >>> import numpy as np >>> from sklearn.metrics import class_likelihood_ratios >>> class_likelihood_ratios([0, 1, 0, 1, 0], [1, 1, 0, 0, 0]) - (1.5, 0.75) + (np.float64(1.5), np.float64(0.75)) >>> y_true = np.array(["non-cat", "cat", "non-cat", "cat", "non-cat"]) >>> y_pred = np.array(["cat", "cat", "non-cat", "non-cat", "non-cat"]) >>> class_likelihood_ratios(y_true, y_pred) - (1.33..., 0.66...) + (np.float64(1.33...), np.float64(0.66...)) >>> y_true = np.array(["non-zebra", "zebra", "non-zebra", "zebra", "non-zebra"]) >>> y_pred = np.array(["zebra", "zebra", "non-zebra", "non-zebra", "non-zebra"]) >>> class_likelihood_ratios(y_true, y_pred) - (1.5, 0.75) + (np.float64(1.5), np.float64(0.75)) To avoid ambiguities, use the notation `labels=[negative_class, positive_class]` @@ -1971,7 +1971,7 @@ class after being classified as negative. This is the case when the >>> y_true = np.array(["non-cat", "cat", "non-cat", "cat", "non-cat"]) >>> y_pred = np.array(["cat", "cat", "non-cat", "non-cat", "non-cat"]) >>> class_likelihood_ratios(y_true, y_pred, labels=["non-cat", "cat"]) - (1.5, 0.75) + (np.float64(1.5), np.float64(0.75)) """ y_type, y_true, y_pred = _check_targets(y_true, y_pred) @@ -2180,11 +2180,11 @@ def precision_score( >>> y_true = [0, 1, 2, 0, 1, 2] >>> y_pred = [0, 2, 1, 0, 0, 1] >>> precision_score(y_true, y_pred, average='macro') - 0.22... + np.float64(0.22...) >>> precision_score(y_true, y_pred, average='micro') - 0.33... + np.float64(0.33...) >>> precision_score(y_true, y_pred, average='weighted') - 0.22... + np.float64(0.22...) >>> precision_score(y_true, y_pred, average=None) array([0.66..., 0. , 0. ]) >>> y_pred = [0, 0, 0, 0, 0, 0] @@ -2361,11 +2361,11 @@ def recall_score( >>> y_true = [0, 1, 2, 0, 1, 2] >>> y_pred = [0, 2, 1, 0, 0, 1] >>> recall_score(y_true, y_pred, average='macro') - 0.33... + np.float64(0.33...) >>> recall_score(y_true, y_pred, average='micro') - 0.33... + np.float64(0.33...) >>> recall_score(y_true, y_pred, average='weighted') - 0.33... + np.float64(0.33...) >>> recall_score(y_true, y_pred, average=None) array([1., 0., 0.]) >>> y_true = [0, 0, 0, 0, 0, 0] @@ -2471,7 +2471,7 @@ def balanced_accuracy_score(y_true, y_pred, *, sample_weight=None, adjusted=Fals >>> y_true = [0, 1, 0, 0, 1, 0] >>> y_pred = [0, 1, 0, 0, 0, 1] >>> balanced_accuracy_score(y_true, y_pred) - 0.625 + np.float64(0.625) """ C = confusion_matrix(y_true, y_pred, sample_weight=sample_weight) with np.errstate(divide="ignore", invalid="ignore"): @@ -3059,7 +3059,7 @@ def hinge_loss(y_true, pred_decision, *, labels=None, sample_weight=None): >>> pred_decision array([-2.18..., 2.36..., 0.09...]) >>> hinge_loss([-1, 1, 1], pred_decision) - 0.30... + np.float64(0.30...) In the multiclass case: @@ -3073,7 +3073,7 @@ def hinge_loss(y_true, pred_decision, *, labels=None, sample_weight=None): >>> pred_decision = est.decision_function([[-1], [2], [3]]) >>> y_true = [0, 2, 3] >>> hinge_loss(y_true, pred_decision, labels=labels) - 0.56... + np.float64(0.56...) """ check_consistent_length(y_true, pred_decision, sample_weight) pred_decision = check_array(pred_decision, ensure_2d=False) @@ -3219,13 +3219,13 @@ def brier_score_loss( >>> y_true_categorical = np.array(["spam", "ham", "ham", "spam"]) >>> y_prob = np.array([0.1, 0.9, 0.8, 0.3]) >>> brier_score_loss(y_true, y_prob) - 0.037... + np.float64(0.037...) >>> brier_score_loss(y_true, 1-y_prob, pos_label=0) - 0.037... + np.float64(0.037...) >>> brier_score_loss(y_true_categorical, y_prob, pos_label="ham") - 0.037... + np.float64(0.037...) >>> brier_score_loss(y_true, np.array(y_prob) > 0.5) - 0.0 + np.float64(0.0) """ # TODO(1.7): remove in 1.7 and reset y_proba to be required # Note: validate params will raise an error if y_prob is not array-like, diff --git a/sklearn/metrics/_pairwise_distances_reduction/meson.build b/sklearn/metrics/_pairwise_distances_reduction/meson.build index 52ea6062da26b..76760ac271cef 100644 --- a/sklearn/metrics/_pairwise_distances_reduction/meson.build +++ b/sklearn/metrics/_pairwise_distances_reduction/meson.build @@ -39,7 +39,7 @@ _datasets_pair_pyx = custom_target( _datasets_pair = py.extension_module( '_datasets_pair', _datasets_pair_pyx, - dependencies: [np_dep, openmp_dep], + dependencies: [np_dep], override_options: ['cython_language=cpp'], cython_args: cython_args, subdir: 'sklearn/metrics/_pairwise_distances_reduction', @@ -94,7 +94,7 @@ _middle_term_computer_pyx = custom_target( _middle_term_computer = py.extension_module( '_middle_term_computer', _middle_term_computer_pyx, - dependencies: [np_dep, openmp_dep], + dependencies: [np_dep], override_options: ['cython_language=cpp'], cython_args: cython_args, subdir: 'sklearn/metrics/_pairwise_distances_reduction', @@ -172,7 +172,7 @@ _argkmin_classmode_pyx = custom_target( _argkmin_classmode = py.extension_module( '_argkmin_classmode', _argkmin_classmode_pyx, - dependencies: [np_dep], + dependencies: [np_dep, openmp_dep], override_options: ['cython_language=cpp'], cython_args: cython_args, # XXX: for some reason -fno-sized-deallocation is needed otherwise there is @@ -199,7 +199,7 @@ _radius_neighbors_classmode_pyx = custom_target( _radius_neighbors_classmode = py.extension_module( '_radius_neighbors_classmode', _radius_neighbors_classmode_pyx, - dependencies: [np_dep], + dependencies: [np_dep, openmp_dep], override_options: ['cython_language=cpp'], cython_args: cython_args, subdir: 'sklearn/metrics/_pairwise_distances_reduction', diff --git a/sklearn/metrics/_ranking.py b/sklearn/metrics/_ranking.py index 6a53fb542fd32..29594ec949b19 100644 --- a/sklearn/metrics/_ranking.py +++ b/sklearn/metrics/_ranking.py @@ -85,7 +85,7 @@ def auc(x, y): >>> pred = np.array([0.1, 0.4, 0.35, 0.8]) >>> fpr, tpr, thresholds = metrics.roc_curve(y, pred, pos_label=2) >>> metrics.auc(fpr, tpr) - 0.75 + np.float64(0.75) """ check_consistent_length(x, y) x = column_or_1d(x) @@ -210,7 +210,7 @@ def average_precision_score( >>> y_true = np.array([0, 0, 1, 1]) >>> y_scores = np.array([0.1, 0.4, 0.35, 0.8]) >>> average_precision_score(y_true, y_scores) - 0.83... + np.float64(0.83...) >>> y_true = np.array([0, 0, 1, 1, 2, 2]) >>> y_scores = np.array([ ... [0.7, 0.2, 0.1], @@ -221,7 +221,7 @@ def average_precision_score( ... [0.1, 0.2, 0.7], ... ]) >>> average_precision_score(y_true, y_scores) - 0.77... + np.float64(0.77...) """ def _binary_uninterpolated_average_precision( @@ -582,9 +582,9 @@ class scores must correspond to the order of ``labels``, >>> X, y = load_breast_cancer(return_X_y=True) >>> clf = LogisticRegression(solver="liblinear", random_state=0).fit(X, y) >>> roc_auc_score(y, clf.predict_proba(X)[:, 1]) - 0.99... + np.float64(0.99...) >>> roc_auc_score(y, clf.decision_function(X)) - 0.99... + np.float64(0.99...) Multiclass case: @@ -592,7 +592,7 @@ class scores must correspond to the order of ``labels``, >>> X, y = load_iris(return_X_y=True) >>> clf = LogisticRegression(solver="liblinear").fit(X, y) >>> roc_auc_score(y, clf.predict_proba(X), multi_class='ovr') - 0.99... + np.float64(0.99...) Multilabel case: @@ -1241,7 +1241,7 @@ def label_ranking_average_precision_score(y_true, y_score, *, sample_weight=None >>> y_true = np.array([[1, 0, 0], [0, 0, 1]]) >>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]]) >>> label_ranking_average_precision_score(y_true, y_score) - 0.416... + np.float64(0.416...) """ check_consistent_length(y_true, y_score, sample_weight) y_true = check_array(y_true, ensure_2d=False, accept_sparse="csr") @@ -1344,7 +1344,7 @@ def coverage_error(y_true, y_score, *, sample_weight=None): >>> y_true = [[1, 0, 0], [0, 1, 1]] >>> y_score = [[1, 0, 0], [0, 1, 1]] >>> coverage_error(y_true, y_score) - 1.5 + np.float64(1.5) """ y_true = check_array(y_true, ensure_2d=True) y_score = check_array(y_score, ensure_2d=True) @@ -1421,7 +1421,7 @@ def label_ranking_loss(y_true, y_score, *, sample_weight=None): >>> y_true = [[1, 0, 0], [0, 0, 1]] >>> y_score = [[0.75, 0.5, 1], [1, 0.2, 0.1]] >>> label_ranking_loss(y_true, y_score) - 0.75... + np.float64(0.75...) """ y_true = check_array(y_true, ensure_2d=False, accept_sparse="csr") y_score = check_array(y_score, ensure_2d=False) @@ -1677,22 +1677,22 @@ def dcg_score( >>> # we predict scores for the answers >>> scores = np.asarray([[.1, .2, .3, 4, 70]]) >>> dcg_score(true_relevance, scores) - 9.49... + np.float64(9.49...) >>> # we can set k to truncate the sum; only top k answers contribute >>> dcg_score(true_relevance, scores, k=2) - 5.63... + np.float64(5.63...) >>> # now we have some ties in our prediction >>> scores = np.asarray([[1, 0, 0, 0, 1]]) >>> # by default ties are averaged, so here we get the average true >>> # relevance of our top predictions: (10 + 5) / 2 = 7.5 >>> dcg_score(true_relevance, scores, k=1) - 7.5 + np.float64(7.5) >>> # we can choose to ignore ties for faster results, but only >>> # if we know there aren't ties in our scores, otherwise we get >>> # wrong results: >>> dcg_score(true_relevance, ... scores, k=1, ignore_ties=True) - 5.0 + np.float64(5.0) """ y_true = check_array(y_true, ensure_2d=False) y_score = check_array(y_score, ensure_2d=False) @@ -1837,29 +1837,29 @@ def ndcg_score(y_true, y_score, *, k=None, sample_weight=None, ignore_ties=False >>> # we predict some scores (relevance) for the answers >>> scores = np.asarray([[.1, .2, .3, 4, 70]]) >>> ndcg_score(true_relevance, scores) - 0.69... + np.float64(0.69...) >>> scores = np.asarray([[.05, 1.1, 1., .5, .0]]) >>> ndcg_score(true_relevance, scores) - 0.49... + np.float64(0.49...) >>> # we can set k to truncate the sum; only top k answers contribute. >>> ndcg_score(true_relevance, scores, k=4) - 0.35... + np.float64(0.35...) >>> # the normalization takes k into account so a perfect answer >>> # would still get 1.0 >>> ndcg_score(true_relevance, true_relevance, k=4) - 1.0... + np.float64(1.0...) >>> # now we have some ties in our prediction >>> scores = np.asarray([[1, 0, 0, 0, 1]]) >>> # by default ties are averaged, so here we get the average (normalized) >>> # true relevance of our top predictions: (10 / 10 + 5 / 10) / 2 = .75 >>> ndcg_score(true_relevance, scores, k=1) - 0.75... + np.float64(0.75...) >>> # we can choose to ignore ties for faster results, but only >>> # if we know there aren't ties in our scores, otherwise we get >>> # wrong results: >>> ndcg_score(true_relevance, ... scores, k=1, ignore_ties=True) - 0.5... + np.float64(0.5...) """ y_true = check_array(y_true, ensure_2d=False) y_score = check_array(y_score, ensure_2d=False) @@ -1962,10 +1962,10 @@ def top_k_accuracy_score( ... [0.2, 0.4, 0.3], # 2 is in top 2 ... [0.7, 0.2, 0.1]]) # 2 isn't in top 2 >>> top_k_accuracy_score(y_true, y_score, k=2) - 0.75 + np.float64(0.75) >>> # Not normalizing gives the number of "correctly" classified samples >>> top_k_accuracy_score(y_true, y_score, k=2, normalize=False) - 3 + np.int64(3) """ y_true = check_array(y_true, ensure_2d=False, dtype=None) y_true = column_or_1d(y_true) diff --git a/sklearn/metrics/_regression.py b/sklearn/metrics/_regression.py index b5605f18803ab..f9d8717198394 100644 --- a/sklearn/metrics/_regression.py +++ b/sklearn/metrics/_regression.py @@ -203,15 +203,15 @@ def mean_absolute_error( >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> mean_absolute_error(y_true, y_pred) - 0.5 + np.float64(0.5) >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> mean_absolute_error(y_true, y_pred) - 0.75 + np.float64(0.75) >>> mean_absolute_error(y_true, y_pred, multioutput='raw_values') array([0.5, 1. ]) >>> mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7]) - 0.85... + np.float64(0.85...) """ y_type, y_true, y_pred, multioutput = _check_reg_targets( y_true, y_pred, multioutput @@ -287,17 +287,17 @@ def mean_pinball_loss( >>> from sklearn.metrics import mean_pinball_loss >>> y_true = [1, 2, 3] >>> mean_pinball_loss(y_true, [0, 2, 3], alpha=0.1) - 0.03... + np.float64(0.03...) >>> mean_pinball_loss(y_true, [1, 2, 4], alpha=0.1) - 0.3... + np.float64(0.3...) >>> mean_pinball_loss(y_true, [0, 2, 3], alpha=0.9) - 0.3... + np.float64(0.3...) >>> mean_pinball_loss(y_true, [1, 2, 4], alpha=0.9) - 0.03... + np.float64(0.03...) >>> mean_pinball_loss(y_true, y_true, alpha=0.1) - 0.0 + np.float64(0.0) >>> mean_pinball_loss(y_true, y_true, alpha=0.9) - 0.0 + np.float64(0.0) """ y_type, y_true, y_pred, multioutput = _check_reg_targets( y_true, y_pred, multioutput @@ -382,19 +382,19 @@ def mean_absolute_percentage_error( >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> mean_absolute_percentage_error(y_true, y_pred) - 0.3273... + np.float64(0.3273...) >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> mean_absolute_percentage_error(y_true, y_pred) - 0.5515... + np.float64(0.5515...) >>> mean_absolute_percentage_error(y_true, y_pred, multioutput=[0.3, 0.7]) - 0.6198... + np.float64(0.6198...) >>> # the value when some element of the y_true is zero is arbitrarily high because >>> # of the division by epsilon >>> y_true = [1., 0., 2.4, 7.] >>> y_pred = [1.2, 0.1, 2.4, 8.] >>> mean_absolute_percentage_error(y_true, y_pred) - 112589990684262.48 + np.float64(112589990684262.48) """ y_type, y_true, y_pred, multioutput = _check_reg_targets( y_true, y_pred, multioutput @@ -477,15 +477,15 @@ def mean_squared_error( >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> mean_squared_error(y_true, y_pred) - 0.375 + np.float64(0.375) >>> y_true = [[0.5, 1],[-1, 1],[7, -6]] >>> y_pred = [[0, 2],[-1, 2],[8, -5]] >>> mean_squared_error(y_true, y_pred) - 0.708... + np.float64(0.708...) >>> mean_squared_error(y_true, y_pred, multioutput='raw_values') array([0.41666667, 1. ]) >>> mean_squared_error(y_true, y_pred, multioutput=[0.3, 0.7]) - 0.825... + np.float64(0.825...) """ # TODO(1.6): remove if squared != "deprecated": @@ -571,11 +571,11 @@ def root_mean_squared_error( >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> root_mean_squared_error(y_true, y_pred) - 0.612... + np.float64(0.612...) >>> y_true = [[0.5, 1],[-1, 1],[7, -6]] >>> y_pred = [[0, 2],[-1, 2],[8, -5]] >>> root_mean_squared_error(y_true, y_pred) - 0.822... + np.float64(0.822...) """ output_errors = np.sqrt( mean_squared_error( @@ -660,15 +660,15 @@ def mean_squared_log_error( >>> y_true = [3, 5, 2.5, 7] >>> y_pred = [2.5, 5, 4, 8] >>> mean_squared_log_error(y_true, y_pred) - 0.039... + np.float64(0.039...) >>> y_true = [[0.5, 1], [1, 2], [7, 6]] >>> y_pred = [[0.5, 2], [1, 2.5], [8, 8]] >>> mean_squared_log_error(y_true, y_pred) - 0.044... + np.float64(0.044...) >>> mean_squared_log_error(y_true, y_pred, multioutput='raw_values') array([0.00462428, 0.08377444]) >>> mean_squared_log_error(y_true, y_pred, multioutput=[0.3, 0.7]) - 0.060... + np.float64(0.060...) """ # TODO(1.6): remove if squared != "deprecated": @@ -759,7 +759,7 @@ def root_mean_squared_log_error( >>> y_true = [3, 5, 2.5, 7] >>> y_pred = [2.5, 5, 4, 8] >>> root_mean_squared_log_error(y_true, y_pred) - 0.199... + np.float64(0.199...) """ _, y_true, y_pred, multioutput = _check_reg_targets(y_true, y_pred, multioutput) check_consistent_length(y_true, y_pred, sample_weight) @@ -833,15 +833,15 @@ def median_absolute_error( >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> median_absolute_error(y_true, y_pred) - 0.5 + np.float64(0.5) >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> median_absolute_error(y_true, y_pred) - 0.75 + np.float64(0.75) >>> median_absolute_error(y_true, y_pred, multioutput='raw_values') array([0.5, 1. ]) >>> median_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7]) - 0.85 + np.float64(0.85) """ y_type, y_true, y_pred, multioutput = _check_reg_targets( y_true, y_pred, multioutput @@ -1266,7 +1266,7 @@ def max_error(y_true, y_pred): >>> y_true = [3, 2, 7, 1] >>> y_pred = [4, 2, 7, 1] >>> max_error(y_true, y_pred) - 1 + np.int64(1) """ y_type, y_true, y_pred, _ = _check_reg_targets(y_true, y_pred, None) if y_type == "continuous-multioutput": @@ -1361,7 +1361,7 @@ def mean_tweedie_deviance(y_true, y_pred, *, sample_weight=None, power=0): >>> y_true = [2, 0, 1, 4] >>> y_pred = [0.5, 0.5, 2., 2.] >>> mean_tweedie_deviance(y_true, y_pred, power=1) - 1.4260... + np.float64(1.4260...) """ y_type, y_true, y_pred, _ = _check_reg_targets( y_true, y_pred, None, dtype=[np.float64, np.float32] @@ -1437,7 +1437,7 @@ def mean_poisson_deviance(y_true, y_pred, *, sample_weight=None): >>> y_true = [2, 0, 1, 4] >>> y_pred = [0.5, 0.5, 2., 2.] >>> mean_poisson_deviance(y_true, y_pred) - 1.4260... + np.float64(1.4260...) """ return mean_tweedie_deviance(y_true, y_pred, sample_weight=sample_weight, power=1) @@ -1481,7 +1481,7 @@ def mean_gamma_deviance(y_true, y_pred, *, sample_weight=None): >>> y_true = [2, 0.5, 1, 4] >>> y_pred = [0.5, 0.5, 2., 2.] >>> mean_gamma_deviance(y_true, y_pred) - 1.0568... + np.float64(1.0568...) """ return mean_tweedie_deviance(y_true, y_pred, sample_weight=sample_weight, power=2) @@ -1567,13 +1567,13 @@ def d2_tweedie_score(y_true, y_pred, *, sample_weight=None, power=0): >>> y_true = [0.5, 1, 2.5, 7] >>> y_pred = [1, 1, 5, 3.5] >>> d2_tweedie_score(y_true, y_pred) - 0.285... + np.float64(0.285...) >>> d2_tweedie_score(y_true, y_pred, power=1) - 0.487... + np.float64(0.487...) >>> d2_tweedie_score(y_true, y_pred, power=2) - 0.630... + np.float64(0.630...) >>> d2_tweedie_score(y_true, y_true, power=2) - 1.0 + np.float64(1.0) """ y_type, y_true, y_pred, _ = _check_reg_targets( y_true, y_pred, None, dtype=[np.float64, np.float32] @@ -1683,13 +1683,13 @@ def d2_pinball_score( >>> y_true = [1, 2, 3] >>> y_pred = [1, 3, 3] >>> d2_pinball_score(y_true, y_pred) - 0.5 + np.float64(0.5) >>> d2_pinball_score(y_true, y_pred, alpha=0.9) - 0.772... + np.float64(0.772...) >>> d2_pinball_score(y_true, y_pred, alpha=0.1) - -1.045... + np.float64(-1.045...) >>> d2_pinball_score(y_true, y_true, alpha=0.1) - 1.0 + np.float64(1.0) """ y_type, y_true, y_pred, multioutput = _check_reg_targets( y_true, y_pred, multioutput @@ -1826,25 +1826,25 @@ def d2_absolute_error_score( >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> d2_absolute_error_score(y_true, y_pred) - 0.764... + np.float64(0.764...) >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> d2_absolute_error_score(y_true, y_pred, multioutput='uniform_average') - 0.691... + np.float64(0.691...) >>> d2_absolute_error_score(y_true, y_pred, multioutput='raw_values') array([0.8125 , 0.57142857]) >>> y_true = [1, 2, 3] >>> y_pred = [1, 2, 3] >>> d2_absolute_error_score(y_true, y_pred) - 1.0 + np.float64(1.0) >>> y_true = [1, 2, 3] >>> y_pred = [2, 2, 2] >>> d2_absolute_error_score(y_true, y_pred) - 0.0 + np.float64(0.0) >>> y_true = [1, 2, 3] >>> y_pred = [3, 2, 1] >>> d2_absolute_error_score(y_true, y_pred) - -1.0 + np.float64(-1.0) """ return d2_pinball_score( y_true, y_pred, sample_weight=sample_weight, alpha=0.5, multioutput=multioutput diff --git a/sklearn/metrics/cluster/_bicluster.py b/sklearn/metrics/cluster/_bicluster.py index 713d0bee8fa2e..0d1d3820b8ab3 100644 --- a/sklearn/metrics/cluster/_bicluster.py +++ b/sklearn/metrics/cluster/_bicluster.py @@ -57,8 +57,9 @@ def _pairwise_similarity(a, b, similarity): def consensus_score(a, b, *, similarity="jaccard"): """The similarity of two sets of biclusters. - Similarity between individual biclusters is computed. Then the - best matching between sets is found using the Hungarian algorithm. + Similarity between individual biclusters is computed. Then the best + matching between sets is found by solving a linear sum assignment problem, + using a modified Jonker-Volgenant algorithm. The final score is the sum of similarities divided by the size of the larger set. @@ -83,9 +84,12 @@ def consensus_score(a, b, *, similarity="jaccard"): Consensus score, a non-negative value, sum of similarities divided by size of larger set. + See Also + -------- + scipy.optimize.linear_sum_assignment : Solve the linear sum assignment problem. + References ---------- - * Hochreiter, Bodenhofer, et. al., 2010. `FABIA: factor analysis for bicluster acquisition `__. @@ -96,7 +100,7 @@ def consensus_score(a, b, *, similarity="jaccard"): >>> a = ([[True, False], [False, True]], [[False, True], [True, False]]) >>> b = ([[False, True], [True, False]], [[True, False], [False, True]]) >>> consensus_score(a, b, similarity='jaccard') - 1.0 + np.float64(1.0) """ if similarity == "jaccard": similarity = _jaccard diff --git a/sklearn/metrics/cluster/_supervised.py b/sklearn/metrics/cluster/_supervised.py index 1f72eae3725f6..e11eca535cbcd 100644 --- a/sklearn/metrics/cluster/_supervised.py +++ b/sklearn/metrics/cluster/_supervised.py @@ -328,7 +328,7 @@ def rand_score(labels_true, labels_pred): are complete but may not always be pure, hence penalized: >>> rand_score([0, 0, 1, 2], [0, 0, 1, 1]) - 0.83... + np.float64(0.83...) """ contingency = pair_confusion_matrix(labels_true, labels_pred) numerator = contingency.diagonal().sum() @@ -524,7 +524,7 @@ def homogeneity_completeness_v_measure(labels_true, labels_pred, *, beta=1.0): >>> from sklearn.metrics import homogeneity_completeness_v_measure >>> y_true, y_pred = [0, 0, 1, 1, 2, 2], [0, 0, 1, 2, 2, 2] >>> homogeneity_completeness_v_measure(y_true, y_pred) - (0.71..., 0.77..., 0.73...) + (np.float64(0.71...), np.float64(0.77...), np.float64(0.73...)) """ labels_true, labels_pred = check_clusterings(labels_true, labels_pred) @@ -608,7 +608,7 @@ def homogeneity_score(labels_true, labels_pred): >>> from sklearn.metrics.cluster import homogeneity_score >>> homogeneity_score([0, 0, 1, 1], [1, 1, 0, 0]) - 1.0 + np.float64(1.0) Non-perfect labelings that further split classes into more clusters can be perfectly homogeneous:: @@ -684,7 +684,7 @@ def completeness_score(labels_true, labels_pred): >>> from sklearn.metrics.cluster import completeness_score >>> completeness_score([0, 0, 1, 1], [1, 1, 0, 0]) - 1.0 + np.float64(1.0) Non-perfect labelings that assign all classes members to the same clusters are still complete:: @@ -773,9 +773,9 @@ def v_measure_score(labels_true, labels_pred, *, beta=1.0): >>> from sklearn.metrics.cluster import v_measure_score >>> v_measure_score([0, 0, 1, 1], [0, 0, 1, 1]) - 1.0 + np.float64(1.0) >>> v_measure_score([0, 0, 1, 1], [1, 1, 0, 0]) - 1.0 + np.float64(1.0) Labelings that assign all classes members to the same clusters are complete but not homogeneous, hence penalized:: @@ -881,7 +881,7 @@ def mutual_info_score(labels_true, labels_pred, *, contingency=None): >>> labels_true = [0, 1, 1, 0, 1, 0] >>> labels_pred = [0, 1, 0, 0, 1, 1] >>> mutual_info_score(labels_true, labels_pred) - 0.056... + np.float64(0.056...) """ if contingency is None: labels_true, labels_pred = check_clusterings(labels_true, labels_pred) @@ -1191,13 +1191,13 @@ def fowlkes_mallows_score(labels_true, labels_pred, *, sparse=False): FMI = TP / sqrt((TP + FP) * (TP + FN)) - Where ``TP`` is the number of **True Positive** (i.e. the number of pair of - points that belongs in the same clusters in both ``labels_true`` and + Where ``TP`` is the number of **True Positive** (i.e. the number of pairs of + points that belong to the same cluster in both ``labels_true`` and ``labels_pred``), ``FP`` is the number of **False Positive** (i.e. the - number of pair of points that belongs in the same clusters in - ``labels_true`` and not in ``labels_pred``) and ``FN`` is the number of - **False Negative** (i.e. the number of pair of points that belongs in the - same clusters in ``labels_pred`` and not in ``labels_True``). + number of pairs of points that belong to the same cluster in + ``labels_pred`` but not in ``labels_true``) and ``FN`` is the number of + **False Negative** (i.e. the number of pairs of points that belong to the + same cluster in ``labels_true`` but not in ``labels_pred``). The score ranges from 0 to 1. A high value indicates a good similarity between two clusters. @@ -1238,9 +1238,9 @@ def fowlkes_mallows_score(labels_true, labels_pred, *, sparse=False): >>> from sklearn.metrics.cluster import fowlkes_mallows_score >>> fowlkes_mallows_score([0, 0, 1, 1], [0, 0, 1, 1]) - 1.0 + np.float64(1.0) >>> fowlkes_mallows_score([0, 0, 1, 1], [1, 1, 0, 0]) - 1.0 + np.float64(1.0) If classes members are completely split across different clusters, the assignment is totally random, hence the FMI is null:: diff --git a/sklearn/metrics/cluster/_unsupervised.py b/sklearn/metrics/cluster/_unsupervised.py index 8e032b971d54e..36a12ddadc5ea 100644 --- a/sklearn/metrics/cluster/_unsupervised.py +++ b/sklearn/metrics/cluster/_unsupervised.py @@ -128,7 +128,7 @@ def silhouette_score( >>> X, y = make_blobs(random_state=42) >>> kmeans = KMeans(n_clusters=2, random_state=42) >>> silhouette_score(X, kmeans.fit_predict(X)) - 0.49... + np.float64(0.49...) """ if sample_size is not None: X, labels = check_X_y(X, labels, accept_sparse=["csc", "csr"]) @@ -363,7 +363,7 @@ def calinski_harabasz_score(X, labels): >>> X, _ = make_blobs(random_state=0) >>> kmeans = KMeans(n_clusters=3, random_state=0,).fit(X) >>> calinski_harabasz_score(X, kmeans.labels_) - 114.8... + np.float64(114.8...) """ X, labels = check_X_y(X, labels) le = LabelEncoder() @@ -438,7 +438,7 @@ def davies_bouldin_score(X, labels): >>> X = [[0, 1], [1, 1], [3, 4]] >>> labels = [0, 0, 1] >>> davies_bouldin_score(X, labels) - 0.12... + np.float64(0.12...) """ X, labels = check_X_y(X, labels) le = LabelEncoder() diff --git a/sklearn/metrics/meson.build b/sklearn/metrics/meson.build index ef7b202c6f89c..2e01572144707 100644 --- a/sklearn/metrics/meson.build +++ b/sklearn/metrics/meson.build @@ -41,6 +41,7 @@ _dist_metrics = py.extension_module( py.extension_module( '_pairwise_fast', ['_pairwise_fast.pyx', metrics_cython_tree], + dependencies: [openmp_dep], cython_args: cython_args, subdir: 'sklearn/metrics', install: true diff --git a/sklearn/metrics/pairwise.py b/sklearn/metrics/pairwise.py index e3faffa77ae51..0892ee8c91c5a 100644 --- a/sklearn/metrics/pairwise.py +++ b/sklearn/metrics/pairwise.py @@ -1883,7 +1883,7 @@ def _dist_wrapper(dist_func, dist_matrix, slice_, *args, **kwargs): def _parallel_pairwise(X, Y, func, n_jobs, **kwds): """Break the pairwise matrix in n_jobs even slices - and compute them in parallel.""" + and compute them using multithreading.""" if Y is None: Y = X @@ -2272,8 +2272,8 @@ def pairwise_distances( n_jobs : int, default=None The number of jobs to use for the computation. This works by breaking - down the pairwise matrix into n_jobs even slices and computing them in - parallel. + down the pairwise matrix into n_jobs even slices and computing them + using multithreading. ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context. ``-1`` means using all processors. See :term:`Glossary ` @@ -2356,7 +2356,7 @@ def pairwise_distances( dtype = bool if metric in PAIRWISE_BOOLEAN_FUNCTIONS else "infer_float" - if dtype == bool and (X.dtype != bool or (Y is not None and Y.dtype != bool)): + if dtype is bool and (X.dtype != bool or (Y is not None and Y.dtype != bool)): msg = "Data was converted to boolean for metric %s" % metric warnings.warn(msg, DataConversionWarning) @@ -2517,8 +2517,8 @@ def pairwise_kernels( n_jobs : int, default=None The number of jobs to use for the computation. This works by breaking - down the pairwise matrix into n_jobs even slices and computing them in - parallel. + down the pairwise matrix into n_jobs even slices and computing them + using multithreading. ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context. ``-1`` means using all processors. See :term:`Glossary ` diff --git a/sklearn/model_selection/_search.py b/sklearn/model_selection/_search.py index 43fab5fce6e63..c6ae9823faf2a 100644 --- a/sklearn/model_selection/_search.py +++ b/sklearn/model_selection/_search.py @@ -893,9 +893,10 @@ def fit(self, X, y=None, **params): Parameters ---------- - X : array-like of shape (n_samples, n_features) - Training vector, where `n_samples` is the number of samples and - `n_features` is the number of features. + X : array-like of shape (n_samples, n_features) or (n_samples, n_samples) + Training vectors, where `n_samples` is the number of samples and + `n_features` is the number of features. For precomputed kernel or + distance matrix, the expected shape of X is (n_samples, n_samples). y : array-like of shape (n_samples, n_output) \ or (n_samples,), default=None @@ -1911,7 +1912,7 @@ class RandomizedSearchCV(BaseSearchCV): >>> clf = RandomizedSearchCV(logistic, distributions, random_state=0) >>> search = clf.fit(iris.data, iris.target) >>> search.best_params_ - {'C': 2..., 'penalty': 'l1'} + {'C': np.float64(2...), 'penalty': 'l1'} """ _required_parameters = ["estimator", "param_distributions"] diff --git a/sklearn/model_selection/_split.py b/sklearn/model_selection/_split.py index 3c3ecbcf1e1d3..35c9ed7878146 100644 --- a/sklearn/model_selection/_split.py +++ b/sklearn/model_selection/_split.py @@ -863,15 +863,15 @@ class StratifiedGroupKFold(GroupsConsumerMixin, _BaseKFold): Each group will appear exactly once in the test set across all folds (the number of distinct groups has to be at least equal to the number of folds). - The difference between :class:`~sklearn.model_selection.GroupKFold` - and :class:`~sklearn.model_selection.StratifiedGroupKFold` is that + The difference between :class:`GroupKFold` + and `StratifiedGroupKFold` is that the former attempts to create balanced folds such that the number of distinct groups is approximately the same in each fold, whereas - StratifiedGroupKFold attempts to create folds which preserve the + `StratifiedGroupKFold` attempts to create folds which preserve the percentage of samples for each class as much as possible given the constraint of non-overlapping groups between splits. - Read more in the :ref:`User Guide `. + Read more in the :ref:`User Guide `. For visualisation of cross-validation behaviour and comparison between common scikit-learn split methods @@ -1276,7 +1276,7 @@ class LeaveOneGroupOut(GroupsConsumerMixin, BaseCrossValidator): Provides train/test indices to split data such that each training set is comprised of all samples except ones belonging to one specific group. - Arbitrary domain specific group information is provided an array integers + Arbitrary domain specific group information is provided as an array of integers that encodes the group of each sample. For instance the groups could be the year of collection of the samples @@ -1892,8 +1892,9 @@ class ShuffleSplit(_UnsupportedGroupCVMixin, BaseShuffleSplit): Yields indices to split data into training and test sets. Note: contrary to other cross-validation strategies, random splits - do not guarantee that all folds will be different, although this is - still very likely for sizeable datasets. + do not guarantee that test sets across all folds will be mutually exclusive, + and might include overlapping samples. However, this is still very likely for + sizeable datasets. Read more in the :ref:`User Guide `. @@ -2000,17 +2001,22 @@ class GroupShuffleSplit(GroupsConsumerMixin, BaseShuffleSplit): For instance the groups could be the year of collection of the samples and thus allow for cross-validation against time-based splits. - The difference between LeavePGroupsOut and GroupShuffleSplit is that + The difference between :class:`LeavePGroupsOut` and ``GroupShuffleSplit`` is that the former generates splits using all subsets of size ``p`` unique groups, - whereas GroupShuffleSplit generates a user-determined number of random + whereas ``GroupShuffleSplit`` generates a user-determined number of random test splits, each with a user-determined fraction of unique groups. For example, a less computationally intensive alternative to ``LeavePGroupsOut(p=10)`` would be ``GroupShuffleSplit(test_size=10, n_splits=100)``. + Contrary to other cross-validation strategies, the random splits + do not guarantee that test sets across all folds will be mutually exclusive, + and might include overlapping samples. However, this is still very likely for + sizeable datasets. + Note: The parameters ``test_size`` and ``train_size`` refer to groups, and - not to samples, as in ShuffleSplit. + not to samples as in :class:`ShuffleSplit`. Read more in the :ref:`User Guide `. @@ -2023,14 +2029,12 @@ class GroupShuffleSplit(GroupsConsumerMixin, BaseShuffleSplit): n_splits : int, default=5 Number of re-shuffling & splitting iterations. - test_size : float, int, default=0.2 + test_size : float, int, default=None If float, should be between 0.0 and 1.0 and represent the proportion of groups to include in the test split (rounded up). If int, represents the absolute number of test groups. If None, the value is - set to the complement of the train size. - The default will change in version 0.21. It will remain 0.2 only - if ``train_size`` is unspecified, otherwise it will complement - the specified ``train_size``. + set to the complement of the train size. If ``train_size`` is also None, + it will be set to 0.2. train_size : float or int, default=None If float, should be between 0.0 and 1.0 and represent the @@ -2138,13 +2142,14 @@ class StratifiedShuffleSplit(BaseShuffleSplit): Provides train/test indices to split data in train/test sets. - This cross-validation object is a merge of StratifiedKFold and - ShuffleSplit, which returns stratified randomized folds. The folds + This cross-validation object is a merge of :class:`StratifiedKFold` and + :class:`ShuffleSplit`, which returns stratified randomized folds. The folds are made by preserving the percentage of samples for each class. - Note: like the ShuffleSplit strategy, stratified random splits - do not guarantee that all folds will be different, although this is - still very likely for sizeable datasets. + Note: like the :class:`ShuffleSplit` strategy, stratified random splits + do not guarantee that test sets across all folds will be mutually exclusive, + and might include overlapping samples. However, this is still very likely for + sizeable datasets. Read more in the :ref:`User Guide `. @@ -2895,7 +2900,7 @@ def _build_repr(self): value = getattr(self, key, None) if value is None and hasattr(self, "cvargs"): value = self.cvargs.get(key, None) - if len(w) and w[0].category == FutureWarning: + if len(w) and w[0].category is FutureWarning: # if the parameter is deprecated, don't show it continue finally: diff --git a/sklearn/model_selection/tests/test_validation.py b/sklearn/model_selection/tests/test_validation.py index a1a860b243249..0fd15eaa5c657 100644 --- a/sklearn/model_selection/tests/test_validation.py +++ b/sklearn/model_selection/tests/test_validation.py @@ -586,10 +586,10 @@ def custom_scorer(clf, X, y): ) # Make sure all the arrays are of np.ndarray type - assert type(cv_results["test_r2"]) == np.ndarray - assert type(cv_results["test_neg_mean_squared_error"]) == np.ndarray - assert type(cv_results["fit_time"]) == np.ndarray - assert type(cv_results["score_time"]) == np.ndarray + assert isinstance(cv_results["test_r2"], np.ndarray) + assert isinstance(cv_results["test_neg_mean_squared_error"], np.ndarray) + assert isinstance(cv_results["fit_time"], np.ndarray) + assert isinstance(cv_results["score_time"], np.ndarray) # Ensure all the times are within sane limits assert np.all(cv_results["fit_time"] >= 0) diff --git a/sklearn/neighbors/_nca.py b/sklearn/neighbors/_nca.py index b304c3fb9792f..49ef5bd1a5c8f 100644 --- a/sklearn/neighbors/_nca.py +++ b/sklearn/neighbors/_nca.py @@ -57,8 +57,8 @@ class NeighborhoodComponentsAnalysis( - `'auto'` Depending on `n_components`, the most reasonable initialization - will be chosen. If `n_components <= n_classes` we use `'lda'`, as - it uses labels information. If not, but + is chosen. If `n_components <= min(n_features, n_classes - 1)` + we use `'lda'`, as it uses labels information. If not, but `n_components < min(n_features, n_samples)`, we use `'pca'`, as it projects data in meaningful directions (those of higher variance). Otherwise, we just use `'identity'`. diff --git a/sklearn/neighbors/_regression.py b/sklearn/neighbors/_regression.py index 2897c1ce409e8..48a51ace630e6 100644 --- a/sklearn/neighbors/_regression.py +++ b/sklearn/neighbors/_regression.py @@ -49,6 +49,10 @@ class KNeighborsRegressor(KNeighborsMixin, RegressorMixin, NeighborsBase): Uniform weights are used by default. + See the following example for a demonstration of the impact of + different weighting schemes on predictions: + :ref:`sphx_glr_auto_examples_neighbors_plot_regression.py`. + algorithm : {'auto', 'ball_tree', 'kd_tree', 'brute'}, default='auto' Algorithm used to compute the nearest neighbors: diff --git a/sklearn/preprocessing/_label.py b/sklearn/preprocessing/_label.py index 301dc19bb1985..98684ac3c5506 100644 --- a/sklearn/preprocessing/_label.py +++ b/sklearn/preprocessing/_label.py @@ -74,11 +74,11 @@ class LabelEncoder(TransformerMixin, BaseEstimator, auto_wrap_output_keys=None): >>> le.fit(["paris", "paris", "tokyo", "amsterdam"]) LabelEncoder() >>> list(le.classes_) - ['amsterdam', 'paris', 'tokyo'] + [np.str_('amsterdam'), np.str_('paris'), np.str_('tokyo')] >>> le.transform(["tokyo", "tokyo", "paris"]) array([2, 2, 1]...) >>> list(le.inverse_transform([2, 2, 1])) - ['tokyo', 'tokyo', 'paris'] + [np.str_('tokyo'), np.str_('tokyo'), np.str_('paris')] """ def fit(self, y): diff --git a/sklearn/preprocessing/_target_encoder.py b/sklearn/preprocessing/_target_encoder.py index b3b7c3d5e7bd9..5a4e24c8bc5f5 100644 --- a/sklearn/preprocessing/_target_encoder.py +++ b/sklearn/preprocessing/_target_encoder.py @@ -172,7 +172,7 @@ class TargetEncoder(OneToOneFeatureMixin, _BaseEncoder): >>> # encodings: >>> enc_high_smooth = TargetEncoder(smooth=5000.0).fit(X, y) >>> enc_high_smooth.target_mean_ - 44... + np.float64(44...) >>> enc_high_smooth.encodings_ [array([44..., 44..., 44...])] diff --git a/sklearn/random_projection.py b/sklearn/random_projection.py index c6f7057396d4a..5c228ade8068d 100644 --- a/sklearn/random_projection.py +++ b/sklearn/random_projection.py @@ -119,7 +119,7 @@ def johnson_lindenstrauss_min_dim(n_samples, *, eps=0.1): -------- >>> from sklearn.random_projection import johnson_lindenstrauss_min_dim >>> johnson_lindenstrauss_min_dim(1e6, eps=0.5) - 663 + np.int64(663) >>> johnson_lindenstrauss_min_dim(1e6, eps=[0.5, 0.1, 0.01]) array([ 663, 11841, 1112658]) @@ -736,7 +736,7 @@ class SparseRandomProjection(BaseRandomProjection): (25, 2759) >>> # very few components are non-zero >>> np.mean(transformer.components_ != 0) - 0.0182... + np.float64(0.0182...) """ _parameter_constraints: dict = { diff --git a/sklearn/svm/_base.py b/sklearn/svm/_base.py index 47d4027c50754..01f9e19be1155 100644 --- a/sklearn/svm/_base.py +++ b/sklearn/svm/_base.py @@ -82,7 +82,7 @@ class BaseLibSVM(BaseEstimator, metaclass=ABCMeta): ], "coef0": [Interval(Real, None, None, closed="neither")], "tol": [Interval(Real, 0.0, None, closed="neither")], - "C": [Interval(Real, 0.0, None, closed="neither")], + "C": [Interval(Real, 0.0, None, closed="right")], "nu": [Interval(Real, 0.0, 1.0, closed="right")], "epsilon": [Interval(Real, 0.0, None, closed="left")], "shrinking": ["boolean"], diff --git a/sklearn/svm/tests/test_svm.py b/sklearn/svm/tests/test_svm.py index 2735dc0651d89..a40e10286bdef 100644 --- a/sklearn/svm/tests/test_svm.py +++ b/sklearn/svm/tests/test_svm.py @@ -14,7 +14,7 @@ ) from sklearn import base, datasets, linear_model, metrics, svm -from sklearn.datasets import make_blobs, make_classification +from sklearn.datasets import make_blobs, make_classification, make_regression from sklearn.exceptions import ( ConvergenceWarning, NotFittedError, @@ -37,7 +37,7 @@ from sklearn.svm._classes import _validate_dual_parameter from sklearn.utils import check_random_state, shuffle from sklearn.utils._testing import ignore_warnings -from sklearn.utils.fixes import CSR_CONTAINERS, LIL_CONTAINERS +from sklearn.utils.fixes import _IS_32BIT, CSR_CONTAINERS, LIL_CONTAINERS from sklearn.utils.validation import _num_samples # toy sample @@ -1203,6 +1203,13 @@ def test_svc_ovr_tie_breaking(SVCClass): """Test if predict breaks ties in OVR mode. Related issue: https://github.com/scikit-learn/scikit-learn/issues/8277 """ + if SVCClass.__name__ == "NuSVC" and _IS_32BIT: + # XXX: known failure to be investigated. Either the code needs to be + # fixed or the test itself might need to be made less sensitive to + # random changes in test data and rounding errors more generally. + # https://github.com/scikit-learn/scikit-learn/issues/29633 + pytest.xfail("Failing test on 32bit OS") + X, y = make_blobs(random_state=0, n_samples=20, n_features=2) xs = np.linspace(X[:, 0].min(), X[:, 0].max(), 100) @@ -1416,3 +1423,21 @@ def test_dual_auto_edge_cases(): "auto", "squared_hinge", "l1", "ovr", np.asarray(X).T ) assert dual is False # only supports False + + +@pytest.mark.parametrize( + "Estimator, make_dataset", + [(svm.SVC, make_classification), (svm.SVR, make_regression)], +) +@pytest.mark.parametrize("C_inf", [np.inf, float("inf")]) +def test_svm_with_infinite_C(Estimator, make_dataset, C_inf, global_random_seed): + """Check that we can pass `C=inf` that is equivalent to a very large C value. + + Non-regression test for + https://github.com/scikit-learn/scikit-learn/issues/29772 + """ + X, y = make_dataset(random_state=global_random_seed) + estimator_C_inf = Estimator(C=C_inf).fit(X, y) + estimator_C_large = Estimator(C=1e10).fit(X, y) + + assert_allclose(estimator_C_large.predict(X), estimator_C_inf.predict(X)) diff --git a/sklearn/tests/test_calibration.py b/sklearn/tests/test_calibration.py index 833ef2ea7e558..94ef295b7619c 100644 --- a/sklearn/tests/test_calibration.py +++ b/sklearn/tests/test_calibration.py @@ -146,6 +146,20 @@ def test_calibration_cv_splitter(data, ensemble): assert len(calib_clf.calibrated_classifiers_) == expected_n_clf +def test_calibration_cv_nfold(data): + # Check error raised when number of examples per class less than nfold + X, y = data + + kfold = KFold(n_splits=101) + calib_clf = CalibratedClassifierCV(cv=kfold, ensemble=True) + with pytest.raises(ValueError, match="Requesting 101-fold cross-validation"): + calib_clf.fit(X, y) + + calib_clf = CalibratedClassifierCV(cv=LeaveOneOut(), ensemble=True) + with pytest.raises(ValueError, match="LeaveOneOut cross-validation does"): + calib_clf.fit(X, y) + + @pytest.mark.parametrize("method", ["sigmoid", "isotonic"]) @pytest.mark.parametrize("ensemble", [True, False]) def test_sample_weight(data, method, ensemble): @@ -423,45 +437,47 @@ def test_calibration_nan_imputer(ensemble): @pytest.mark.parametrize("ensemble", [True, False]) def test_calibration_prob_sum(ensemble): - # Test that sum of probabilities is 1. A non-regression test for - # issue #7796 - num_classes = 2 - X, y = make_classification(n_samples=10, n_features=5, n_classes=num_classes) + # Test that sum of probabilities is (max) 1. A non-regression test for + # issue #7796 - when test has fewer classes than train + X, _ = make_classification(n_samples=10, n_features=5, n_classes=2) + y = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0] clf = LinearSVC(C=1.0, random_state=7) + # In the first and last fold, test will have 1 class while train will have 2 clf_prob = CalibratedClassifierCV( - clf, method="sigmoid", cv=LeaveOneOut(), ensemble=ensemble + clf, method="sigmoid", cv=KFold(n_splits=3), ensemble=ensemble ) clf_prob.fit(X, y) - - probs = clf_prob.predict_proba(X) - assert_array_almost_equal(probs.sum(axis=1), np.ones(probs.shape[0])) + assert_allclose(clf_prob.predict_proba(X).sum(axis=1), 1.0) @pytest.mark.parametrize("ensemble", [True, False]) def test_calibration_less_classes(ensemble): # Test to check calibration works fine when train set in a test-train # split does not contain all classes - # Since this test uses LOO, at each iteration train set will not contain a - # class label - X = np.random.randn(10, 5) - y = np.arange(10) - clf = LinearSVC(C=1.0, random_state=7) + # In 1st split, train is missing class 0 + # In 3rd split, train is missing class 3 + X = np.random.randn(12, 5) + y = [0, 0, 0, 1] + [1, 1, 2, 2] + [2, 3, 3, 3] + clf = DecisionTreeClassifier(random_state=7) cal_clf = CalibratedClassifierCV( - clf, method="sigmoid", cv=LeaveOneOut(), ensemble=ensemble + clf, method="sigmoid", cv=KFold(3), ensemble=ensemble ) cal_clf.fit(X, y) - for i, calibrated_classifier in enumerate(cal_clf.calibrated_classifiers_): - proba = calibrated_classifier.predict_proba(X) - if ensemble: + if ensemble: + classes = np.arange(4) + for calib_i, class_i in zip([0, 2], [0, 3]): + proba = cal_clf.calibrated_classifiers_[calib_i].predict_proba(X) # Check that the unobserved class has proba=0 - assert_array_equal(proba[:, i], np.zeros(len(y))) + assert_array_equal(proba[:, class_i], np.zeros(len(y))) # Check for all other classes proba>0 - assert np.all(proba[:, :i] > 0) - assert np.all(proba[:, i + 1 :] > 0) - else: - # Check `proba` are all 1/n_classes - assert np.allclose(proba, 1 / proba.shape[0]) + assert np.all(proba[:, classes != class_i] > 0) + + # When `ensemble=False`, `cross_val_predict` is used to compute predictions + # to fit only one `calibrated_classifiers_` + else: + proba = cal_clf.calibrated_classifiers_[0].predict_proba(X) + assert_array_almost_equal(proba.sum(axis=1), np.ones(proba.shape[0])) @pytest.mark.parametrize( diff --git a/sklearn/tree/_classes.py b/sklearn/tree/_classes.py index 9f99d831a0990..9242f8e8e7352 100644 --- a/sklearn/tree/_classes.py +++ b/sklearn/tree/_classes.py @@ -1106,7 +1106,7 @@ class DecisionTreeRegressor(RegressorMixin, BaseDecisionTree): mean squared error with Friedman's improvement score for potential splits, "absolute_error" for the mean absolute error, which minimizes the L1 loss using the median of each terminal node, and "poisson" which - uses reduction in Poisson deviance to find splits. + uses reduction in the half mean Poisson deviance to find splits. .. versionadded:: 0.18 Mean Absolute Error (MAE) criterion. diff --git a/sklearn/utils/_array_api.py b/sklearn/utils/_array_api.py index 9306bf4afcdf4..ea10235c2944e 100644 --- a/sklearn/utils/_array_api.py +++ b/sklearn/utils/_array_api.py @@ -647,16 +647,10 @@ def _average(a, axis=None, weights=None, normalize=True, xp=None): f"weights {tuple(weights.shape)} differ." ) - if weights.ndim != 1: - raise TypeError( - f"1D weights expected when a.shape={tuple(a.shape)} and " - f"weights.shape={tuple(weights.shape)} differ." - ) - - if size(weights) != a.shape[axis]: + if tuple(weights.shape) != (a.shape[axis],): raise ValueError( - f"Length of weights {size(weights)} not compatible with " - f" a.shape={tuple(a.shape)} and {axis=}." + f"Shape of weights weights.shape={tuple(weights.shape)} must be " + f"consistent with a.shape={tuple(a.shape)} and {axis=}." ) # If weights are 1D, add singleton dimensions for broadcasting @@ -814,9 +808,14 @@ def _estimator_with_converted_arrays(estimator, converter): return new_estimator -def _atol_for_type(dtype): +def _atol_for_type(dtype_or_dtype_name): """Return the absolute tolerance for a given numpy dtype.""" - return numpy.finfo(dtype).eps * 100 + if dtype_or_dtype_name is None: + # If no dtype is specified when running tests for a given namespace, we + # expect the same floating precision level as NumPy's default floating + # point dtype. + dtype_or_dtype_name = numpy.float64 + return numpy.finfo(dtype_or_dtype_name).eps * 100 def indexing_dtype(xp): diff --git a/sklearn/utils/_estimator_html_repr.py b/sklearn/utils/_estimator_html_repr.py index 5e465234f516b..31f3a2b213e01 100644 --- a/sklearn/utils/_estimator_html_repr.py +++ b/sklearn/utils/_estimator_html_repr.py @@ -427,15 +427,31 @@ class _HTMLDocumentationLinkMixin: Examples -------- If the default values for `_doc_link_module`, `_doc_link_template` are not suitable, - then you can override them: + then you can override them and provide a method to generate the URL parameters: >>> from sklearn.base import BaseEstimator - >>> estimator = BaseEstimator() - >>> estimator._doc_link_template = "https://website.com/{single_param}.html" + >>> doc_link_template = "https://address.local/{single_param}.html" >>> def url_param_generator(estimator): ... return {"single_param": estimator.__class__.__name__} - >>> estimator._doc_link_url_param_generator = url_param_generator + >>> class MyEstimator(BaseEstimator): + ... # use "builtins" since it is the associated module when declaring + ... # the class in a docstring + ... _doc_link_module = "builtins" + ... _doc_link_template = doc_link_template + ... _doc_link_url_param_generator = url_param_generator + >>> estimator = MyEstimator() >>> estimator._get_doc_link() - 'https://website.com/BaseEstimator.html' + 'https://address.local/MyEstimator.html' + + If instead of overriding the attributes inside the class definition, you want to + override a class instance, you can use `types.MethodType` to bind the method to the + instance: + >>> import types + >>> estimator = BaseEstimator() + >>> estimator._doc_link_template = doc_link_template + >>> estimator._doc_link_url_param_generator = types.MethodType( + ... url_param_generator, estimator) + >>> estimator._get_doc_link() + 'https://address.local/BaseEstimator.html' """ _doc_link_module = "sklearn" @@ -491,6 +507,4 @@ def _get_doc_link(self): return self._doc_link_template.format( estimator_module=estimator_module, estimator_name=estimator_name ) - return self._doc_link_template.format( - **self._doc_link_url_param_generator(self) - ) + return self._doc_link_template.format(**self._doc_link_url_param_generator()) diff --git a/sklearn/utils/_indexing.py b/sklearn/utils/_indexing.py index ca2327f2bb109..11ecdfe0ecbd9 100644 --- a/sklearn/utils/_indexing.py +++ b/sklearn/utils/_indexing.py @@ -478,8 +478,8 @@ def resample(*arrays, replace=True, n_samples=None, random_state=None, stratify= [1., 0.]]) >>> X_sparse - <3x2 sparse matrix of type '<... 'numpy.float64'>' - with 4 stored elements in Compressed Sparse Row format> + >>> X_sparse.toarray() array([[1., 0.], @@ -616,8 +616,8 @@ def shuffle(*arrays, random_state=None, n_samples=None): [1., 0.]]) >>> X_sparse - <3x2 sparse matrix of type '<... 'numpy.float64'>' - with 3 stored elements in Compressed Sparse Row format> + >>> X_sparse.toarray() array([[0., 0.], diff --git a/sklearn/utils/_metadata_requests.py b/sklearn/utils/_metadata_requests.py index f730539621177..61701bf94d6f7 100644 --- a/sklearn/utils/_metadata_requests.py +++ b/sklearn/utils/_metadata_requests.py @@ -4,7 +4,7 @@ In order to better understand the components implemented in this file, one needs to understand their relationship to one another. -The only relevant public API for end users are the ``set_{method}_request``, +The only relevant public API for end users are the ``set_{method}_request`` methods, e.g. ``estimator.set_fit_request(sample_weight=True)``. However, third-party developers and users who implement custom meta-estimators, need to deal with the objects implemented in this file. @@ -59,10 +59,10 @@ To give the above representation some structure, we use the following objects: -- ``(caller, callee)`` is a namedtuple called ``MethodPair`` +- ``(caller=..., callee=...)`` is a namedtuple called ``MethodPair`` -- The list of ``MethodPair`` stored in the ``mapping`` field is a - ``MethodMapping`` object +- The list of ``MethodPair`` stored in the ``mapping`` field of a `RouterMappingPair` is + a ``MethodMapping`` object - ``(mapping=..., router=...)`` is a namedtuple called ``RouterMappingPair`` @@ -686,13 +686,14 @@ def __str__(self): # This section includes all objects required for MetadataRouter which is used # in routers, returned by their ``get_metadata_routing``. -# This namedtuple is used to store a (mapping, routing) pair. Mapping is a -# MethodMapping object, and routing is the output of `get_metadata_routing`. -# MetadataRouter stores a collection of these namedtuples. +# `RouterMappingPair` is used to store a (mapping, router) tuple where `mapping` is a +# `MethodMapping` object and `router` is the output of `get_metadata_routing`. +# `MetadataRouter` stores a collection of `RouterMappingPair` objects in its +# `_route_mappings` attribute. RouterMappingPair = namedtuple("RouterMappingPair", ["mapping", "router"]) -# A namedtuple storing a single method route. A collection of these namedtuples -# is stored in a MetadataRouter. +# `MethodPair` is used to store a single method routing. `MethodMapping` stores a list +# of `MethodPair` objects in its `_routes` attribute. MethodPair = namedtuple("MethodPair", ["caller", "callee"]) @@ -700,11 +701,11 @@ class MethodMapping: """Stores the mapping between caller and callee methods for a router. This class is primarily used in a ``get_metadata_routing()`` of a router - object when defining the mapping between a sub-object (a sub-estimator or a - scorer) to the router's methods. It stores a collection of namedtuples. + object when defining the mapping between the router's methods and a sub-object (a + sub-estimator or a scorer). - Iterating through an instance of this class will yield named - ``MethodPair(caller, callee)`` tuples. + Iterating through an instance of this class yields + ``MethodPair(caller, callee)`` instances. .. versionadded:: 1.3 """ diff --git a/sklearn/utils/_set_output.py b/sklearn/utils/_set_output.py index 42757dbb00fae..216cb061de9be 100644 --- a/sklearn/utils/_set_output.py +++ b/sklearn/utils/_set_output.py @@ -7,6 +7,7 @@ from .._config import get_config from ._available_if import available_if +from .fixes import _create_pandas_dataframe_from_non_pandas_container def check_library_installed(library): @@ -128,7 +129,9 @@ def create_container(self, X_output, X_original, columns, inplace=True): # We don't pass columns here because it would intend columns selection # instead of renaming. - X_output = pd.DataFrame(X_output, index=index, copy=not inplace) + X_output = _create_pandas_dataframe_from_non_pandas_container( + X=X_output, index=index, copy=not inplace + ) if columns is not None: return self.rename_columns(X_output, columns) diff --git a/sklearn/utils/deprecation.py b/sklearn/utils/deprecation.py index a3225597701c7..f72f8b8124f28 100644 --- a/sklearn/utils/deprecation.py +++ b/sklearn/utils/deprecation.py @@ -97,7 +97,7 @@ def _decorate_property(self, prop): msg = self.extra @property - @functools.wraps(prop) + @functools.wraps(prop.fget) def wrapped(*args, **kwargs): warnings.warn(msg, category=FutureWarning) return prop.fget(*args, **kwargs) diff --git a/sklearn/utils/estimator_checks.py b/sklearn/utils/estimator_checks.py index 8ec1dc024ea4f..360f204dac912 100644 --- a/sklearn/utils/estimator_checks.py +++ b/sklearn/utils/estimator_checks.py @@ -1028,9 +1028,9 @@ def check_array_api_input_and_values( def _check_estimator_sparse_container(name, estimator_orig, sparse_type): rng = np.random.RandomState(0) X = rng.uniform(size=(40, 3)) - X[X < 0.8] = 0 + X[X < 0.6] = 0 X = _enforce_estimator_tags_X(estimator_orig, X) - y = (4 * rng.uniform(size=40)).astype(int) + y = (4 * rng.uniform(size=X.shape[0])).astype(np.int32) # catch deprecation warnings with ignore_warnings(category=FutureWarning): estimator = clone(estimator_orig) @@ -1506,7 +1506,7 @@ def _apply_on_subsets(func, X): result_by_batch = [func(batch.reshape(1, n_features)) for batch in X] # func can output tuple (e.g. score_samples) - if type(result_full) == tuple: + if isinstance(result_full, tuple): result_full = result_full[0] result_by_batch = list(map(lambda x: x[0], result_by_batch)) @@ -1919,7 +1919,7 @@ def check_estimators_dtypes(name, estimator_orig): X_train_64 = X_train_32.astype(np.float64) X_train_int_64 = X_train_32.astype(np.int64) X_train_int_32 = X_train_32.astype(np.int32) - y = X_train_int_64[:, 0] + y = np.array([1, 2] * 10, dtype=np.int64) y = _enforce_estimator_tags_y(estimator_orig, y) methods = ["predict", "transform", "decision_function", "predict_proba"] diff --git a/sklearn/utils/extmath.py b/sklearn/utils/extmath.py index 638423e1ebc54..63b24d665597c 100644 --- a/sklearn/utils/extmath.py +++ b/sklearn/utils/extmath.py @@ -121,7 +121,7 @@ def fast_logdet(A): >>> from sklearn.utils.extmath import fast_logdet >>> a = np.array([[5, 1], [2, 8]]) >>> fast_logdet(a) - 3.6375861597263857 + np.float64(3.6375861597263857) """ xp, _ = get_namespace(A) sign, ld = xp.linalg.slogdet(A) diff --git a/sklearn/utils/fixes.py b/sklearn/utils/fixes.py index d0ac208ed5e0b..f15ed273f6c2a 100644 --- a/sklearn/utils/fixes.py +++ b/sklearn/utils/fixes.py @@ -13,12 +13,18 @@ import platform import struct +import sys import numpy as np import scipy import scipy.sparse.linalg import scipy.stats +try: + import pandas as pd +except ImportError: + pd = None + from ..externals._packaging.version import parse as parse_version from .parallel import _get_threadpool_controller @@ -414,3 +420,21 @@ def _in_unstable_openblas_configuration(): # See discussions in https://github.com/numpy/numpy/issues/19411 return True # pragma: no cover return False + + +# TODO: remove when pandas >= 1.4 is the minimum supported version +if pd is not None and parse_version(pd.__version__) < parse_version("1.4"): + + def _create_pandas_dataframe_from_non_pandas_container(X, *, index, copy): + pl = sys.modules.get("polars") + if pl is None or not isinstance(X, pl.DataFrame): + return pd.DataFrame(X, index=index, copy=copy) + + # Bug in pandas<1.4: when constructing a pandas DataFrame from a polars + # DataFrame, the data is transposed ... + return pd.DataFrame(X.to_numpy(), index=index, copy=copy) + +else: + + def _create_pandas_dataframe_from_non_pandas_container(X, *, index, copy): + return pd.DataFrame(X, index=index, copy=copy) diff --git a/sklearn/utils/meson.build b/sklearn/utils/meson.build index 9bbfc01b7b6bf..c7a6102b956e8 100644 --- a/sklearn/utils/meson.build +++ b/sklearn/utils/meson.build @@ -18,7 +18,7 @@ utils_extension_metadata = { 'sparsefuncs_fast': {'sources': ['sparsefuncs_fast.pyx']}, '_cython_blas': {'sources': ['_cython_blas.pyx']}, - 'arrayfuncs': {'sources': ['arrayfuncs.pyx']}, + 'arrayfuncs': {'sources': ['arrayfuncs.pyx'], 'dependencies': [openmp_dep]}, 'murmurhash': { 'sources': ['murmurhash.pyx', 'src' / 'MurmurHash3.cpp'], }, diff --git a/sklearn/utils/sparsefuncs_fast.pyx b/sklearn/utils/sparsefuncs_fast.pyx index a6fdcd8c94463..a9d8989d634be 100644 --- a/sklearn/utils/sparsefuncs_fast.pyx +++ b/sklearn/utils/sparsefuncs_fast.pyx @@ -494,7 +494,11 @@ def inplace_csr_row_normalize_l1(X): -------- >>> from scipy.sparse import csr_matrix >>> from sklearn.utils.sparsefuncs_fast import inplace_csr_row_normalize_l1 - >>> X = csr_matrix(([1.0, 2.0, 3.0], [0, 2, 3], [0, 3, 4]), shape=(3, 4)) + >>> import numpy as np + >>> indptr = np.array([0, 2, 3, 4]) + >>> indices = np.array([0, 1, 2, 3]) + >>> data = np.array([1.0, 2.0, 3.0, 4.0]) + >>> X = csr_matrix((data, indices, indptr), shape=(3, 4)) >>> X.toarray() array([[1., 2., 0., 0.], [0., 0., 3., 0.], @@ -552,7 +556,11 @@ def inplace_csr_row_normalize_l2(X): -------- >>> from scipy.sparse import csr_matrix >>> from sklearn.utils.sparsefuncs_fast import inplace_csr_row_normalize_l2 - >>> X = csr_matrix(([1.0, 2.0, 3.0], [0, 2, 3], [0, 3, 4]), shape=(3, 4)) + >>> import numpy as np + >>> indptr = np.array([0, 2, 3, 4]) + >>> indices = np.array([0, 1, 2, 3]) + >>> data = np.array([1.0, 2.0, 3.0, 4.0]) + >>> X = csr_matrix((data, indices, indptr), shape=(3, 4)) >>> X.toarray() array([[1., 2., 0., 0.], [0., 0., 3., 0.], diff --git a/sklearn/utils/tests/test_array_api.py b/sklearn/utils/tests/test_array_api.py index 9d0b8808e64a2..4f7c43238f625 100644 --- a/sklearn/utils/tests/test_array_api.py +++ b/sklearn/utils/tests/test_array_api.py @@ -31,7 +31,7 @@ _array_api_for_tests, skip_if_array_api_compat_not_configured, ) -from sklearn.utils.fixes import _IS_32BIT, CSR_CONTAINERS +from sklearn.utils.fixes import _IS_32BIT, CSR_CONTAINERS, np_version, parse_version @pytest.mark.parametrize("X", [numpy.asarray([1, 2, 3]), [1, 2, 3]]) @@ -64,7 +64,12 @@ def test_get_namespace_ndarray_with_dispatch(): with config_context(array_api_dispatch=True): xp_out, is_array_api_compliant = get_namespace(X_np) assert is_array_api_compliant - assert xp_out is array_api_compat.numpy + if np_version >= parse_version("2.0.0"): + # NumPy 2.0+ is an array API compliant library. + assert xp_out is numpy + else: + # Older NumPy versions require the compatibility layer. + assert xp_out is array_api_compat.numpy @skip_if_array_api_compat_not_configured @@ -132,7 +137,7 @@ def test_asarray_with_order_ignored(): @pytest.mark.parametrize( - "array_namespace, device, dtype_name", yield_namespace_device_dtype_combinations() + "array_namespace, device_, dtype_name", yield_namespace_device_dtype_combinations() ) @pytest.mark.parametrize( "weights, axis, normalize, expected", @@ -164,19 +169,22 @@ def test_asarray_with_order_ignored(): ], ) def test_average( - array_namespace, device, dtype_name, weights, axis, normalize, expected + array_namespace, device_, dtype_name, weights, axis, normalize, expected ): - xp = _array_api_for_tests(array_namespace, device) + xp = _array_api_for_tests(array_namespace, device_) array_in = numpy.asarray([[1, 2, 3], [4, 5, 6]], dtype=dtype_name) - array_in = xp.asarray(array_in, device=device) + array_in = xp.asarray(array_in, device=device_) if weights is not None: weights = numpy.asarray(weights, dtype=dtype_name) - weights = xp.asarray(weights, device=device) + weights = xp.asarray(weights, device=device_) with config_context(array_api_dispatch=True): result = _average(array_in, axis=axis, weights=weights, normalize=normalize) - assert getattr(array_in, "device", None) == getattr(result, "device", None) + if np_version < parse_version("2.0.0") or np_version >= parse_version("2.1.0"): + # NumPy 2.0 has a problem with the device attribute of scalar arrays: + # https://github.com/numpy/numpy/issues/26850 + assert device(array_in) == device(result) result = _convert_to_numpy(result, xp) assert_allclose(result, expected, atol=_atol_for_type(dtype_name)) @@ -223,14 +231,15 @@ def test_average_raises_with_wrong_dtype(array_namespace, device, dtype_name): ( 0, [[1, 2]], - TypeError, - "1D weights expected", + # NumPy 2 raises ValueError, NumPy 1 raises TypeError + (ValueError, TypeError), + "weights", # the message is different for NumPy 1 and 2... ), ( 0, [1, 2, 3, 4], ValueError, - "Length of weights", + "weights", ), (0, [-1, 1], ZeroDivisionError, "Weights sum to zero, can't be normalized"), ), @@ -534,18 +543,18 @@ def test_get_namespace_and_device(): @pytest.mark.parametrize( - "array_namespace, device, dtype_name", yield_namespace_device_dtype_combinations() + "array_namespace, device_, dtype_name", yield_namespace_device_dtype_combinations() ) @pytest.mark.parametrize("csr_container", CSR_CONTAINERS) @pytest.mark.parametrize("axis", [0, 1, None, -1, -2]) @pytest.mark.parametrize("sample_weight_type", [None, "int", "float"]) def test_count_nonzero( - array_namespace, device, dtype_name, csr_container, axis, sample_weight_type + array_namespace, device_, dtype_name, csr_container, axis, sample_weight_type ): from sklearn.utils.sparsefuncs import count_nonzero as sparse_count_nonzero - xp = _array_api_for_tests(array_namespace, device) + xp = _array_api_for_tests(array_namespace, device_) array = numpy.array([[0, 3, 0], [2, -1, 0], [0, 0, 0], [9, 8, 7], [4, 0, 5]]) if sample_weight_type == "int": sample_weight = numpy.asarray([1, 2, 2, 3, 1]) @@ -556,12 +565,16 @@ def test_count_nonzero( expected = sparse_count_nonzero( csr_container(array), axis=axis, sample_weight=sample_weight ) - array_xp = xp.asarray(array, device=device) + array_xp = xp.asarray(array, device=device_) with config_context(array_api_dispatch=True): result = _count_nonzero( - array_xp, xp=xp, device=device, axis=axis, sample_weight=sample_weight + array_xp, xp=xp, device=device_, axis=axis, sample_weight=sample_weight ) assert_allclose(_convert_to_numpy(result, xp=xp), expected) - assert getattr(array_xp, "device", None) == getattr(result, "device", None) + + if np_version < parse_version("2.0.0") or np_version >= parse_version("2.1.0"): + # NumPy 2.0 has a problem with the device attribute of scalar arrays: + # https://github.com/numpy/numpy/issues/26850 + assert device(array_xp) == device(result) diff --git a/sklearn/utils/tests/test_estimator_html_repr.py b/sklearn/utils/tests/test_estimator_html_repr.py index d59658998432d..67aff63799ec3 100644 --- a/sklearn/utils/tests/test_estimator_html_repr.py +++ b/sklearn/utils/tests/test_estimator_html_repr.py @@ -1,6 +1,7 @@ import html import locale import re +import types from contextlib import closing from io import StringIO from unittest.mock import patch @@ -443,7 +444,9 @@ def test_html_documentation_link_mixin_sklearn(mock_version): ("prefix.mypackage.mymodule.submodule", "prefix.mypackage.mymodule.submodule"), ], ) -def test_html_documentation_link_mixin_get_doc_link(module_path, expected_module): +def test_html_documentation_link_mixin_get_doc_link_instance( + module_path, expected_module +): """Check the behaviour of the `_get_doc_link` with various parameter.""" class FooBar(_HTMLDocumentationLinkMixin): @@ -459,6 +462,32 @@ class FooBar(_HTMLDocumentationLinkMixin): assert est._get_doc_link() == f"https://website.com/{expected_module}.FooBar.html" +@pytest.mark.parametrize( + "module_path,expected_module", + [ + ("prefix.mymodule", "prefix.mymodule"), + ("prefix._mymodule", "prefix"), + ("prefix.mypackage._mymodule", "prefix.mypackage"), + ("prefix.mypackage._mymodule.submodule", "prefix.mypackage"), + ("prefix.mypackage.mymodule.submodule", "prefix.mypackage.mymodule.submodule"), + ], +) +def test_html_documentation_link_mixin_get_doc_link_class(module_path, expected_module): + """Check the behaviour of the `_get_doc_link` when `_doc_link_module` and + `_doc_link_template` are defined at the class level and not at the instance + level.""" + + class FooBar(_HTMLDocumentationLinkMixin): + _doc_link_module = "prefix" + _doc_link_template = ( + "https://website.com/{estimator_module}.{estimator_name}.html" + ) + + FooBar.__module__ = module_path + est = FooBar() + assert est._get_doc_link() == f"https://website.com/{expected_module}.FooBar.html" + + def test_html_documentation_link_mixin_get_doc_link_out_of_library(): """Check the behaviour of the `_get_doc_link` with various parameter.""" mixin = _HTMLDocumentationLinkMixin() @@ -469,7 +498,7 @@ def test_html_documentation_link_mixin_get_doc_link_out_of_library(): assert mixin._get_doc_link() == "" -def test_html_documentation_link_mixin_doc_link_url_param_generator(): +def test_html_documentation_link_mixin_doc_link_url_param_generator_instance(): mixin = _HTMLDocumentationLinkMixin() # we can bypass the generation by providing our own callable mixin._doc_link_template = ( @@ -482,11 +511,30 @@ def url_param_generator(estimator): "another_variable": "value_2", } - mixin._doc_link_url_param_generator = url_param_generator + mixin._doc_link_url_param_generator = types.MethodType(url_param_generator, mixin) assert mixin._get_doc_link() == "https://website.com/value_1.value_2.html" +def test_html_documentation_link_mixin_doc_link_url_param_generator_class(): + # we can bypass the generation by providing our own callable + + def url_param_generator(estimator): + return { + "my_own_variable": "value_1", + "another_variable": "value_2", + } + + class FooBar(_HTMLDocumentationLinkMixin): + _doc_link_template = ( + "https://website.com/{my_own_variable}.{another_variable}.html" + ) + _doc_link_url_param_generator = url_param_generator + + estimator = FooBar() + assert estimator._get_doc_link() == "https://website.com/value_1.value_2.html" + + @pytest.fixture def set_non_utf8_locale(): """Pytest fixture to set non utf-8 locale during the test. diff --git a/sklearn/utils/tests/test_validation.py b/sklearn/utils/tests/test_validation.py index 5bde51ae514d9..d3646b783fc15 100644 --- a/sklearn/utils/tests/test_validation.py +++ b/sklearn/utils/tests/test_validation.py @@ -1341,7 +1341,7 @@ def test_check_scalar_invalid( include_boundaries=include_boundaries, ) assert str(raised_error.value) == str(err_msg) - assert type(raised_error.value) == type(err_msg) + assert isinstance(raised_error.value, type(err_msg)) _psd_cases_valid = { diff --git a/sklearn/utils/validation.py b/sklearn/utils/validation.py index e145512cd36a6..f4300d13b0584 100644 --- a/sklearn/utils/validation.py +++ b/sklearn/utils/validation.py @@ -507,7 +507,7 @@ def indexable(*iterables): ... [1, 2, 3], np.array([2, 3, 4]), None, csr_matrix([[5], [6], [7]]) ... ] >>> indexable(*iterables) - [[1, 2, 3], array([2, 3, 4]), None, <3x1 sparse matrix ...>] + [[1, 2, 3], array([2, 3, 4]), None, <...Sparse...dtype 'int64'...shape (3, 1)>] """ result = [_make_indexable(X) for X in iterables] @@ -1509,8 +1509,8 @@ def check_symmetric(array, *, tol=1e-10, raise_warning=True, raise_exception=Fal >>> from scipy.sparse import csr_matrix >>> sparse_symmetric_array = csr_matrix(symmetric_array) >>> check_symmetric(sparse_symmetric_array) - <3x3 sparse matrix of type '' - with 6 stored elements in Compressed Sparse Row format> + """ if (array.ndim != 2) or (array.shape[0] != array.shape[1]): raise ValueError(