diff --git a/build_tools/azure/debian_atlas_32bit_lock.txt b/build_tools/azure/debian_atlas_32bit_lock.txt index 92b4b864fb9f5..ba957463e60bc 100644 --- a/build_tools/azure/debian_atlas_32bit_lock.txt +++ b/build_tools/azure/debian_atlas_32bit_lock.txt @@ -6,7 +6,7 @@ # attrs==23.2.0 # via pytest -coverage==7.5.2 +coverage==7.5.3 # via pytest-cov cython==3.0.10 # via -r build_tools/azure/debian_atlas_32bit_requirements.txt @@ -14,7 +14,7 @@ iniconfig==2.0.0 # via pytest joblib==1.2.0 # via -r build_tools/azure/debian_atlas_32bit_requirements.txt -meson==1.4.0 +meson==1.4.1 # via meson-python meson-python==0.16.0 # via -r build_tools/azure/debian_atlas_32bit_requirements.txt 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 bf4b0087c662b..35201642cd4bc 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 @@ -1,9 +1,9 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 50fed47bc507d9ee3dbf5ff7a2247cb88944928bd5797e534ebdf8ece2d858ec +# input_hash: 0c58e5b0c6721f7dfae2396da8908cb7f7f0ce8858819ea625f0788a440a1df1 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb @@ -48,7 +48,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 @@ -99,7 +99,7 @@ https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.49-h06160fa_0.conda#1d78 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/ucx-1.14.1-h64cca9d_5.conda#39aa3b356d10d7e5add0c540945a0944 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-he9a53bd_1.conda#8a24e5820f4a0ffd2ed9c4722cd5d7ca https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b @@ -124,7 +124,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec -https://conda.anaconda.org/conda-forge/noarch/array-api-compat-1.7-pyhd8ed1ab_0.conda#c359e5b3182a7147e29f9e29ebad7cdd +https://conda.anaconda.org/conda-forge/noarch/array-api-compat-1.7.1-pyhd8ed1ab_0.conda#8791d81c38f676a7c08c76546800bf70 https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h2e3709c_4.conda#2cf21b1cbc1c096a28ffa2892257a2c1 https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-h00aa349_4.conda#cb932dff7328ff620ce8059c9968b095 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 @@ -148,11 +148,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda#dfcfd72c7a430d3616763ecfbefe4ca9 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda#776a8dd9e824f77abac30e6ef43a8f7a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda#18c6deb6f9602e32446398203c8f0e91 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad @@ -163,7 +165,7 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py311h459d7ec_0.conda#cc7727006191b8f3630936b339a76cd0 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda#26d7ee34132362115093717c706c384c https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda#81f740407b45e3f9047b3174fa94eb9e @@ -172,14 +174,15 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_ https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-h28f7589_1.conda#97503d3e565004697f1651753aa95b9e https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.3-hb447be9_1.conda#c520669eb0be9269a5f0d8ef62531882 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.2-py311h331c9d8_0.conda#6afe87fd0c278ed708393cc1cf085146 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.1-py311h331c9d8_0.conda#bb70cda5777de08084a402a2cdc13935 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py311h331c9d8_0.conda#2daef6c4ce74840c8d7a431498be83e9 https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.12.0-hac9eb74_1.conda#0dee716254497604762957076ac76540 https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.2.1-h84fe81f_16997.conda#a7ce56d5757f5b57e7daabe703ade5bb https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 @@ -190,7 +193,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py311hb755f60_0.conda#02336abab4cb5dd794010ef53c54bd09 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-hf3aad02_1.conda#a968ffa7e9fe0c257628033d393e512f https://conda.anaconda.org/conda-forge/linux-64/blas-1.0-mkl.tar.bz2#349aef876b1d8c9dccae01de20d5b385 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.3-haf2f30d_0.conda#f3df87cc9ef0b5113bff55aefcbcafd5 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.conda#926c2c7ee7a0b48d6d70783a33f7bc80 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_mkl.tar.bz2#85f61af03fd291dae33150ffe89dc09a https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 @@ -198,8 +201,9 @@ https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.c https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py311hb755f60_5.conda#e4d262cc3600e70b505a6761d29f6207 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b +https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda#ba445bf767ae6f0d959ff2b40c20912b https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.21.0-hb942446_5.conda#07d92ed5403ad7b5c66ffd7d5b8f7e57 -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.3-h9ad1361_0.conda#8fb0e954c616bb0f9389efac4b4ed44b +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2#361bf757b95488de76c4f123805742d3 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_mkl.tar.bz2#a2f166748917d6d6e4707841ca1f519e https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b @@ -210,7 +214,7 @@ https://conda.anaconda.org/conda-forge/noarch/array-api-strict-1.1.1-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 https://conda.anaconda.org/conda-forge/linux-64/libarrow-12.0.1-hb87d912_8_cpu.conda#3f3b11398fe79b578e3c44dd00a44e4a https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py311h14de704_1.conda#84e2dd379d4edec4dd6382861486104d -https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.29-py311h00856b1_0.conda#f231b6f51b2154ac92fe26b874dafca2 +https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.31-py311h00856b1_0.conda#4f1cc2c95c25fe838acabfa8dc0d48ff https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py311hf0fb5b6_5.conda#ec7e45bc76d9d0b69a74a2075932b8e8 https://conda.anaconda.org/conda-forge/linux-64/pytorch-1.13.1-cpu_py311h410fd25_1.conda#ddd2fadddf89e3dc3d541a2537fce010 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda#764b0e055f59dbd7d114d32b8c6e55e6 diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_environment.yml b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_environment.yml index 30a2fe1d1812a..4a88a2b82b275 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_environment.yml +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_environment.yml @@ -13,6 +13,7 @@ dependencies: - threadpoolctl - matplotlib - pandas + - rich - pyamg - pytest - pytest-xdist 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 833ce559e02b9..49f1149217f4c 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 @@ -1,9 +1,9 @@ # Generated by conda-lock. # platform: osx-64 -# input_hash: e7c2bc2b07721ef735f30d3b1cf0b2a780b5bf5c138d9d18ad174611bfbd32bf +# input_hash: dd7e2ed099586061e53fd1456b3bfd4c777fab025716fb18e5fe01597f1d26ac @EXPLICIT https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda#6097a6ca9ada32699b5fc4312dd6ef18 -https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda#f2eacee8c33c43692f1ccfd33d0f50b1 +https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.6.2-h8857fd0_0.conda#3c23a8cab15ae51ebc9efdc229fccecf https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda#5cc301d759ec03f28328428e28f65591 https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h0dc2134_1.conda#9e6c31441c9aa24e41ace40d6151aab6 https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.20-h49d49c5_0.conda#d46104f6a896a0bc6a1d37b88b2edf5c @@ -13,7 +13,6 @@ https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-12.3.0-h0 https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda#6c3628d047e151efba7cf08c5e54d1ca https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda#72507f8e3961bc968af17435060b6dd6 https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda#b2c0047ea73819d992484faacbbe1c24 -https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda#4a3ad23f6e16f99c04e166767193d700 https://conda.anaconda.org/conda-forge/osx-64/mkl-include-2023.2.0-h6bab518_50500.conda#835abb8ded5e26f23ea6996259c7972e https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda#02a888433d165c99bf09784a7b14d900 https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2#addd19059de62181cd11ae8f4ef26084 @@ -25,29 +24,33 @@ https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2#a72f9d https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h0dc2134_1.conda#9ee0bab91b2ca579e10353738be36063 https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h0dc2134_1.conda#8a421fe09c6187f0eb5e2338a8a8be6d https://conda.anaconda.org/conda-forge/osx-64/libcxx-17.0.6-h88467a6_0.conda#0fe355aecb8d24b8bc07c763209adbd9 -https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda#65dcddb15965c9de2c0365cb14910532 -https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda#68e462226209f35182ef66eda0f794ff https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda#5513f57e0238c87c12dffedbcc9c1a4a -https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-h3e169fe_0.conda#4c04ba47fdd2ebecc1d3b6a77534d9ef +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.6-h15ab845_0.conda#065f974bc7afcef3f94df56394e16154 https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-h87427d6_3.conda#ec504fefb403644d893adffb6e7a2dbe https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda#f17f77f2acf4d344734bda76829ce14e -https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda#bf830ba5afc507c6232d4ef0fb1a882d -https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda#75a8a98b1c4671c5d2897975731da42d -https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda#4cb2cd56f039b129bb0e491c1164167e https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h0dc2134_1.conda#ece565c215adcc47fc1db4e651ee094b -https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda#25152fce119320c980e5470e64834b50 https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-h73e2aa4_1.conda#92f8d748d95d97f92fc26cfac9bb5b6e https://conda.anaconda.org/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda#d06222822a9144918333346f145b68c6 https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2#f9d6a4c82889d5ecedec1d90eb673c55 https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda#e4fb4d23ec2870ff3c40d10afe305aec -https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.10.0-default_h456cccd_1001.conda#d2dc768b14cdf226a30a8eab15641305 -https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-hbedff68_3.conda#8fd56c0adc07a37f93bd44aa61a97c90 +https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda#65dcddb15965c9de2c0365cb14910532 +https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda#68e462226209f35182ef66eda0f794ff +https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-hfa5d230_0.conda#8a120101fe26145a0cee371825ce37ad https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-h3c5361c_0.conda#a0ebabd021c8191aeb82793fe43cfdcb -https://conda.anaconda.org/conda-forge/osx-64/python-3.12.3-h1411813_0_cpython.conda#df1448ec6cbf8eceb03d29003cf72ae6 https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2#fbfb84b9de9a6939cb165c02c69b1865 https://conda.anaconda.org/conda-forge/osx-64/tapi-1100.0.11-h9ce4665_0.tar.bz2#f9ff42ccf809a21ba6f8607f8de36108 +https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda#bf830ba5afc507c6232d4ef0fb1a882d +https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-h87427d6_1.conda#3ac9ef8975965f9698dbedd2a4cc5894 +https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda#4cb2cd56f039b129bb0e491c1164167e https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h0dc2134_1.conda#9272dd3b19c4e8212f8542cefd5c3d67 +https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda#25152fce119320c980e5470e64834b50 +https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda#0b6e23a012ee7a9a5f6b244f5a92c1d5 +https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.10.0-default_h456cccd_1001.conda#d2dc768b14cdf226a30a8eab15641305 +https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-hbedff68_3.conda#8fd56c0adc07a37f93bd44aa61a97c90 +https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h129831d_3.conda#568593071d2e6cea7b5fc1f75bfa10ca +https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-h4f6b447_1.conda#b90df08f0deb2f58631447c1462c92a7 +https://conda.anaconda.org/conda-forge/osx-64/python-3.12.3-h1411813_0_cpython.conda#df1448ec6cbf8eceb03d29003cf72ae6 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 https://conda.anaconda.org/conda-forge/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 @@ -56,15 +59,18 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2. https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py312h49ebfd2_1.conda#21f174a5cfb5964069c374171a979157 +https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda#1442db8f03517834843666c422238c9b https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-711-ha20a434_0.conda#a8b41eb97c8a9d618243a79ba78fdc3c -https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp16-16.0.6-default_h7151d67_6.conda#7eaad118ab797d1427f8745c861d1925 -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/libtiff-4.6.0-h129831d_3.conda#568593071d2e6cea7b5fc1f75bfa10ca +https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp16-16.0.6-default_h4c8afb6_7.conda#784816790fe438443354d13050fcd67d +https://conda.anaconda.org/conda-forge/osx-64/libhiredis-1.0.2-h2beb688_0.tar.bz2#524282b2c46c9dedf051b3bc2ae05494 https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-16.0.6-hbedff68_3.conda#e9356b0807462e8f84c1384a8da539a5 -https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-h4f6b447_1.conda#b90df08f0deb2f58631447c1462c92a7 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda#776a8dd9e824f77abac30e6ef43a8f7a +https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h81bd1dd_0.conda#c752c0eb6c250919559172c011e5f65b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 +https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda#05a14cc9d725dd74995927968d6547e3 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad @@ -75,34 +81,33 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py312h41838bb_0.conda#2d2d1fde5800d45cb56218583156d23d +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda#26d7ee34132362115093717c706c384c https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae +https://conda.anaconda.org/conda-forge/osx-64/ccache-4.9.1-h41adc32_0.conda#45aaf96b67840bd98a928de8679098fa https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-986-ha1c5b94_0.conda#a8951de2506df5649f5a3295fdfd9f2c -https://conda.anaconda.org/conda-forge/osx-64/clang-16-16.0.6-default_h7151d67_6.conda#1c298568c30efe7d9369c7c15b748461 -https://conda.anaconda.org/conda-forge/osx-64/coverage-7.5.2-py312hbd25219_0.conda#7af2cf0238c403ef3f92abdcda6151bf -https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.52.1-py312hbd25219_0.conda#e830ecb59e43bcaabc98fa945e1985a3 +https://conda.anaconda.org/conda-forge/osx-64/clang-16-16.0.6-default_h4c8afb6_7.conda#c9da6a62b571cac3707db69610ed7bd3 +https://conda.anaconda.org/conda-forge/osx-64/coverage-7.5.3-py312hbd25219_0.conda#135eeb22a4da903e2d06c4323b459003 +https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.53.0-py312hbd25219_0.conda#ce2e9b0279cbbae03017ec7be748b255 +https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-12.3.0-hc328e78_3.conda#b3d751dc7073bbfdfa9d863e39b9685d https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f -https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda#1442db8f03517834843666c422238c9b https://conda.anaconda.org/conda-forge/osx-64/ld64-711-ha02d983_0.conda#3ae4930ec076735cce481e906f5192e0 -https://conda.anaconda.org/conda-forge/osx-64/libhiredis-1.0.2-h2beb688_0.tar.bz2#524282b2c46c9dedf051b3bc2ae05494 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b -https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h81bd1dd_0.conda#c752c0eb6c250919559172c011e5f65b -https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda#05a14cc9d725dd74995927968d6547e3 +https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py312h0c923fa_0.conda#6f0591ae972e9b815739da3392fbb3c3 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.8.0-pyhd8ed1ab_0.conda#573fe09d7bd0cd4bcc210d8369b5ca47 https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4418e8bdbaa8eea28e047531e6763c8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/osx-64/ccache-4.9.1-h41adc32_0.conda#45aaf96b67840bd98a928de8679098fa https://conda.anaconda.org/conda-forge/osx-64/cctools-986-h40f6528_0.conda#b7a2ca0062a6ee8bc4e83ec887bef942 -https://conda.anaconda.org/conda-forge/osx-64/clang-16.0.6-hdae98eb_6.conda#884e7b24306e4f21b7ee08dabadb2ecc -https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-12.3.0-hc328e78_3.conda#b3d751dc7073bbfdfa9d863e39b9685d +https://conda.anaconda.org/conda-forge/osx-64/clang-16.0.6-hd4457cd_7.conda#0f91e4c1d9d85887db66ddbc185d65d4 https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda#160fdc97a51d66d51dc782fb67d35205 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 https://conda.anaconda.org/conda-forge/osx-64/mkl-devel-2023.2.0-h694c41f_50500.conda#1b4d0235ef253a1e19459351badf4f9f -https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py312h0c923fa_0.conda#6f0591ae972e9b815739da3392fbb3c3 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/osx-64/clangxx-16.0.6-default_h7151d67_6.conda#cc8c007a529a7cfaa5d29d8599df3fe6 +https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda#ba445bf767ae6f0d959ff2b40c20912b +https://conda.anaconda.org/conda-forge/osx-64/clangxx-16.0.6-default_ha3b9224_7.conda#00c8a212cbbd427dcbcc4231b23ddc5e https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda#51089a4865eb4aec2bc5c7468bd07f9f https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda#58f08e12ad487fac4a08f90ff0b87aec https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-16.0.6-ha38d28d_2.conda#7a46507edc35c6c8818db0adaf8d787f diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_environment.yml b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_environment.yml index ad177e4ed391b..c5c104b20751d 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_environment.yml +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_environment.yml @@ -13,6 +13,7 @@ dependencies: - threadpoolctl - matplotlib - pandas + - rich - pyamg - pytest - pytest-xdist diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml b/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml index 7e85b28b3f6c4..1cbf63700d3c2 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml @@ -11,6 +11,7 @@ dependencies: - joblib - matplotlib - pandas + - rich - pyamg - pytest - pytest-xdist 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 956622fe0008e..1aa2360266172 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: osx-64 -# input_hash: 33a102d2ccde4e14e315a98b50340349af349f802403dd49589375b2b889f2d3 +# input_hash: e737acc704c7bc36db9d57f2d04509176b0afcba73d19fa9125e4898c0f7b62f @EXPLICIT https://repo.anaconda.com/pkgs/main/osx-64/blas-1.0-mkl.conda#cb2c87e85ac8e0ceae776d26d4214c8a https://repo.anaconda.com/pkgs/main/osx-64/bzip2-1.0.8-h6c40b1e_6.conda#96224786021d0765ce05818fa3c59bdb @@ -46,11 +46,13 @@ https://repo.anaconda.com/pkgs/main/noarch/iniconfig-1.1.1-pyhd3eb1b0_0.tar.bz2# https://repo.anaconda.com/pkgs/main/osx-64/joblib-1.4.0-py312hecd8cb5_0.conda#0af12a3a87d9c8051ae6ba2ed2c3882a https://repo.anaconda.com/pkgs/main/osx-64/kiwisolver-1.4.4-py312hcec6c5f_0.conda#2ba6561ddd1d05936fe74f5d118ce7dd https://repo.anaconda.com/pkgs/main/osx-64/lcms2-2.12-hf1fd2bf_0.conda#697aba7a3308226df7a93ccfeae16ffa +https://repo.anaconda.com/pkgs/main/osx-64/mdurl-0.1.0-py312hecd8cb5_0.conda#0d3a6bae224df024c474dfc062324218 https://repo.anaconda.com/pkgs/main/osx-64/mkl-service-2.4.0-py312h6c40b1e_1.conda#b1ef860be9043b35c5e8d9388b858514 https://repo.anaconda.com/pkgs/main/osx-64/ninja-1.10.2-hecd8cb5_5.conda#a0043b325fb08db82477ae433668e684 https://repo.anaconda.com/pkgs/main/osx-64/openjpeg-2.4.0-h66ea3da_0.conda#882833bd7befc5e60e6fba9c518c1b79 https://repo.anaconda.com/pkgs/main/osx-64/packaging-23.2-py312hecd8cb5_0.conda#2b4e331c8f6df5d95a5dd3af37a34d89 https://repo.anaconda.com/pkgs/main/osx-64/pluggy-1.0.0-py312hecd8cb5_1.conda#647fada22f1697691fdee90b52c99bcb +https://repo.anaconda.com/pkgs/main/osx-64/pygments-2.15.1-py312hecd8cb5_1.conda#76178b3f791217ae17fcb1a295ffdb84 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 @@ -61,6 +63,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/tornado-6.3.3-py312h6c40b1e_0.conda#4 https://repo.anaconda.com/pkgs/main/osx-64/unicodedata2-15.1.0-py312h6c40b1e_0.conda#65bd2cb787fc99662d9bb6e6520c5826 https://repo.anaconda.com/pkgs/main/osx-64/wheel-0.43.0-py312hecd8cb5_0.conda#c0bdd5748b170523232e8ad1d667136c https://repo.anaconda.com/pkgs/main/osx-64/fonttools-4.51.0-py312h6c40b1e_0.conda#8f55fa86b73e8a7f4403503f9b7a9959 +https://repo.anaconda.com/pkgs/main/osx-64/markdown-it-py-2.2.0-py312hecd8cb5_1.conda#bc2e2635a5c7fc25b591c4cd5216194b https://repo.anaconda.com/pkgs/main/osx-64/numpy-base-1.26.4-py312h6f81483_0.conda#87f73efbf26ab2e2ea7c32481a71bd47 https://repo.anaconda.com/pkgs/main/osx-64/pillow-10.3.0-py312h6c40b1e_0.conda#fe883fa4247d35fe6de49f713529ca02 https://repo.anaconda.com/pkgs/main/osx-64/pip-24.0-py312hecd8cb5_0.conda#7a8e0b1d3742ddf1c8aa97fbaa158039 @@ -68,6 +71,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/pytest-7.4.0-py312hecd8cb5_0.conda#b8 https://repo.anaconda.com/pkgs/main/osx-64/python-dateutil-2.9.0post0-py312hecd8cb5_2.conda#1047dde28f78127dd9f6121e882926dd https://repo.anaconda.com/pkgs/main/osx-64/pytest-cov-4.1.0-py312hecd8cb5_1.conda#a33a24eb20359f464938e75b2f57e23a https://repo.anaconda.com/pkgs/main/osx-64/pytest-xdist-3.5.0-py312hecd8cb5_0.conda#d1ecfb3691cceecb1f16bcfdf0b67bb5 +https://repo.anaconda.com/pkgs/main/osx-64/rich-13.3.5-py312hecd8cb5_1.conda#05de027713190752da0887054acbf016 https://repo.anaconda.com/pkgs/main/osx-64/bottleneck-1.3.7-py312h32608ca_0.conda#f96a01eba5ea542cf9c7cc8d77447627 https://repo.anaconda.com/pkgs/main/osx-64/contourpy-1.2.0-py312ha357a0b_0.conda#57d384ad07152375b40a6293f79e3f0c https://repo.anaconda.com/pkgs/main/osx-64/matplotlib-3.8.4-py312hecd8cb5_0.conda#6886c230c2ec2f47621b5cca4c7d493a @@ -80,7 +84,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/scipy-1.11.4-py312h81688c2_0.conda#7d https://repo.anaconda.com/pkgs/main/osx-64/pandas-2.2.1-py312he282a81_0.conda#021b70a1e40efb75b89eb8ebdb347132 https://repo.anaconda.com/pkgs/main/osx-64/pyamg-4.2.3-py312h44cbcf4_0.conda#3bdc7be74087b3a5a83c520a74e1e8eb # pip cython @ https://files.pythonhosted.org/packages/d5/6d/06c08d75adb98cdf72af18801e193d22580cc86ca553610f430f18ea26b3/Cython-3.0.10-cp312-cp312-macosx_10_9_x86_64.whl#sha256=8f2864ab5fcd27a346f0b50f901ebeb8f60b25a60a575ccfd982e7f3e9674914 -# pip meson @ https://files.pythonhosted.org/packages/33/75/b1a37fa7b2dbca8c0dbb04d5cdd7e2720c8ef6febe41b4a74866350e041c/meson-1.4.0-py3-none-any.whl#sha256=476a458d51fcfa322a6bdc64da5138997c542d08e6b2e49b9fa68c46fd7c4475 +# pip meson @ https://files.pythonhosted.org/packages/44/b2/d4433391a7c5e94a39b50ca7295a8ceba736e7c72c455752a60122f52453/meson-1.4.1-py3-none-any.whl#sha256=d5acc3abae2dad3c70ddcbd10acac92b78b144d34d43f40f5b8ac31dfd8a826a # pip threadpoolctl @ https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl#sha256=56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467 # pip pyproject-metadata @ https://files.pythonhosted.org/packages/aa/5f/bb5970d3d04173b46c9037109f7f05fc8904ff5be073ee49bb6ff00301bc/pyproject_metadata-0.8.0-py3-none-any.whl#sha256=ad858d448e1d3a1fb408ac5bac9ea7743e7a8bbb472f2693aaa334d2db42f526 # pip meson-python @ https://files.pythonhosted.org/packages/91/c0/104cb6244c83fe6bc3886f144cc433db0c0c78efac5dc00e409a5a08c87d/meson_python-0.16.0-py3-none-any.whl#sha256=842dc9f5dc29e55fc769ff1b6fe328412fe6c870220fc321060a1d2d395e69e8 diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml b/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml index adb7add7622e1..f06d14141fa59 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml +++ b/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml @@ -15,6 +15,7 @@ dependencies: - threadpoolctl - matplotlib - pandas + - rich - pyamg - pytest - pytest-xdist 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 fb409d975c5a4..2f8c76838eddf 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 37f8029b6bb116e0d5856093424791a8c1ddc3f493e20fcb5d02cd32d516523d +# input_hash: 921314cadc10ee36e485ebf8528fe4080984c8116dac786ae7fd94538865ec5f @EXPLICIT https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda#c3473ff8bdb3d124ed5ff11ec380d6f9 https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2024.3.11-h06a4308_0.conda#08529eb3504712baabcbda266a19feb7 @@ -25,21 +25,22 @@ https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.43.0-py39h06a4308_0.conda#4 https://repo.anaconda.com/pkgs/main/linux-64/pip-24.0-py39h06a4308_0.conda#7f8ce3af15cfecd12e4dda8c5cef5fb7 # pip alabaster @ https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl#sha256=b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 # pip babel @ https://files.pythonhosted.org/packages/27/45/377f7e32a5c93d94cd56542349b34efab5ca3f9e2fd5a68c5e93169aa32d/Babel-2.15.0-py3-none-any.whl#sha256=08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb -# pip certifi @ https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl#sha256=dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 +# pip certifi @ https://files.pythonhosted.org/packages/5b/11/1e78951465b4a225519b8c3ad29769c49e0d8d157a070f681d5b6d64737f/certifi-2024.6.2-py3-none-any.whl#sha256=ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 # pip charset-normalizer @ https://files.pythonhosted.org/packages/98/69/5d8751b4b670d623aa7a47bef061d69c279e9f922f6705147983aa76c3ce/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 # pip cycler @ https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl#sha256=85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 # pip cython @ https://files.pythonhosted.org/packages/a7/f5/3dde4d96076888ceaa981827b098274c2b45ddd4b20d75a8cfaa92b91eec/Cython-3.0.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=651a15a8534ebfb9b58cb0b87c269c70984b6f9c88bfe65e4f635f0e3f07dfcd # pip docutils @ https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl#sha256=dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # pip exceptiongroup @ https://files.pythonhosted.org/packages/01/90/79fe92dd413a9cab314ef5c591b5aa9b9ba787ae4cadab75055b0ae00b33/exceptiongroup-1.2.1-py3-none-any.whl#sha256=5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad # pip execnet @ https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl#sha256=26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc -# pip fonttools @ https://files.pythonhosted.org/packages/22/56/8b2ffe792b0a11d481ed797e0c246ee914b86370e317476c84d4fc537d95/fonttools-4.52.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=ee2a8c1101d06cc8fca7851dceb67afd53dd6fc0288bacaa632e647bc5afff58 +# pip fonttools @ https://files.pythonhosted.org/packages/c1/cb/b1877d606dfa1daca70324bf37afec2b0a386138c467580027b9b51188a8/fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f # pip idna @ https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl#sha256=82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 # pip imagesize @ https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl#sha256=0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b # pip iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 # pip joblib @ https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl#sha256=06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 # pip kiwisolver @ https://files.pythonhosted.org/packages/c0/a8/841594f11d0b88d8aeb26991bc4dac38baa909dc58d0c4262a4f7893bcbf/kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff # pip markupsafe @ https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 -# pip meson @ https://files.pythonhosted.org/packages/33/75/b1a37fa7b2dbca8c0dbb04d5cdd7e2720c8ef6febe41b4a74866350e041c/meson-1.4.0-py3-none-any.whl#sha256=476a458d51fcfa322a6bdc64da5138997c542d08e6b2e49b9fa68c46fd7c4475 +# pip mdurl @ https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl#sha256=84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 +# pip meson @ https://files.pythonhosted.org/packages/44/b2/d4433391a7c5e94a39b50ca7295a8ceba736e7c72c455752a60122f52453/meson-1.4.1-py3-none-any.whl#sha256=d5acc3abae2dad3c70ddcbd10acac92b78b144d34d43f40f5b8ac31dfd8a826a # pip networkx @ https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl#sha256=f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2 # pip ninja @ https://files.pythonhosted.org/packages/6d/92/8d7aebd4430ab5ff65df2bfee6d5745f95c004284db2d8ca76dcbfd9de47/ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl#sha256=84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b # pip numpy @ https://files.pythonhosted.org/packages/54/30/c2a907b9443cf42b90c17ad10c1e8fa801975f01cb9764f3f8eb8aea638b/numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3 @@ -62,18 +63,19 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-24.0-py39h06a4308_0.conda#7f8ce # pip tomli @ https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl#sha256=939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc # pip tzdata @ https://files.pythonhosted.org/packages/65/58/f9c9e6be752e9fcb8b6a0ee9fb87e6e7a1f6bcab2cdc73f02bb7ba91ada0/tzdata-2024.1-py2.py3-none-any.whl#sha256=9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252 # pip urllib3 @ https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl#sha256=450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d -# pip zipp @ https://files.pythonhosted.org/packages/7f/2d/670176f39d6613af2908b5bc31c9974588208de1fcc4117dfae08623d188/zipp-3.19.0-py3-none-any.whl#sha256=96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec +# pip zipp @ https://files.pythonhosted.org/packages/82/1a/ac67760425f2477b1da593b347db66d474130747e6e5285d08c7f2d5884a/zipp-3.19.1-py3-none-any.whl#sha256=2828e64edb5386ea6a52e7ba7cdb17bb30a73a858f5eb6eb93d8d36f5ea26091 # pip contourpy @ https://files.pythonhosted.org/packages/31/a2/2f12e3a6e45935ff694654b710961b03310b0e1ec997ee9f416d3c873f87/contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445 -# pip coverage @ https://files.pythonhosted.org/packages/b2/31/aa090d5e5a4e1a0e2d517f73a737a6d4b4975ca1f2b9cea9cb985b3ef307/coverage-7.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=24bb4c7859a3f757a116521d4d3a8a82befad56ea1bdacd17d6aafd113b0071e +# pip coverage @ https://files.pythonhosted.org/packages/07/e0/0e30ca5c6c5bcae86df9583c30807ff26e0b991e76f266b81224410663e4/coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7 # pip imageio @ https://files.pythonhosted.org/packages/a3/b6/39c7dad203d9984225f47e0aa39ac3ba3a47c77a02d0ef2a7be691855a06/imageio-2.34.1-py3-none-any.whl#sha256=408c1d4d62f72c9e8347e7d1ca9bc11d8673328af3913868db3b828e28b40a4c # pip importlib-metadata @ https://files.pythonhosted.org/packages/2d/0a/679461c511447ffaf176567d5c496d1de27cbe34a87df6677d7171b2fbd4/importlib_metadata-7.1.0-py3-none-any.whl#sha256=30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 # pip importlib-resources @ https://files.pythonhosted.org/packages/75/06/4df55e1b7b112d183f65db9503bff189e97179b256e1ea450a3c365241e0/importlib_resources-6.4.0-py3-none-any.whl#sha256=50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c # pip jinja2 @ https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl#sha256=bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # pip lazy-loader @ https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl#sha256=342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc +# pip markdown-it-py @ https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl#sha256=355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 # pip pyproject-metadata @ https://files.pythonhosted.org/packages/aa/5f/bb5970d3d04173b46c9037109f7f05fc8904ff5be073ee49bb6ff00301bc/pyproject_metadata-0.8.0-py3-none-any.whl#sha256=ad858d448e1d3a1fb408ac5bac9ea7743e7a8bbb472f2693aaa334d2db42f526 # pip pytest @ https://files.pythonhosted.org/packages/b4/c1/27a1274b73712232328cb5115030057b7dec377f36a518c83f2e01d4f305/pytest-8.2.1-py3-none-any.whl#sha256=faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1 # 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/c3/20/748e38b466e0819491f0ce6e90ebe4184966ee304fe483e2c414b0f4ef07/requests-2.32.2-py3-none-any.whl#sha256=fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c +# pip requests @ https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl#sha256=70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # pip scipy @ https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d # pip tifffile @ https://files.pythonhosted.org/packages/d9/6c/740c07588434e86028c24b0653c1eb6b46904d9ce585a20f07590620ec41/tifffile-2024.5.22-py3-none-any.whl#sha256=e281781c15d7d197d7e12749849c965651413aa905f97a48b0f84bd90a3b4c6f # pip lightgbm @ https://files.pythonhosted.org/packages/ba/11/cb8b67f3cbdca05b59a032bb57963d4fe8c8d18c3870f30bed005b7f174d/lightgbm-4.3.0-py3-none-manylinux_2_28_x86_64.whl#sha256=104496a3404cb2452d3412cbddcfbfadbef9c372ea91e3a9b8794bcc5183bf07 @@ -83,6 +85,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-24.0-py39h06a4308_0.conda#7f8ce # pip pyamg @ https://files.pythonhosted.org/packages/68/a9/aed9f557e7eb779d2cb4fa090663f8540979e0c04dadd16e9a0bdc9632c5/pyamg-5.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=5817d4567fb240dab4779bb1630bbb3035b3827731fcdaeb9ecc9c8814319995 # pip 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 rich @ https://files.pythonhosted.org/packages/87/67/a37f6214d0e9fe57f6ae54b2956d550ca8365857f42a1ce0392bb21d9410/rich-13.7.1-py3-none-any.whl#sha256=4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222 # pip scikit-image @ https://files.pythonhosted.org/packages/a3/7e/4cd853a855ac34b4ef3ef6a5c3d1c2e96eaca1154fc6be75db55ffa87393/scikit_image-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=3b7a6c89e8d6252332121b58f50e1625c35f7d6a85489c0b6b7ee4f5155d547a # pip sphinx @ https://files.pythonhosted.org/packages/b4/fa/130c32ed94cf270e3d0b9ded16fb7b2c8fea86fa7263c29a696a30c1dde7/sphinx-7.3.7-py3-none-any.whl#sha256=413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3 # pip numpydoc @ https://files.pythonhosted.org/packages/f0/fa/dcfe0f65660661db757ee9ebd84e170ff98edd5d80235f62457d9088f85f/numpydoc-1.7.0-py3-none-any.whl#sha256=5a56419d931310d79a06cfc2a126d1558700feeb9b4f3d8dcae1a8134be829c9 diff --git a/build_tools/azure/pymin_conda_defaults_openblas_environment.yml b/build_tools/azure/pymin_conda_defaults_openblas_environment.yml index a82ba18e27980..fdbde485df804 100644 --- a/build_tools/azure/pymin_conda_defaults_openblas_environment.yml +++ b/build_tools/azure/pymin_conda_defaults_openblas_environment.yml @@ -11,6 +11,7 @@ dependencies: - cython=3.0.10 # min - joblib=1.2.0 # min - matplotlib=3.3.4 # min + - rich - pyamg - pytest - pytest-xdist diff --git a/build_tools/azure/pymin_conda_defaults_openblas_linux-64_conda.lock b/build_tools/azure/pymin_conda_defaults_openblas_linux-64_conda.lock index deb9f11010bd9..2f2907ad5c315 100644 --- a/build_tools/azure/pymin_conda_defaults_openblas_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_defaults_openblas_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: be0f080ab1974d224952262cd9179ff999d10108421d7e7ded2435e6f08edf0e +# input_hash: 64fa5ad0ac24492aafb5bddb9e4a26af74a99f7740aafa3d2a8e2323fc800e27 @EXPLICIT https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda#c3473ff8bdb3d124ed5ff11ec380d6f9 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 @@ -65,12 +65,14 @@ https://repo.anaconda.com/pkgs/main/linux-64/glib-2.78.4-h6a678d5_0.conda#045ff4 https://repo.anaconda.com/pkgs/main/noarch/iniconfig-1.1.1-pyhd3eb1b0_0.tar.bz2#e40edff2c5708f342cef43c7f280c507 https://repo.anaconda.com/pkgs/main/linux-64/joblib-1.2.0-py39h06a4308_0.conda#ac1f5687d70aa1128cbecb26bc9e559d https://repo.anaconda.com/pkgs/main/linux-64/kiwisolver-1.4.4-py39h6a678d5_0.conda#3d57aedbfbd054ce57fb3c1e4448828c +https://repo.anaconda.com/pkgs/main/linux-64/mdurl-0.1.0-py39h06a4308_0.conda#4b648c8cb1fc9a37cf4bf3feb13c2db0 https://repo.anaconda.com/pkgs/main/linux-64/mysql-5.7.24-h721c034_2.conda#dfc19ca2466d275c4c1f73b62c57f37b https://repo.anaconda.com/pkgs/main/linux-64/numpy-base-1.21.6-py39h375b286_1.conda#0061d9193658774ab79fc85d143a94fc https://repo.anaconda.com/pkgs/main/linux-64/packaging-23.2-py39h06a4308_0.conda#b3f88f45f31bde016e49be3e941e5272 https://repo.anaconda.com/pkgs/main/linux-64/pillow-10.3.0-py39h5eee18b_0.conda#b346d6c71267c1553b6c18d3db5fdf6d https://repo.anaconda.com/pkgs/main/linux-64/pluggy-1.0.0-py39h06a4308_1.conda#fb4fed11ed43cf727dbd51883cc1d9fa https://repo.anaconda.com/pkgs/main/linux-64/ply-3.11-py39h06a4308_0.conda#6c89bf6d2fdf6d24126e34cb83fd10f1 +https://repo.anaconda.com/pkgs/main/linux-64/pygments-2.15.1-py39h06a4308_1.conda#e7e7d655415c62b52e9cd5bd9384b630 https://repo.anaconda.com/pkgs/main/linux-64/pyparsing-3.0.9-py39h06a4308_0.conda#3a0537468e59760404f63b4f04369828 https://repo.anaconda.com/pkgs/main/linux-64/pyqt5-sip-12.13.0-py39h5eee18b_0.conda#256840c3841b52346ea5743be8490ede https://repo.anaconda.com/pkgs/main/linux-64/setuptools-69.5.1-py39h06a4308_0.conda#3eb144d481b39c0fbbced789dd9b76b3 @@ -82,6 +84,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.43.0-py39h06a4308_0.conda#4 https://repo.anaconda.com/pkgs/main/linux-64/coverage-7.2.2-py39h5eee18b_0.conda#e9da151b7e1f56be2cb569c65949a1d2 https://repo.anaconda.com/pkgs/main/linux-64/dbus-1.13.18-hb2f20db_0.conda#6a6a6f1391f807847404344489ef6cf4 https://repo.anaconda.com/pkgs/main/linux-64/gstreamer-1.14.1-h5eee18b_1.conda#f2f26e6f869b5d87f41bd059fae47c3e +https://repo.anaconda.com/pkgs/main/linux-64/markdown-it-py-2.2.0-py39h06a4308_1.conda#ea301bbe299e246052c856dfb763b456 https://repo.anaconda.com/pkgs/main/linux-64/numpy-1.21.6-py39hac523dd_1.conda#f379f92039f666828a193fadd18c9819 https://repo.anaconda.com/pkgs/main/linux-64/pip-24.0-py39h06a4308_0.conda#7f8ce3af15cfecd12e4dda8c5cef5fb7 https://repo.anaconda.com/pkgs/main/linux-64/pytest-7.4.0-py39h06a4308_0.conda#99d92a7a39f7e615de84f8cc5606c49a @@ -91,6 +94,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/gst-plugins-base-1.14.1-h6a678d5_1. https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-base-3.3.4-py39h62a2d02_0.conda#dbab28222c740af8e21a3e5e2882c178 https://repo.anaconda.com/pkgs/main/linux-64/pytest-cov-4.1.0-py39h06a4308_1.conda#8f41fce21670b120bf7fa8a7883380d9 https://repo.anaconda.com/pkgs/main/linux-64/pytest-xdist-3.5.0-py39h06a4308_0.conda#e1d7ffcb1ee2ed9a84800f5c4bbbd7ae +https://repo.anaconda.com/pkgs/main/linux-64/rich-13.3.5-py39h06a4308_0.conda#6b2cffe72b9503d076c851487fbaa1a1 https://repo.anaconda.com/pkgs/main/linux-64/scipy-1.7.3-py39hf838250_2.conda#0667ea5ac14d35e26da19a0f068739da https://repo.anaconda.com/pkgs/main/linux-64/pyamg-4.2.3-py39h79cecc1_0.conda#afc634da8b81dc504179d53d334e6e55 https://repo.anaconda.com/pkgs/main/linux-64/qt-main-5.15.2-h53bd1ea_10.conda#bd0c79e82df6323f638bdcb871891b61 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 f4c2f51b1ea88..dd03cd7fb403b 100644 --- a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock @@ -2,7 +2,7 @@ # platform: win-64 # input_hash: ea607aaeb7b1d1f8a1f821a9f505b3601083a218ec4763e2d72d3d3d800e718c @EXPLICIT -https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda#63da060240ab8087b60d1357051ea7d6 +https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.6.2-h56e8100_0.conda#12a3a2b3a00a21bbb390d4de5ad8dd0f https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_966.conda#35d7ea07ad6c878bd7240d2d6c1b8657 https://conda.anaconda.org/conda-forge/win-64/mkl-include-2024.1.0-h66d3029_692.conda#60233966dc7c0261c9a443120b43c477 https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2#b0309b72560df66f71a9d5e34a5efdfa @@ -26,7 +26,7 @@ https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.con https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.4-h8ffe710_1.tar.bz2#04286d905a0dcb7f7d4a12bdfe02516d https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda#73f5dc8e2d55d9a1e14b11f49c3b4a28 https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda#abd61d0ab127ec5cd68f62c2969e6f34 -https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda#5fdb9c6a113b6b6cb5e517fd972d5f41 +https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda#d4483ca8afc57ddf1f6dded53b36c17f https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2#066552ac6b907ec6d72c0ddab29050dc https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_0.conda#a557dde55343e03c68cd7e29e7f87279 https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-h2466b09_3.conda#d7fec5d3bb8fc0c8e266bf1ad350cec5 @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-hcfcfb64_1.cond https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_2.conda#aa622c938af057adc119f8b8eecada01 https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.43-h19919ed_0.conda#77e398acc32617a0384553aea29e866b https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h0e60522_0.tar.bz2#e1a22282de0169c93e4ffe6ce6acc212 -https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_0.conda#1451be68a5549561979125c1827b79ed +https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h73268cd_0.conda#55e21736821ca3f207615fdce0d844f4 https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2#fe759119b8b3bfa720b8762c6fdc35de https://conda.anaconda.org/conda-forge/win-64/pcre2-10.43-h17e33f8_0.conda#d0485b8aa2cedb141a7bd27b4efa4c9c https://conda.anaconda.org/conda-forge/win-64/python-3.9.19-h4de0772_0_cpython.conda#b6999bc275e0e6beae7b1c8ea0be1e85 @@ -77,7 +77,7 @@ https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.cond https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2#46878ebb6b9cbd8afcf8088d7ef00ece https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-hcfcfb64_1.conda#f47f6db2528e38321fb00ae31674c133 -https://conda.anaconda.org/conda-forge/win-64/coverage-7.5.2-py39ha55e580_0.conda#efb1e63bf5157f005afcc40778efaff5 +https://conda.anaconda.org/conda-forge/win-64/coverage-7.5.3-py39ha55e580_0.conda#28d426e365cb4ed87d22d1a89c0bd006 https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.2-h2f9d560_0.conda#42fc785d9db7ab051a206fbf882ecf2e https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f @@ -91,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py39h99910a6_0.conda#0cc5774390ada632ed7975203057c91c https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-hc790b64_1.conda#e98333643abc739ebea1bac97a479828 -https://conda.anaconda.org/conda-forge/win-64/fonttools-4.52.1-py39ha55e580_0.conda#781c66ea2eeed910c0f1abc5ccc4a079 +https://conda.anaconda.org/conda-forge/win-64/fonttools-4.53.0-py39ha55e580_0.conda#7c4625b8a1013dd22e924f1fa9fbc605 https://conda.anaconda.org/conda-forge/win-64/glib-2.80.2-h0df6a38_0.conda#a728ca6f04c33ecb0f39eeda5fbd0e23 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda#dcbadab7a68738a028e195ab68ab2d2e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 @@ -100,10 +100,10 @@ https://conda.anaconda.org/conda-forge/win-64/pillow-10.3.0-py39h9ee4981_0.conda https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py39h99910a6_5.conda#dffbcea794c524c471772a5f697c2aea https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.3-h5006eae_0.conda#8c8959a520ef4911271fbf2cb2dfc3fe +https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.4-h5006eae_0.conda#3d7ebad364d5f63a1ae54eecb35aee31 https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda#65c56ecdeceffd6c32d3d54db7e02c6e https://conda.anaconda.org/conda-forge/win-64/mkl-devel-2024.1.0-h57928b3_692.conda#9b3d1d4916a56fd32460f6fe784dcb51 -https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.3-hba88be7_0.conda#1fa879c7b4868c58830762b6fac0075d +https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.4-hba88be7_0.conda#0b1d683d462029446924fa87a50dda12 https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda#336c93ab102846c6131cf68e722a68f1 https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda#c752cc2af9f3d8d7b2fdebb915a33ef7 https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-22_win64_mkl.conda#db33ffa4bae1d2f6d5602afaa048bf6b diff --git a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_environment.yml b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_environment.yml index 38737e7c9c0b0..969007db4e4dd 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_environment.yml +++ b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_environment.yml @@ -13,6 +13,7 @@ dependencies: - threadpoolctl - matplotlib - pandas + - rich - pyamg - pytest - pytest-xdist 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 66cd5eced566b..df9fc52f9d649 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 @@ -1,9 +1,9 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 3974f9847d888a2fd37ba5fcfb76cb09bba4c9b84b6200932500fc94e3b0c4ae +# input_hash: 83b00d9bf238c4a9109347cd4a7030f2e1c9fdf69bca243829aa9426efa9b031 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb @@ -40,7 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 @@ -77,7 +77,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#829 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb @@ -126,6 +126,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda#dfcfd72c7a430d3616763ecfbefe4ca9 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda#776a8dd9e824f77abac30e6ef43a8f7a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.27-pthreads_h7a3da1a_0.conda#4b422ebe8fc6a5320d0c1c22e5a46032 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 @@ -146,6 +147,7 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda#1e865e9188204cdfb1fd2531780add88 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda#26d7ee34132362115093717c706c384c https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 @@ -155,7 +157,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_ https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.1-py39hd3abc70_0.conda#66b6088c2446c25e714829a289070499 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py39hd3abc70_0.conda#9dae301603c88aef61dba733e8931cdd https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d @@ -166,6 +168,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.cond https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda#1e3b6af9592be71ce19f0a6aae05d97b https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 @@ -174,7 +177,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda#e667a3ab0df62c54e60e1843d2e6defb https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.3-haf2f30d_0.conda#f3df87cc9ef0b5113bff55aefcbcafd5 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.conda#926c2c7ee7a0b48d6d70783a33f7bc80 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda#dcbadab7a68738a028e195ab68ab2d2e https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-22_linux64_openblas.conda#1fd156abd41a4992835952f6f4d951d0 @@ -183,10 +186,11 @@ https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda#93aff412f3e49fdb43361c0215cbd72d https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.2-pyhd8ed1ab_0.conda#e1643b34b19df8c028a4f00bf5df58a6 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 +https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda#ba445bf767ae6f0d959ff2b40c20912b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-22_linux64_openblas.conda#63ddb593595c9cf5eb08d3de54d66df8 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda#bdc188e59857d6efab332714e0d01d93 -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.3-h9ad1361_0.conda#8fb0e954c616bb0f9389efac4b4ed44b +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py39hfc16268_1.conda#8b23d2b425035a7468d17e6fe1d54124 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py39haf93ffa_0.conda#492a2cd65862d16a4aaf535ae9ccb761 @@ -196,7 +200,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.1.0-py39h85c637f_1.conda https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda#b325046180590c868ce0dbf267b82eb8 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda#e1f148e57d071b09187719df86f513c1 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py39hf3d152e_2.conda#bd956c7563b6a6b27521b83623c74e22 -https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda#1ad3afced398492586ca1bef70328be4 +https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_1.conda#66798cbfdcb003d9fbccd92cd08eb3ac https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 diff --git a/build_tools/azure/ubuntu_atlas_lock.txt b/build_tools/azure/ubuntu_atlas_lock.txt index e66f5ca8943fd..f8da72c8cea87 100644 --- a/build_tools/azure/ubuntu_atlas_lock.txt +++ b/build_tools/azure/ubuntu_atlas_lock.txt @@ -14,7 +14,7 @@ iniconfig==2.0.0 # via pytest joblib==1.2.0 # via -r build_tools/azure/ubuntu_atlas_requirements.txt -meson==1.4.0 +meson==1.4.1 # via meson-python meson-python==0.16.0 # via -r build_tools/azure/ubuntu_atlas_requirements.txt diff --git a/build_tools/circle/doc_environment.yml b/build_tools/circle/doc_environment.yml index ea930fadcb528..6a23d9729fc70 100644 --- a/build_tools/circle/doc_environment.yml +++ b/build_tools/circle/doc_environment.yml @@ -13,6 +13,7 @@ dependencies: - threadpoolctl - matplotlib - pandas + - rich - pyamg - pytest - pytest-xdist diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock index 0d925375b643b..7fa1e405e174a 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -1,9 +1,9 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: f6f3862aafcafa139a322e498517c3db58e1b8db95f1b1ca8c18f5b70d446dc9 +# input_hash: c48daac8c3285e337ac8cd2cc0b3cb4e37bcc795645b2eb52def8b460c79d021 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb @@ -56,7 +56,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.3.0-hb8811af_7.c https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d @@ -101,7 +101,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#829 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 +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/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba @@ -160,6 +160,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda#dfcfd72c7a430d3616763ecfbefe4ca9 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda#776a8dd9e824f77abac30e6ef43a8f7a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda#425fce3b531bed6ec3c74fab3e5f0a1c https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.27-pthreads_h7a3da1a_0.conda#4b422ebe8fc6a5320d0c1c22e5a46032 @@ -185,7 +186,7 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda#1e865e9188204cdfb1fd2531780add88 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda#26d7ee34132362115093717c706c384c https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 @@ -199,7 +200,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/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.7.0-h00ab1b0_1.conda#28de2e073db9ca9b72858bee9fb6f571 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.4-py39hd3abc70_0.conda#2e309d4c5736d32dfb1a1afccb4fea66 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py39hd3abc70_0.conda#9dae301603c88aef61dba733e8931cdd https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.7.0-heb67821_1.conda#cf4b0e7c4c78bb0662aed9b27c414a3c https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 @@ -211,6 +212,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.cond https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_0.tar.bz2#8b45f9f2b2f7a98b0ec179c8991a4a9b https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda#1e3b6af9592be71ce19f0a6aae05d97b @@ -232,15 +234,16 @@ https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda#93aff412f3e49fdb43361c0215cbd72d https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.2-pyhd8ed1ab_0.conda#e1643b34b19df8c028a4f00bf5df58a6 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 +https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda#ba445bf767ae6f0d959ff2b40c20912b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-22_linux64_openblas.conda#63ddb593595c9cf5eb08d3de54d66df8 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda#bdc188e59857d6efab332714e0d01d93 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.1.1-py39hbbab4d9_7.conda#ade05a8093fc3a23c5637f433706141e +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py39hbbab4d9_0.conda#bc3c956def472cc1562a325198db91c0 https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda#bcf6a6f4c6889ca083e8d33afbafb8d5 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py39hfc16268_1.conda#8b23d2b425035a7468d17e6fe1d54124 https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 -https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py39ha963410_0.conda#322084e8890afc27fcca6df7a528df25 +https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.31-py39ha963410_0.conda#ef7ffefe34eae8f69a2ed0cdf2a27678 https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.1-pyhd8ed1ab_0.conda#d15917f33140f8d2ac9ca44db7ec8a25 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py39h44dd56e_1.conda#d037c20e3da2e85f03ebd20ad480c359 @@ -256,7 +259,7 @@ https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.22.0-py39hddac248 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py39hf3d152e_2.conda#bd956c7563b6a6b27521b83623c74e22 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e -https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda#1ad3afced398492586ca1bef70328be4 +https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_1.conda#66798cbfdcb003d9fbccd92cd08eb3ac https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda#264b3c697fa9cdade87eb0abe4440d54 @@ -282,7 +285,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip mistune @ https://files.pythonhosted.org/packages/f0/74/c95adcdf032956d9ef6c89a9b8a5152bf73915f8c633f3e3d88d06bd699c/mistune-3.0.2-py3-none-any.whl#sha256=71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205 # pip overrides @ https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl#sha256=c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 # pip pandocfilters @ https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl#sha256=93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc -# pip pkginfo @ https://files.pythonhosted.org/packages/56/09/054aea9b7534a15ad38a363a2bd974c20646ab1582a387a95b8df1bfea1c/pkginfo-1.10.0-py3-none-any.whl#sha256=889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097 +# pip pkginfo @ https://files.pythonhosted.org/packages/66/46/f6bce532c9181b0d99b4612ebc2e633e5e0dae8c8540f2a664fe71e12953/pkginfo-1.11.0-py3-none-any.whl#sha256=6d4998d1cd42c297af72cc0eab5f5bab1d356fb8a55b828fa914173f8bc1ba05 # pip prometheus-client @ https://files.pythonhosted.org/packages/c7/98/745b810d822103adca2df8decd4c0bbe839ba7ad3511af3f0d09692fc0f0/prometheus_client-0.20.0-py3-none-any.whl#sha256=cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7 # pip ptyprocess @ https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl#sha256=4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 # pip pycparser @ https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl#sha256=c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc @@ -323,6 +326,6 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip nbformat @ https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl#sha256=3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b # pip nbclient @ https://files.pythonhosted.org/packages/66/e8/00517a23d3eeaed0513e718fbc94aab26eaa1758f5690fc8578839791c79/nbclient-0.10.0-py3-none-any.whl#sha256=f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f # pip nbconvert @ https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl#sha256=05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3 -# pip jupyter-server @ https://files.pythonhosted.org/packages/07/46/6bb926b3bf878bf687b952fb6a4c09d014b4575a25960f2cd1a61793763f/jupyter_server-2.14.0-py3-none-any.whl#sha256=fb6be52c713e80e004fac34b35a0990d6d36ba06fd0a2b2ed82b899143a64210 +# pip jupyter-server @ https://files.pythonhosted.org/packages/26/f5/be75c159deda5b54e15cf54029915ad28337fcfef402d671566c45f9e61f/jupyter_server-2.14.1-py3-none-any.whl#sha256=16f7177c3a4ea8fe37784e2d31271981a812f0b2874af17339031dc3510cc2a5 # pip jupyterlab-server @ https://files.pythonhosted.org/packages/cb/46/d5ffd7c0f63db4e9f0982c3d58efeea10fc5f47e79fb328431df78843772/jupyterlab_server-2.27.2-py3-none-any.whl#sha256=54aa2d64fd86383b5438d9f0c032f043c4d8c0264b8af9f60bd061157466ea43 # pip jupyterlite-sphinx @ https://files.pythonhosted.org/packages/71/2c/bd797dc46a7281d43444c79ff312d4f8d27d41a0de05f48cad81c7939966/jupyterlite_sphinx-0.15.0-py3-none-any.whl#sha256=344d1f9ee5a20b141a4a4139874eae30a68216f0c995d03ea2e3b3e9d29c4cd5 diff --git a/build_tools/circle/doc_min_dependencies_environment.yml b/build_tools/circle/doc_min_dependencies_environment.yml index e27c3a700fdad..d175b2fcac256 100644 --- a/build_tools/circle/doc_min_dependencies_environment.yml +++ b/build_tools/circle/doc_min_dependencies_environment.yml @@ -13,6 +13,7 @@ dependencies: - threadpoolctl - matplotlib=3.3.4 # min - pandas=1.1.5 # min + - rich - pyamg - pytest - pytest-xdist 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 3708a86ff6a7a..21bf0ac44e7e6 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -1,9 +1,9 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: aa64e81a701c97b7c4cf149f108c3ca59fc65572bfda79dbaeb2d093afc8a665 +# input_hash: 3b3599afa9c4dc2e2618fd02f6afd31cdbb1a1d0ec298c4b3bdbe0476a6b3a86 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb @@ -49,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.3.0-hb8811af_7.c https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#829 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/gcc-12.3.0-h915e2ae_7.conda#84b1c5cebd0a0443f3d7f90a4be93fc6 @@ -125,7 +125,7 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.5.0-pyhff2d567_0.conda#d73e9932511ef7670b2cc0ebd9dfbd30 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/linux-64/gfortran-12.3.0-h915e2ae_7.conda#8efa768f7f74085629f3e1090e7f0569 https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-12.3.0-h617cb40_3.conda#3a9e5b8a6f651ff14e74d896d8f04ab6 https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda#a965aeaf060289528a3fbe09326edae2 @@ -144,6 +144,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.con https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e 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/mdurl-0.1.2-pyhd8ed1ab_0.conda#776a8dd9e824f77abac30e6ef43a8f7a https://conda.anaconda.org/conda-forge/noarch/networkx-3.2-pyhd8ed1ab_0.conda#cec8cc498664cc00a070676aa89e69a7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 @@ -167,7 +168,7 @@ https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda#1e865e9188204cdfb1fd2531780add88 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda#26d7ee34132362115093717c706c384c https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda#81f740407b45e3f9047b3174fa94eb9e @@ -188,6 +189,7 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25 https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_0.tar.bz2#8b45f9f2b2f7a98b0ec179c8991a4a9b https://conda.anaconda.org/conda-forge/noarch/meson-1.4.0-pyhd8ed1ab_0.conda#52a0660cfa40b45bf254ecc3374cb2e0 https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.1.0-ha957f24_693.conda#ff0f4abf6f94e36a918f1ef4dbeb9769 @@ -210,8 +212,9 @@ https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.c https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.1.0-ha770c72_693.conda#7f422e2cf549a3fb920c95288393870d https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda#93aff412f3e49fdb43361c0215cbd72d https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.2-pyhd8ed1ab_0.conda#e1643b34b19df8c028a4f00bf5df58a6 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.conda#d4f60ccc5421472d2583efd9ce39d8b1 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 +https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda#ba445bf767ae6f0d959ff2b40c20912b +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.conda#1a57a819915e1c169b74933720b138f2 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_mkl.conda#d6f942423116553f068b2f2d93ffea2e https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_mkl.conda#4edf2e7ce63920e4f539d12e32fb478e diff --git a/build_tools/update_environments_and_lock_files.py b/build_tools/update_environments_and_lock_files.py index 92d97709386d1..5147b61a08455 100644 --- a/build_tools/update_environments_and_lock_files.py +++ b/build_tools/update_environments_and_lock_files.py @@ -66,6 +66,7 @@ "threadpoolctl", "matplotlib", "pandas", + "rich", "pyamg", "pytest", "pytest-xdist", @@ -233,6 +234,7 @@ def remove_from(alist, to_remove): "numpy", "scipy", "pandas", + "rich", "cython", "joblib", "pillow", @@ -252,7 +254,9 @@ def remove_from(alist, to_remove): "folder": "build_tools/azure", "platform": "win-64", "channel": "conda-forge", - "conda_dependencies": remove_from(common_dependencies, ["pandas", "pyamg"]) + "conda_dependencies": remove_from( + common_dependencies, ["pandas", "rich", "pyamg"] + ) + [ "wheel", "pip", @@ -357,7 +361,7 @@ def remove_from(alist, to_remove): "platform": "linux-aarch64", "channel": "conda-forge", "conda_dependencies": remove_from( - common_dependencies_without_coverage, ["pandas", "pyamg"] + common_dependencies_without_coverage, ["pandas", "rich", "pyamg"] ) + ["pip", "ccache"], "package_constraints": { diff --git a/pyproject.toml b/pyproject.toml index 4599d7f6302fc..cfda7c26268f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,6 +50,7 @@ docs = [ "matplotlib>=3.3.4", "scikit-image>=0.17.2", "pandas>=1.1.5", + "rich>=13.6.0", "seaborn>=0.9.0", "memory_profiler>=0.57.0", "sphinx>=7.3.7", @@ -71,6 +72,7 @@ examples = [ "matplotlib>=3.3.4", "scikit-image>=0.17.2", "pandas>=1.1.5", + "rich>=13.6.0", "seaborn>=0.9.0", "pooch>=1.6.0", "plotly>=5.14.0", @@ -79,6 +81,7 @@ tests = [ "matplotlib>=3.3.4", "scikit-image>=0.17.2", "pandas>=1.1.5", + "rich>=13.6.0", "pytest>=7.1.2", "pytest-cov>=2.9.0", "ruff>=0.2.1", diff --git a/sklearn/__init__.py b/sklearn/__init__.py index 8e554cca71253..8e91a39e56984 100644 --- a/sklearn/__init__.py +++ b/sklearn/__init__.py @@ -95,6 +95,7 @@ __all__ = [ "calibration", + "callback", "cluster", "covariance", "cross_decomposition", diff --git a/sklearn/_min_dependencies.py b/sklearn/_min_dependencies.py index 9c108791b45bc..5fa4c125d49f0 100644 --- a/sklearn/_min_dependencies.py +++ b/sklearn/_min_dependencies.py @@ -25,6 +25,7 @@ "matplotlib": ("3.3.4", "benchmark, docs, examples, tests"), "scikit-image": ("0.17.2", "docs, examples, tests"), "pandas": ("1.1.5", "benchmark, docs, examples, tests"), + "rich": ("13.6.0", "docs, examples, tests"), "seaborn": ("0.9.0", "docs, examples"), "memory_profiler": ("0.57.0", "benchmark, docs"), "pytest": (PYTEST_MIN_VERSION, "tests"), diff --git a/sklearn/base.py b/sklearn/base.py index d4245ade4e499..a325c73dfa52d 100644 --- a/sklearn/base.py +++ b/sklearn/base.py @@ -130,6 +130,10 @@ def _clone_parametrized(estimator, *, safe=True): params_set = new_object.get_params(deep=False) + # attach callbacks to the new estimator + if hasattr(estimator, "_skl_callbacks"): + new_object._skl_callbacks = clone(estimator._skl_callbacks, safe=False) + # quick sanity check of the parameters of the clone for name in new_object_params: param1 = new_object_params[name] @@ -1511,7 +1515,11 @@ def wrapper(estimator, *args, **kwargs): prefer_skip_nested_validation or global_skip_validation ) ): - return fit_method(estimator, *args, **kwargs) + try: + return fit_method(estimator, *args, **kwargs) + finally: + if hasattr(estimator, "_callback_fit_ctx"): + estimator._callback_fit_ctx.eval_on_fit_end(estimator=estimator) return wrapper diff --git a/sklearn/callback/__init__.py b/sklearn/callback/__init__.py new file mode 100644 index 0000000000000..a493454bdbb22 --- /dev/null +++ b/sklearn/callback/__init__.py @@ -0,0 +1,22 @@ +""" +The :mod:`sklearn.callback` module implements the framework and off the shelf +callbacks for scikit-learn estimators. +""" + +# License: BSD 3 clause +# Authors: the scikit-learn developers + +from ._base import AutoPropagatedProtocol, CallbackProtocol +from ._callback_context import CallbackContext +from ._mixin import CallbackSupportMixin +from ._progressbar import ProgressBar +from ._task_tree import TaskNode + +__all__ = [ + "AutoPropagatedProtocol", + "CallbackProtocol", + "CallbackContext", + "CallbackSupportMixin", + "TaskNode", + "ProgressBar", +] diff --git a/sklearn/callback/_base.py b/sklearn/callback/_base.py new file mode 100644 index 0000000000000..cdb434de08d2a --- /dev/null +++ b/sklearn/callback/_base.py @@ -0,0 +1,97 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + +from typing import Protocol, runtime_checkable + + +@runtime_checkable +class CallbackProtocol(Protocol): + """Protocol for the callbacks""" + + def _on_fit_begin(self, estimator, *, data): + """Method called at the beginning of the fit method of the estimator. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. + + data : dict + Dictionary containing the training and validation data. The possible + keys are "X_train", "y_train", "sample_weight_train", "X_val", "y_val" + and "sample_weight_val". + """ + + def _on_fit_iter_end(self, estimator, task_node, **kwargs): + """Method called at the end of each task of the estimator. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. It might differ from the estimator + passed to the `on_fit_begin` method for auto-propagated callbacks. + + task_node : TaskNode instance + The caller task node. + + **kwargs : dict + arguments passed to the callback. Possible keys are + + - data: dict + Dictionary containing the training and validation data. The keys are + "X_train", "y_train", "sample_weight_train", "X_val", "y_val", + "sample_weight_val". The values are the corresponding data. If a key is + missing, the corresponding value is None. + + - stopping_criterion: float + Usually iterations stop when `stopping_criterion <= tol`. + This is only provided at the innermost level of iterations. + + - tol: float + Tolerance for the stopping criterion. + This is only provided at the innermost level of iterations. + + - from_reconstruction_attributes: estimator instance + A ready to predict, transform, etc ... estimator as if the fit stopped + at this node. Usually it's a copy of the caller estimator with the + necessary attributes set but it can sometimes be an instance of another + class (e.g. LogisticRegressionCV -> LogisticRegression) + + - fit_state: dict + Model specific quantities updated during fit. This is not meant to be + used by generic callbacks but by a callback designed for a specific + estimator instead. + + Returns + ------- + stop : bool + Whether or not to stop the current level of iterations at this task node. + """ + + def _on_fit_end(self, estimator, task_node): + """Method called at the end of the fit method of the estimator. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. + + task_node : TaskNode instance + The task node corresponding to the whole `fit` task. This is usually the + root of the task tree of the estimator but it can be an intermediate node + if the estimator is a sub-estimator of a meta-estimator. + """ + + +@runtime_checkable +class AutoPropagatedProtocol(Protocol): + """Protocol for the auto-propagated callbacks""" + + @property + def max_estimator_depth(self): + """The maximum number of nested estimators at which the callback should be + propagated. + + If set to None, the callback is propagated to sub-estimators at all nesting + levels. + """ diff --git a/sklearn/callback/_callback_context.py b/sklearn/callback/_callback_context.py new file mode 100644 index 0000000000000..c4ea17d95cd3c --- /dev/null +++ b/sklearn/callback/_callback_context.py @@ -0,0 +1,250 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + +from . import AutoPropagatedProtocol +from ._task_tree import TaskNode + + +class CallbackContext: + """Task level context for the callbacks. + + This class is responsible for managing the callbacks and task tree of an estimator. + """ + + @classmethod + def _from_estimator(cls, estimator, *, task_name, task_id, max_tasks=1): + """Private constructor to create a root context. + + Parameters + ---------- + estimator : estimator instance + The estimator this context is responsible for. + + task_name : str + The name of the task this context is responsible for. + + task_id : int + The id of the task this context is responsible for. + + max_tasks : int, default=1 + The maximum number of tasks that can be siblings of the task this context is + responsible for. + """ + new_ctx = cls.__new__(cls) + + # We don't store the estimator in the context to avoid circular references + # because the estimator already holds a reference to the context. + new_ctx._callbacks = getattr(estimator, "_skl_callbacks", []) + new_ctx._estimator_name = estimator.__class__.__name__ + + new_ctx._task_node = TaskNode( + task_name=task_name, + task_id=task_id, + max_tasks=max_tasks, + estimator_name=new_ctx._estimator_name, + ) + + if hasattr(estimator, "_parent_callback_ctx"): + # This task is the root task of the estimator which itself corresponds to + # a leaf task of a meta-estimator. Both tasks actually represent the same + # task so we merge both task nodes into a single task node, attaching the + # task tree of the sub-estimator to the task tree of the meta-estimator on + # the way. + parent_ctx = estimator._parent_callback_ctx + new_ctx._task_node._merge_with(parent_ctx._task_node) + new_ctx._estimator_depth = parent_ctx._estimator_depth + 1 + else: + new_ctx._estimator_depth = 0 + + return new_ctx + + @classmethod + def _from_parent(cls, parent_context, *, task_name, task_id, max_tasks=1): + """Private constructor to create a sub-context. + + Parameters + ---------- + parent_context : CallbackContext instance + The parent context of the new context. + + task_name : str + The name of the task this context is responsible for. + + task_id : int + The id of the task this context is responsible for. + + max_tasks : int, default=1 + The maximum number of tasks that can be siblings of the task this context is + responsible for. + """ + new_ctx = cls.__new__(cls) + + new_ctx._callbacks = parent_context._callbacks + new_ctx._estimator_name = parent_context._estimator_name + new_ctx._estimator_depth = parent_context._estimator_depth + + new_ctx._task_node = TaskNode( + task_name=task_name, + task_id=task_id, + max_tasks=max_tasks, + estimator_name=new_ctx._estimator_name, + ) + + # This task is a subtask of another task of a same estimator + parent_context._task_node._add_child(new_ctx._task_node) + + return new_ctx + + def subcontext(self, task_name="", task_id=0, max_tasks=1): + """Create a context for a subtask of the current task. + + Parameters + ---------- + task_name : str, default="" + The name of the subtask. + + task_id : int, default=0 + An identifier of the subtask. Usually a number between 0 and + `max_tasks - 1`, but can be any identifier. + + max_tasks : int, default=1 + The maximum number of tasks that can be siblings of the subtask. + """ + return CallbackContext._from_parent( + parent_context=self, + task_name=task_name, + task_id=task_id, + max_tasks=max_tasks, + ) + + def eval_on_fit_begin(self, estimator, *, data): + """Evaluate the _on_fit_begin method of the callbacks. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. + + data : dict + Dictionary containing the training and validation data. The possible + keys are "X_train", "y_train", "sample_weight_train", "X_val", "y_val" + and "sample_weight_val". + """ + for callback in self._callbacks: + # Only call the on_fit_begin method of callbacks that are not + # propagated from a meta-estimator. + if not ( + isinstance(callback, AutoPropagatedProtocol) + and self._task_node.parent is not None + ): + callback._on_fit_begin(estimator, data=data) + + return self + + def eval_on_fit_iter_end(self, estimator, **kwargs): + """Evaluate the _on_fit_iter_end method of the callbacks. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. + + **kwargs : dict + arguments passed to the callback. Possible keys are + + - data: dict + Dictionary containing the training and validation data. The keys are + "X_train", "y_train", "sample_weight_train", "X_val", "y_val", + "sample_weight_val". The values are the corresponding data. If a key is + missing, the corresponding value is None. + + - stopping_criterion: float + Usually iterations stop when `stopping_criterion <= tol`. + This is only provided at the innermost level of iterations. + + - tol: float + Tolerance for the stopping criterion. + This is only provided at the innermost level of iterations. + + - from_reconstruction_attributes: estimator instance + A ready to predict, transform, etc ... estimator as if the fit stopped + at this node. Usually it's a copy of the caller estimator with the + necessary attributes set but it can sometimes be an instance of another + class (e.g. LogisticRegressionCV -> LogisticRegression) + + - fit_state: dict + Model specific quantities updated during fit. This is not meant to be + used by generic callbacks but by a callback designed for a specific + estimator instead. + + Returns + ------- + stop : bool + Whether or not to stop the current level of iterations at this task node. + """ + return any( + callback._on_fit_iter_end(estimator, self._task_node, **kwargs) + for callback in self._callbacks + ) + + def eval_on_fit_end(self, estimator): + """Evaluate the _on_fit_end method of the callbacks. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. + """ + for callback in self._callbacks: + # Only call the on_fit_end method of callbacks that are not + # propagated from a meta-estimator. + if not ( + isinstance(callback, AutoPropagatedProtocol) + and self._task_node.parent is not None + ): + callback._on_fit_end(estimator, task_node=self._task_node) + + def propagate_callbacks(self, sub_estimator): + """Propagate the callbacks to a sub-estimator. + + Parameters + ---------- + sub_estimator : estimator instance + The estimator to which the callbacks should be propagated. + """ + bad_callbacks = [ + callback.__class__.__name__ + for callback in getattr(sub_estimator, "_skl_callbacks", []) + if isinstance(callback, AutoPropagatedProtocol) + ] + + if bad_callbacks: + raise TypeError( + f"The sub-estimator ({sub_estimator.__class__.__name__}) of a" + f" meta-estimator ({self._task_node.estimator_name}) can't have" + f" auto-propagated callbacks ({bad_callbacks})." + " Register them directly on the meta-estimator." + ) + + callbacks_to_propagate = [ + callback + for callback in self._callbacks + if isinstance(callback, AutoPropagatedProtocol) + and ( + callback.max_estimator_depth is None + or self._estimator_depth < callback.max_estimator_depth + ) + ] + + if not callbacks_to_propagate: + return self + + # We store the parent context in the sub-estimator to be able to merge the + # task trees of the sub-estimator and the meta-estimator. + sub_estimator._parent_callback_ctx = self + + sub_estimator.set_callbacks( + getattr(sub_estimator, "_skl_callbacks", []) + callbacks_to_propagate + ) + + return self diff --git a/sklearn/callback/_mixin.py b/sklearn/callback/_mixin.py new file mode 100644 index 0000000000000..4311e1331dda8 --- /dev/null +++ b/sklearn/callback/_mixin.py @@ -0,0 +1,51 @@ +from ._base import CallbackProtocol +from ._callback_context import CallbackContext + + +class CallbackSupportMixin: + """Mixin class to add callback support to an estimator.""" + + def set_callbacks(self, callbacks): + """Set callbacks for the estimator. + + Parameters + ---------- + callbacks : callback or list of callbacks + the callbacks to set. + + Returns + ------- + self : estimator instance + The estimator instance itself. + """ + if not isinstance(callbacks, list): + callbacks = [callbacks] + + if not all(isinstance(callback, CallbackProtocol) for callback in callbacks): + raise TypeError("callbacks must follow the CallbackProtocol protocol.") + + self._skl_callbacks = callbacks + + return self + + def init_callback_context(self, task_name="fit"): + """Initialize the callback context for the estimator. + + Parameters + ---------- + task_name : str, default='fit' + The name of the root task. + + Returns + ------- + callback_fit_ctx : CallbackContext + The callback context for the estimator. + """ + # We don't initialize the callback context during _set_callbacks but in fit + # because in the future we might want to have callbacks in predict/transform + # which would require their own context. + self._callback_fit_ctx = CallbackContext._from_estimator( + estimator=self, task_name=task_name, task_id=0, max_tasks=1 + ) + + return self._callback_fit_ctx diff --git a/sklearn/callback/_progressbar.py b/sklearn/callback/_progressbar.py new file mode 100644 index 0000000000000..2ed8f4e4e00b5 --- /dev/null +++ b/sklearn/callback/_progressbar.py @@ -0,0 +1,212 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + +from multiprocessing import Manager +from threading import Thread + +from ..utils._optional_dependencies import check_rich_support + + +class ProgressBar: + """Callback that displays progress bars for each iterative steps of an estimator. + + Parameters + ---------- + max_estimator_depth : int, default=1 + The maximum number of nested levels of estimators to display progress bars for. + By default, only the progress bars of the outermost estimator are displayed. + If set to None, all levels are displayed. + """ + + def __init__(self, max_estimator_depth=1): + check_rich_support("Progressbar") + + self.max_estimator_depth = max_estimator_depth + + def _on_fit_begin(self, estimator, *, data): + self._queue = Manager().Queue() + self.progress_monitor = _RichProgressMonitor(queue=self._queue) + self.progress_monitor.start() + + def _on_fit_iter_end(self, estimator, task_node, **kwargs): + self._queue.put(task_node) + + def _on_fit_end(self, estimator, task_node): + self._queue.put(task_node) + self._queue.put(None) + self.progress_monitor.join() + + def __getstate__(self): + state = self.__dict__.copy() + if "progress_monitor" in state: + del state["progress_monitor"] # a thread is not picklable + return state + + +try: + from rich.progress import BarColumn, Progress, TextColumn, TimeRemainingColumn + from rich.style import Style + + class _Progress(Progress): + # Custom Progress class to allow showing the tasks in a given order (given by + # setting the _ordered_tasks attribute). In particular it allows to dynamically + # create and insert tasks between existing tasks. + def get_renderables(self): + table = self.make_tasks_table(getattr(self, "_ordered_tasks", [])) + yield table + +except ImportError: + pass + + +class _RichProgressMonitor(Thread): + """Thread monitoring the progress of an estimator with rich based display. + + The display is a list of nested rich tasks using `rich.Progress`. There is one for + each non-leaf node in the task tree of the estimator. + + Parameters + ---------- + queue : `multiprocessing.Manager.Queue` instance + This thread will run until the queue is empty. + """ + + def __init__(self, *, queue): + Thread.__init__(self) + self.queue = queue + + def run(self): + self.progress_ctx = _Progress( + TextColumn("[progress.description]{task.description}"), + BarColumn( + complete_style=Style(color="dark_orange"), + finished_style=Style(color="cyan"), + ), + TextColumn("[bright_magenta]{task.percentage:>3.0f}%"), + TimeRemainingColumn(elapsed_when_finished=True), + auto_refresh=False, + ) + + # Holds the root of the tree of rich tasks (i.e. progress bars) that will be + # created dynamically as the computation tree of the estimator is traversed. + self.root_rich_task = None + + with self.progress_ctx: + while task_node := self.queue.get(): + self._update_task_tree(task_node) + self._update_tasks() + self.progress_ctx.refresh() + + def _update_task_tree(self, task_node): + """Update the tree of tasks from a new node.""" + curr_rich_task, parent_rich_task = None, None + + for curr_node in task_node.path: + if curr_node.parent is None: # root node + if self.root_rich_task is None: + self.root_rich_task = RichTaskNode( + curr_node, progress_ctx=self.progress_ctx + ) + curr_rich_task = self.root_rich_task + elif curr_node.task_id not in parent_rich_task.children: + curr_rich_task = RichTaskNode( + curr_node, progress_ctx=self.progress_ctx, parent=parent_rich_task + ) + parent_rich_task.children[curr_node.task_id] = curr_rich_task + else: # task already exists + curr_rich_task = parent_rich_task.children[curr_node.task_id] + parent_rich_task = curr_rich_task + + # Mark the deepest task as finished (this is the one corresponding to the + # computation node that we just get from the queue). + curr_rich_task.finished = True + + def _update_tasks(self): + """Loop through the tasks in their display order and update their progress.""" + self.progress_ctx._ordered_tasks = [] + + for rich_task_node in self.root_rich_task: + task = self.progress_ctx.tasks[rich_task_node.task_id] + + total = task.total + + if rich_task_node.finished: + # It's possible that a task finishes without reaching its total + # (e.g. early stopping). We mark it as 100% completed. + + if task.total is None: + # Indeterminate task is finished. Set total to an arbitrary + # value to render its completion as 100%. + completed = total = 1 + else: + completed = total + else: + completed = sum(t.finished for t in rich_task_node.children.values()) + + self.progress_ctx.update( + rich_task_node.task_id, completed=completed, total=total, refresh=False + ) + self.progress_ctx._ordered_tasks.append(task) + + +class RichTaskNode: + """A node in the tree of rich tasks. + + Parameters + ---------- + task_node : `TaskNode` instance + The task node of an estimator this task corresponds to. + + progress_ctx : `rich.Progress` instance + The progress context to which this task belongs. + + parent : `RichTaskNode` instance + The parent of this task. + + Attributes + ---------- + finished : bool + Whether the task is finished. + + task_id : int + The ID of the task in the Progress context. + + children : dict + A mapping from the index of a child to the child node `{idx: RichTaskNode}`. + For a leaf, it's an empty dictionary. + """ + + def __init__(self, task_node, progress_ctx, parent=None): + self.parent = parent + self.children = {} + self.finished = False + + if task_node.max_subtasks != 0: + description = self._format_task_description(task_node) + self.task_id = progress_ctx.add_task( + description, total=task_node.max_subtasks + ) + + def _format_task_description(self, task_node): + """Return a formatted description for the task.""" + colors = ["bright_magenta", "cyan", "dark_orange"] + + indent = f"{' ' * (task_node.depth)}" + style = f"[{colors[(task_node.depth)%len(colors)]}]" + + task_desc = f"{task_node.estimator_name} - {task_node.task_name}" + id_mark = f" #{task_node.task_id}" if task_node.parent is not None else "" + prev_task_desc = ( + f"{task_node.prev_estimator_name} - {task_node.prev_task_name} | " + if task_node.prev_estimator_name is not None + else "" + ) + + return f"{style}{indent}{prev_task_desc}{task_desc}{id_mark}" + + def __iter__(self): + """Pre-order depth-first traversal, excluding leaves.""" + if self.children: + yield self + for child in self.children.values(): + yield from child diff --git a/sklearn/callback/_task_tree.py b/sklearn/callback/_task_tree.py new file mode 100644 index 0000000000000..3f97b2ac282c5 --- /dev/null +++ b/sklearn/callback/_task_tree.py @@ -0,0 +1,112 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + + +class TaskNode: + """A node in a task tree. + + Parameters + ---------- + task_name : str + The name of the task this node represents. + + task_id : int + An identifier for this task that distinguishes it from its siblings. Usually + the index of this node among its siblings. + + max_tasks : int or None + The maximum number of its siblings. None means the maximum number of siblings + is not known in advance. + + estimator_name : str + The name of the estimator this task node belongs to. + + Attributes + ---------- + parent : TaskNode instance or None + The parent node. None means this is the root. + + Note that it's dynamic since the root task of an estimator can become an + intermediate node of a meta-estimator. + + children_map : dict + A mapping from the task_id of a child to the child node `{task_id: TaskNode}`. + For a leaf, it's an empty dictionary. + + max_subtasks : int or None + The maximum number of subtasks of this node. 0 means it's a leaf. None + means the maximum number of subtasks is not known in advance. + + prev_estimator_name : str or None + The estimator name of the node this node was merged with. None if it was not + merged with another node. + + prev_task_name : str + The task name of the node this node was merged with. None if it was not + merged with another node. + """ + + def __init__(self, *, task_name, task_id, max_tasks, estimator_name): + self.task_name = task_name + self.task_id = task_id + self.max_tasks = max_tasks + self.estimator_name = estimator_name + + self.parent = None + self.children_map = {} + self.max_subtasks = 0 + + # When an estimator is a sub-estimator of a meta-estimator, the root task of + # the estimator is merged with the corresponding leaf task of the + # meta-estimator because both correspond to the same computation step. + # The root task of the estimator takes the place of the leaf task of the + # meta-estimator in the task tree but we keep the information about the + # leaf task it was merged with to fully describe the merged node. + self.prev_estimator_name = None + self.prev_task_name = None + + def _add_child(self, task_node): + if task_node.task_id in self.children_map: + raise ValueError( + f"Task node {self.task_name} of estimator {self.estimator_name} " + f"already has a child with task_id={task_node.task_id}." + ) + + if len(self.children_map) == task_node.max_tasks: + raise ValueError( + f"Cannot add child to task node {self.task_name} of estimator " + f"{self.estimator_name} because it already has its maximum " + f"number of children ({task_node.max_tasks})." + ) + + self.children_map[task_node.task_id] = task_node + self.max_subtasks = task_node.max_tasks + task_node.parent = self + + def _merge_with(self, task_node): + # Set the parent of the sub-estimator's root task node to the parent + # of the meta-estimator's leaf task node + self.parent = task_node.parent + self.task_id = task_node.task_id + self.max_tasks = task_node.max_tasks + task_node.parent.children_map[self.task_id] = self + + # Keep information about the node it was merged with + self.prev_task_name = task_node.task_name + self.prev_estimator_name = task_node.estimator_name + + @property + def depth(self): + """The depth of this node in the computation tree.""" + return 0 if self.parent is None else self.parent.depth + 1 + + @property + def path(self): + """List of all the nodes in the path from the root to this node.""" + return [self] if self.parent is None else self.parent.path + [self] + + def __iter__(self): + """Pre-order depth-first traversal""" + yield self + for task_node in self.children_map.values(): + yield from task_node diff --git a/sklearn/callback/tests/__init__.py b/sklearn/callback/tests/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/sklearn/callback/tests/_utils.py b/sklearn/callback/tests/_utils.py new file mode 100644 index 0000000000000..8fbb25d9c09e8 --- /dev/null +++ b/sklearn/callback/tests/_utils.py @@ -0,0 +1,149 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + +import time + +from sklearn.base import BaseEstimator, _fit_context, clone +from sklearn.callback import CallbackSupportMixin +from sklearn.utils.parallel import Parallel, delayed + + +class TestingCallback: + def _on_fit_begin(self, estimator, *, data): + pass + + def _on_fit_end(self): + pass + + def _on_fit_iter_end(self, estimator, node, **kwargs): + pass + + +class TestingAutoPropagatedCallback(TestingCallback): + max_estimator_depth = None + + +class NotValidCallback: + """Unvalid callback since it's missing a method from the protocol.'""" + + def _on_fit_begin(self, estimator, *, data): + pass # pragma: no cover + + def _on_fit_iter_end(self, estimator, node, **kwargs): + pass # pragma: no cover + + +class Estimator(CallbackSupportMixin, BaseEstimator): + _parameter_constraints: dict = {} + + def __init__(self, max_iter=20, computation_intensity=0.001): + self.max_iter = max_iter + self.computation_intensity = computation_intensity + + @_fit_context(prefer_skip_nested_validation=False) + def fit(self, X=None, y=None): + callback_ctx = self.init_callback_context().eval_on_fit_begin( + estimator=self, data={"X_train": X, "y_train": y} + ) + + for i in range(self.max_iter): + subcontext = callback_ctx.subcontext(task_id=i, max_tasks=self.max_iter) + + time.sleep(self.computation_intensity) # Computation intensive task + + if subcontext.eval_on_fit_iter_end( + estimator=self, + data={"X_train": X, "y_train": y}, + ): + break + + self.n_iter_ = i + 1 + + return self + + +class WhileEstimator(CallbackSupportMixin, BaseEstimator): + _parameter_constraints: dict = {} + + def __init__(self, computation_intensity=0.001): + self.computation_intensity = computation_intensity + + @_fit_context(prefer_skip_nested_validation=False) + def fit(self, X=None, y=None): + callback_ctx = self.init_callback_context().eval_on_fit_begin( + estimator=self, data={"X_train": X, "y_train": y} + ) + + i = 0 + while True: + subcontext = callback_ctx.subcontext(task_id=i, max_tasks=None) + + time.sleep(self.computation_intensity) # Computation intensive task + + if subcontext.eval_on_fit_iter_end( + estimator=self, + data={"X_train": X, "y_train": y}, + ): + break + + if i == 20: + break + + i += 1 + + return self + + +class MetaEstimator(CallbackSupportMixin, BaseEstimator): + _parameter_constraints: dict = {} + + def __init__( + self, estimator, n_outer=4, n_inner=3, n_jobs=None, prefer="processes" + ): + self.estimator = estimator + self.n_outer = n_outer + self.n_inner = n_inner + self.n_jobs = n_jobs + self.prefer = prefer + + @_fit_context(prefer_skip_nested_validation=False) + def fit(self, X=None, y=None): + callback_ctx = self.init_callback_context().eval_on_fit_begin( + estimator=self, data={"X_train": X, "y_train": y} + ) + + Parallel(n_jobs=self.n_jobs, prefer=self.prefer)( + delayed(_func)( + self, + self.estimator, + X, + y, + callback_ctx=callback_ctx.subcontext( + task_name="outer", task_id=i, max_tasks=self.n_outer + ), + ) + for i in range(self.n_outer) + ) + + return self + + +def _func(meta_estimator, inner_estimator, X, y, *, callback_ctx): + for i in range(meta_estimator.n_inner): + est = clone(inner_estimator) + + inner_ctx = callback_ctx.subcontext( + task_name="inner", task_id=i, max_tasks=meta_estimator.n_inner + ).propagate_callbacks(sub_estimator=est) + + est.fit(X, y) + + inner_ctx.eval_on_fit_iter_end( + estimator=meta_estimator, + data={"X_train": X, "y_train": y}, + ) + + callback_ctx.eval_on_fit_iter_end( + estimator=meta_estimator, + data={"X_train": X, "y_train": y}, + ) diff --git a/sklearn/callback/tests/test_callback_context.py b/sklearn/callback/tests/test_callback_context.py new file mode 100644 index 0000000000000..b1e1a6baafeeb --- /dev/null +++ b/sklearn/callback/tests/test_callback_context.py @@ -0,0 +1,99 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + +import pytest + +from sklearn.callback.tests._utils import ( + Estimator, + MetaEstimator, + NotValidCallback, + TestingAutoPropagatedCallback, + TestingCallback, +) + + +@pytest.mark.parametrize( + "callbacks", + [ + TestingCallback(), + [TestingCallback()], + [TestingCallback(), TestingAutoPropagatedCallback()], + ], +) +def test_set_callbacks(callbacks): + """Sanity check for the `set_callbacks` method.""" + estimator = Estimator() + + set_callbacks_return = estimator.set_callbacks(callbacks) + assert hasattr(estimator, "_skl_callbacks") + + expected_callbacks = [callbacks] if not isinstance(callbacks, list) else callbacks + assert estimator._skl_callbacks == expected_callbacks + + assert set_callbacks_return is estimator + + +@pytest.mark.parametrize("callbacks", [None, NotValidCallback()]) +def test_set_callbacks_error(callbacks): + """Check the error message when not passing a valid callback to `set_callbacks`.""" + estimator = Estimator() + + with pytest.raises( + TypeError, match="callbacks must follow the CallbackProtocol protocol." + ): + estimator.set_callbacks(callbacks) + + +def test_init_callback_context(): + """Sanity check for the `init_callback_context` method.""" + estimator = Estimator() + callback_ctx = estimator.init_callback_context() + + assert hasattr(estimator, "_callback_fit_ctx") + assert hasattr(callback_ctx, "_callbacks") + + +def test_propagate_callbacks(): + """Sanity check for the `propagate_callbacks` method.""" + not_propagated_callback = TestingCallback() + propagated_callback = TestingAutoPropagatedCallback() + + estimator = Estimator() + metaestimator = MetaEstimator(estimator) + metaestimator.set_callbacks([not_propagated_callback, propagated_callback]) + + callback_ctx = metaestimator.init_callback_context() + callback_ctx.propagate_callbacks(estimator) + + assert hasattr(estimator, "_parent_callback_ctx") + assert not_propagated_callback not in estimator._skl_callbacks + assert propagated_callback in estimator._skl_callbacks + + +def test_propagate_callback_no_callback(): + """Check that no callback is propagated if there's no callback.""" + estimator = Estimator() + metaestimator = MetaEstimator(estimator) + + callback_ctx = metaestimator.init_callback_context() + assert len(callback_ctx._callbacks) == 0 + + callback_ctx.propagate_callbacks(estimator) + + assert not hasattr(metaestimator, "_skl_callbacks") + assert not hasattr(estimator, "_skl_callbacks") + + +def test_auto_propagated_callbacks(): + """Check that it's not possible to set an auto-propagated callback on the + sub-estimator of a meta-estimator. + """ + estimator = Estimator() + estimator.set_callbacks(TestingAutoPropagatedCallback()) + meta_estimator = MetaEstimator(estimator=estimator) + + match = ( + r"sub-estimator .*of a meta-estimator .*can't have auto-propagated callbacks" + ) + with pytest.raises(TypeError, match=match): + meta_estimator.fit(X=None, y=None) diff --git a/sklearn/callback/tests/test_progressbar.py b/sklearn/callback/tests/test_progressbar.py new file mode 100644 index 0000000000000..9acd47e30d5ab --- /dev/null +++ b/sklearn/callback/tests/test_progressbar.py @@ -0,0 +1,62 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + +import re + +import pytest + +from sklearn.callback import ProgressBar +from sklearn.utils._optional_dependencies import check_rich_support +from sklearn.utils._testing import SkipTest + +from ._utils import Estimator, MetaEstimator, WhileEstimator + + +@pytest.mark.parametrize("n_jobs", [1, 2]) +@pytest.mark.parametrize("prefer", ["threads", "processes"]) +@pytest.mark.parametrize("InnerEstimator", [Estimator, WhileEstimator]) +@pytest.mark.parametrize("max_estimator_depth", [1, 2, None]) +def test_progressbar(n_jobs, prefer, InnerEstimator, max_estimator_depth, capsys): + """Check the output of the progress bars and their completion.""" + pytest.importorskip("rich") + + n_inner = 2 + n_outer = 3 + + est = InnerEstimator() + meta_est = MetaEstimator( + est, n_outer=n_outer, n_inner=n_inner, n_jobs=n_jobs, prefer=prefer + ) + meta_est.set_callbacks(ProgressBar(max_estimator_depth=max_estimator_depth)) + meta_est.fit() + + captured = capsys.readouterr() + + assert re.search(r"MetaEstimator - fit", captured.out) + for i in range(n_outer): + assert re.search(rf"MetaEstimator - outer #{i}", captured.out) + + # Progress bars of inner estimators are displayed only if max_estimator_depth > 1 + # (or None, which means all levels are displayed) + if max_estimator_depth is None or max_estimator_depth > 1: + for i in range(n_inner): + assert re.search( + rf"MetaEstimator - inner #{i} | {est.__class__.__name__} - fit", + captured.out, + ) + + # Check that all bars are 100% complete + assert re.search(r"100%", captured.out) + assert not re.search(r"[1-9]%", captured.out) + + +def test_progressbar_requires_rich_error(): + """Check that we raise an informative error when rich is not installed.""" + try: + check_rich_support("test_progressbar_requires_rich_error") + except ImportError: + err_msg = "Progressbar requires rich" + with pytest.raises(ImportError, match=err_msg): + ProgressBar() + else: + raise SkipTest("This test requires rich to not be installed.") diff --git a/sklearn/callback/tests/test_task_tree.py b/sklearn/callback/tests/test_task_tree.py new file mode 100644 index 0000000000000..5085d50d06e83 --- /dev/null +++ b/sklearn/callback/tests/test_task_tree.py @@ -0,0 +1,141 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + +import numpy as np +import pytest + +from sklearn.callback import TaskNode + + +def _make_task_tree(n_children, n_grandchildren): + root = TaskNode( + task_name="root task", task_id=0, max_tasks=1, estimator_name="estimator" + ) + + for i in range(n_children): + child = TaskNode( + task_name="child task", + task_id=i, + max_tasks=n_children, + estimator_name="estimator", + ) + root._add_child(child) + + for j in range(n_grandchildren): + grandchild = TaskNode( + task_name="grandchild task", + task_id=j, + max_tasks=n_grandchildren, + estimator_name="estimator", + ) + child._add_child(grandchild) + + return root + + +def test_task_tree(): + """Check that the task tree is correctly built.""" + root = _make_task_tree(n_children=3, n_grandchildren=5) + + assert root.parent is None + assert root.depth == 0 + assert len(root.children_map) == 3 + + for child in root.children_map.values(): + assert child.parent is root + assert child.depth == 1 + assert len(child.children_map) == 5 + assert root.max_subtasks == child.max_tasks + + for grandchild in child.children_map.values(): + assert grandchild.parent is child + assert grandchild.depth == 2 + assert len(grandchild.children_map) == 0 + assert child.max_subtasks == grandchild.max_tasks + + # 1 root + 1 * 3 children + 1 * 3 * 5 grandchildren + expected_n_nodes = np.sum(np.cumprod([1, 3, 5])) + actual_n_nodes = sum(1 for _ in root) + assert actual_n_nodes == expected_n_nodes + + # None of the nodes should have been merged with another node + assert all(node.prev_estimator_name is None for node in root) + assert all(node.prev_task_name is None for node in root) + + +def test_path(): + """Sanity check for the path property.""" + root = _make_task_tree(n_children=3, n_grandchildren=5) + + assert root.path == [root] + + # pick an arbitrary node + node = root.children_map[1].children_map[2] + + expected_path = [root, root.children_map[1], node] + assert node.path == expected_path + + +def test_add_task(): + """Check that informative error messages are raised when adding tasks.""" + root = TaskNode(task_name="root task", task_id=0, max_tasks=1, estimator_name="est") + + # Before adding new task, it's considered a leaf + assert root.max_subtasks == 0 + + root._add_child( + TaskNode(task_name="child task", task_id=0, max_tasks=2, estimator_name="est") + ) + assert root.max_subtasks == 2 + assert len(root.children_map) == 1 + + # root already has a child with id 0 + with pytest.raises( + ValueError, match=r"Task node .* already has a child with task_id=0" + ): + root._add_child( + TaskNode( + task_name="child task", task_id=0, max_tasks=2, estimator_name="est" + ) + ) + + root._add_child( + TaskNode(task_name="child task", task_id=1, max_tasks=2, estimator_name="est") + ) + assert len(root.children_map) == 2 + + # root can have at most 2 children + with pytest.raises(ValueError, match=r"Cannot add child to task node"): + root._add_child( + TaskNode( + task_name="child task", task_id=2, max_tasks=2, estimator_name="est" + ) + ) + + +def test_merge_with(): + outer_root = TaskNode( + task_name="root", task_id=0, max_tasks=1, estimator_name="outer" + ) + + # Add a child task within the same estimator + outer_child = TaskNode( + task_name="child", task_id="id", max_tasks=2, estimator_name="outer" + ) + outer_root._add_child(outer_child) + + # The root task of the inner estimator is merged with (and effectively replaces) + # a leaf of the outer estimator because they correspond to the same formal task. + inner_root = TaskNode( + task_name="root", task_id=0, max_tasks=1, estimator_name="inner" + ) + inner_root._merge_with(outer_child) + + assert inner_root.parent is outer_root + assert inner_root.task_id == outer_child.task_id + assert outer_child not in outer_root.children_map.values() + assert inner_root in outer_root.children_map.values() + + # The name and estimator name of the tasks it was merged with are stored + assert inner_root.prev_task_name == outer_child.task_name + assert inner_root.prev_estimator_name == outer_child.estimator_name diff --git a/sklearn/utils/_optional_dependencies.py b/sklearn/utils/_optional_dependencies.py index 14ffeb1d5b6ee..e432dd820cfa8 100644 --- a/sklearn/utils/_optional_dependencies.py +++ b/sklearn/utils/_optional_dependencies.py @@ -40,3 +40,19 @@ def check_pandas_support(caller_name): return pandas except ImportError as e: raise ImportError("{} requires pandas.".format(caller_name)) from e + + +def check_rich_support(caller_name): + """Raise ImportError with detailed error message if rich is not installed. + + caller should lazily import rich and call this helper before any computation. + + Parameters + ---------- + caller_name : str + The name of the caller that requires rich. + """ + try: + import rich # noqa + except ImportError as e: + raise ImportError(f"{caller_name} requires rich.") from e