diff --git a/.github/workflows/update-lock-files-pr.yml b/.github/workflows/update-lock-files-pr.yml
new file mode 100644
index 0000000000000..86e7c793de4af
--- /dev/null
+++ b/.github/workflows/update-lock-files-pr.yml
@@ -0,0 +1,58 @@
+# Workflow to update lock files in a PR, triggered by specific PR comments
+name: Update lock files in PR
+on:
+ issue_comment:
+ types: [created]
+
+permissions:
+ contents: write
+
+jobs:
+ update-lock-files:
+ if: >-
+ github.event.issue.pull_request
+ && startsWith(github.event.comment.body, '@scikit-learn-bot update lock-files')
+ runs-on: ubuntu-latest
+
+ steps:
+ # There is no direct way to get the HEAD information directly from issue_comment
+ # event, so we use the GitHub CLI to get the PR head ref and repository
+ - name: Get pull request HEAD information
+ id: pr-head-info
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ pr_info=$(gh pr view ${{ github.event.issue.number }} --repo ${{ github.repository }} --json headRefName,headRepository,headRepositoryOwner)
+ pr_head_ref=$(echo "$pr_info" | jq -r '.headRefName')
+ pr_head_repository=$(echo "$pr_info" | jq -r '.headRepositoryOwner.login + "/" + .headRepository.name')
+ echo "pr_head_ref=$pr_head_ref" >> $GITHUB_OUTPUT
+ echo "pr_head_repository=$pr_head_repository" >> $GITHUB_OUTPUT
+
+ - name: Check out the PR branch
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ steps.pr-head-info.outputs.pr_head_ref }}
+ repository: ${{ steps.pr-head-info.outputs.pr_head_repository }}
+
+ # We overwrite all the scripts we are going to use in this workflow with their
+ # versions on main; since this workflow has the write permissions this is to avoid
+ # malicious changes to these scripts in PRs to be executed
+ - name: Download scripts from main
+ run: |
+ curl https://raw.githubusercontent.com/${{ github.repository }}/comment-update-lock/build_tools/shared.sh --retry 5 -o ./build_tools/shared.sh
+ curl https://raw.githubusercontent.com/${{ github.repository }}/comment-update-lock/build_tools/update_environments_and_lock_files.py --retry 5 -o ./build_tools/update_environments_and_lock_files.py
+ curl https://raw.githubusercontent.com/${{ github.repository }}/comment-update-lock/build_tools/on_pr_comment_update_environments_and_lock_files.py --retry 5 -o ./build_tools/on_pr_comment_update_environments_and_lock_files.py
+
+ - name: Update lock files
+ env:
+ COMMENT: ${{ github.event.comment.body }}
+ # We download the lock files update scripts from main, since this workflow is
+ # run from main itself
+ run: |
+ source build_tools/shared.sh
+ source $CONDA/bin/activate
+ conda install -n base conda conda-libmamba-solver -y
+ conda config --set solver libmamba
+ conda install -c conda-forge "$(get_dep conda-lock min)" -y
+
+ python build_tools/on_pr_comment_update_environments_and_lock_files.py
diff --git a/build_tools/azure/debian_atlas_32bit_lock.txt b/build_tools/azure/debian_atlas_32bit_lock.txt
index 64513a4be3866..6e407243fc695 100644
--- a/build_tools/azure/debian_atlas_32bit_lock.txt
+++ b/build_tools/azure/debian_atlas_32bit_lock.txt
@@ -4,7 +4,7 @@
#
# pip-compile --output-file=build_tools/azure/debian_atlas_32bit_lock.txt build_tools/azure/debian_atlas_32bit_requirements.txt
#
-attrs==24.1.0
+attrs==24.2.0
# via pytest
coverage==7.6.1
# via pytest-cov
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 d25420e46b309..e54faa3011313 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
@@ -22,7 +22,7 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e
https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d
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/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/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/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3
@@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852
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/aws-c-cal-0.7.1-h87b94db_1.conda#2d76d2cfdcfe2d5c3883d33d8be919e7
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.2-h87b94db_0.conda#8623f26fa29df281dc69ebdb41df0a25
https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-he027950_7.conda#11e5cb0b426772974f6416545baee0ce
https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-he027950_3.conda#adbf0c44ca88a3cded175cd809a106b6
https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-he027950_7.conda#95611b325a9728ed68b8f7eef2dd3feb
@@ -81,43 +81,43 @@ https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-h0f59acf_0.conda#391
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/s2n-1.4.17-he19d79f_0.conda#e25ac9bf10f8e6aa67727b1cdbe762ef
+https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.19-h3400bea_0.conda#7d6818f07e4471d471be9b4252d7b54c
https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f
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.0-h5291e77_0.conda#c13ca0abd5d1d31d0eebcf86d51da8a4
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.14.10-h826b7d6_1.conda#6961646dded770513a781de4cd5c1fe1
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h6ea103f_1.conda#b0da9b0d46def0a1190790e623f246d3
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/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb
https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca
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-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc
+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/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13
https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35
https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d
-https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504
+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_0.conda#322be9d39e030673e105b0abb320514e
https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h38ae2d0_2.conda#168e18a2bba4f8520e6c5e38982f5847
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/python-3.12.4-h194c7f8_0_cpython.conda#d73490214f536cccb5819e9873048c92
+https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda#9c56c4df45f6571b13111d8df2448692
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.4.2-h7671281_15.conda#3b45b0da170f515de8be68155e14955a
-https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.2-he17ee6b_6.conda#4e3d1bb2ade85619ac2163e695c2cc1b
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h29f85be_19.conda#5e668aea2cda1c93c9ae72da95415440
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.7-h45b8271_1.conda#397d8a9cad2e86361587d37840f41e4c
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.10.1-h065aff2_0.conda#d6b48c138e0c8170a6fe9c136e063540
https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4
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-py312h30efb56_0.conda#b119273bff37284cbcb9281c1e85e67d
+https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py312hca68cad_0.conda#f824c60def49466ad5b9aed4eaa23c28
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
@@ -130,8 +130,8 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb
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.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0
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_1.conda#16d94b3586ef3558e5a583598524deb4
-https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e
+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-h482b261_0.conda#0f74c5581623f860e7baca042d9d7139
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-py312h98912ed_0.conda#6ff0b9582da2d4a74a1f9ae1f9ce2af6
https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-hfe3b2da_0.conda#289c71e83dc0daa7d4c81f04180778ca
@@ -158,8 +158,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.
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/aws-c-auth-0.7.22-hbd3ac97_10.conda#7ca4abcc98c7521c02f4e8809bbe40df
-https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hcd6a914_8.conda#b81c45867558446640306507498b2c6b
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.25-hdfe1943_2.conda#02273b04ae28f0822310d1be2be75c83
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-h7eb77b2_15.conda#46913a2424bbf6b8c5ab5910d967c64a
https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.13.0-h935415a_0.conda#debd1677c2fea41eb2233a260f48a298
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-py312h41a817b_0.conda#4006636c39312dc42f8504475be3800f
@@ -167,8 +167,8 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h41a817b_0
https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h1d5cde6_1.conda#27abd7664bc87595bd98b6306b8393d1
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/libclang-cpp18.1-18.1.8-default_hf981a13_1.conda#1cd622f71ea159cc8c9c416568a34f0a
-https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_1.conda#04c8c481b30c3fe62bec148fa4a75857
+https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.8-default_hf981a13_2.conda#b0f8c590aa86d9bee5987082f7f15bdf
+https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_2.conda#ba2d12adbea9de311297f2b577f4bb86
https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325
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
@@ -179,46 +179,46 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e0
https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c
https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_3.conda#c667c11d1e488a38220ede8a34441bff
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/aws-c-s3-0.6.0-h365ddd8_2.conda#22339cf124753bafda336167f80e7860
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.4-hd923058_5.conda#1fdd83fe1d7a8a208a88be70911a5f9c
https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hd126650_2.conda#36df3cf05459de5d0a41c77c4329634b
https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.7.0-h10ac4d7_1.conda#ab6d507ad16dbe2157920451d662e4a1
https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8
-https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.26.0-h26d7fe4_0.conda#7b9d4c93870fb2d644168071d4d76afb
+https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_0.conda#2c51703b4d775f8943c08a361788131b
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-2023.2.0-h84fe81f_50496.conda#81d4a1a57d618adf0152db973d93b2ad
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/noarch/sympy-1.13.0-pypyh2585a3b_103.conda#be7ad175eb670a83ff575f86e53c57fb
-https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.27.3-hda66527_2.conda#734875312c8196feecc91f89856da612
+https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.1-pypyh2585a3b_103.conda#e8095a7cdbe43c73ba5a381ead1a52f4
+https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.27.5-hdd22b19_3.conda#6f7122a63de602ee202b059e698c574d
https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.12.0-hd2e3451_0.conda#61f1c193452f0daa582f39634627ea33
https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_mkl.conda#8bf521f6007b0b0eb91515a1165b5d85
-https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.26.0-ha262f82_0.conda#89b53708fd67762b26c38c8ecc5d323d
+https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda#9e7960f0b9ab3895ef73d92477c47dae
https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2023.2.0-ha770c72_50496.conda#3b4c50e31ff098b18a450e4f5f860adf
https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.2-hb12f9c5_4.conda#5dd4fddb73e5e4fef38ef54f35c155cd
-https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-h46c3b66_9.conda#c840f07ec58dc0b06041e7f36550a539
+https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.379-h82708ae_1.conda#ea040cd44271cd00a36d1a464a2aaad5
https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.11.0-h325d260_1.conda#11d926d1f4a75a1b03d1c053ca20424b
https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_mkl.conda#7a2972758a03adc92d856072c71c9170
https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_mkl.conda#4db0cd03efcdab535f6f066aca4cddbb
-https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.7.2-py312hb5137db_1.conda#3ea04b72ac9f7df92d1614f216d94048
-https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h4b47046_3_cpu.conda#c4e92e0d3c8b065294ac61a33cb0abc6
+https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.7.2-py312hb5137db_2.conda#99889d0c042cc4dfb9a758619d487282
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h03aeac6_6_cpu.conda#c0d3c973e49d549ba10003c3c985f027
https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-20_linux64_mkl.conda#3dea5e9be386b963d7f4368966e238b3
https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.1.2-cpu_mkl_hff68eba_104.conda#a47f9e37a5e5006a0be7e845b3bb4b3e
https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f
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/blas-devel-3.9.0-20_linux64_mkl.conda#079d50df2338a3d47522d7e84c3dfbf6
https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f
-https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-he02047a_3_cpu.conda#8e3a0843cc7c09921c65ad80fe28d801
-https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h9e5060d_3_cpu.conda#f6eb0a9b55a0cd22bd8dede025562ede
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-he02047a_6_cpu.conda#f38e5ee8bb811b2a465598a4bfc41e22
+https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h9e5060d_6_cpu.conda#974d42b6c948038824ce56ae006c9237
https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py312h1d6d2e6_1.conda#ae00b61f3000d2284d1f2584d4dfafa8
https://conda.anaconda.org/conda-forge/linux-64/polars-1.2.1-py312h7285250_0.conda#f9f44acb5e671f282cf09e3fb79f446c
https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h9cafe31_1_cpu.conda#235827b9c93850cafdd2d5ab359893f9
https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.1.2-cpu_mkl_py312he7b903e_104.conda#a5cc49281c2e59c18bf0c75e23f3eabc
https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py312hc2bc53b_1.conda#eae80145f63aa04a02dda456d4883b46
https://conda.anaconda.org/conda-forge/linux-64/blas-2.120-mkl.conda#9444330235a4828878cbe9c897ba0aa3
-https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-he02047a_3_cpu.conda#6cf5d038ca5cfd29988c4a05cd5a6276
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-he02047a_6_cpu.conda#94b84127d9f697b4ac0eba53e58583b6
https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py312h854627b_2.conda#2a49f2a9c0447bc1bdaec98e3ee59117
https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py312h389efb2_0.conda#37038b979f8be9666d90a852879368fb
https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-2.1.2-cpu_mkl_py312he2922ba_104.conda#d258a5ab0b958cbdd0573f5ca2ef8895
-https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-17.0.0-hc9a23c6_3_cpu.conda#5014dd2d204f163d5296b7c803b6c1ca
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-17.0.0-hc9a23c6_6_cpu.conda#f6fd0b0822f00c963b31ac3fec2b6905
https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.9.1-py312h7900ff3_2.conda#0cb46cee2785e2d9dd29a5f36f5a1de7
https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_1.conda#7e8ddbd44fb99ba376b09c4e9e61e509
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 2425532b1bb73..3b8066be2568c 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
@@ -4,7 +4,6 @@
@EXPLICIT
https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.7.4-h8857fd0_0.conda#7df874a4b05b2d2b82826190170eaa0f
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/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
@@ -23,7 +22,8 @@ https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda#7ed43
https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda#d68d48a3060eb5abdc1cdc8e2a3a5966
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-18.1.8-hef8daea_2.conda#c21d8b63b5cf5d3290d5a7aa2b028bcc
+https://conda.anaconda.org/conda-forge/osx-64/libcxx-18.1.8-heced48a_2.conda#8c8198f9e93fcc0fd359ff37b4a8cd2d
+https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.21-hfdf4475_0.conda#88409b23a5585c15d52de0073f3c9c61
https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.16-h0dc2134_0.conda#07e80289d4ba724f37b4b6f001f88fbe
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.8-h15ab845_0.conda#2c3c6c8aaf8728f87326964a82fdc7d8
@@ -49,13 +49,13 @@ https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda#2
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.11.1-default_h456cccd_1000.conda#a14989f6bbea46e6ec4521a403f63ff2
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/libtiff-4.6.0-h603087a_4.conda#362626a2aacb976ec89c91b99bfab30b
https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-hc80595b_2.conda#fc9b5179824146b67ad5a0b053b253ff
-https://conda.anaconda.org/conda-forge/osx-64/python-3.12.4-h37a9e06_0_cpython.conda#94e2b77992f580ac6b7a4fc9b53018b3
+https://conda.anaconda.org/conda-forge/osx-64/python-3.12.5-h37a9e06_0_cpython.conda#517cb4e16466f8d96ba2a72897d14c48
https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4
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/osx-64/cython-3.0.11-py312h28f332c_0.conda#4ab9ee64007a1e4a79b38e4de31aa2fc
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
@@ -115,15 +115,15 @@ https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py312h9230928_0.co
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.14.0-py312hb9702fa_1.conda#9899db3cf8965c3aecab3daf5227d3eb
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_18.conda#12f8213141de7f6750b237eb933bfe40
+https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-16.0.6-h8787910_19.conda#64155ef139280e8c181dad866dea2980
https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.9.1-py312h0d5aeb7_2.conda#0aece95a1cd3b77990022d3e0f37c6aa
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-16.0.6-hb91bd55_18.conda#fd48bd52766dc748842ae785a96d547c
+https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-16.0.6-hb91bd55_19.conda#760ecbc6f4b6cecbe440b0080626286f
https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.9.1-py312hb401068_2.conda#1ead575881ba176014aad8dfac07d1b1
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_18.conda#6caeea3e1c0af451118c19894448d4a0
+https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-16.0.6-h6d92fbe_19.conda#9ffa16e2bd7eb5b8b1a0d19185710cd3
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_18.conda#0d120b5e06d2ea6c9103f2017be1ff22
+https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-16.0.6-hb91bd55_19.conda#81d40fad4c14cc7a893f2e274647c7a4
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
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 f9827208ac958..b994b147ae513 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
@@ -5,7 +5,7 @@
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.7.2-hecd8cb5_0.conda#297cfad0c0eac53e5ac75674828eedd9
-https://repo.anaconda.com/pkgs/main/osx-64/jpeg-9e-h46256e1_2.conda#5f0bfd93528771ebc3e340ac1c91a4cd
+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
@@ -48,13 +48,13 @@ https://repo.anaconda.com/pkgs/main/osx-64/kiwisolver-1.4.4-py312hcec6c5f_0.cond
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-h7231236_2.conda#e7cd7f1cdc309f7e32cedd73803536e0
+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/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.4.1-py312h46256e1_0.conda#ff2efd781e1b1af38284aeda9d676d42
@@ -79,7 +79,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/numexpr-2.8.7-py312hac873b0_0.conda#6
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.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 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
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 b79b8cd5ea6de..7cc0fbf4c197e 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
@@ -22,17 +22,17 @@ 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.11.9-h955ad1f_0.conda#5668a8845dd35bbbc9663c8f217a2ab8
-https://repo.anaconda.com/pkgs/main/linux-64/setuptools-69.5.1-py311h06a4308_0.conda#0989470c81841dfcb22c7bbb40f543c5
+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.0-py311h06a4308_0.conda#84aef4db159f0daf63751d87d7d6ca56
# 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/27/45/377f7e32a5c93d94cd56542349b34efab5ca3f9e2fd5a68c5e93169aa32d/Babel-2.15.0-py3-none-any.whl#sha256=08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb
+# 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/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl#sha256=c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90
# 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/45/82/077c13035d6f45d8b8b74d67e9f73f2bfc54ef8d1f79572790f6f7d2b4f5/Cython-3.0.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=38d40fa1324ac47c04483d151f5e092406a147eac88a18aec789cf01c089c3f2
+# 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 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/a4/22/0a0ad59d9367997fd74a00ad2e88d10559122e09f105e94d34c155aecc0a/fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3
@@ -74,9 +74,9 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-24.0-py311h06a4308_0.conda#84ae
# 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/89/bb/80c9c98d887c855710fd31fc5ae5574133e98203b3475b07579251803662/scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74
-# pip tifffile @ https://files.pythonhosted.org/packages/05/a9/f7b3fd6c73e0ac29e7f9c9c86c3b7367b182a3dd60495da7b8129e6df681/tifffile-2024.7.24-py3-none-any.whl#sha256=f5cce1a915c37bc44ae4a792e3b42c07a30a3fa88406f5c6060a3de076487ed1
+# pip tifffile @ https://files.pythonhosted.org/packages/fd/3a/6ec0327e238253a2b7adab0e542763fd639c4b3cef63b135a74ef3f454a7/tifffile-2024.8.10-py3-none-any.whl#sha256=1c224564fa92e7e9f9a0ed65880b2ece97c3f0d10029ffbebfa5e62b3f6b343d
# 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/b8/63/cef838d92c1918ae28afd12b8aeaa9c104a0686cf6447aa0546f7c6dd1f0/matplotlib-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=ab38a4f3772523179b2f772103d8030215b318fef6360cb40558f585bf3d017f
+# pip matplotlib @ https://files.pythonhosted.org/packages/a5/8b/90fae9c1b34ef3252003c26b15e8cb26b83701e34e5acf6430919c2c5c89/matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=89eb7e89e2b57856533c5c98f018aa3254fa3789fcd86d5f80077b9034a54c9a
# 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/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
@@ -84,4 +84,4 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-24.0-py311h06a4308_0.conda#84ae
# 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/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/f0/fa/dcfe0f65660661db757ee9ebd84e170ff98edd5d80235f62457d9088f85f/numpydoc-1.7.0-py3-none-any.whl#sha256=5a56419d931310d79a06cfc2a126d1558700feeb9b4f3d8dcae1a8134be829c9
+# 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 afecc31b579cf..5c84b2119f2e8 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
@@ -23,11 +23,11 @@ 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/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl#sha256=fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b
-# pip babel @ https://files.pythonhosted.org/packages/27/45/377f7e32a5c93d94cd56542349b34efab5ca3f9e2fd5a68c5e93169aa32d/Babel-2.15.0-py3-none-any.whl#sha256=08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb
+# 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/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl#sha256=c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90
# 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/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
@@ -64,4 +64,4 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-24.0-py312h06a4308_0.conda#6d96
# 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/4d/61/2ad169c6ff1226b46e50da0e44671592dbc6d840a52034a0193a99b28579/sphinx-8.0.2-py3-none-any.whl#sha256=56173572ae6c1b9a38911786e206a110c9749116745873feae4f9ce88e59391d
-# pip numpydoc @ https://files.pythonhosted.org/packages/f0/fa/dcfe0f65660661db757ee9ebd84e170ff98edd5d80235f62457d9088f85f/numpydoc-1.7.0-py3-none-any.whl#sha256=5a56419d931310d79a06cfc2a126d1558700feeb9b4f3d8dcae1a8134be829c9
+# 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_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock
index ae91423d25ea1..feae35c24526a 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
@@ -29,7 +29,7 @@ https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.con
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/libdeflate-1.21-h2466b09_0.conda#4ebe2206ebf4bf38f6084ad836110361
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
@@ -59,16 +59,16 @@ https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hcfcfb64_1.conda#
https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4
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/win-64/cython-3.0.11-py39ha51f57c_0.conda#d7dfdb0e5fa3cc89807fc77fe6173c4d
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.8-default_ha5278ca_1.conda#30a167d5b69555fbf39192a23e40df52
-https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.3-h7025463_1.conda#53c80e0ed9a3905ca7047c03756a5caa
+https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.8-default_ha5278ca_2.conda#8185207d3f7e59474870cc79e4f9eaa5
+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-hddb2be6_3.conda#6d1828c9039929e2f185c5fa9d133018
+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.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db
@@ -116,7 +116,7 @@ https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-23_win64_mkl.conda
https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.7.2-hbb46ec1_4.conda#11c572c84b282f085c0379d6b5a6db19
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.1-py39h60232e0_0.conda#abb4185f8ac60eeb9b450757197da7ac
-https://conda.anaconda.org/conda-forge/win-64/pyside6-6.7.2-py39h0285922_1.conda#f1e4e1f964077cce3d44bbfd94686a78
+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.2.1-py39h1f6ef14_0.conda#03e25c6bae87f4f9595337255b44b0fb
https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.1-py39h1a10956_0.conda#9f8e571406af04d2f5fdcbecec704505
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
index 3f7ea06a3891b..264049d4abb3a 100644
--- 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
@@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e
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/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.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/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d
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
@@ -77,10 +77,10 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d05
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-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50
-https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc
+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-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504
+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_0.conda#322be9d39e030673e105b0abb320514e
https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda#82776ee8145b9d1fd6546604de4b351d
@@ -101,15 +101,15 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.
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-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926
-https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.3-h73ef956_1.conda#99701cdc9a25a333d15265d1d243b2dc
+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.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2
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_1.conda#16d94b3586ef3558e5a583598524deb4
-https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e
+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-h482b261_0.conda#0f74c5581623f860e7baca042d9d7139
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
@@ -131,11 +131,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co
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-py39hcd6043d_0.conda#daab0ee8e85e258281e2b2dd74ebe0bb
-https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h8a4344b_1.conda#a3acc4920c9ca19cb6b295028d606477
+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_1.conda#04c8c481b30c3fe62bec148fa4a75857
+https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_2.conda#ba2d12adbea9de311297f2b577f4bb86
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
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 b35e7a0764bb1..b3aa33c38e4e2 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
@@ -19,7 +19,7 @@ https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda
https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553
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/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/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3
https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d
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-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5
@@ -70,10 +70,10 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d05
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/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/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc
+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.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec
-https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504
+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_0.conda#322be9d39e030673e105b0abb320514e
https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda#82776ee8145b9d1fd6546604de4b351d
@@ -91,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.cond
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-py39h98e3656_0.conda#e3762ffb02c6490cf1b8d2c7af219eb5
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.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0
@@ -106,8 +106,8 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.
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-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/libllvm18-18.1.8-h8b73ec9_1.conda#16d94b3586ef3558e5a583598524deb4
-https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e
+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-h482b261_0.conda#0f74c5581623f860e7baca042d9d7139
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-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f
https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19
@@ -138,7 +138,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_
https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4
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-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292
-https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7
+https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py39h49a4b6b_0.conda#278cc676a7e939cf2561ce4a5cfaa484
https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py39hcd6043d_0.conda#297804eca6ea16a835a869699095de1c
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.2.0-pyha770c72_0.conda#c261d14fc7f49cdd403868998a18c318
@@ -146,8 +146,8 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1
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-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310
-https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.8-default_hf981a13_1.conda#1cd622f71ea159cc8c9c416568a34f0a
-https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_1.conda#04c8c481b30c3fe62bec148fa4a75857
+https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.8-default_hf981a13_2.conda#b0f8c590aa86d9bee5987082f7f15bdf
+https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_2.conda#ba2d12adbea9de311297f2b577f4bb86
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
@@ -173,7 +173,7 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e
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.1-py39h0565ad7_2.conda#bdde79163fde321b3dddac0c08dd6134
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_1.conda#27964496b9996f7453f8b45ea72acc7a
+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.1-py39hf3d152e_2.conda#600643bf041c52023bdc30477c1f077b
https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_3.conda#4f5a67d2176fe024a7d83b3eb09b8e13
diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock
index 68b3e798f84c0..3a0d9d2cf2c32 100644
--- a/build_tools/circle/doc_linux-64_conda.lock
+++ b/build_tools/circle/doc_linux-64_conda.lock
@@ -31,7 +31,7 @@ https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3b
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/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/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3
https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d
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-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5
@@ -98,10 +98,10 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda
https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.4.0-hb2e57f8_0.conda#61f3e74c92b7c44191143a661f821bab
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-h9b56c87_0.conda#cb7355212240e92dcf9c73cb1f10e4a9
-https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc
+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-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504
+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_0.conda#322be9d39e030673e105b0abb320514e
https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda#82776ee8145b9d1fd6546604de4b351d
@@ -118,7 +118,7 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.cond
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-py39h98e3656_0.conda#e3762ffb02c6490cf1b8d2c7af219eb5
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.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0
@@ -127,7 +127,7 @@ https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.con
https://conda.anaconda.org/conda-forge/linux-64/gcc-12.4.0-h236703b_0.conda#9485dc28dccde81b12e17f9bdda18f14
https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.4.0-h6b7512a_0.conda#fec7117a58f5becf76b43dec55064ff9
https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-12.4.0-hc568b83_0.conda#bf4f9ad129a9a8dc86cce6626697d413
-https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.4.0-h557a472_0.conda#77076175ffd18ef618470991cc38c540
+https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.4.0-h613a52c_0.conda#0740149e4653caebd1d2f6bbf84a1720
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.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca
@@ -137,8 +137,8 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.
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-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/libllvm18-18.1.8-h8b73ec9_1.conda#16d94b3586ef3558e5a583598524deb4
-https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e
+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-h482b261_0.conda#0f74c5581623f860e7baca042d9d7139
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-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f
https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19
@@ -179,7 +179,7 @@ https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0
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.7.0-hd590300_1.conda#e9dffe1056994133616378309f932d77
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.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7
+https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py39h49a4b6b_0.conda#278cc676a7e939cf2561ce4a5cfaa484
https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py39hcd6043d_0.conda#297804eca6ea16a835a869699095de1c
https://conda.anaconda.org/conda-forge/linux-64/gfortran-12.4.0-h236703b_0.conda#581156aeb9b903f5425d5dd963d56ec1
https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-12.4.0-hd748a6a_0.conda#6fd80632f36e5a3934af2600bcbb2b2d
@@ -191,8 +191,8 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1
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-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310
-https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.8-default_hf981a13_1.conda#1cd622f71ea159cc8c9c416568a34f0a
-https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_1.conda#04c8c481b30c3fe62bec148fa4a75857
+https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.8-default_hf981a13_2.conda#b0f8c590aa86d9bee5987082f7f15bdf
+https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_2.conda#ba2d12adbea9de311297f2b577f4bb86
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
@@ -217,7 +217,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39h623c9ba_0.
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/compilers-1.7.0-ha770c72_1.conda#d8d07866ac3b5b6937213c89a1874f08
https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda#bdc188e59857d6efab332714e0d01d93
-https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py39h34cef29_2.conda#d3ee926e63ebd5b44ebc984dff020305
+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.34.2-pyh12aca89_0.conda#97ad994fae55dce96bd397054b32e41a
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
@@ -229,7 +229,7 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e
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.1-py39h0565ad7_2.conda#bdde79163fde321b3dddac0c08dd6134
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_1.conda#27964496b9996f7453f8b45ea72acc7a
+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.6.18-pyhd8ed1ab_0.conda#7c3077529bfe3b86f9425d526d73bd24
@@ -242,7 +242,7 @@ https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_3.conda#
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.6.1-pyhd8ed1ab_0.conda#51b2433e4a223b14defee96d3caf9bab
-https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.17.0-pyhd8ed1ab_0.conda#952c3c12f751861ae704080aab566c5a
+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-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9
@@ -252,7 +252,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed
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/9b/2b/913eda7a67f7bea7496c1a8e1666f48aa9f15520da79368e4ec1109e2690/attrs-24.1.0-py3-none-any.whl#sha256=377b47448cb61fea38533f671fba0d0f8a96fd58facd4dc518e3dac9dbea0905
+# 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/6d/ca/086311cdfc017ec964b2436fe0c98c1f4efcb7e4c328956a22456e497655/fastjsonschema-2.20.0-py3-none-any.whl#sha256=5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a
@@ -268,15 +268,15 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1
# 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 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/9d/9f/683f61c2541da8e98d9d4612c7282ce5a6b169573df3262274fdf3ba94a8/rpds_py-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=f09529d2332264a902688031a83c19de8fda5eb5881e44233286b9c9ec91856d
+# 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 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
@@ -305,4 +305,4 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1
# 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/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/ce/a4/f91fa06fb9d345e7e9fe38c9f5cc12b5de24741ad13ec82e9769396d7a8c/jupyterlite_sphinx-0.16.3-py3-none-any.whl#sha256=0e6d976f831fbdfd12e15adf2f3bbcbfd59705fdf5546948956c5ce7928026a8
+# 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_linux-64_conda.lock b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock
index 1c28f0399ef47..286c970c75940 100644
--- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock
+++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock
@@ -35,7 +35,7 @@ https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aea
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/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/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3
https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d
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
@@ -110,9 +110,9 @@ https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.4.0-hb2e57f
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-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50
https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h9b56c87_0.conda#cb7355212240e92dcf9c73cb1f10e4a9
-https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc
+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-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504
+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_0.conda#322be9d39e030673e105b0abb320514e
https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda#82776ee8145b9d1fd6546604de4b351d
@@ -144,8 +144,8 @@ https://conda.anaconda.org/conda-forge/linux-64/gcc-12.4.0-h236703b_0.conda#9485
https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.4.0-h6b7512a_0.conda#fec7117a58f5becf76b43dec55064ff9
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.4.0-hc568b83_0.conda#bf4f9ad129a9a8dc86cce6626697d413
-https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.3-h73ef956_1.conda#99701cdc9a25a333d15265d1d243b2dc
-https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.4.0-h557a472_0.conda#77076175ffd18ef618470991cc38c540
+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_impl_linux-64-12.4.0-h613a52c_0.conda#0740149e4653caebd1d2f6bbf84a1720
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.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca
@@ -156,8 +156,8 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb
https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3
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_1.conda#16d94b3586ef3558e5a583598524deb4
-https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e
+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-h482b261_0.conda#0f74c5581623f860e7baca042d9d7139
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/noarch/networkx-3.2-pyhd8ed1ab_0.conda#cec8cc498664cc00a070676aa89e69a7
@@ -171,7 +171,7 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda
https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f
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-py39hcd6043d_0.conda#40f1dd93ac87fff4b776d6fb8033ddb9
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
@@ -196,11 +196,11 @@ https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0
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.7.0-hd590300_1.conda#e9dffe1056994133616378309f932d77
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.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7
+https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py39h49a4b6b_0.conda#278cc676a7e939cf2561ce4a5cfaa484
https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py39hd1e30aa_0.conda#dc0fb8e157c7caba4c98f1e1f9d2e5f4
https://conda.anaconda.org/conda-forge/linux-64/gfortran-12.4.0-h236703b_0.conda#581156aeb9b903f5425d5dd963d56ec1
https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-12.4.0-hd748a6a_0.conda#6fd80632f36e5a3934af2600bcbb2b2d
-https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h8a4344b_1.conda#a3acc4920c9ca19cb6b295028d606477
+https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h315aac3_2.conda#00e0da7e4fceb5449f3ddd2bf6b2c351
https://conda.anaconda.org/conda-forge/linux-64/gxx-12.4.0-h236703b_0.conda#56cefffbce52071b597fd3eb9208adc9
https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.4.0-h8489865_0.conda#5cf73d936678e6805da39b8ba6be263c
https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097
@@ -208,7 +208,7 @@ https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.2.0-pyha770c7
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/libclang-cpp15-15.0.7-default_h127d8a8_5.conda#d0a9633b53cdc319b8a1a532ae7822b8
-https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_1.conda#04c8c481b30c3fe62bec148fa4a75857
+https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_2.conda#ba2d12adbea9de311297f2b577f4bb86
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
@@ -237,7 +237,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5
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-py39h623c9ba_0.conda#a19d023682384c637cb356d270c276c0
https://conda.anaconda.org/conda-forge/linux-64/compilers-1.7.0-ha770c72_1.conda#d8d07866ac3b5b6937213c89a1874f08
-https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.1-pyhd8ed1ab_0.conda#80f7ce024289c333fdc5ad54a194fc86
+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.6-hbaaba92_0.conda#b22ffc80ac9af846df60b2640c98fea4
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-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5
@@ -252,7 +252,7 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.19.5-py39hd249d9e_3.tar.
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-py39h34cef29_2.conda#d3ee926e63ebd5b44ebc984dff020305
+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.34.2-pyh12aca89_0.conda#97ad994fae55dce96bd397054b32e41a
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
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 cb2d117efcd76..9ce2c67444c6d 100644
--- a/build_tools/cirrus/pymin_conda_forge_linux-aarch64_conda.lock
+++ b/build_tools/cirrus/pymin_conda_forge_linux-aarch64_conda.lock
@@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.12-h68df207_0.
https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20
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/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/libdeflate-1.21-h68df207_0.conda#806c74df6dcf96adea47c7829b264f80
https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.2-h2f0025b_0.conda#1b9f46b804a2c3c5d7fd6a80b77c35f9
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
@@ -69,10 +69,10 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda
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/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_1.conda#50ed8a077706cfe3da719deb71001f2c
+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_h076ed1e_1.conda#cc0a15e3a6f92f454b6132ca6aca8e8d
-https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.6.0-hf980d43_3.conda#b6f3abf5726ae33094bee238b4eb492f
+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_0.conda#f0cf07feda9ed87092833cd8fca012f5
https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-libs-8.3.0-h0c23661_5.conda#c5447423bf6ba4f4ad398033bd66998f
@@ -87,7 +87,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/ccache-4.10.1-ha3bccff_0.co
https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4
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/linux-aarch64/cython-3.0.11-py39h6e76b30_0.conda#7b2bd72eeb9a59b13090b02f4a534168
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
@@ -97,8 +97,8 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.4.5-py39had2cf
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-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_1.conda#4807ee3558305d0e7634fd4be0f6cfbc
-https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-16.3-hcf0348d_0.conda#7dd46e914b037824b9a9629ca6586fc3
+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-hcf0348d_0.conda#d7a3cef9193c842d8621869affb3e069
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_hd33deab_1.conda#70c0aa7d1dd049fffae952bfe8f2c4e9
@@ -123,8 +123,8 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.53.1-py39he257e
https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d
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-23_linuxaarch64_openblas.conda#65a4f18036c0f5419146fddee6653a96
-https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp18.1-18.1.8-default_h14d1da3_1.conda#b8c48ff5a2c8fac7885ca558202d0bd4
-https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-18.1.8-default_h465fbfb_1.conda#b472fe26d5032bed56caf31064580fb9
+https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp18.1-18.1.8-default_h14d1da3_2.conda#ed0dd9fe9fb649dc19593919df0afd43
+https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-18.1.8-default_h465fbfb_2.conda#940ece4a5d753f0cb6ee27219bcd814a
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
@@ -146,5 +146,5 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.7.2-h288a8fd_4.c
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.123-openblas.conda#43772c0a1ae8f29c9a223c21fd89262b
https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.9.1-py39hf3ba65a_2.conda#2c71adc96eab781c8cd8d1cfc64d5bc7
-https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.7.2-py39hb23dda1_1.conda#0e0b29e8b60171e7c8d5652b955a50fd
+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.1-py39ha65689a_2.conda#6f6879438411334f90c06aca5e2cb6b7
diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock
index 159e0f77d20ae..fc815e047708a 100644
--- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock
+++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock
@@ -25,7 +25,7 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e
https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d
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/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/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/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3
@@ -53,7 +53,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_10
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/aws-c-cal-0.7.1-h87b94db_1.conda#2d76d2cfdcfe2d5c3883d33d8be919e7
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.2-h87b94db_0.conda#8623f26fa29df281dc69ebdb41df0a25
https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-he027950_7.conda#11e5cb0b426772974f6416545baee0ce
https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-he027950_3.conda#adbf0c44ca88a3cded175cd809a106b6
https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-he027950_7.conda#95611b325a9728ed68b8f7eef2dd3feb
@@ -97,44 +97,44 @@ https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-h0f59acf_0.conda#391
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/s2n-1.4.17-he19d79f_0.conda#e25ac9bf10f8e6aa67727b1cdbe762ef
+https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.19-h3400bea_0.conda#7d6818f07e4471d471be9b4252d7b54c
https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f
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.0-h5291e77_0.conda#c13ca0abd5d1d31d0eebcf86d51da8a4
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.14.10-h826b7d6_1.conda#6961646dded770513a781de4cd5c1fe1
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h6ea103f_1.conda#b0da9b0d46def0a1190790e623f246d3
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/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb
https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca
https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368
https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.4.2.65-hd3aeb46_0.conda#a83c33c2abd3bd467e13329a9655cb03
https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.3.0.142-hd3aeb46_0.conda#d72fd369532e32f800ab6447e9cd00ac
-https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc
+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/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13
https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35
https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d
-https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504
+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/mpfr-4.2.1-h38ae2d0_2.conda#168e18a2bba4f8520e6c5e38982f5847
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/python-3.12.4-h194c7f8_0_cpython.conda#d73490214f536cccb5819e9873048c92
+https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda#9c56c4df45f6571b13111d8df2448692
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.4.2-h7671281_15.conda#3b45b0da170f515de8be68155e14955a
-https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.2-he17ee6b_6.conda#4e3d1bb2ade85619ac2163e695c2cc1b
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h29f85be_19.conda#5e668aea2cda1c93c9ae72da95415440
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.7-h45b8271_1.conda#397d8a9cad2e86361587d37840f41e4c
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.10.1-h065aff2_0.conda#d6b48c138e0c8170a6fe9c136e063540
https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4
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-py312h30efb56_0.conda#b119273bff37284cbcb9281c1e85e67d
+https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py312hca68cad_0.conda#f824c60def49466ad5b9aed4eaa23c28
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
@@ -148,8 +148,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d
https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0
https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.6.0.99-hd3aeb46_0.conda#ccea7d03d84947a00296f6a39dc774b8
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_1.conda#16d94b3586ef3558e5a583598524deb4
-https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e
+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-h482b261_0.conda#0f74c5581623f860e7baca042d9d7139
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-py312h98912ed_0.conda#6ff0b9582da2d4a74a1f9ae1f9ce2af6
https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-hfe3b2da_0.conda#289c71e83dc0daa7d4c81f04180778ca
@@ -163,7 +163,7 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3
https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f
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/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552
+https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h41a817b_0.conda#1779c9cbd9006415ab7bb9e12747e9d1
https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda
https://conda.anaconda.org/conda-forge/noarch/setuptools-72.1.0-pyhd8ed1ab_0.conda#e06d4c26df4f958a8d38696f2c344d15
https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2
@@ -177,8 +177,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.
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/aws-c-auth-0.7.22-hbd3ac97_10.conda#7ca4abcc98c7521c02f4e8809bbe40df
-https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hcd6a914_8.conda#b81c45867558446640306507498b2c6b
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.25-hdfe1943_2.conda#02273b04ae28f0822310d1be2be75c83
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-h7eb77b2_15.conda#46913a2424bbf6b8c5ab5910d967c64a
https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.13.0-h935415a_0.conda#debd1677c2fea41eb2233a260f48a298
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-py312h41a817b_0.conda#4006636c39312dc42f8504475be3800f
@@ -187,8 +187,8 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h41a817b_0
https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py312h1d5cde6_1.conda#27abd7664bc87595bd98b6306b8393d1
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/libclang-cpp18.1-18.1.8-default_hf981a13_1.conda#1cd622f71ea159cc8c9c416568a34f0a
-https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_1.conda#04c8c481b30c3fe62bec148fa4a75857
+https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.8-default_hf981a13_2.conda#b0f8c590aa86d9bee5987082f7f15bdf
+https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.8-default_h9def88c_2.conda#ba2d12adbea9de311297f2b577f4bb86
https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325
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
@@ -199,48 +199,48 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e0
https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c
https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_3.conda#c667c11d1e488a38220ede8a34441bff
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/aws-c-s3-0.6.0-h365ddd8_2.conda#22339cf124753bafda336167f80e7860
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.4-hd923058_5.conda#1fdd83fe1d7a8a208a88be70911a5f9c
https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hd126650_2.conda#36df3cf05459de5d0a41c77c4329634b
https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.7.0-h10ac4d7_1.conda#ab6d507ad16dbe2157920451d662e4a1
https://conda.anaconda.org/conda-forge/noarch/cuda-runtime-12.4.0-ha804496_0.conda#b760ac3b8e6faaf4f59cb2c47334b4f3
https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8
-https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.26.0-h26d7fe4_0.conda#7b9d4c93870fb2d644168071d4d76afb
+https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_0.conda#2c51703b4d775f8943c08a361788131b
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-2022.1.0-h84fe81f_915.tar.bz2#b9c8f925797a93dbff45e1626b025a6b
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/noarch/sympy-1.13.0-pypyh2585a3b_103.conda#be7ad175eb670a83ff575f86e53c57fb
-https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.27.3-hda66527_2.conda#734875312c8196feecc91f89856da612
+https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.1-pypyh2585a3b_103.conda#e8095a7cdbe43c73ba5a381ead1a52f4
+https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.27.5-hdd22b19_3.conda#6f7122a63de602ee202b059e698c574d
https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.12.0-hd2e3451_0.conda#61f1c193452f0daa582f39634627ea33
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/libgoogle-cloud-storage-2.26.0-ha262f82_0.conda#89b53708fd67762b26c38c8ecc5d323d
+https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda#9e7960f0b9ab3895ef73d92477c47dae
https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2022.1.0-ha770c72_916.tar.bz2#69ba49e445f87aea2cba343a71a35ca2
https://conda.anaconda.org/pytorch/linux-64/pytorch-cuda-12.4-hc786d27_6.tar.bz2#294df2aee019b0e314713842d46e6b65
https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.2-hb12f9c5_4.conda#5dd4fddb73e5e4fef38ef54f35c155cd
-https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-h46c3b66_9.conda#c840f07ec58dc0b06041e7f36550a539
+https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.379-h82708ae_1.conda#ea040cd44271cd00a36d1a464a2aaad5
https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.11.0-h325d260_1.conda#11d926d1f4a75a1b03d1c053ca20424b
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/pyside6-6.7.2-py312hb5137db_1.conda#3ea04b72ac9f7df92d1614f216d94048
-https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h4b47046_3_cpu.conda#c4e92e0d3c8b065294ac61a33cb0abc6
+https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.7.2-py312hb5137db_2.conda#99889d0c042cc4dfb9a758619d487282
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h03aeac6_6_cpu.conda#c0d3c973e49d549ba10003c3c985f027
https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-16_linux64_mkl.tar.bz2#44ccc4d4dca6a8d57fa17442bc64b5a1
https://conda.anaconda.org/conda-forge/linux-64/numpy-2.0.1-py312h1103770_0.conda#9f444595d8d9682891f2f078fc19da43
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/blas-devel-3.9.0-16_linux64_mkl.tar.bz2#3f92c1c9e1c0e183462c5071aa02cae1
https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f
https://conda.anaconda.org/conda-forge/linux-64/cupy-core-13.2.0-py312hd074ebb_1.conda#222e2290af35f5c1fff96425456031e1
-https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-he02047a_3_cpu.conda#8e3a0843cc7c09921c65ad80fe28d801
-https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h9e5060d_3_cpu.conda#f6eb0a9b55a0cd22bd8dede025562ede
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-he02047a_6_cpu.conda#f38e5ee8bb811b2a465598a4bfc41e22
+https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h9e5060d_6_cpu.conda#974d42b6c948038824ce56ae006c9237
https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py312h1d6d2e6_1.conda#ae00b61f3000d2284d1f2584d4dfafa8
https://conda.anaconda.org/conda-forge/linux-64/polars-1.2.1-py312h7285250_0.conda#f9f44acb5e671f282cf09e3fb79f446c
https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h9cafe31_1_cpu.conda#235827b9c93850cafdd2d5ab359893f9
https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py312hc2bc53b_1.conda#eae80145f63aa04a02dda456d4883b46
https://conda.anaconda.org/conda-forge/linux-64/blas-2.116-mkl.tar.bz2#c196a26abf6b4f132c88828ab7c2231c
https://conda.anaconda.org/conda-forge/linux-64/cupy-13.2.0-py312had87585_1.conda#f5b30677da665b13e1ef2a47f239992d
-https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-he02047a_3_cpu.conda#6cf5d038ca5cfd29988c4a05cd5a6276
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-he02047a_6_cpu.conda#94b84127d9f697b4ac0eba53e58583b6
https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py312h854627b_2.conda#2a49f2a9c0447bc1bdaec98e3ee59117
https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py312h389efb2_0.conda#37038b979f8be9666d90a852879368fb
-https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-17.0.0-hc9a23c6_3_cpu.conda#5014dd2d204f163d5296b7c803b6c1ca
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-17.0.0-hc9a23c6_6_cpu.conda#f6fd0b0822f00c963b31ac3fec2b6905
https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.9.1-py312h7900ff3_2.conda#0cb46cee2785e2d9dd29a5f36f5a1de7
https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_1.conda#7e8ddbd44fb99ba376b09c4e9e61e509
https://conda.anaconda.org/pytorch/linux-64/pytorch-2.4.0-py3.12_cuda12.4_cudnn9.1.0_0.tar.bz2#9731ae9086ed66acc02e8e4aba5d9990
diff --git a/build_tools/on_pr_comment_update_environments_and_lock_files.py b/build_tools/on_pr_comment_update_environments_and_lock_files.py
new file mode 100644
index 0000000000000..f57a17af1f1fc
--- /dev/null
+++ b/build_tools/on_pr_comment_update_environments_and_lock_files.py
@@ -0,0 +1,73 @@
+import argparse
+import os
+import shlex
+import subprocess
+
+
+def execute_command(command):
+ command_list = shlex.split(command)
+ subprocess.run(command_list, check=True, text=True)
+
+
+def main():
+ comment = os.environ["COMMENT"].splitlines()[0].strip()
+
+ # Extract the command-line arguments from the comment
+ prefix = "@scikit-learn-bot update lock-files"
+ assert comment.startswith(prefix)
+ all_args_list = shlex.split(comment[len(prefix) :])
+
+ # Parse the options for the lock-file script
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--select-build", default="")
+ parser.add_argument("--skip-build", default=None)
+ parser.add_argument("--select-tag", default=None)
+ args, extra_args_list = parser.parse_known_args(all_args_list)
+
+ # Rebuild the command-line arguments for the lock-file script
+ args_string = ""
+ if args.select_build != "":
+ args_string += f" --select-build {args.select_build}"
+ if args.skip_build is not None:
+ args_string += f" --skip-build {args.skip_build}"
+ if args.select_tag is not None:
+ args_string += f" --select-tag {args.select_tag}"
+
+ # Parse extra arguments
+ extra_parser = argparse.ArgumentParser()
+ extra_parser.add_argument("--commit-marker", default=None)
+ extra_args, _ = extra_parser.parse_known_args(extra_args_list)
+
+ marker = ""
+ # Additional markers based on the tag
+ if args.select_tag == "main-ci":
+ marker += "[doc build] "
+ elif args.select_tag == "scipy-dev":
+ marker += "[scipy-dev] "
+ elif args.select_tag == "arm":
+ marker += "[cirrus arm] "
+ elif len(all_args_list) == 0:
+ # No arguments which will update all lock files so add all markers
+ marker += "[doc build] [scipy-dev] [cirrus arm] "
+ # The additional `--commit-marker` argument
+ if extra_args.commit_marker is not None:
+ marker += extra_args.commit_marker + " "
+
+ execute_command(
+ f"python build_tools/update_environments_and_lock_files.py{args_string}"
+ )
+ execute_command('git config --global user.name "scikit-learn-bot"')
+ execute_command('git config --global user.email "noreply@github.com"')
+ execute_command("git add -A")
+ # Avoiding commiting the scripts that are downloaded from main
+ execute_command("git reset build_tools/shared.sh")
+ execute_command("git reset build_tools/update_environments_and_lock_files.py")
+ execute_command(
+ "git reset build_tools/on_pr_comment_update_environments_and_lock_files.py"
+ )
+ execute_command(f'git commit -m "{marker}Update lock files"')
+ execute_command("git push")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/doc/about.rst b/doc/about.rst
index 7d2039fb890be..7ea26ad126eea 100644
--- a/doc/about.rst
+++ b/doc/about.rst
@@ -292,6 +292,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 +484,7 @@ Past Sponsors
.. div:: image-box
- .. image:: images/czi_logo.svg
+ .. image:: images/czi.png
:target: https://chanzuckerberg.com
......................
diff --git a/doc/developers/contributing.rst b/doc/developers/contributing.rst
index ede9d44e44240..cd187b128d12d 100644
--- a/doc/developers/contributing.rst
+++ b/doc/developers/contributing.rst
@@ -517,7 +517,7 @@ profiling and Cython optimizations.
sections.
Continuous Integration (CI)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+---------------------------
* Azure pipelines are used for testing scikit-learn on Linux, Mac and Windows,
with different dependencies and settings.
@@ -526,12 +526,17 @@ Continuous Integration (CI)
source distributions.
* Cirrus CI is used to build on ARM.
+.. _commit_markers:
+
+Commit message markers
+^^^^^^^^^^^^^^^^^^^^^^
+
Please note that if one of the following markers appear in the latest commit
message, the following actions are taken.
====================== ===================
Commit Message Marker Action Taken by CI
----------------------- -------------------
+====================== ===================
[ci skip] CI is skipped completely
[cd build] CD is run (wheels and source distribution are built)
[cd build gh] CD is run only for GitHub Actions
@@ -551,10 +556,40 @@ Commit Message Marker Action Taken by CI
Note that, by default, the documentation is built but only the examples
that are directly modified by the pull request are executed.
+Lock files
+^^^^^^^^^^
+
+CIs use lock files to build environments with specific versions of dependencies. When a
+PR needs to modify the dependencies or their versions, the lock files should be updated
+accordingly. This can be done by commenting in the PR:
+
+.. code-block:: text
+
+ @scikit-learn-bot update lock-files
+
+A bot will push a commit to your PR branch with the updated lock files in a few minutes.
+Make sure to tick the *Allow edits from maintainers* checkbox located at the bottom of
+the right sidebar of the PR. You can also specify the options `--select-build`,
+`--skip-build`, and `--select-tag` as in a command line. Use `--help` on the script
+`build_tools/update_environments_and_lock_files.py` for more information. For example,
+
+.. code-block:: text
+
+ @scikit-learn-bot update lock-files --select-tag main-ci --skip-build doc
+
+The bot will automatically add :ref:`commit message markers ` to the
+commit for certain tags. If you want to add more markers manually, you can do so using
+the `--commit-marker` option. For example, the following comment will trigger the bot to
+update documentation-related lock files and add the `[doc build]` marker to the commit:
+
+.. code-block:: text
+
+ @scikit-learn-bot update lock-files --select-build doc --commit-marker "[doc build]"
+
.. _stalled_pull_request:
Stalled pull requests
-^^^^^^^^^^^^^^^^^^^^^
+---------------------
As contributing a feature can be a lengthy process, some
pull requests appear inactive but unfinished. In such a case, taking
@@ -586,7 +621,7 @@ them over is a great service for the project. A good etiquette to take over is:
old one.
Stalled and Unclaimed Issues
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+----------------------------
Generally speaking, issues which are up for grabs will have a
`"help wanted" `_.
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 @@
-
-
\ No newline at end of file
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/metadata_routing.rst b/doc/metadata_routing.rst
index fec2cf610c02f..9b21b74032562 100644
--- a/doc/metadata_routing.rst
+++ b/doc/metadata_routing.rst
@@ -284,6 +284,8 @@ Meta-estimators and functions supporting metadata routing:
- :class:`sklearn.ensemble.VotingRegressor`
- :class:`sklearn.ensemble.BaggingClassifier`
- :class:`sklearn.ensemble.BaggingRegressor`
+- :class:`sklearn.feature_selection.RFE`
+- :class:`sklearn.feature_selection.RFECV`
- :class:`sklearn.feature_selection.SelectFromModel`
- :class:`sklearn.feature_selection.SequentialFeatureSelector`
- :class:`sklearn.impute.IterativeImputer`
@@ -323,5 +325,3 @@ Meta-estimators and tools not supporting metadata routing yet:
- :class:`sklearn.ensemble.AdaBoostClassifier`
- :class:`sklearn.ensemble.AdaBoostRegressor`
-- :class:`sklearn.feature_selection.RFE`
-- :class:`sklearn.feature_selection.RFECV`
diff --git a/doc/modules/grid_search.rst b/doc/modules/grid_search.rst
index 12ee76d8e4d39..ee567c8e497e2 100644
--- a/doc/modules/grid_search.rst
+++ b/doc/modules/grid_search.rst
@@ -188,6 +188,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.
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/templates/index.html b/doc/templates/index.html
index 875a295068f7c..c99d45ff1321f 100644
--- a/doc/templates/index.html
+++ b/doc/templates/index.html
@@ -300,6 +300,8 @@
Who uses scikit-learn?
+
+
diff --git a/doc/whats_new/v1.5.rst b/doc/whats_new/v1.5.rst
index 059875eec12d6..b5542a0d1cf5f 100644
--- a/doc/whats_new/v1.5.rst
+++ b/doc/whats_new/v1.5.rst
@@ -23,6 +23,13 @@ Version 1.5.2
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`
......................
diff --git a/doc/whats_new/v1.6.rst b/doc/whats_new/v1.6.rst
index 74357c9171f10..6df2d9b2218bb 100644
--- a/doc/whats_new/v1.6.rst
+++ b/doc/whats_new/v1.6.rst
@@ -104,6 +104,10 @@ more details.
for the `fit` method of its estimator and for its underlying CV splitter and scorer.
:pr:`29266` by :user:`Adam Li `.
+- |Feature| :class:`feature_selection.RFE` and :class:`feature_selection.RFECV`
+ now support metadata routing.
+ :pr:`29312` by :user:`Omar Salman `.
+
Dropping support for building with setuptools
---------------------------------------------
diff --git a/examples/applications/plot_species_distribution_modeling.py b/examples/applications/plot_species_distribution_modeling.py
index ea5f2c4aaf97d..3bb5c771adfd8 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/meson.build b/meson.build
index 9902d3fe189d2..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',
],
diff --git a/sklearn/calibration.py b/sklearn/calibration.py
index bc5ed634a3be4..609f051ab1626 100644
--- a/sklearn/calibration.py
+++ b/sklearn/calibration.py
@@ -24,7 +24,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 (
@@ -390,6 +390,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:
diff --git a/sklearn/feature_selection/_rfe.py b/sklearn/feature_selection/_rfe.py
index 524c791be6989..8ccbffce9b15e 100644
--- a/sklearn/feature_selection/_rfe.py
+++ b/sklearn/feature_selection/_rfe.py
@@ -10,38 +10,52 @@
from joblib import effective_n_jobs
from ..base import BaseEstimator, MetaEstimatorMixin, _fit_context, clone, is_classifier
-from ..metrics import check_scoring
+from ..metrics import get_scorer
from ..model_selection import check_cv
from ..model_selection._validation import _score
-from ..utils._param_validation import HasMethods, Interval, RealNotInt
-from ..utils.metadata_routing import (
- _raise_for_unsupported_routing,
- _RoutingNotSupportedMixin,
+from ..utils import Bunch, metadata_routing
+from ..utils._metadata_requests import (
+ MetadataRouter,
+ MethodMapping,
+ _raise_for_params,
+ _routing_enabled,
+ process_routing,
)
+from ..utils._param_validation import HasMethods, Interval, RealNotInt
from ..utils.metaestimators import _safe_split, available_if
from ..utils.parallel import Parallel, delayed
-from ..utils.validation import check_is_fitted
+from ..utils.validation import (
+ _check_method_params,
+ _deprecate_positional_args,
+ check_is_fitted,
+)
from ._base import SelectorMixin, _get_feature_importances
-def _rfe_single_fit(rfe, estimator, X, y, train, test, scorer):
+def _rfe_single_fit(rfe, estimator, X, y, train, test, scorer, routed_params):
"""
Return the score and n_features per step for a fit across one fold.
"""
X_train, y_train = _safe_split(estimator, X, y, train)
X_test, y_test = _safe_split(estimator, X, y, test, train)
+ fit_params = _check_method_params(
+ X, params=routed_params.estimator.fit, indices=train
+ )
+ score_params = _check_method_params(
+ X=X, params=routed_params.scorer.score, indices=test
+ )
rfe._fit(
X_train,
y_train,
lambda estimator, features: _score(
- # TODO(SLEP6): pass score_params here
estimator,
X_test[:, features],
y_test,
scorer,
- score_params=None,
+ score_params=score_params,
),
+ **fit_params,
)
return rfe.step_scores_, rfe.step_n_features_
@@ -66,7 +80,7 @@ def check(self):
return check
-class RFE(_RoutingNotSupportedMixin, SelectorMixin, MetaEstimatorMixin, BaseEstimator):
+class RFE(SelectorMixin, MetaEstimatorMixin, BaseEstimator):
"""Feature ranking with recursive feature elimination.
Given an external estimator that assigns weights to features (e.g., the
@@ -253,16 +267,31 @@ def fit(self, X, y, **fit_params):
The target values.
**fit_params : dict
- Additional parameters passed to the `fit` method of the underlying
- estimator.
+ - If `enable_metadata_routing=False` (default):
+
+ Parameters directly passed to the ``fit`` method of the
+ underlying estimator.
+
+ - If `enable_metadata_routing=True`:
+
+ Parameters safely routed to the ``fit`` method of the
+ underlying estimator.
+
+ .. versionchanged:: 1.6
+ See :ref:`Metadata Routing User Guide `
+ for more details.
Returns
-------
self : object
Fitted estimator.
"""
- _raise_for_unsupported_routing(self, "fit", **fit_params)
- return self._fit(X, y, **fit_params)
+ if _routing_enabled():
+ routed_params = process_routing(self, "fit", **fit_params)
+ else:
+ routed_params = Bunch(estimator=Bunch(fit=fit_params))
+
+ return self._fit(X, y, **routed_params.estimator.fit)
def _fit(self, X, y, step_score=None, **fit_params):
# Parameter step_score controls the calculation of self.step_scores_
@@ -358,7 +387,7 @@ def _fit(self, X, y, step_score=None, **fit_params):
return self
@available_if(_estimator_has("predict"))
- def predict(self, X):
+ def predict(self, X, **predict_params):
"""Reduce X to the selected features and predict using the estimator.
Parameters
@@ -366,16 +395,35 @@ def predict(self, X):
X : array of shape [n_samples, n_features]
The input samples.
+ **predict_params : dict
+ Parameters to route to the ``predict`` method of the
+ underlying estimator.
+
+ .. versionadded:: 1.6
+ 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
-------
y : array of shape [n_samples]
The predicted target values.
"""
+ _raise_for_params(predict_params, self, "predict")
check_is_fitted(self)
- return self.estimator_.predict(self.transform(X))
+ if _routing_enabled():
+ routed_params = process_routing(self, "predict", **predict_params)
+ else:
+ routed_params = Bunch(estimator=Bunch(predict={}))
+
+ return self.estimator_.predict(
+ self.transform(X), **routed_params.estimator.predict
+ )
@available_if(_estimator_has("score"))
- def score(self, X, y, **fit_params):
+ def score(self, X, y, **score_params):
"""Reduce X to the selected features and return the score of the estimator.
Parameters
@@ -386,11 +434,22 @@ def score(self, X, y, **fit_params):
y : array of shape [n_samples]
The target values.
- **fit_params : dict
- Parameters to pass to the `score` method of the underlying
- estimator.
+ **score_params : dict
+ - If `enable_metadata_routing=False` (default):
- .. versionadded:: 1.0
+ Parameters directly passed to the ``score`` method of the
+ underlying estimator.
+
+ .. versionadded:: 1.0
+
+ - If `enable_metadata_routing=True`:
+
+ Parameters safely routed to the `score` method of the
+ underlying estimator.
+
+ .. versionchanged:: 1.6
+ See :ref:`Metadata Routing User Guide `
+ for more details.
Returns
-------
@@ -399,7 +458,14 @@ def score(self, X, y, **fit_params):
features returned by `rfe.transform(X)` and `y`.
"""
check_is_fitted(self)
- return self.estimator_.score(self.transform(X), y, **fit_params)
+ if _routing_enabled():
+ routed_params = process_routing(self, "score", **score_params)
+ else:
+ routed_params = Bunch(estimator=Bunch(score=score_params))
+
+ return self.estimator_.score(
+ self.transform(X), y, **routed_params.estimator.score
+ )
def _get_support_mask(self):
check_is_fitted(self)
@@ -478,6 +544,29 @@ def _more_tags(self):
return tags
+ def get_metadata_routing(self):
+ """Get metadata routing of this object.
+
+ Please check :ref:`User Guide ` on how the routing
+ mechanism works.
+
+ .. versionadded:: 1.6
+
+ Returns
+ -------
+ routing : MetadataRouter
+ A :class:`~sklearn.utils.metadata_routing.MetadataRouter` encapsulating
+ routing information.
+ """
+ router = MetadataRouter(owner=self.__class__.__name__).add(
+ estimator=self.estimator,
+ method_mapping=MethodMapping()
+ .add(caller="fit", callee="fit")
+ .add(caller="predict", callee="predict")
+ .add(caller="score", callee="score"),
+ )
+ return router
+
class RFECV(RFE):
"""Recursive feature elimination with cross-validation to select features.
@@ -668,6 +757,7 @@ class RFECV(RFE):
"n_jobs": [None, Integral],
}
_parameter_constraints.pop("n_features_to_select")
+ __metadata_request__fit = {"groups": metadata_routing.UNUSED}
def __init__(
self,
@@ -690,11 +780,13 @@ def __init__(
self.n_jobs = n_jobs
self.min_features_to_select = min_features_to_select
+ # TODO(1.8): remove `groups` from the signature after deprecation cycle.
+ @_deprecate_positional_args(version="1.8")
@_fit_context(
# RFECV.estimator is not validated yet
prefer_skip_nested_validation=False
)
- def fit(self, X, y, groups=None):
+ def fit(self, X, y, *, groups=None, **params):
"""Fit the RFE model and automatically tune the number of selected features.
Parameters
@@ -714,12 +806,23 @@ def fit(self, X, y, groups=None):
.. versionadded:: 0.20
+ **params : dict of str -> object
+ Parameters passed to the ``fit`` method of the estimator,
+ the scorer, and the CV splitter.
+
+ ..versionadded:: 1.6
+ 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
Fitted estimator.
"""
- _raise_for_unsupported_routing(self, "fit", groups=groups)
+ _raise_for_params(params, self, "fit")
X, y = self._validate_data(
X,
y,
@@ -729,9 +832,20 @@ def fit(self, X, y, groups=None):
multi_output=True,
)
+ if _routing_enabled():
+ if groups is not None:
+ params.update({"groups": groups})
+ routed_params = process_routing(self, "fit", **params)
+ else:
+ routed_params = Bunch(
+ estimator=Bunch(fit={}),
+ splitter=Bunch(split={"groups": groups}),
+ scorer=Bunch(score={}),
+ )
+
# Initialization
cv = check_cv(self.cv, y, classifier=is_classifier(self.estimator))
- scorer = check_scoring(self.estimator, scoring=self.scoring)
+ scorer = self._get_scorer()
# Build an RFE object, which will evaluate and score each possible
# feature count, down to self.min_features_to_select
@@ -772,8 +886,8 @@ def fit(self, X, y, groups=None):
func = delayed(_rfe_single_fit)
scores_features = parallel(
- func(rfe, self.estimator, X, y, train, test, scorer)
- for train, test in cv.split(X, y, groups)
+ func(rfe, self.estimator, X, y, train, test, scorer, routed_params)
+ for train, test in cv.split(X, y, **routed_params.splitter.split)
)
scores, step_n_features = zip(*scores_features)
@@ -793,14 +907,14 @@ def fit(self, X, y, groups=None):
verbose=self.verbose,
)
- rfe.fit(X, y)
+ rfe.fit(X, y, **routed_params.estimator.fit)
# Set final attributes
self.support_ = rfe.support_
self.n_features_ = rfe.n_features_
self.ranking_ = rfe.ranking_
self.estimator_ = clone(self.estimator)
- self.estimator_.fit(self._transform(X), y)
+ self.estimator_.fit(self._transform(X), y, **routed_params.estimator.fit)
# reverse to stay consistent with before
scores_rev = scores[:, ::-1]
@@ -811,3 +925,81 @@ def fit(self, X, y, groups=None):
"n_features": step_n_features_rev,
}
return self
+
+ def score(self, X, y, **score_params):
+ """Score using the `scoring` option on the given test data and labels.
+
+ Parameters
+ ----------
+ X : array-like of shape (n_samples, n_features)
+ Test samples.
+
+ y : array-like of shape (n_samples,)
+ True labels for X.
+
+ **score_params : dict
+ Parameters to pass to the `score` method of the underlying scorer.
+
+ ..versionadded:: 1.6
+ 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
+ -------
+ score : float
+ Score of self.predict(X) w.r.t. y defined by `scoring`.
+ """
+ _raise_for_params(score_params, self, "score")
+ scoring = self._get_scorer()
+ if _routing_enabled():
+ routed_params = process_routing(self, "score", **score_params)
+ else:
+ routed_params = Bunch()
+ routed_params.scorer = Bunch(score={})
+
+ return scoring(self, X, y, **routed_params.scorer.score)
+
+ def get_metadata_routing(self):
+ """Get metadata routing of this object.
+
+ Please check :ref:`User Guide ` on how the routing
+ mechanism works.
+
+ .. versionadded:: 1.6
+
+ Returns
+ -------
+ routing : MetadataRouter
+ A :class:`~sklearn.utils.metadata_routing.MetadataRouter` encapsulating
+ routing information.
+ """
+ router = MetadataRouter(owner=self.__class__.__name__)
+ router.add(
+ estimator=self.estimator,
+ method_mapping=MethodMapping().add(caller="fit", callee="fit"),
+ )
+ router.add(
+ splitter=check_cv(self.cv),
+ method_mapping=MethodMapping().add(
+ caller="fit",
+ callee="split",
+ ),
+ )
+ router.add(
+ scorer=self._get_scorer(),
+ method_mapping=MethodMapping()
+ .add(caller="fit", callee="score")
+ .add(caller="score", callee="score"),
+ )
+
+ return router
+
+ def _get_scorer(self):
+ if self.scoring is None:
+ scoring = "accuracy" if is_classifier(self.estimator) else "r2"
+ else:
+ scoring = self.scoring
+ return get_scorer(scoring)
diff --git a/sklearn/feature_selection/_sequential.py b/sklearn/feature_selection/_sequential.py
index 9578e27920d12..99700e50661ed 100644
--- a/sklearn/feature_selection/_sequential.py
+++ b/sklearn/feature_selection/_sequential.py
@@ -65,6 +65,7 @@ class SequentialFeatureSelector(SelectorMixin, MetaEstimatorMixin, BaseEstimator
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.
@@ -250,7 +251,9 @@ def fit(self, X, y=None, **params):
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_rfe.py b/sklearn/feature_selection/tests/test_rfe.py
index a0610e990054f..6e9acd7acc0ee 100644
--- a/sklearn/feature_selection/tests/test_rfe.py
+++ b/sklearn/feature_selection/tests/test_rfe.py
@@ -26,7 +26,7 @@
from sklearn.utils.fixes import CSR_CONTAINERS
-class MockClassifier:
+class MockClassifier(ClassifierMixin):
"""
Dummy classifier to test recursive feature elimination
"""
@@ -37,10 +37,11 @@ def __init__(self, foo_param=0):
def fit(self, X, y):
assert len(X) == len(y)
self.coef_ = np.ones(X.shape[1], dtype=np.float64)
+ self.classes_ = sorted(set(y))
return self
def predict(self, T):
- return T.shape[0]
+ return np.ones(T.shape[0])
predict_proba = predict
decision_function = predict
@@ -666,3 +667,36 @@ def test_rfe_n_features_to_select_warning(ClsRFE, param):
# larger than the number of features present in the X variable
clsrfe = ClsRFE(estimator=LogisticRegression(), **{param: 21})
clsrfe.fit(X, y)
+
+
+def test_rfe_with_sample_weight():
+ """Test that `RFE` works correctly with sample weights."""
+ X, y = make_classification(random_state=0)
+ n_samples = X.shape[0]
+
+ # Assign the first half of the samples with twice the weight
+ sample_weight = np.ones_like(y)
+ sample_weight[: n_samples // 2] = 2
+
+ # Duplicate the first half of the data samples to replicate the effect
+ # of sample weights for comparison
+ X2 = np.concatenate([X, X[: n_samples // 2]], axis=0)
+ y2 = np.concatenate([y, y[: n_samples // 2]])
+
+ estimator = SVC(kernel="linear")
+
+ rfe_sw = RFE(estimator=estimator, step=0.1)
+ rfe_sw.fit(X, y, sample_weight=sample_weight)
+
+ rfe = RFE(estimator=estimator, step=0.1)
+ rfe.fit(X2, y2)
+
+ assert_array_equal(rfe_sw.ranking_, rfe.ranking_)
+
+ # Also verify that when sample weights are not doubled the results
+ # are different from the duplicated data
+ rfe_sw_2 = RFE(estimator=estimator, step=0.1)
+ sample_weight_2 = np.ones_like(y)
+ rfe_sw_2.fit(X, y, sample_weight=sample_weight_2)
+
+ assert not np.array_equal(rfe_sw_2.ranking_, rfe.ranking_)
diff --git a/sklearn/feature_selection/tests/test_sequential.py b/sklearn/feature_selection/tests/test_sequential.py
index c6fa9b15dc80a..b98d5b400b84e 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/metrics/_scorer.py b/sklearn/metrics/_scorer.py
index 76ad55514b8c2..f09b4e6d77442 100644
--- a/sklearn/metrics/_scorer.py
+++ b/sklearn/metrics/_scorer.py
@@ -378,7 +378,10 @@ def _score(self, method_caller, estimator, X, y_true, **kwargs):
pos_label = None if is_regressor(estimator) else self._get_pos_label()
response_method = _check_response_method(estimator, self._response_method)
y_pred = method_caller(
- estimator, response_method.__name__, X, pos_label=pos_label
+ estimator,
+ _get_response_method_name(response_method),
+ X,
+ pos_label=pos_label,
)
scoring_kwargs = {**self._kwargs, **kwargs}
@@ -651,6 +654,13 @@ def _get_response_method(response_method, needs_threshold, needs_proba):
return response_method
+def _get_response_method_name(response_method):
+ try:
+ return response_method.__name__
+ except AttributeError:
+ return _get_response_method_name(response_method.func)
+
+
@validate_params(
{
"score_func": [callable],
diff --git a/sklearn/model_selection/_search.py b/sklearn/model_selection/_search.py
index 2ddbc7854e93e..9218b5bb6b3be 100644
--- a/sklearn/model_selection/_search.py
+++ b/sklearn/model_selection/_search.py
@@ -890,9 +890,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
diff --git a/sklearn/model_selection/tests/test_search.py b/sklearn/model_selection/tests/test_search.py
index 36887fb36e770..060ab9ed55f98 100644
--- a/sklearn/model_selection/tests/test_search.py
+++ b/sklearn/model_selection/tests/test_search.py
@@ -2780,6 +2780,7 @@ def test_array_api_search_cv_classifier(SearchCV, array_namespace, device, dtype
LinearDiscriminantAnalysis(),
{"tol": [1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7]},
cv=2,
+ error_score="raise",
)
searcher.fit(X_xp, y_xp)
searcher.score(X_xp, y_xp)
diff --git a/sklearn/tests/metadata_routing_common.py b/sklearn/tests/metadata_routing_common.py
index 5fffec8fccecf..174164daada8c 100644
--- a/sklearn/tests/metadata_routing_common.py
+++ b/sklearn/tests/metadata_routing_common.py
@@ -201,6 +201,7 @@ def __init__(self, alpha=0.0):
def fit(self, X, y):
self.classes_ = np.unique(y)
+ self.coef_ = np.ones_like(X)
return self
def partial_fit(self, X, y, classes=None):
@@ -281,6 +282,7 @@ def fit(self, X, y, sample_weight="default", metadata="default"):
)
self.classes_ = np.unique(y)
+ self.coef_ = np.ones_like(X)
return self
def predict(self, X, sample_weight="default", metadata="default"):
diff --git a/sklearn/tests/test_calibration.py b/sklearn/tests/test_calibration.py
index c2cbad4060fde..b80083f3eac0d 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/tests/test_metaestimators.py b/sklearn/tests/test_metaestimators.py
index e06d2f59a6c10..9c12afd60c206 100644
--- a/sklearn/tests/test_metaestimators.py
+++ b/sklearn/tests/test_metaestimators.py
@@ -40,6 +40,10 @@ def __init__(
self.skip_methods = skip_methods
+# For the following meta estimators we check for the existence of relevant
+# methods only if the sub estimator also contains them. Any methods that
+# are implemented in the meta estimator themselves and are not dependent
+# on the sub estimator are specified in the `skip_methods` parameter.
DELEGATING_METAESTIMATORS = [
DelegatorData("Pipeline", lambda est: Pipeline([("est", est)])),
DelegatorData(
@@ -55,7 +59,9 @@ def __init__(
skip_methods=["score"],
),
DelegatorData("RFE", RFE, skip_methods=["transform", "inverse_transform"]),
- DelegatorData("RFECV", RFECV, skip_methods=["transform", "inverse_transform"]),
+ DelegatorData(
+ "RFECV", RFECV, skip_methods=["transform", "inverse_transform", "score"]
+ ),
DelegatorData(
"BaggingClassifier",
BaggingClassifier,
diff --git a/sklearn/tests/test_metaestimators_metadata_routing.py b/sklearn/tests/test_metaestimators_metadata_routing.py
index 5c31361163689..614c8669592b4 100644
--- a/sklearn/tests/test_metaestimators_metadata_routing.py
+++ b/sklearn/tests/test_metaestimators_metadata_routing.py
@@ -419,6 +419,26 @@ def enable_slep006():
"cv_name": "cv",
"cv_routing_methods": ["fit"],
},
+ {
+ "metaestimator": RFE,
+ "estimator": "classifier",
+ "estimator_name": "estimator",
+ "X": X,
+ "y": y,
+ "estimator_routing_methods": ["fit", "predict", "score"],
+ },
+ {
+ "metaestimator": RFECV,
+ "estimator": "classifier",
+ "estimator_name": "estimator",
+ "estimator_routing_methods": ["fit"],
+ "cv_name": "cv",
+ "cv_routing_methods": ["fit"],
+ "scorer_name": "scoring",
+ "scorer_routing_methods": ["fit", "score"],
+ "X": X,
+ "y": y,
+ },
]
"""List containing all metaestimators to be tested and their settings
@@ -460,8 +480,6 @@ def enable_slep006():
UNSUPPORTED_ESTIMATORS = [
AdaBoostClassifier(),
AdaBoostRegressor(),
- RFE(ConsumingClassifier()),
- RFECV(ConsumingClassifier()),
]
diff --git a/sklearn/tree/_tree.pxd b/sklearn/tree/_tree.pxd
index aecb9a4d95009..47a3cd2bd5c9d 100644
--- a/sklearn/tree/_tree.pxd
+++ b/sklearn/tree/_tree.pxd
@@ -193,7 +193,16 @@ cdef class TreeBuilder:
)
-cdef _build_pruned_tree(
+# =============================================================================
+# Tree pruning
+# =============================================================================
+
+# The private function allows any external caller to prune the tree and return
+# a new tree with the pruned nodes. The pruned tree is a new tree object.
+#
+# .. warning:: this function is not backwards compatible and may change without
+# notice.
+cdef void _build_pruned_tree(
Tree tree, # OUT
Tree orig_tree,
const uint8_t[:] leaves_in_subtree,
diff --git a/sklearn/tree/_tree.pyx b/sklearn/tree/_tree.pyx
index 18d9275115786..943d5e6148538 100644
--- a/sklearn/tree/_tree.pyx
+++ b/sklearn/tree/_tree.pyx
@@ -2379,7 +2379,7 @@ cdef struct BuildPrunedRecord:
intp_t parent
bint is_left
-cdef _build_pruned_tree(
+cdef void _build_pruned_tree(
Tree tree, # OUT
Tree orig_tree,
const uint8_t[:] leaves_in_subtree,
@@ -2440,6 +2440,15 @@ cdef _build_pruned_tree(
is_leaf = leaves_in_subtree[orig_node_id]
node = &orig_tree.nodes[orig_node_id]
+ # protect against an infinite loop as a runtime error, when leaves_in_subtree
+ # are improperly set where a node is not marked as a leaf, but is a node
+ # in the original tree. Thus, it violates the assumption that the node
+ # is a leaf in the pruned tree, or has a descendant that will be pruned.
+ if (not is_leaf and node.left_child == _TREE_LEAF
+ and node.right_child == _TREE_LEAF):
+ rc = -2
+ break
+
# redefine to a SplitRecord to pass into _add_node
split.feature = node.feature
split.threshold = node.threshold
@@ -2473,3 +2482,33 @@ cdef _build_pruned_tree(
tree.max_depth = max_depth_seen
if rc == -1:
raise MemoryError("pruning tree")
+ elif rc == -2:
+ raise ValueError(
+ "Node has reached a leaf in the original tree, but is not "
+ "marked as a leaf in the leaves_in_subtree mask."
+ )
+
+
+def _build_pruned_tree_py(Tree tree, Tree orig_tree, const uint8_t[:] leaves_in_subtree):
+ """Build a pruned tree.
+
+ Build a pruned tree from the original tree by transforming the nodes in
+ ``leaves_in_subtree`` into leaves.
+
+ Parameters
+ ----------
+ tree : Tree
+ Location to place the pruned tree
+ orig_tree : Tree
+ Original tree
+ leaves_in_subtree : uint8_t ndarray, shape=(node_count, )
+ Boolean mask for leaves to include in subtree. The array must have
+ the same size as the number of nodes in the original tree.
+ """
+ if leaves_in_subtree.shape[0] != orig_tree.node_count:
+ raise ValueError(
+ f"The length of leaves_in_subtree {len(leaves_in_subtree)} must be "
+ f"equal to the number of nodes in the original tree {orig_tree.node_count}."
+ )
+
+ _build_pruned_tree(tree, orig_tree, leaves_in_subtree, orig_tree.node_count)
diff --git a/sklearn/tree/_utils.pxd b/sklearn/tree/_utils.pxd
index 526d484416c69..8094537f885d4 100644
--- a/sklearn/tree/_utils.pxd
+++ b/sklearn/tree/_utils.pxd
@@ -9,7 +9,6 @@ cnp.import_array()
from ..neighbors._quad_tree cimport Cell
from ..utils._typedefs cimport float32_t, float64_t, intp_t, uint8_t, int32_t, uint32_t
-
from ._tree cimport Node
diff --git a/sklearn/tree/tests/test_tree.py b/sklearn/tree/tests/test_tree.py
index da8412fa5a8a5..fee65b96cc865 100644
--- a/sklearn/tree/tests/test_tree.py
+++ b/sklearn/tree/tests/test_tree.py
@@ -39,6 +39,7 @@
NODE_DTYPE,
TREE_LEAF,
TREE_UNDEFINED,
+ _build_pruned_tree_py,
_check_n_classes,
_check_node_ndarray,
_check_value_ndarray,
@@ -2942,3 +2943,52 @@ def test_classification_tree_missing_values_toy():
(tree.tree_.children_left == -1) & (tree.tree_.n_node_samples == 1)
)
assert_allclose(tree.tree_.impurity[leaves_idx], 0.0)
+
+
+def test_build_pruned_tree_py():
+ """Test pruning a tree with the Python caller of the Cythonized prune tree."""
+ tree = DecisionTreeClassifier(random_state=0, max_depth=1)
+ tree.fit(iris.data, iris.target)
+
+ n_classes = np.atleast_1d(tree.n_classes_)
+ pruned_tree = CythonTree(tree.n_features_in_, n_classes, tree.n_outputs_)
+
+ # only keep the root note
+ leave_in_subtree = np.zeros(tree.tree_.node_count, dtype=np.uint8)
+ leave_in_subtree[0] = 1
+ _build_pruned_tree_py(pruned_tree, tree.tree_, leave_in_subtree)
+
+ assert tree.tree_.node_count == 3
+ assert pruned_tree.node_count == 1
+ with pytest.raises(AssertionError):
+ assert_array_equal(tree.tree_.value, pruned_tree.value)
+ assert_array_equal(tree.tree_.value[0], pruned_tree.value[0])
+
+ # now keep all the leaves
+ pruned_tree = CythonTree(tree.n_features_in_, n_classes, tree.n_outputs_)
+ leave_in_subtree = np.zeros(tree.tree_.node_count, dtype=np.uint8)
+ leave_in_subtree[1:] = 1
+
+ # Prune the tree
+ _build_pruned_tree_py(pruned_tree, tree.tree_, leave_in_subtree)
+ assert tree.tree_.node_count == 3
+ assert pruned_tree.node_count == 3, pruned_tree.node_count
+ assert_array_equal(tree.tree_.value, pruned_tree.value)
+
+
+def test_build_pruned_tree_infinite_loop():
+ """Test pruning a tree does not result in an infinite loop."""
+
+ # Create a tree with root and two children
+ tree = DecisionTreeClassifier(random_state=0, max_depth=1)
+ tree.fit(iris.data, iris.target)
+ n_classes = np.atleast_1d(tree.n_classes_)
+ pruned_tree = CythonTree(tree.n_features_in_, n_classes, tree.n_outputs_)
+
+ # only keeping one child as a leaf results in an improper tree
+ leave_in_subtree = np.zeros(tree.tree_.node_count, dtype=np.uint8)
+ leave_in_subtree[1] = 1
+ with pytest.raises(
+ ValueError, match="Node has reached a leaf in the original tree"
+ ):
+ _build_pruned_tree_py(pruned_tree, tree.tree_, leave_in_subtree)
diff --git a/sklearn/utils/estimator_checks.py b/sklearn/utils/estimator_checks.py
index a8776aa19608e..42edfe0d4d3c4 100644
--- a/sklearn/utils/estimator_checks.py
+++ b/sklearn/utils/estimator_checks.py
@@ -1915,7 +1915,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"]