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 245316227cddd..a3ccfa1f4c9c6 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,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 58f8e7b7af3826532872962cc6b88e6c57c2ed2b033142dd0dfe788d2ad041b8 +# input_hash: 890d30ba86df29fe406605241d3c9eac687523c8cb59f87e9feff645a441ce3f @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 @@ -130,7 +130,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ccache-4.9.1-h1fcd64f_0.conda#36 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 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.8-py311hb755f60_0.conda#28778bfea41b0f34141208783882649b +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py311hb755f60_0.conda#c49924051b8336f6031eb3d019619cba https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 @@ -143,13 +143,15 @@ https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_ha2b6c https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda#fe0e297faf462ee579c95071a5211665 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda#24e2649ebd432e652aa72cfd05f23a8e +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 +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-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 @@ -175,6 +177,7 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4d https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_hb11cfb5_4.conda#c90f4cbb57839c98fef8f830e4b9972f 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/libxkbcommon-1.6.0-hd429924_1.conda#1dbcc04604fdf1e526e6d1b0b6938396 +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.3.2-pyhd8ed1ab_0.conda#8d18c47cc233a35c81450ba1ce601eb4 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.2.0-py311ha6c5da5_0.conda#a5ccd7f2271f28b7d2de0b02b64e3796 @@ -193,6 +196,7 @@ https://conda.anaconda.org/conda-forge/noarch/meson-python-0.15.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-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da 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.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_mkl.tar.bz2#361bf757b95488de76c4f123805742d3 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 8ad97b91f8fce..6b894e44df7da 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<8 - 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 96d0b1b7798a2..ec6d71a4cb49d 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,6 +1,6 @@ # Generated by conda-lock. # platform: osx-64 -# input_hash: 1a426ea210e386d35f7d10d1994232053aaddcffe015b7c418298385f796c6e5 +# input_hash: 929f2325a67833ad3497328fc3a8e15d94ead4095b399c3a051c65529805a62b @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 @@ -64,19 +64,21 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/osx-64/clang-16-16.0.6-default_h7151d67_5.conda#e132cf98d775fd7ec3b43859373bc070 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/osx-64/cython-3.0.8-py312hede676d_0.conda#c81eb31a4d8f585068d9b0a84f74070e +https://conda.anaconda.org/conda-forge/osx-64/cython-3.0.9-py312hede676d_0.conda#e7cfe4322252a2d0786a064c214436ae https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 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/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/ld64-609-ha02d983_16.conda#6dfb00e6cab263fe598d48df153d3288 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda#776a8dd9e824f77abac30e6ef43a8f7a https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/osx-64/pillow-10.2.0-py312h0c70c2f_0.conda#0cc3674239ad12c6836cb4174f106c92 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 @@ -85,20 +87,23 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.3.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.10.0-pyha770c72_0.conda#16ae769069b380646c47142d719ef466 https://conda.anaconda.org/conda-forge/osx-64/cctools-973.0.1-h40f6528_16.conda#b7234c329d4503600b032f168f4b65e7 https://conda.anaconda.org/conda-forge/osx-64/clang-16.0.6-hdae98eb_5.conda#5f020dce5a00342141d87f952c9c0282 https://conda.anaconda.org/conda-forge/osx-64/coverage-7.4.3-py312h41838bb_1.conda#996062eaf469432f208a7573c2482e3d https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.49.0-py312h41838bb_0.conda#910043c784378419df3160b7661ee915 https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4da50d410f553db77e62ab62ffaa1abc https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda#160fdc97a51d66d51dc782fb67d35205 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/osx-64/mkl-devel-2023.2.0-h694c41f_50500.conda#1b4d0235ef253a1e19459351badf4f9f -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.0-pyhd8ed1ab_0.conda#e2eeb8b7c5506b9778e8c41934e8dc6e +https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.2-pyhd8ed1ab_0.conda#40bd3ef942b9642a3eb20b0bbf92469b https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/osx-64/clangxx-16.0.6-default_h7151d67_5.conda#8c3fb5d2005174683f3958383643e335 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/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da 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/noarch/compiler-rt_osx-64-16.0.6-ha38d28d_2.conda#7a46507edc35c6c8818db0adaf8d787f https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-20_osx64_mkl.conda#124ae8e384268a8da66f1d64114a1eda https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py312he3a82b2_0.conda#96c61a21c4276613748dba069554846b 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 8535baec11c4d..248307399b991 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 403350d1cda05..3dd46a4532167 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml @@ -12,6 +12,7 @@ dependencies: - threadpoolctl - 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 77b05092849ea..13b5089f398d8 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: 0852937217d7f245972202bbf4d45e87bae0b554b334e0a6a351c65ba033ae17 +# input_hash: eee5f86c56909c910b8b9cab920079bfbcc7544de4b61aa33eba93f1dc04b5df @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_5.conda#0f51dde96c82dcf58a788787fed4c5b9 @@ -45,11 +45,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.2.0-py312hecd8cb5_0.conda#aeeb33f85c1e6776700b67a4762d2e6d 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/noarch/munkres-1.1.4-py_0.conda#148362ba07f92abab76999a680c80084 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.1-py312hecd8cb5_0.conda#27f59725d093a50f366eaeba0db9ec61 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-2023.3.post1-py312hecd8cb5_0.conda#2636382c9a424f69cbc36b1c5dc1f2fc @@ -60,6 +62,7 @@ https://repo.anaconda.com/pkgs/main/noarch/toml-0.10.2-pyhd3eb1b0_0.conda#cda05f https://repo.anaconda.com/pkgs/main/osx-64/tornado-6.3.3-py312h6c40b1e_0.conda#49173b5a36c9134865221f29d4a73fb6 https://repo.anaconda.com/pkgs/main/osx-64/wheel-0.41.2-py312hecd8cb5_0.conda#e7aea266d81142e2bb0bbc2280e64526 https://repo.anaconda.com/pkgs/main/noarch/fonttools-4.25.0-pyhd3eb1b0_0.conda#bb9c5b5a6d892fca5efe4bf0203b6a48 +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.2.0-py312h6c40b1e_0.conda#5a44bd28cf26fff2d6219e76a86db126 https://repo.anaconda.com/pkgs/main/osx-64/pip-23.3.1-py312hecd8cb5_0.conda#efc3db40cac09f74bb480d28d3a0b260 @@ -67,6 +70,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/pytest-7.4.0-py312hecd8cb5_0.conda#b8 https://repo.anaconda.com/pkgs/main/noarch/python-dateutil-2.8.2-pyhd3eb1b0_0.conda#211ee00320b08a1ac9fea6677649f6c9 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.0-py312hecd8cb5_0.conda#64ffa3462aace0fc2d5fa5bff15f63f6 @@ -76,6 +80,6 @@ https://repo.anaconda.com/pkgs/main/osx-64/mkl_random-1.2.4-py312ha357a0b_0.cond https://repo.anaconda.com/pkgs/main/osx-64/numpy-1.26.4-py312hac873b0_0.conda#3150bac1e382156f82a153229e1ebd06 https://repo.anaconda.com/pkgs/main/osx-64/numexpr-2.8.7-py312hac873b0_0.conda#6303ba071636ef57fddf69eb6f440ec1 https://repo.anaconda.com/pkgs/main/osx-64/scipy-1.11.4-py312h81688c2_0.conda#7d57b4c21a9261f97fa511e0940c5d93 -https://repo.anaconda.com/pkgs/main/osx-64/pandas-2.1.4-py312he282a81_0.conda#dcbed31bc94e03cc6f53312e0fb4eb49 +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/3d/8e/28f8c6109990eef7317ab7e43644092b49a88a39f9373dcd19318946df09/Cython-3.0.8-cp312-cp312-macosx_10_9_x86_64.whl#sha256=90d3fe31db55685d8cb97d43b0ec39ef614fcf660f83c77ed06aa670cb0e164f +# pip cython @ https://files.pythonhosted.org/packages/be/67/6a1316e4b3201b44d245873f62395bd8ea7d181c4b6b2d43fe7da486bf61/Cython-3.0.9-cp312-cp312-macosx_10_9_x86_64.whl#sha256=157973807c2796addbed5fbc4d9c882ab34bbc60dc297ca729504901479d5df7 diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml b/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml index 6167ca6e63748..503c409ac67a3 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 8accefbcf32b6..2eace1516e0f6 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: 22948f30d83c53ec29f96e979ec8bba03310eeecfa22be3e918d2c0313431e18 +# input_hash: 3f7a5d057283e10f12386fd0307b136a646e8b977a60957b99442de4fc68604f @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-2023.12.12-h06a4308_0.conda#12bf7315c3f5ca50300e8b48d1b4ef2e @@ -28,7 +28,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-23.3.1-py39h06a4308_0.conda#685 # pip certifi @ https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl#sha256=dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 # 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/c1/a7/606c4414a46d589114bf4de7eebeea315aae68283de095dd3e949d9c96d8/Cython-3.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=de892422582f5758bd8de187e98ac829330ec1007bc42c661f687792999988a7 +# pip cython @ https://files.pythonhosted.org/packages/77/0c/4e9ead9733a92d96d2638fce41450d94f36d091a81e1d97b4fd51b6ad09c/Cython-3.0.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=2fd198c1a7f8e9382904d622cc0efa3c184605881fd5262c64cbb7168c4c1ec5 # pip docutils @ https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl#sha256=96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 # pip exceptiongroup @ https://files.pythonhosted.org/packages/b8/9a/5028fd52db10e600f1c4674441b968cf2ea4959085bfb5b99fb1250e5f68/exceptiongroup-1.2.0-py3-none-any.whl#sha256=4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 # pip execnet @ https://files.pythonhosted.org/packages/e8/9c/a079946da30fac4924d92dbc617e5367d454954494cf1e71567bcc4e00ee/execnet-2.0.2-py3-none-any.whl#sha256=88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41 @@ -40,13 +40,14 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-23.3.1-py39h06a4308_0.conda#685 # 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 lazy-loader @ https://files.pythonhosted.org/packages/a1/c3/65b3814e155836acacf720e5be3b5757130346670ac454fee29d3eda1381/lazy_loader-0.3-py3-none-any.whl#sha256=1e9e76ee8631e264c62ce10006718e80b2cfc74340d17d1031e0f84af7478554 # 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 mdurl @ https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl#sha256=84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 # pip networkx @ https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl#sha256=f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2 # pip numpy @ https://files.pythonhosted.org/packages/54/30/c2a907b9443cf42b90c17ad10c1e8fa801975f01cb9764f3f8eb8aea638b/numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3 # pip packaging @ https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl#sha256=8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 # pip pillow @ https://files.pythonhosted.org/packages/87/0d/8f5136a5481731c342a901ff155c587ce7804114db069345e1894ab4978a/pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl#sha256=b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13 # pip pluggy @ https://files.pythonhosted.org/packages/a5/5b/0cc789b59e8cc1bf288b38111d002d8c5917123194d45b29dcdac64723cc/pluggy-1.4.0-py3-none-any.whl#sha256=7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981 # pip pygments @ https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl#sha256=b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c -# pip pyparsing @ https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl#sha256=32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb +# pip pyparsing @ https://files.pythonhosted.org/packages/9d/ea/6d76df31432a0e6fdf81681a895f009a4bb47b3c39036db3e1b528191d52/pyparsing-3.1.2-py3-none-any.whl#sha256=f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742 # pip pytz @ https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl#sha256=328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 # pip six @ https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl#sha256=8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 # pip snowballstemmer @ https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl#sha256=c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a @@ -68,6 +69,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-23.3.1-py39h06a4308_0.conda#685 # pip importlib-metadata @ https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e # pip importlib-resources @ https://files.pythonhosted.org/packages/ba/0b/27d13042335942abc29a87f49f1ce6b56fa58e025e96454ef25929aeb603/importlib_resources-6.1.2-py3-none-any.whl#sha256=9a0a862501dc38b68adebc82970140c9e4209fc99601782925178f8386339938 # pip jinja2 @ https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa +# 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 pytest @ https://files.pythonhosted.org/packages/5a/4a/3f626e3974bea1e6d471bd86f7965c67cd06d5770d1fec9aae445c44da7b/pytest-8.1.0-py3-none-any.whl#sha256=ee32db7af8de4629a455806befa90559f307424c07b8413ccfc30bf5b221dd7e # 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/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl#sha256=58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f @@ -79,6 +81,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-23.3.1-py39h06a4308_0.conda#685 # pip pyamg @ https://files.pythonhosted.org/packages/35/1c/8b2aa6fbb2bae258ab6cdb35b09635bf50865ac2bcdaf220db3d972cc0d8/pyamg-5.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=1332acec6d5ede9440c8ced0ef20952f5b766387116f254b79880ce29fdecee7 # pip pytest-cov @ https://files.pythonhosted.org/packages/a7/4b/8b78d126e275efa2379b1c2e09dc52cf70df16fc3b90613ef82531499d73/pytest_cov-4.1.0-py3-none-any.whl#sha256=6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a # pip pytest-xdist @ https://files.pythonhosted.org/packages/50/37/125fe5ec459321e2d48a0c38672cfc2419ad87d580196fd894e5f25230b0/pytest_xdist-3.5.0-py3-none-any.whl#sha256=d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24 +# 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/b2/b6/8ed35256aa530a9d3da15d20bdc0ba888d5364441bb50a5a83ee7827affe/sphinx-7.2.6-py3-none-any.whl#sha256=1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560 # pip numpydoc @ https://files.pythonhosted.org/packages/9c/94/09c437fd4a5fb5adf0468c0865c781dbc11d399544b55f1163d5d4414afb/numpydoc-1.6.0-py3-none-any.whl#sha256=b6ddaa654a52bdf967763c1e773be41f1c3ae3da39ee0de973f2680048acafaa diff --git a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock index d2673e28f9cd2..37efa9e7d0254 100644 --- a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock @@ -5,24 +5,24 @@ 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-2023.12.12-h06a4308_0.conda#12bf7315c3f5ca50300e8b48d1b4ef2e https://repo.anaconda.com/pkgs/main/linux-64/ld_impl_linux-64-2.38-h1181459_1.conda#68eedfd9c06f2b0e6888d8db345b7f5b -https://repo.anaconda.com/pkgs/main/noarch/tzdata-2023d-h04d1e81_0.conda#fdb319536f351b2b828a350ffd1a35a1 +https://repo.anaconda.com/pkgs/main/noarch/tzdata-2024a-h04d1e81_0.conda#452af53adae0a5b06eb5d05c707b2f25 https://repo.anaconda.com/pkgs/main/linux-64/libgomp-11.2.0-h1234567_1.conda#b372c0eea9b60732fdae4b817a63c8cd https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-11.2.0-h1234567_1.conda#57623d10a70e09e1d048c2b2b6f4e2dd https://repo.anaconda.com/pkgs/main/linux-64/_openmp_mutex-5.1-1_gnu.conda#71d281e9c2192cb3fa425655a8defb85 https://repo.anaconda.com/pkgs/main/linux-64/libgcc-ng-11.2.0-h1234567_1.conda#a87728dabf3151fb9cfa990bd2eb0464 -https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h7b6447c_0.conda#9303f4af7c004e069bae22bde8d800ee +https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h5eee18b_5.conda#9c8dec113089c4aca7392c6a3864f505 https://repo.anaconda.com/pkgs/main/linux-64/expat-2.5.0-h6a678d5_0.conda#9a21d99d49a0a556cf9590430dec8ec0 https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.4.4-h6a678d5_0.conda#06e288f9250abef59b9a367d151fc339 https://repo.anaconda.com/pkgs/main/linux-64/libuuid-1.41.5-h5eee18b_0.conda#4a6a2354414c9080327274aa514e5299 https://repo.anaconda.com/pkgs/main/linux-64/ncurses-6.4-h6a678d5_0.conda#5558eec6e2191741a92f832ea826251c https://repo.anaconda.com/pkgs/main/linux-64/openssl-3.0.13-h7f8727e_0.conda#c73d46a4d666da0ae3dcd3fd8f805122 -https://repo.anaconda.com/pkgs/main/linux-64/xz-5.4.5-h5eee18b_0.conda#fb0f709ab3eb6ad3538677c327646581 +https://repo.anaconda.com/pkgs/main/linux-64/xz-5.4.6-h5eee18b_0.conda#81a9916f581d4da15a3839216a487c66 https://repo.anaconda.com/pkgs/main/linux-64/zlib-1.2.13-h5eee18b_0.conda#333e31fbfbb5057c92fa845ad6adef93 https://repo.anaconda.com/pkgs/main/linux-64/ccache-3.7.9-hfe4627d_0.conda#bef6fc681c273bb7bd0c67d1a591365e https://repo.anaconda.com/pkgs/main/linux-64/readline-8.2-h5eee18b_0.conda#be42180685cce6e6b0329201d9f48efb https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.12-h1ccaba5_0.conda#fa10ff4aa631fa4aa090a6234d7770b9 https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.41.2-h5eee18b_0.conda#c7086c9ceb6cfe1c4c729a774a2d88a5 -https://repo.anaconda.com/pkgs/main/linux-64/python-3.12.1-h996f2a0_0.conda#5455a3a81e47bad947aa99db795d241a +https://repo.anaconda.com/pkgs/main/linux-64/python-3.12.2-h996f2a0_0.conda#bc4748d0d26253c8499a3abeca289469 https://repo.anaconda.com/pkgs/main/linux-64/setuptools-68.2.2-py312h06a4308_0.conda#83ba634cde4f30d9e0b88e4ac9716ca4 https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.41.2-py312h06a4308_0.conda#b2c4f82880d58d679f3982370d80c0e2 https://repo.anaconda.com/pkgs/main/linux-64/pip-23.3.1-py312h06a4308_0.conda#e1d44bca4a257e84af33503233491107 @@ -30,7 +30,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-23.3.1-py312h06a4308_0.conda#e1 # pip babel @ https://files.pythonhosted.org/packages/0d/35/4196b21041e29a42dc4f05866d0c94fa26c9da88ce12c38c2265e42c82fb/Babel-2.14.0-py3-none-any.whl#sha256=efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287 # pip certifi @ https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl#sha256=dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 # pip charset-normalizer @ https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b -# pip coverage @ https://files.pythonhosted.org/packages/c3/92/f2d89715c3397e76fe365b1ecbb861d1279ff8d47d23635040a358bc75dc/coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3 +# pip coverage @ https://files.pythonhosted.org/packages/2f/db/70900f10b85a66f761a3a28950ccd07757d51548b1d10157adc4b9415f15/coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e # pip docutils @ https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl#sha256=96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 # pip execnet @ https://files.pythonhosted.org/packages/e8/9c/a079946da30fac4924d92dbc617e5367d454954494cf1e71567bcc4e00ee/execnet-2.0.2-py3-none-any.whl#sha256=88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41 # pip idna @ https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl#sha256=c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f @@ -50,13 +50,13 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-23.3.1-py312h06a4308_0.conda#e1 # pip sphinxcontrib-qthelp @ https://files.pythonhosted.org/packages/80/b3/1beac14a88654d2e5120d0143b49be5ad450b86eb1963523d8dbdcc51eb2/sphinxcontrib_qthelp-1.0.7-py3-none-any.whl#sha256=e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182 # pip sphinxcontrib-serializinghtml @ https://files.pythonhosted.org/packages/38/24/228bb903ea87b9e08ab33470e6102402a644127108c7117ac9c00d849f82/sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl#sha256=326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7 # pip tabulate @ https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl#sha256=024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f -# pip threadpoolctl @ https://files.pythonhosted.org/packages/81/12/fd4dea011af9d69e1cad05c75f3f7202cdcbeac9b712eea58ca779a72865/threadpoolctl-3.2.0-py3-none-any.whl#sha256=2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032 -# pip urllib3 @ https://files.pythonhosted.org/packages/88/75/311454fd3317aefe18415f04568edc20218453b709c63c58b9292c71be17/urllib3-2.2.0-py3-none-any.whl#sha256=ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224 +# pip threadpoolctl @ https://files.pythonhosted.org/packages/b1/2c/f504e55d98418f2fcf756a56877e6d9a45dd5ed28b3d7c267b300e85ad5b/threadpoolctl-3.3.0-py3-none-any.whl#sha256=6155be1f4a39f31a18ea70f94a77e0ccd57dced08122ea61109e7da89883781e +# pip urllib3 @ https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl#sha256=450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d # pip jinja2 @ https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa -# pip pytest @ https://files.pythonhosted.org/packages/c7/10/727155d44c5e04bb08e880668e53079547282e4f950535234e5a80690564/pytest-8.0.0-py3-none-any.whl#sha256=50fb9cbe836c3f20f0dfa99c565201fb75dc54c8d76373cd1bde06b06657bdb6 -# pip python-dateutil @ https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl#sha256=961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 +# pip pytest @ https://files.pythonhosted.org/packages/5a/4a/3f626e3974bea1e6d471bd86f7965c67cd06d5770d1fec9aae445c44da7b/pytest-8.1.0-py3-none-any.whl#sha256=ee32db7af8de4629a455806befa90559f307424c07b8413ccfc30bf5b221dd7e +# 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/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl#sha256=58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f -# pip pooch @ https://files.pythonhosted.org/packages/1a/a5/5174dac3957ac412e80a00f30b6507031fcab7000afc9ea0ac413bddcff2/pooch-1.8.0-py3-none-any.whl#sha256=1bfba436d9e2ad5199ccad3583cca8c241b8736b5bb23fe67c213d52650dbb66 +# pip pooch @ https://files.pythonhosted.org/packages/f4/72/8ae0f1ba4ce6a4f6d4d01a60a9fdf690fde188c45c1872b0b4ddb0607ace/pooch-1.8.1-py3-none-any.whl#sha256=6b56611ac320c239faece1ac51a60b25796792599ce5c0b1bb87bf01df55e0a9 # pip pytest-cov @ https://files.pythonhosted.org/packages/a7/4b/8b78d126e275efa2379b1c2e09dc52cf70df16fc3b90613ef82531499d73/pytest_cov-4.1.0-py3-none-any.whl#sha256=6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a # pip pytest-xdist @ https://files.pythonhosted.org/packages/50/37/125fe5ec459321e2d48a0c38672cfc2419ad87d580196fd894e5f25230b0/pytest_xdist-3.5.0-py3-none-any.whl#sha256=d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24 # pip sphinx @ https://files.pythonhosted.org/packages/b2/b6/8ed35256aa530a9d3da15d20bdc0ba888d5364441bb50a5a83ee7827affe/sphinx-7.2.6-py3-none-any.whl#sha256=1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560 diff --git a/build_tools/azure/pymin_conda_defaults_openblas_environment.yml b/build_tools/azure/pymin_conda_defaults_openblas_environment.yml index d9424eda24349..cced1b64f8263 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: - joblib - threadpoolctl=2.2.0 - 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 e82b1fd3b640e..f82cae33f5c66 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: b250f106acfb8df0d6b3218c65e408f78edfbb37298810ab460c0e1dd1e3da37 +# input_hash: 780450b8b2255780dcdaac20441de28c64893d655de9bd05700259ff72e1c5be @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 @@ -64,12 +64,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_0.conda#4ceaa5d6e6307fe06961d555f78b266f https://repo.anaconda.com/pkgs/main/linux-64/packaging-23.1-py39h06a4308_0.conda#b8179f352917de28dd6bdbbb79e1db3f https://repo.anaconda.com/pkgs/main/linux-64/pillow-10.2.0-py39h5eee18b_0.conda#fca2a1c44d16ec4b8ba71759b4ba9ba4 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-68.2.2-py39h06a4308_0.conda#5b42cae5548732ae5c167bb1066085de @@ -82,6 +84,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.41.2-py39h06a4308_0.conda#e 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_0.conda#a03c1fe16cf2558bca3838062c334d7d https://repo.anaconda.com/pkgs/main/linux-64/pip-23.3.1-py39h06a4308_0.conda#685007e3dae59d211620f19926577bd6 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 c0fe7f88f22fe..6406945c32b3e 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 @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 816da54e5588e59c1421ecbadecee72df09985ec71ba8aa60722041f52705984 +# input_hash: 2f4b1d16d553e6307f97867b796d97131fd60899af1e29931840dbbc1b00d7b9 @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/intel-openmp-2024.0.0-h57928b3_49841.conda#e3255c8cdaf1d52f15816d1970f9c77a @@ -47,7 +47,7 @@ https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hcfcfb64_1.conda# https://conda.anaconda.org/conda-forge/noarch/certifi-2024.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 -https://conda.anaconda.org/conda-forge/win-64/cython-3.0.8-py39h99910a6_0.conda#c786525ccc5eac436b127a610dfe6c08 +https://conda.anaconda.org/conda-forge/win-64/cython-3.0.9-py39h99910a6_0.conda#37456058d8e7e7e3e3f68771aff7e543 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda#3761b23693f768dc75a8fd0a73ca053f @@ -62,7 +62,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2#a1f820480193ea83582b13249a7e7bd9 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.3.0-pyhc1e730c_0.conda#698d2d2b621640bddb9191f132967c9f @@ -84,7 +84,7 @@ https://conda.anaconda.org/conda-forge/win-64/libclang-15.0.7-default_hde6756a_4 https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda#090d91b69396f14afef450c285f9758c https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda#7e7099ad94ac3b599808950cec30ad4e https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.0-pyhd8ed1ab_0.conda#e2eeb8b7c5506b9778e8c41934e8dc6e +https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.2-pyhd8ed1ab_0.conda#40bd3ef942b9642a3eb20b0bbf92469b 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.11.0-h91493d7_1.conda#21069f3ed16812f9f4f2700667b6ec86 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 51fe4e3308868..628b96a458d83 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 32309f49e33c6..5442920c586ff 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,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: abcdef3ac4427961c9800df4e1a24a9b69fd7de178ff6e46e7c2ee5674f5b89f +# input_hash: 36888a57687ae12b5ca6ce054560ae59b0fe86aa090f112cde69225c83828524 @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 @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.8-py39h3d6467e_0.conda#0261e43a0b124d1ced1e1af085e8bc3c +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py39h3d6467e_0.conda#82f4e576cbe74921703f91d3b43c8a73 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py39hf3d152e_3.conda#09a48956e1c155907fd0d626f3e80f2e https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa @@ -119,8 +119,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openbla https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_ha2b6cf4_4.conda#898e0dd993afbed0d871b60c2eb33b83 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda#fe0e297faf462ee579c95071a5211665 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda#24e2649ebd432e652aa72cfd05f23a8e +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 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.26-pthreads_h7a3da1a_0.conda#bda28edbedb0ae5f0a9d3ebcb4290c1d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 @@ -128,7 +129,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad @@ -141,6 +142,7 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.3.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.10.0-pyha770c72_0.conda#16ae769069b380646c47142d719ef466 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 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 @@ -159,9 +161,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openbl https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_hb11cfb5_4.conda#c90f4cbb57839c98fef8f830e4b9972f https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.6.0-hd429924_1.conda#1dbcc04604fdf1e526e6d1b0b6938396 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda#2972754dc054bb079d1d121918b5126f https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda#ac902ff3c1c6d750dd0dfc93a974ab74 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.0-pyhd8ed1ab_0.conda#e2eeb8b7c5506b9778e8c41934e8dc6e +https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.2-pyhd8ed1ab_0.conda#40bd3ef942b9642a3eb20b0bbf92469b 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 @@ -173,6 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.cond 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.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +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-21_linux64_openblas.conda#77cefbfb4d47ba8cafef8e3f768a4538 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a diff --git a/build_tools/azure/pypy3_linux-64_conda.lock b/build_tools/azure/pypy3_linux-64_conda.lock index 7e1631f12ea83..e81dab95c0bb9 100644 --- a/build_tools/azure/pypy3_linux-64_conda.lock +++ b/build_tools/azure/pypy3_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: eadff03664bc914f17d2105d969374ce628b48c451ad69f86e457a73fa529c96 +# input_hash: 231e6765d0906ea65daa71dd10e672c1afde9ae87cba2e958a8744a6a38a4e7b @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 @@ -61,7 +61,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-1_73_pypy.conda#6e 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 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.8-py39hc10206b_0.conda#2dbc50309441c86f761ec382869a6116 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py39hc10206b_0.conda#6ec46cd4c47257085675df035236f31e https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -72,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h6dedee3_0.cond https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39hcf8a34e_0.conda#8a406ee5a979c2591f4c734d6fe4a958 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pypy-7.3.15-1_pypy39.conda#a418a6c16bd6f7ed56b92194214791a0 https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39ha90811c_0.c https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py39hf860d4a_0.conda#fa0d38d44f69d5c8ca476beb24fb456e https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.2-pyhd8ed1ab_0.conda#6f4399795892835bd192ea210ca69447 https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4da50d410f553db77e62ab62ffaa1abc -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.0-pyhd8ed1ab_0.conda#e2eeb8b7c5506b9778e8c41934e8dc6e +https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.2-pyhd8ed1ab_0.conda#40bd3ef942b9642a3eb20b0bbf92469b https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h6dedee3_2.conda#6c5d74bac41838f4377dfd45085e1fec https://conda.anaconda.org/conda-forge/linux-64/blas-2.121-openblas.conda#4a279792fd8861a15705516a52872eb6 diff --git a/build_tools/azure/ubuntu_atlas_lock.txt b/build_tools/azure/ubuntu_atlas_lock.txt index ec6fc8daf8bab..4a17f57a74ef2 100644 --- a/build_tools/azure/ubuntu_atlas_lock.txt +++ b/build_tools/azure/ubuntu_atlas_lock.txt @@ -18,7 +18,7 @@ packaging==23.2 # via pytest pluggy==1.4.0 # via pytest -pytest==8.1.0 +pytest==8.0.2 # via # -r build_tools/azure/ubuntu_atlas_requirements.txt # pytest-xdist diff --git a/build_tools/circle/doc_environment.yml b/build_tools/circle/doc_environment.yml index 22400c45091bb..cf46fe75f21f7 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 8149640fa7132..f3df0cfdcf32b 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 8c161b9707728825ba988fb31378ccb47ef5f7f7bb8c59df9236a7fbff130d2f +# input_hash: 6d9332337cbb68ec0111258bb0ab4b76ddc6b41f652dfca993a3a1e7ab8bf2b1 @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 @@ -44,6 +44,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace +https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.0.7-h00ab1b0_0.conda#271c74eadb196f7ae588d95a11e9acd3 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 @@ -110,6 +111,7 @@ https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.3.0-he2b93b https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.4-h783c2da_0.conda#d86baf8740d1a906b9716f2a0bac2f2d +https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.1-h5b01ea3_0.conda#6a6a96a3cd66ff9514a22f1eea91e303 https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e @@ -131,7 +133,7 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.8-py39h3d6467e_0.conda#0261e43a0b124d1ced1e1af085e8bc3c +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py39h3d6467e_0.conda#82f4e576cbe74921703f91d3b43c8a73 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py39hf3d152e_3.conda#09a48956e1c155907fd0d626f3e80f2e https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa @@ -152,8 +154,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openbla https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_ha2b6cf4_4.conda#898e0dd993afbed0d871b60c2eb33b83 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda#fe0e297faf462ee579c95071a5211665 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda#24e2649ebd432e652aa72cfd05f23a8e +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 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.26-pthreads_h7a3da1a_0.conda#bda28edbedb0ae5f0a9d3ebcb4290c1d @@ -164,7 +167,7 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#13 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py39hd1e30aa_0.conda#ec86403fde8793ac1c36f8afa3d15902 https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad @@ -201,12 +204,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openbl https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_hb11cfb5_4.conda#c90f4cbb57839c98fef8f830e4b9972f https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.6.0-hd429924_1.conda#1dbcc04604fdf1e526e6d1b0b6938396 +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/linux-64/pillow-10.2.0-py39had0adad_0.conda#2972754dc054bb079d1d121918b5126f https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/noarch/plotly-5.19.0-pyhd8ed1ab_0.conda#669cd7065794633b9e64e6a9612ec700 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda#ac902ff3c1c6d750dd0dfc93a974ab74 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.0-pyhd8ed1ab_0.conda#e2eeb8b7c5506b9778e8c41934e8dc6e +https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.2-pyhd8ed1ab_0.conda#40bd3ef942b9642a3eb20b0bbf92469b 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 @@ -219,10 +223,11 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.cond 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.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +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-21_linux64_openblas.conda#77cefbfb4d47ba8cafef8e3f768a4538 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.1.1-py39hf9b8f0e_0.conda#9ddd29852457d1152ca235eb87bc74fb +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.1.1-py39hf9b8f0e_1.conda#14a906ccb9a6f385fc4fe3c393246b49 https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.0-pyh4b66e23_0.conda#b8853659d596f967c661f544dd89ede7 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py39hddac248_0.conda#85293a042c24a08e71b7608ee66b6134 https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 @@ -304,7 +309,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip jupyter-events @ https://files.pythonhosted.org/packages/e3/55/0c1aa72f4317e826a471dc4adc3036acd11d496ded68c4bbac2a88551519/jupyter_events-0.9.0-py3-none-any.whl#sha256=d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf # pip nbformat @ https://files.pythonhosted.org/packages/f4/e7/ef30a90b70eba39e675689b9eaaa92530a71d7435ab8f9cae520814e0caf/nbformat-5.9.2-py3-none-any.whl#sha256=1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9 # pip nbclient @ https://files.pythonhosted.org/packages/6b/3a/607149974149f847125c38a62b9ea2b8267eb74823bbf8d8c54ae0212a00/nbclient-0.9.0-py3-none-any.whl#sha256=a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15 -# pip nbconvert @ https://files.pythonhosted.org/packages/dc/6f/2c4e3dafb36dff2c98a170c1d61275f2e2d6bfd0f07d25771c1c18a6a529/nbconvert-7.16.1-py3-none-any.whl#sha256=3188727dffadfdc9c6a1c7250729063d7bc78b355ad7aa023138afa030d1cd07 -# pip jupyter-server @ https://files.pythonhosted.org/packages/25/d6/6ee093c967d11144aeb1b0b4952d30e51da8eb2737837ab612084c783a58/jupyter_server-2.12.5-py3-none-any.whl#sha256=184a0f82809a8522777cfb6b760ab6f4b1bb398664c5860a27cec696cb884923 +# pip nbconvert @ https://files.pythonhosted.org/packages/4f/90/a522a41247a2c80289f265890d096821698819a15b12f30ff6e51ac00fe6/nbconvert-7.16.2-py3-none-any.whl#sha256=0c01c23981a8de0220255706822c40b751438e32467d6a686e26be08ba784382 +# pip jupyter-server @ https://files.pythonhosted.org/packages/95/85/483b8e09a897d1bc2194646d30d4ce6ae166106e91ecbd11d6b6d9ccfc36/jupyter_server-2.13.0-py3-none-any.whl#sha256=77b2b49c3831fbbfbdb5048cef4350d12946191f833a24e5f83e5f8f4803e97b # pip jupyterlab-server @ https://files.pythonhosted.org/packages/ab/ac/a19c579bb8ab2a2aefcf47cd3787683e6e136378d7ab2602be3b8e628030/jupyterlab_server-2.25.3-py3-none-any.whl#sha256=c48862519fded9b418c71645d85a49b2f0ec50d032ba8316738e9276046088c1 # pip jupyterlite-sphinx @ https://files.pythonhosted.org/packages/9c/bd/1695eebeb376315c9fc5cbd41c54fb84bb69c68e69651bfc6f03aa4fe659/jupyterlite_sphinx-0.11.0-py3-none-any.whl#sha256=2a0762167e89ec6acd267c73bb90b528728fdba5e30390ea4fe37ddcec277191 diff --git a/build_tools/circle/doc_min_dependencies_environment.yml b/build_tools/circle/doc_min_dependencies_environment.yml index 0d2718b5cfd4b..fccea4849351f 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 f9ab2c156a83f..b0c693c119be7 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: abd4c0de4597ed9fe272490453b63fabd083c7fdfd2953e00fe35b1b4dd44e72 +# input_hash: 4d7f75e47b3fc4a97f127831445d22078a5d1cd7673cea9a03a37529a8218645 @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 @@ -135,9 +135,10 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_ha2b6cf4_4.conda#898e0dd993afbed0d871b60c2eb33b83 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda#fe0e297faf462ee579c95071a5211665 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda#24e2649ebd432e652aa72cfd05f23a8e +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 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-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 @@ -146,7 +147,7 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#13 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py39hd1e30aa_0.conda#ec86403fde8793ac1c36f8afa3d15902 https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 @@ -179,6 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7 https://conda.anaconda.org/conda-forge/noarch/joblib-1.3.2-pyhd8ed1ab_0.conda#4da50d410f553db77e62ab62ffaa1abc https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_hb11cfb5_4.conda#c90f4cbb57839c98fef8f830e4b9972f https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.6.0-hd429924_1.conda#1dbcc04604fdf1e526e6d1b0b6938396 +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/linux-64/mkl-2024.0.0-ha957f24_49657.conda#21acbdcbba8d049c8617c486bdc9bc84 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 @@ -186,7 +188,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.con https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/noarch/plotly-5.14.0-pyhd8ed1ab_0.conda#6a7bcc42ef58dd6cf3da9333ea102433 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda#ac902ff3c1c6d750dd0dfc93a974ab74 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.0-pyhd8ed1ab_0.conda#e2eeb8b7c5506b9778e8c41934e8dc6e +https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.2-pyhd8ed1ab_0.conda#40bd3ef942b9642a3eb20b0bbf92469b 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 @@ -199,6 +201,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.0.0-ha770c72_4965 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.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +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.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_mkl.conda#0553cad80ef02be86c8e178eeecb6a34 diff --git a/build_tools/cirrus/pymin_conda_forge_linux-aarch64_conda.lock b/build_tools/cirrus/pymin_conda_forge_linux-aarch64_conda.lock index b4d8f44224de2..5533556abcd38 100644 --- a/build_tools/cirrus/pymin_conda_forge_linux-aarch64_conda.lock +++ b/build_tools/cirrus/pymin_conda_forge_linux-aarch64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-aarch64 -# input_hash: 2e525206249f57e81ca413c5e09cf8b9ee0654ff901e99e5c50b3beef4cc72c0 +# input_hash: dc7e28d3993d445e2d092c8e0962c7c7b4861c3413f40ab9e1f017be338abb90 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.2.2-hcefe29a_0.conda#57c226edb90c4e973b9b7503537dd339 https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h2d8c526_0.conda#16246d69e945d0b1969a6099e7c5d457 @@ -48,7 +48,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/ccache-4.9.1-h6552966_0.con 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 -https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.0.8-py39h387a81e_0.conda#86c9d8fd1ff4ffa4c9911523432f1e75 +https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.0.9-py39h387a81e_0.conda#9a131335ffb2447b28834ed1da117fd4 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -60,7 +60,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/openblas-0.3.26-pthreads_h3 https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.2-h0d9d63b_0.conda#fd2898519e839d5ceb778343f39a3176 https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.3.0-pyhc1e730c_0.conda#698d2d2b621640bddb9191f132967c9f @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-21_linuxaarc https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-21_linuxaarch64_openblas.conda#ab08b651e3630c20d3032e59859f34f7 https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.2.0-py39h8ce38d7_0.conda#cf4745fb7f7cb5d0b90c476116c7d8ac https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.0-pyhd8ed1ab_0.conda#e2eeb8b7c5506b9778e8c41934e8dc6e +https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.2-pyhd8ed1ab_0.conda#40bd3ef942b9642a3eb20b0bbf92469b https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.2-pyhd8ed1ab_0.conda#c69b222e1a89945b80feb249d57d8949 https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-21_linuxaarch64_openblas.conda#be00a60ef5d88de133a28cb1fb6e0b31 diff --git a/build_tools/update_environments_and_lock_files.py b/build_tools/update_environments_and_lock_files.py index add176b93ba82..5a9e82c000413 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", @@ -223,6 +224,7 @@ def remove_from(alist, to_remove): "numpy", "scipy", "pandas", + "rich", "cython", "joblib", "pillow", @@ -245,7 +247,8 @@ def remove_from(alist, to_remove): "conda_dependencies": ( ["pypy", "python"] + remove_from( - common_dependencies_without_coverage, ["python", "pandas", "pillow"] + common_dependencies_without_coverage, + ["python", "pandas", "rich", "pillow"], ) + ["ccache"] ), @@ -261,7 +264,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", ], @@ -345,7 +350,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": { "python": "3.9", diff --git a/sklearn/__init__.py b/sklearn/__init__.py index 30a3bbcdcbf66..58b2ecda6410f 100644 --- a/sklearn/__init__.py +++ b/sklearn/__init__.py @@ -89,6 +89,7 @@ __all__ = [ "calibration", + "callback", "cluster", "covariance", "cross_decomposition", diff --git a/sklearn/_min_dependencies.py b/sklearn/_min_dependencies.py index 9813d22af6098..054cd6154c182 100644 --- a/sklearn/_min_dependencies.py +++ b/sklearn/_min_dependencies.py @@ -23,6 +23,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 e73ae4c8a180e..86b01b4e87439 100644 --- a/sklearn/base.py +++ b/sklearn/base.py @@ -15,6 +15,8 @@ from . import __version__ from ._config import config_context, get_config +from .callback import BaseCallback, build_computation_tree +from .callback._base import default_data from .exceptions import InconsistentVersionWarning from .utils import _IS_32BIT from .utils._estimator_html_repr import _HTMLDocumentationLinkMixin, estimator_html_repr @@ -130,6 +132,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] @@ -669,6 +675,84 @@ class attribute, which is a dictionary `param_name: list of constraints`. See caller_name=self.__class__.__name__, ) + 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, BaseCallback) for callback in callbacks): + raise TypeError("callbacks must be subclasses of BaseCallback.") + + self._skl_callbacks = callbacks + + return self + + def _eval_callbacks_on_fit_begin(self, *, tree_structure, data): + """Evaluate the `on_fit_begin` method of the callbacks. + + The computation tree is also built at this point. + + This method should be called after all data and parameters validation. + + Parameters + ---------- + tree_structure : list of dict + A description of the nested steps of computation of the estimator to build + the computation tree. It's a list of dict with keys "stage" and + "n_children". + + 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. + + Returns + ------- + root : ComputationNode instance + The root of the computation tree. + """ + self._computation_tree = build_computation_tree( + estimator_name=self.__class__.__name__, + tree_structure=tree_structure, + parent=getattr(self, "_parent_node", None), + ) + + if not hasattr(self, "_skl_callbacks"): + return self._computation_tree + + # Only call the on_fit_begin method of callbacks that are not + # propagated from a meta-estimator. + for callback in self._skl_callbacks: + if not callback._is_propagated(estimator=self): + callback.on_fit_begin(estimator=self, data={**default_data, **data}) + + return self._computation_tree + + def _eval_callbacks_on_fit_end(self): + """Evaluate the `on_fit_end` method of the callbacks.""" + if not hasattr(self, "_skl_callbacks") or not hasattr( + self, "_computation_tree" + ): + return + + # Only call the on_fit_end method of callbacks that are not + # propagated from a meta-estimator. + for callback in self._skl_callbacks: + if not callback._is_propagated(estimator=self): + callback.on_fit_end() + @property def _repr_html_(self): """HTML representation of estimator. @@ -1471,7 +1555,10 @@ 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: + estimator._eval_callbacks_on_fit_end() return wrapper diff --git a/sklearn/callback/__init__.py b/sklearn/callback/__init__.py new file mode 100644 index 0000000000000..42fd228069c3e --- /dev/null +++ b/sklearn/callback/__init__.py @@ -0,0 +1,19 @@ +""" +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 BaseCallback, CallbackPropagatorMixin +from ._computation_tree import ComputationNode, build_computation_tree +from ._progressbar import ProgressBar + +__all__ = [ + "BaseCallback", + "CallbackPropagatorMixin", + "build_computation_tree", + "ComputationNode", + "ProgressBar", +] diff --git a/sklearn/callback/_base.py b/sklearn/callback/_base.py new file mode 100644 index 0000000000000..d9be734ba251a --- /dev/null +++ b/sklearn/callback/_base.py @@ -0,0 +1,205 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + +from abc import ABC, abstractmethod + +# default values for the data dict passed to the callbacks +default_data = { + "X_train": None, + "y_train": None, + "sample_weight_train": None, + "X_val": None, + "y_val": None, + "sample_weight_val": None, +} + + +class BaseCallback(ABC): + """Abstract class for the callbacks""" + + @abstractmethod + 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 the callback is set on. + + 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. + """ + + @abstractmethod + def on_fit_end(self): + """Method called at the end of the fit method of the estimator.""" + + @abstractmethod + def on_fit_iter_end(self, estimator, node, **kwargs): + """Method called at the end of each computation node of the estimator. + + Parameters + ---------- + estimator : estimator instance + The caller estimator. It might differ from the estimator passed to the + `on_fit_begin` method for auto-propagated callbacks. + + node : ComputationNode instance + The caller computation 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 or None + Whether or not to stop the current level of iterations at this node. + """ + + @property + def auto_propagate(self): + """Whether or not this callback should be propagated to sub-estimators. + + An auto-propagated callback (from a meta-estimator to its sub-estimators) must + be set on the meta-estimator. Its `on_fit_begin` and `on_fit_end` methods will + only be called at the beginning and end of the fit method of the meta-estimator, + while its `on_fit_iter_end` method will be called at each computation node of + the meta-estimator and its sub-estimators. + """ + return False + + def _is_propagated(self, estimator): + """Check if this callback attached to estimator has been propagated from a + meta-estimator. + """ + return self.auto_propagate and hasattr(estimator, "_parent_node") + + # TODO: This is not used yet but will be necessary for next callbacks + # Uncomment when needed + # @property + # def request_stopping_criterion(self): + # return False + + # @property + # def request_from_reconstruction_attributes(self): + # return False + + +class CallbackPropagatorMixin: + """Mixin class for meta-estimators expected to propagate callbacks.""" + + def _propagate_callbacks(self, sub_estimator, *, parent_node): + """Propagate the auto-propagated callbacks to a sub-estimator. + + Parameters + ---------- + sub_estimator : estimator instance + The sub-estimator to propagate the callbacks to. + + parent_node : ComputationNode instance + The computation node in this estimator to set as `parent_node` to the + computation tree of the sub-estimator. It must be the node where the fit + method of the sub-estimator is called. + """ + if hasattr(sub_estimator, "_skl_callbacks") and any( + callback.auto_propagate for callback in sub_estimator._skl_callbacks + ): + bad_callbacks = [ + callback.__class__.__name__ + for callback in sub_estimator._skl_callbacks + if callback.auto_propagate + ] + raise TypeError( + f"The sub-estimators ({sub_estimator.__class__.__name__}) of a" + f" meta-estimator ({self.__class__.__name__}) can't have" + f" auto-propagated callbacks ({bad_callbacks})." + " Set them directly on the meta-estimator." + ) + + if not hasattr(self, "_skl_callbacks"): + return + + propagated_callbacks = [ + callback for callback in self._skl_callbacks if callback.auto_propagate + ] + + if not propagated_callbacks: + return + + sub_estimator._parent_node = parent_node + + sub_estimator._set_callbacks( + getattr(sub_estimator, "_skl_callbacks", []) + propagated_callbacks + ) + + +# Not a method of BaseEstimator because it might not be directly called from fit but +# by a non-method function called by fit +def _eval_callbacks_on_fit_iter_end(**kwargs): + """Evaluate the `on_fit_iter_end` method of the callbacks. + + This function must be called at the end of each computation node. + + Parameters + ---------- + kwargs : dict + Arguments passed to the callback. + + Returns + ------- + stop : bool + Whether or not to stop the fit at this node. + """ + estimator = kwargs.get("estimator") + node = kwargs.get("node") + + if not hasattr(estimator, "_skl_callbacks") or node is None: + return False + + # stopping_criterion and reconstruction_attributes can be costly to compute. + # They are passed as lambdas for lazy evaluation. We only actually + # compute them if a callback requests it. + # TODO: This is not used yet but will be necessary for next callbacks + # Uncomment when needed + # if any(cb.request_stopping_criterion for cb in estimator._skl_callbacks): + # kwarg = kwargs.pop("stopping_criterion", lambda: None)() + # kwargs["stopping_criterion"] = kwarg + + # if any( + # cb.request_from_reconstruction_attributes + # for cb in estimator._skl_callbacks + # ): + # kwarg = kwargs.pop("from_reconstruction_attributes", lambda: None)() + # kwargs["from_reconstruction_attributes"] = kwarg + + return any( + callback.on_fit_iter_end(**kwargs) for callback in estimator._skl_callbacks + ) diff --git a/sklearn/callback/_computation_tree.py b/sklearn/callback/_computation_tree.py new file mode 100644 index 0000000000000..ba32e04400810 --- /dev/null +++ b/sklearn/callback/_computation_tree.py @@ -0,0 +1,126 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + + +class ComputationNode: + """A node in a computation tree. + + Parameters + ---------- + estimator_name : str + The name of the estimator this computation node belongs to. + + stage : str, default=None + A description of the stage this computation node belongs to. + None means it's a leaf. + + n_children : int, default=None + The number of its children. None means it's a leaf. + + idx : int, default=0 + The index of this node among its siblings. + + parent : ComputationNode instance, default=None + The parent node. None means this is the root. + + Attributes + ---------- + children : list + The list of its children nodes. For a leaf, it's an empty list + """ + + def __init__( + self, + estimator_name, + stage=None, + n_children=None, + idx=0, + parent=None, + ): + # estimator_name and description are tuples because an estimator can be + # a sub-estimator of a meta-estimator. In that case, the root of the computation + # tree of the sub-estimator and a leaf of the computation tree of the + # meta-estimator correspond to the same computation step. Therefore, both + # nodes are merged into a single node, retaining the information of both. + self.estimator_name = (estimator_name,) + self.stage = (stage,) + + self.parent = parent + self.n_children = n_children + self.idx = idx + + self.children = [] + + @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 node in self.children: + yield from node + + +def build_computation_tree(estimator_name, tree_structure, parent=None, idx=0): + """Build the computation tree from the description of the levels. + + Parameters + ---------- + estimator_name : str + The name of the estimator this computation tree belongs to. + + tree_structure : list of dict + The description of the stages of the computation tree. Each dict must have + the following keys: + - stage: str + A human readable description of the stage. + - n_children: int or None + The number of its children. None means it's a leaf. + + parent : ComputationNode instance, default=None + The parent node. None means this is the root. + + idx : int, default=0 + The index of this node among its siblings. + + Returns + ------- + computation_tree : ComputationNode instance + The root of the computation tree. + """ + this_stage = tree_structure[0] + + node = ComputationNode( + estimator_name=estimator_name, + parent=parent, + n_children=this_stage["n_children"], + stage=this_stage["stage"], + idx=idx, + ) + + if parent is not None and parent.n_children is None: + # parent node is a leaf of the computation tree of an outer estimator. It means + # that this node is the root of the computation tree of this estimator. They + # both correspond the same computation step, so we merge both nodes. + node.stage = parent.stage + node.stage + node.estimator_name = parent.estimator_name + node.estimator_name + node.parent = parent.parent + node.idx = parent.idx + parent.parent.children[node.idx] = node + + if node.n_children is not None: + for i in range(node.n_children): + node.children.append( + build_computation_tree( + estimator_name, tree_structure[1:], parent=node, idx=i + ) + ) + + return node diff --git a/sklearn/callback/_progressbar.py b/sklearn/callback/_progressbar.py new file mode 100644 index 0000000000000..ee5669acf5c60 --- /dev/null +++ b/sklearn/callback/_progressbar.py @@ -0,0 +1,183 @@ +# 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 +from . import BaseCallback + + +class ProgressBar(BaseCallback): + """Callback that displays progress bars for each iterative steps of an estimator.""" + + auto_propagate = True + + def __init__(self): + check_rich_support("Progressbar") + + 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, node, **kwargs): + self._queue.put(node) + + def on_fit_end(self): + 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 computation 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(), + 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_task = None + + with self.progress_ctx: + while node := self.queue.get(): + self._update_task_tree(node) + self._update_tasks() + self.progress_ctx.refresh() + + def _update_task_tree(self, node): + """Update the tree of tasks from a new node.""" + curr_task, parent_task = None, None + + for curr_node in node.path: + if curr_node.parent is None: # root node + if self.root_task is None: + self.root_task = TaskNode(curr_node, progress_ctx=self.progress_ctx) + curr_task = self.root_task + elif curr_node.idx not in parent_task.children: + curr_task = TaskNode( + curr_node, progress_ctx=self.progress_ctx, parent=parent_task + ) + parent_task.children[curr_node.idx] = curr_task + else: # task already exists + curr_task = parent_task.children[curr_node.idx] + parent_task = curr_task + + # Mark the deepest task as finished (this is the one corresponding the + # computation node that we just get from the queue). + curr_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 task_node in self.root_task: + task = self.progress_ctx.tasks[task_node.task_id] + + if task_node.parent is not None and task_node.parent.finished: + # If the parent task is finished, then mark the current task as + # finished. It can happen if an estimator doesn't reach its max number + # of iterations (e.g. early stopping). + completed = task.total + else: + completed = sum(t.finished for t in task_node.children.values()) + + if completed == task.total: + task_node.finished = True + + self.progress_ctx.update( + task_node.task_id, completed=completed, refresh=False + ) + self.progress_ctx._ordered_tasks.append(task) + + +class TaskNode: + """A node in the tree of rich tasks. + + Parameters + ---------- + node : `ComputationNode` instance + The computation node this task corresponds to. + + progress_ctx : `rich.Progress` instance + The progress context to which this task belongs. + + parent : `TaskNode` instance + The parent of this task. + """ + + def __init__(self, node, progress_ctx, parent=None): + self.node_idx = node.idx + self.parent = parent + self.children = {} + self.finished = False + + if node.n_children is not None: + description = self._format_task_description(node) + self.task_id = progress_ctx.add_task(description, total=node.n_children) + + def _format_task_description(self, node): + """Return a formatted description for the task of the node.""" + colors = ["bright_magenta", "cyan", "dark_orange"] + + indent = f"{' ' * (node.depth)}" + style = f"[{colors[(node.depth)%len(colors)]}]" + + description = f"{node.estimator_name[0]} - {node.stage[0]}" + if node.parent is not None: + description += f" #{node.idx}" + if len(node.estimator_name) == 2: + description += f" | {node.estimator_name[1]} - {node.stage[1]}" + + return f"{style}{indent}{description}" + + 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/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..0e51d1c165b2e --- /dev/null +++ b/sklearn/callback/tests/_utils.py @@ -0,0 +1,105 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + +from sklearn.base import BaseEstimator, _fit_context, clone +from sklearn.callback import BaseCallback, CallbackPropagatorMixin +from sklearn.callback._base import _eval_callbacks_on_fit_iter_end +from sklearn.utils.parallel import Parallel, delayed + + +class TestingCallback(BaseCallback): + 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): + auto_propagate = True + + +class NotValidCallback: + """Unvalid callback since it does not inherit from `BaseCallback`.""" + + def on_fit_begin(self, estimator, *, data): + pass # pragma: no cover + + def on_fit_end(self): + pass # pragma: no cover + + def on_fit_iter_end(self, estimator, node, **kwargs): + pass # pragma: no cover + + +class Estimator(BaseEstimator): + _parameter_constraints: dict = {} + + def __init__(self, max_iter=20): + self.max_iter = max_iter + + @_fit_context(prefer_skip_nested_validation=False) + def fit(self, X, y): + root = self._eval_callbacks_on_fit_begin( + tree_structure=[ + {"stage": "fit", "n_children": self.max_iter}, + {"stage": "iter", "n_children": None}, + ], + data={"X_train": X, "y_train": y}, + ) + + for i in range(self.max_iter): + if _eval_callbacks_on_fit_iter_end( + estimator=self, + node=root.children[i], + ): + break + + self.n_iter_ = i + 1 + + return self + + +class MetaEstimator(BaseEstimator, CallbackPropagatorMixin): + _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, y): + root = self._eval_callbacks_on_fit_begin( + tree_structure=[ + {"stage": "fit", "n_children": self.n_outer}, + {"stage": "outer", "n_children": self.n_inner}, + {"stage": "inner", "n_children": None}, + ], + data={"X_train": X, "y_train": y}, + ) + + Parallel(n_jobs=self.n_jobs, prefer=self.prefer)( + delayed(_func)(self, self.estimator, X, y, node) + for _, node in enumerate(root.children) + ) + + return self + + +def _func(meta_estimator, inner_estimator, X, y, parent_node): + for _, node in enumerate(parent_node.children): + est = clone(inner_estimator) + meta_estimator._propagate_callbacks(est, parent_node=node) + est.fit(X, y) + + _eval_callbacks_on_fit_iter_end(estimator=meta_estimator, node=node) + + _eval_callbacks_on_fit_iter_end(estimator=meta_estimator, node=parent_node) diff --git a/sklearn/callback/tests/test_base_estimator_callback_methods.py b/sklearn/callback/tests/test_base_estimator_callback_methods.py new file mode 100644 index 0000000000000..838f117e65812 --- /dev/null +++ b/sklearn/callback/tests/test_base_estimator_callback_methods.py @@ -0,0 +1,107 @@ +# 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 be subclasses of BaseCallback"): + estimator._set_callbacks(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]) + + metaestimator._propagate_callbacks(estimator, parent_node=None) + + assert hasattr(estimator, "_parent_node") + 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) + metaestimator._propagate_callbacks(estimator, parent_node=None) + + 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-estimators .*of a meta-estimator .*can't have auto-propagated callbacks" + ) + with pytest.raises(TypeError, match=match): + meta_estimator.fit(X=None, y=None) + + +def test_eval_callbacks_on_fit_begin(): + """Check that `_eval_callbacks_on_fit_begin` creates the computation tree.""" + estimator = Estimator()._set_callbacks(TestingCallback()) + assert not hasattr(estimator, "_computation_tree") + + tree_structure = [ + {"stage": "fit", "n_children": 10}, + {"stage": "iter", "n_children": None}, + ] + estimator._eval_callbacks_on_fit_begin(tree_structure=tree_structure, data={}) + assert hasattr(estimator, "_computation_tree") + + +def test_no_callback_early_stop(): + """Check that `eval_callbacks_on_fit_iter_end` doesn't trigger early stopping + when there's no callback. + """ + estimator = Estimator() + estimator.fit(X=None, y=None) + + assert estimator.n_iter_ == estimator.max_iter diff --git a/sklearn/callback/tests/test_computation_tree.py b/sklearn/callback/tests/test_computation_tree.py new file mode 100644 index 0000000000000..de2442d4851a3 --- /dev/null +++ b/sklearn/callback/tests/test_computation_tree.py @@ -0,0 +1,73 @@ +# License: BSD 3 clause +# Authors: the scikit-learn developers + +import numpy as np + +from sklearn.callback import build_computation_tree + +TREE_STRUCTURE = [ + {"stage": "stage0", "n_children": 3}, + {"stage": "stage1", "n_children": 5}, + {"stage": "stage2", "n_children": 7}, + {"stage": "stage3", "n_children": None}, +] + + +def test_computation_tree(): + """Check the construction of the computation tree.""" + computation_tree = build_computation_tree( + estimator_name="estimator", tree_structure=TREE_STRUCTURE + ) + assert computation_tree.estimator_name == ("estimator",) + assert computation_tree.parent is None + assert computation_tree.idx == 0 + + assert len(computation_tree.children) == computation_tree.n_children == 3 + assert [node.idx for node in computation_tree.children] == list(range(3)) + + for node1 in computation_tree.children: + assert len(node1.children) == 5 + assert [n.idx for n in node1.children] == list(range(5)) + + for node2 in node1.children: + assert len(node2.children) == 7 + assert [n.idx for n in node2.children] == list(range(7)) + + for node3 in node2.children: + assert not node3.children + + +def test_n_nodes(): + """Check that the number of node in a computation tree corresponds to what we expect + from the level descriptions. + """ + computation_tree = build_computation_tree( + estimator_name="", tree_structure=TREE_STRUCTURE + ) + + n_children_per_level = [stage["n_children"] for stage in TREE_STRUCTURE[:-1]] + expected_n_nodes = 1 + np.sum(np.cumprod(n_children_per_level)) + + actual_n_nodes = sum(1 for _ in computation_tree) + + assert actual_n_nodes == expected_n_nodes + + +def test_path(): + """Check that the path from the root to a node is correct.""" + computation_tree = build_computation_tree( + estimator_name="", tree_structure=TREE_STRUCTURE + ) + + assert computation_tree.path == [computation_tree] + + node = computation_tree.children[1].children[2].children[3] + expected_path = [ + computation_tree, + computation_tree.children[1], + computation_tree.children[1].children[2], + node, + ] + assert node.path == expected_path + + assert all(node.depth == i for i, node in enumerate(expected_path)) diff --git a/sklearn/callback/tests/test_progressbar.py b/sklearn/callback/tests/test_progressbar.py new file mode 100644 index 0000000000000..20aab8f4c4ab7 --- /dev/null +++ b/sklearn/callback/tests/test_progressbar.py @@ -0,0 +1,48 @@ +# 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 + + +@pytest.mark.parametrize("n_jobs", [1, 2]) +@pytest.mark.parametrize("prefer", ["threads", "processes"]) +def test_progressbar(n_jobs, prefer, capsys): + """Check the output of the progress bars and their completion.""" + pytest.importorskip("rich") + + est = Estimator() + meta_est = MetaEstimator(est, n_jobs=n_jobs, prefer=prefer) + meta_est._set_callbacks(ProgressBar()) + meta_est.fit(None, None) + + captured = capsys.readouterr() + + assert re.search(r"MetaEstimator - fit", captured.out) + for i in range(4): + assert re.search(rf"MetaEstimator - outer #{i}", captured.out) + for i in range(3): + assert re.search(rf"MetaEstimator - inner #{i} | Estimator - 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_fetch_openml_requires_pandas") + 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/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