diff --git a/build_tools/azure/debian_32bit_lock.txt b/build_tools/azure/debian_32bit_lock.txt index a0793f19ce69a..ec9ead63ab9a4 100644 --- a/build_tools/azure/debian_32bit_lock.txt +++ b/build_tools/azure/debian_32bit_lock.txt @@ -31,7 +31,7 @@ pytest==8.3.5 # via # -r build_tools/azure/debian_32bit_requirements.txt # pytest-cov -pytest-cov==6.0.0 +pytest-cov==6.1.0 # via -r build_tools/azure/debian_32bit_requirements.txt threadpoolctl==3.6.0 # via -r build_tools/azure/debian_32bit_requirements.txt diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock index c98790e49dd11..ea8781d37590c 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: 15de7a0d1a0d046ada825ffa5ad3547c790bf903bd5d9b03e7c0e9a6a62c680d +# input_hash: 5af635a76d4f0cdd464707612f3fccd27d4e70a5b3127e4c4cc84e3f5840434a @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 @@ -9,7 +9,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.19.0-ha770c72_0.conda#6a85954c6b124241afa7d3d1897321e2 https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2024.2.2-ha957f24_16.conda#42b0d14354b5910a9f41e29289914f6b -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-5_cp313.conda#381bbd2a92c863f640a55b6ff3c35161 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-6_cp313.conda#ef1d8e55d61220011cceed0b94a920d2 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 @@ -25,8 +25,8 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.0-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 @@ -49,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-h3870646_2. https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.3-h3870646_2.conda#303d9e83e0518f1dcb66e90054635ca6 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda#1d6afef758879ef5ee78127eb4cd2c4a +https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250127.1-cxx17_hbbce691_0.conda#00290e549c5c8a32cc271020acc9ec6b @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1. https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.1-pyhd8ed1ab_0.conda#2ded25bc46cbae83d08807c89cb84747 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py313h33d0bda_0.conda#9862d13a5e466273d5a4738cffcb8d6c https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 @@ -130,6 +130,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar. https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h8d12d68_0.conda#109427e5576d0ce9c42257c2421b1680 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda#21b62c55924f01b6eef6827167b46acb +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda#3585aa87c43ab15b167b574cd73b057b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -139,6 +140,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda# https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba21d75dc722c29827988a575a65707 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda#120541563e520d12d8e39abd7de9092c +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad @@ -172,6 +174,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46 https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.1-ha7bfdaf_0.conda#2e234fb7d6eeb5c32eb5b256403b5795 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda#fee3164ac23dfca50cfcc8b85ddefb81 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 @@ -198,12 +201,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.1-default_ https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.1-default_h9c6a7e4_0.conda#f8b1b8c13c0a0fede5e1a204eafb48f8 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda#ae36e6296a8dd8e8a9a8375965bf6398 https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.19.0-hd1b1c89_0.conda#21fdfc7394cf73e8f5d46e66a1eeed09 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_0.conda#d67f3f3c33344ff3e9ef5270001e9011 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/optree-0.14.1-py313h33d0bda_1.conda#951a8b89db3ca099f93586919c03226d https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py313h8db990d_0.conda#1e86810c6c3fb6d6aebdba26564eb2e8 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/rich-14.0.0-pyh29332c3_0.conda#202f08242192ce3ed8bdb439ba40c0fe https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.31.0-h55f77e1_4.conda#0627af705ed70681f5bede31e72348e5 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 e804bf1ce8e31..a849f2fed83c1 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_environment.yml +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_environment.yml @@ -13,6 +13,7 @@ dependencies: - threadpoolctl - matplotlib - pandas + - rich - pyamg - pytest - pytest-xdist diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock index d9d01a7829476..c2daaf2cfb07b 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,20 +1,20 @@ # Generated by conda-lock. # platform: osx-64 -# input_hash: b4e9eb0fbe1a7a6d067e4f4b43ca9e632309794c2a76d5c254ce023cb2fa2d99 +# input_hash: df2fdfb48d1d95889ffd96afa43f5027525c62645dedd829ee43ca8c0b916985 @EXPLICIT https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2025.1.31-h8857fd0_0.conda#3418b6c8cac3e71c0bc089fc5ea53042 https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-13.3.0-h297be85_1.conda#b4e7d8b8e403d8021bc42293082b9da0 https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda#72507f8e3961bc968af17435060b6dd6 https://conda.anaconda.org/conda-forge/osx-64/mkl-include-2023.2.0-h6bab518_50500.conda#835abb8ded5e26f23ea6996259c7972e -https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.13-5_cp313.conda#927a2186f1f997ac018d67c4eece90a6 +https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.13-6_cp313.conda#1867172dd3044e5c3db5772b81d67796 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda#7ed4301d437b59045be7e051a0308211 https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda#d68d48a3060eb5abdc1cdc8e2a3a5966 https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda#58f2c4bdd56c46cc7451596e4ae68e0b https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.1-hf95d169_0.conda#85cff0ed95d940c4762d5a99a6fe34ae https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.23-he65b83e_0.conda#120f8f7ba6a8defb59f4253447db4bb4 -https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda#20307f4049a735a78a29073be1be2626 -https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_0.conda#b8667b0d0400b8dcb6844d8e06b2027d +https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda#026d0a1056ba2a3dbbea6d4b08188676 +https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda#4ca9ea59839a9ca8df84170fab4ceb41 https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda#6283140d7b2b55b6b095af939b71b13f https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.6.4-hd471939_0.conda#db9d7b0152613f097cdb61ccf9f70ef5 https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda#ed625b2e59dff82859c23dd24774156b @@ -66,12 +66,14 @@ https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-951.9-h33512f0_4.conda https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.8-default_h3571c67_8.conda#1444a2cd1f78fccea7dacb658f8aeb39 https://conda.anaconda.org/conda-forge/osx-64/libhiredis-1.0.2-h2beb688_0.tar.bz2#524282b2c46c9dedf051b3bc2ae05494 https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18-18.1.8-hc29ff6c_3.conda#61dfcd8dc654e2ca399a214641ab549f +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda#0520855aaae268ea413d6bc913f1384c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h7fd6d84_0.conda#025c711177fc3309228ca1a32374458d https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba21d75dc722c29827988a575a65707 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad @@ -82,6 +84,7 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.2-py313h63b0ddb_0.conda#74a3a14f82dc65fa19f4fd4e2eb8da93 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 https://conda.anaconda.org/conda-forge/osx-64/ccache-4.11.2-h30d2cd9_0.conda#9412b5214abe467b2d70eaf8c65975a0 https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.8-default_h3571c67_8.conda#c40e72e808995df189d70d9a438d77ac https://conda.anaconda.org/conda-forge/osx-64/coverage-7.8.0-py313h717bdf5_0.conda#1215b56c8d9915318d1714cbd004035f @@ -90,6 +93,7 @@ https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-13.3.0-h355c4 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/osx-64/ld64-951.9-h4e51db5_4.conda#a35ccc73726f64d22dc9c4349f5c58bd https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-hc29ff6c_3.conda#2585f8254d2ce24399a601e9b4e15652 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda#fee3164ac23dfca50cfcc8b85ddefb81 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b https://conda.anaconda.org/conda-forge/osx-64/pillow-11.1.0-py313h0c4f865_0.conda#11b4dd7a814202f2a0b655420f1c1c3a @@ -103,6 +107,7 @@ https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.c https://conda.anaconda.org/conda-forge/osx-64/mkl-devel-2023.2.0-h694c41f_50500.conda#1b4d0235ef253a1e19459351badf4f9f https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/rich-14.0.0-pyh29332c3_0.conda#202f08242192ce3ed8bdb439ba40c0fe https://conda.anaconda.org/conda-forge/osx-64/cctools-1010.6-ha66f10e_4.conda#df1dfc9721444ad44d0916d9454e55f3 https://conda.anaconda.org/conda-forge/osx-64/clangxx-18.1.8-default_heb2e8d1_8.conda#06a53a18fa886ec96f519b9022eeb449 https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda#51089a4865eb4aec2bc5c7468bd07f9f diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_environment.yml b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_environment.yml index ad177e4ed391b..c5c104b20751d 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_environment.yml +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_environment.yml @@ -13,6 +13,7 @@ dependencies: - threadpoolctl - matplotlib - pandas + - rich - pyamg - pytest - pytest-xdist diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml b/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml index 0c2eec344c26b..7f75c461a1c58 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_environment.yml @@ -11,6 +11,7 @@ dependencies: - joblib - matplotlib - pandas + - rich - pyamg - pytest - pytest-xdist diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock index 62d975f5d717a..5f19bdb5d194b 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: 037fecf9454db91c21c8a57ee632e7221447f0bcfd9a5850dfcd6d727a30b086 +# input_hash: fb9e99d2ce3c41745716ad22a3f2d43174ccfcb197e3b6cdabf38782f78516dc @EXPLICIT https://repo.anaconda.com/pkgs/main/osx-64/blas-1.0-mkl.conda#cb2c87e85ac8e0ceae776d26d4214c8a https://repo.anaconda.com/pkgs/main/osx-64/bzip2-1.0.8-h6c40b1e_6.conda#96224786021d0765ce05818fa3c59bdb @@ -42,11 +42,13 @@ https://repo.anaconda.com/pkgs/main/noarch/iniconfig-1.1.1-pyhd3eb1b0_0.tar.bz2# https://repo.anaconda.com/pkgs/main/osx-64/joblib-1.4.2-py312hecd8cb5_0.conda#8ab03dfa447b4e0bfa0bd3d25930f3b6 https://repo.anaconda.com/pkgs/main/osx-64/kiwisolver-1.4.8-py312h6d0c2b6_0.conda#060d4498fcc967a640829cb7e55c95f2 https://repo.anaconda.com/pkgs/main/osx-64/lcms2-2.16-h4f63f0c_0.conda#2cd61d3449b21735ccca2e09ca2f93ef +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-py312h46256e1_2.conda#04297cb766cabf38613ed6eb4eec85c3 https://repo.anaconda.com/pkgs/main/osx-64/ninja-1.12.1-hecd8cb5_0.conda#ee3b660616ef0fbcbd0096a67c11c94b https://repo.anaconda.com/pkgs/main/osx-64/openjpeg-2.5.2-hbf2204d_0.conda#8463f11309271a93d615450382761470 https://repo.anaconda.com/pkgs/main/osx-64/packaging-24.2-py312hecd8cb5_0.conda#76512e47c9c37443444ef0624769f620 https://repo.anaconda.com/pkgs/main/osx-64/pluggy-1.5.0-py312hecd8cb5_0.conda#ca381e438f1dbd7986ac0fa0da70c9d8 +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.2.0-py312hecd8cb5_0.conda#e4086daaaed13f68cc8d5b9da7db73cc https://repo.anaconda.com/pkgs/main/noarch/python-tzdata-2023.3-pyhd3eb1b0_0.conda#479c037de0186d114b9911158427624e https://repo.anaconda.com/pkgs/main/osx-64/pytz-2024.1-py312hecd8cb5_0.conda#2b28ec0e0d07f5c0c701f75200b1e8b6 @@ -57,6 +59,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/tornado-6.4.2-py312h46256e1_0.conda#6 https://repo.anaconda.com/pkgs/main/osx-64/unicodedata2-15.1.0-py312h46256e1_1.conda#4a7fd1dec7277c8ab71aa11aa08df86b https://repo.anaconda.com/pkgs/main/osx-64/wheel-0.45.1-py312hecd8cb5_0.conda#fafb8687668467d8624d2ddd0909bce9 https://repo.anaconda.com/pkgs/main/osx-64/fonttools-4.55.3-py312h46256e1_0.conda#f7680dd6b8b1c2f8aab17cf6630c6deb +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-11.1.0-py312h47bf62f_0.conda#56484cc67963212898552539482aa6b5 https://repo.anaconda.com/pkgs/main/osx-64/pip-25.0-py312hecd8cb5_0.conda#ece07a868514de9803e7a3c8aec1909f @@ -64,6 +67,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/pytest-8.3.4-py312hecd8cb5_0.conda#b1 https://repo.anaconda.com/pkgs/main/osx-64/python-dateutil-2.9.0post0-py312hecd8cb5_2.conda#1047dde28f78127dd9f6121e882926dd https://repo.anaconda.com/pkgs/main/osx-64/pytest-cov-6.0.0-py312hecd8cb5_0.conda#db697e319a4d1145363246a51eef0352 https://repo.anaconda.com/pkgs/main/osx-64/pytest-xdist-3.6.1-py312hecd8cb5_0.conda#38df9520774ee82bf143218f1271f936 +https://repo.anaconda.com/pkgs/main/osx-64/rich-13.9.4-py312hecd8cb5_0.conda#7d3a241f666a44a69064883fa2f41655 https://repo.anaconda.com/pkgs/main/osx-64/bottleneck-1.4.2-py312ha2b695f_0.conda#7efb63b6a5b33829a3b2c7a3efcf53ce https://repo.anaconda.com/pkgs/main/osx-64/contourpy-1.3.1-py312h1962661_0.conda#41499d3a415721b0514f0cccb8288cb1 https://repo.anaconda.com/pkgs/main/osx-64/matplotlib-3.10.0-py312hecd8cb5_0.conda#2977e81a7775be7963daf49df981b6e0 diff --git a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock index f869ef9e2349a..81f6c43e03ad5 100644 --- a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock +++ b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock @@ -10,8 +10,8 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml b/build_tools/azure/pylatest_pip_openblas_pandas_environment.yml index 6c3da4bb863b4..cbfc45732d0ce 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 58b87952fda46..39e41914e5a9a 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: 830b1d953ebfc9e46b73f639e733ee09b5171952cf987981d569b1d5abd16292 +# input_hash: 8c3f6442e33d12548162b57412fc2525c6a50cc367f54b6bd321fb67d26c60d7 @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-2025.2.25-h06a4308_0.conda#495015d24da8ad929e3ae2d18571016d @@ -44,6 +44,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip joblib @ https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl#sha256=06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 # pip kiwisolver @ https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246 # pip markupsafe @ https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 +# pip mdurl @ https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl#sha256=84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 # pip meson @ https://files.pythonhosted.org/packages/ab/3b/63fdad828b4cbeb49cef3aad26f3edfbc72f37a0ab54917d445ec0b9d9ff/meson-1.7.0-py3-none-any.whl#sha256=ae3f12953045f3c7c60e27f2af1ad862f14dee125b4ed9bcb8a842a5080dbf85 # pip networkx @ https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl#sha256=df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 @@ -72,6 +73,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip imageio @ https://files.pythonhosted.org/packages/cb/bd/b394387b598ed84d8d0fa90611a90bee0adc2021820ad5729f7ced74a8e2/imageio-2.37.0-py3-none-any.whl#sha256=11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed # pip jinja2 @ https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl#sha256=85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 # pip lazy-loader @ https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl#sha256=342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc +# pip markdown-it-py @ https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl#sha256=355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 # pip pyproject-metadata @ https://files.pythonhosted.org/packages/7e/b1/8e63033b259e0a4e40dd1ec4a9fee17718016845048b43a36ec67d62e6fe/pyproject_metadata-0.9.1-py3-none-any.whl#sha256=ee5efde548c3ed9b75a354fc319d5afd25e9585fa918a34f62f904cc731973ad # pip pytest @ https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl#sha256=c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820 # pip python-dateutil @ https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl#sha256=a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 @@ -82,9 +84,10 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip matplotlib @ https://files.pythonhosted.org/packages/51/d0/2bc4368abf766203e548dc7ab57cf7e9c621f1a3c72b516cc7715347b179/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6 # pip meson-python @ https://files.pythonhosted.org/packages/7d/ec/40c0ddd29ef4daa6689a2b9c5ced47d5b58fa54ae149b19e9a97f4979c8c/meson_python-0.17.1-py3-none-any.whl#sha256=30a75c52578ef14aff8392677b09c39346e0a24d2b2c6204b8ed30583c11269c # pip pandas @ https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24 -# pip pyamg @ https://files.pythonhosted.org/packages/cd/a7/0df731cbfb09e73979a1a032fc7bc5be0eba617d798b998a0f887afe8ade/pyamg-5.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=6999b351ab969c79faacb81faa74c0fa9682feeff3954979212872a3ee40c298 -# pip pytest-cov @ https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl#sha256=eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35 +# pip pyamg @ https://files.pythonhosted.org/packages/72/10/aee094f1ab76d07d7c5c3ff7e4c411d720f0d4461e0fdea74a4393058863/pyamg-5.2.1.tar.gz#sha256=f449d934224e503401ee72cd2eece1a29d893b7abe35f62a44d52ba831198efa +# pip pytest-cov @ https://files.pythonhosted.org/packages/e1/c5/8d6ffe9fc8f7f57b3662156ae8a34f2b8e7a754c73b48e689ce43145e98c/pytest_cov-6.1.0-py3-none-any.whl#sha256=cd7e1d54981d5185ef2b8d64b50172ce97e6f357e6df5cb103e828c7f993e201 # pip pytest-xdist @ https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl#sha256=9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 +# pip rich @ https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl#sha256=1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0 # pip scikit-image @ https://files.pythonhosted.org/packages/cd/9b/c3da56a145f52cd61a68b8465d6a29d9503bc45bc993bb45e84371c97d94/scikit_image-0.25.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b8abd3c805ce6944b941cfed0406d88faeb19bab3ed3d4b50187af55cf24d147 # pip scipy-doctest @ https://files.pythonhosted.org/packages/ca/e9/0330ebc475a142c6cb0c21a401037ab839b7c5d9bc88f9f04cf8ba07f196/scipy_doctest-1.6-py3-none-any.whl#sha256=665af41687eff8f61a506408cc0dbddbe2f822179b2c59579596aba50566dc3b # pip sphinx @ https://files.pythonhosted.org/packages/2f/72/9a437a9dc5393c0eabba447bdb6233a7b02bb23e84975f17ad9a9ca86677/sphinx-8.3.0-py3-none-any.whl#sha256=bd8fcf35ab2c4240b01c74a411c948350a3aebd6aa175579363754ed380d350a 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 7a7697fc64aee..d2c44e34e6cf7 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 @@ -64,7 +64,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip requests @ https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl#sha256=70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # pip meson-python @ https://files.pythonhosted.org/packages/7d/ec/40c0ddd29ef4daa6689a2b9c5ced47d5b58fa54ae149b19e9a97f4979c8c/meson_python-0.17.1-py3-none-any.whl#sha256=30a75c52578ef14aff8392677b09c39346e0a24d2b2c6204b8ed30583c11269c # pip pooch @ https://files.pythonhosted.org/packages/a8/87/77cc11c7a9ea9fd05503def69e3d18605852cd0d4b0d3b8f15bbeb3ef1d1/pooch-1.8.2-py3-none-any.whl#sha256=3529a57096f7198778a5ceefd5ac3ef0e4d06a6ddaf9fc2d609b806f25302c47 -# pip pytest-cov @ https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl#sha256=eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35 +# pip pytest-cov @ https://files.pythonhosted.org/packages/e1/c5/8d6ffe9fc8f7f57b3662156ae8a34f2b8e7a754c73b48e689ce43145e98c/pytest_cov-6.1.0-py3-none-any.whl#sha256=cd7e1d54981d5185ef2b8d64b50172ce97e6f357e6df5cb103e828c7f993e201 # pip pytest-xdist @ https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl#sha256=9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 # pip sphinx @ https://files.pythonhosted.org/packages/2f/72/9a437a9dc5393c0eabba447bdb6233a7b02bb23e84975f17ad9a9ca86677/sphinx-8.3.0-py3-none-any.whl#sha256=bd8fcf35ab2c4240b01c74a411c948350a3aebd6aa175579363754ed380d350a # pip numpydoc @ https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl#sha256=72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 diff --git a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock index 1ed2de82c9b52..81324eaa47b5d 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 @@ -9,7 +9,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda#2d89243bfb53652c182a7c73182cce4f https://conda.anaconda.org/conda-forge/win-64/mkl-include-2024.2.2-h66d3029_15.conda#e2f516189b44b6e042199d13e7015361 -https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-5_cp310.conda#3c510f4c4383f5fbdb12fdd971b30d49 +https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-6_cp310.conda#041cd0bfc8be015fbd78b5b2fe9b168e https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda#6797b005cd0f439c4c5c9ac565783700 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 @@ -27,8 +27,8 @@ https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda#8579b6bb https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2#1900cb3cab5055833cfddb0ba233b074 https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda#f7dc9a8f21d74eab46456df301da2972 https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.23-h9062f6e_0.conda#a9624935147a25b06013099d3038e467 -https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda#eb383771c680aa792feb529eaf9df82f -https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_0.conda#31d5107f75b2f204937728417e2e39e5 +https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.0-he0c23c2_0.conda#b6f5352fdb525662f4169a0431d2dd7a +https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda#85d8fa5e55ed8f93f874b3b23ed54ec6 https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-h135ad9c_1.conda#21fc5dba2cbcd8e5e26ff976a312122c https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda#3f1b948619c45b1ca714d60c7389092c https://conda.anaconda.org/conda-forge/win-64/liblzma-5.6.4-h2466b09_0.conda#c48f6ad0ef0a555b27b233dfcab46a90 diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_environment.yml b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_environment.yml index a179c55fed993..b918cb9d03df4 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_environment.yml +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_environment.yml @@ -13,6 +13,7 @@ dependencies: - threadpoolctl=3.1.0 # min - matplotlib=3.5.0 # min - pandas=1.4.0 # min + - rich - pyamg=4.2.1 # min - pytest - pytest-xdist diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock index d0fcc47ce5dcd..ec9c39790b4af 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock @@ -1,13 +1,13 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: fbba4fe2a9e1ebfa6e5d79269f12618306ade6ba86f95bb43c9719cd8dbe0e38 +# input_hash: fb65d6c24e9e8678160f93abba8ae1be09ad6073bb67679f1914fd903e3704cf @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 @@ -113,10 +113,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413 https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda#04bcf3055e51f8dde6fab9672fb9fca0 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h8d12d68_0.conda#109427e5576d0ce9c42257c2421b1680 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda#fd5062942bfa1b0bd5e0d2a4397b099e +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 @@ -147,6 +149,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928 https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.7-ha7bfdaf_1.conda#6d2362046dce932eefbdeb0540de0c38 https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.1-ha7bfdaf_0.conda#2e234fb7d6eeb5c32eb5b256403b5795 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda#fee3164ac23dfca50cfcc8b85ddefb81 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.25-pthreads_h7a3da1a_0.conda#87661673941b5e702275fdf0fc095ad0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 @@ -164,13 +167,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openbl https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.7-default_hb5137d0_2.conda#62d6f9353753a12a281ae99e0a3403c4 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.1-default_h9c6a7e4_0.conda#f8b1b8c13c0a0fede5e1a204eafb48f8 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_0.conda#d67f3f3c33344ff3e9ef5270001e9011 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py310hc6cd4ac_5.conda#ef5333594a958b25912002886b82b253 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/rich-14.0.0-pyh29332c3_0.conda#202f08242192ce3ed8bdb439ba40c0fe https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.7-hf3bb09a_0.conda#c78bc4ef0afb3cd2365d9973c71fc876 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-20_linux64_openblas.conda#05c5862c7dc25e65ba6c471d96429dae https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2#607c66f0cce2986515a8fe9e136b2b57 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 267c149fd1c35..49d20249d3bdf 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 @@ -12,6 +12,7 @@ dependencies: - joblib - threadpoolctl - 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 88f8501dee71d..c9189bb935832 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,17 +1,17 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: ec41f4a9538671e542d266b999ea055a685df8323c3c879f7d01fb2c259197cb +# input_hash: adfe0af03f902fa3a7a1b99e8906c90182281270349d024731770abbd5d2b1ab @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-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb @@ -60,6 +60,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openbl https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 @@ -75,6 +76,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda#959484a66b4b76befcddc4fa97c95567 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 @@ -85,6 +87,7 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda#fee3164ac23dfca50cfcc8b85ddefb81 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 @@ -96,6 +99,7 @@ https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.c https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py310hefbff90_0.conda#b3a99849aa14b78d32250c0709e8792a https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/rich-14.0.0-pyh29332c3_0.conda#202f08242192ce3ed8bdb439ba40c0fe https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_1.conda#e67778e1cac3bca3b3300f6164f7ffb9 diff --git a/build_tools/circle/doc_environment.yml b/build_tools/circle/doc_environment.yml index bc36e178de058..014f298ac9f2c 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 a70274d4931aa..7938f8aaf2a10 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: 208134f3b8c140a6fe6fffe85293a731d77b7bf6cdcf0b12f7a44fdcf6e665d2 +# input_hash: f00dac72dca7159046049c5381900142900b2670a039cc354f8821266b060f6c @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-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 @@ -9,7 +9,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 @@ -29,8 +29,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#e https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda#ae1370588aa6a5157c34c73e9bbb36a0 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 @@ -48,7 +48,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda#1d6afef758879ef5ee78127eb4cd2c4a +https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -138,8 +138,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hdb8da77_0.conda#3 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h8d12d68_0.conda#109427e5576d0ce9c42257c2421b1680 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/narwhals-1.32.0-pyhd8ed1ab_0.conda#fd49dbbf238fc97ff41a42df6afc94b8 +https://conda.anaconda.org/conda-forge/noarch/narwhals-1.33.0-pyhd8ed1ab_0.conda#54a495cf873b193aa17fb9517d0487c1 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa @@ -194,6 +195,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_open https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.1-ha7bfdaf_0.conda#2e234fb7d6eeb5c32eb5b256403b5795 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda#fee3164ac23dfca50cfcc8b85ddefb81 https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 @@ -220,11 +222,12 @@ https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.1-default_hb5137d0_0.conda#331dee424fabc0c26331767acc93a074 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.1-default_h9c6a7e4_0.conda#f8b1b8c13c0a0fede5e1a204eafb48f8 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_0.conda#d67f3f3c33344ff3e9ef5270001e9011 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py310hefbff90_0.conda#b3a99849aa14b78d32250c0709e8792a https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/rich-14.0.0-pyh29332c3_0.conda#202f08242192ce3ed8bdb439ba40c0fe https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 @@ -247,7 +250,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py310ha2bacc8_1.cond https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.8.3-py310hfd10a26_0.conda#dd3dd65ec785c86ed90e8cb4890361f2 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py310hf462985_0.conda#636d3c500d8a851e377360e88ec95372 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.13-pyhd8ed1ab_0.conda#4660bf736145d44fe220f0f95c9d9a2a +https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.30-pyhd8ed1ab_0.conda#14f46147fae19bb867f82a787c7059e9 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py310hff52083_0.conda#45c1ad6a0351492b56d1b2bb5442cdfa https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda#b3e783e8e8ed7577cf0b6dee37d1fbac https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.2-py310h5eaa309_0.conda#4cc3a231679ecb3c0ba20ebf3c27d12e @@ -276,7 +279,6 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip jsonpointer @ https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl#sha256=13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942 # pip jupyterlab-pygments @ https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl#sha256=841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780 # pip libsass @ https://files.pythonhosted.org/packages/fd/5a/eb5b62641df0459a3291fc206cf5bd669c0feed7814dded8edef4ade8512/libsass-0.23.0-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl#sha256=4a218406d605f325d234e4678bd57126a66a88841cb95bee2caeafdc6f138306 -# pip mdurl @ https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl#sha256=84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 # pip overrides @ https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl#sha256=c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 # pip pandocfilters @ https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl#sha256=93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc # pip pkginfo @ https://files.pythonhosted.org/packages/fa/3d/f4f2ba829efb54b6cd2d91349c7463316a9cc55a43fc980447416c88540f/pkginfo-1.12.1.2-py3-none-any.whl#sha256=c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343 @@ -299,7 +301,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip arrow @ https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl#sha256=c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 # pip doit @ https://files.pythonhosted.org/packages/44/83/a2960d2c975836daa629a73995134fd86520c101412578c57da3d2aa71ee/doit-0.36.0-py3-none-any.whl#sha256=ebc285f6666871b5300091c26eafdff3de968a6bd60ea35dd1e3fc6f2e32479a # pip jupyter-core @ https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl#sha256=4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 -# pip markdown-it-py @ https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl#sha256=355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 +# pip mdit-py-plugins @ https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl#sha256=0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 # pip mistune @ https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl#sha256=1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9 # pip pyzmq @ https://files.pythonhosted.org/packages/97/d4/4dd152dbbaac35d4e1fe8e8fd26d73640fcd84ec9c3915b545692df1ffb7/pyzmq-26.3.0-cp310-cp310-manylinux_2_28_x86_64.whl#sha256=49334faa749d55b77f084389a80654bf2e68ab5191c0235066f0140c1b670d64 # pip referencing @ https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl#sha256=e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0 @@ -314,7 +316,6 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip jupyter-client @ https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl#sha256=e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f # pip jupyter-server-terminals @ https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl#sha256=41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa # pip jupyterlite-core @ https://files.pythonhosted.org/packages/46/15/1d9160819d1e6e018d15de0e98b9297d0a09cfcfdc73add6e24ee3b2b83c/jupyterlite_core-0.5.1-py3-none-any.whl#sha256=76381619a632f06bf67fb47e5464af762ad8836df5ffe3d7e7ee0e316c1407ee -# pip mdit-py-plugins @ https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl#sha256=0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 # pip jsonschema @ https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl#sha256=fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 # pip jupyterlite-pyodide-kernel @ https://files.pythonhosted.org/packages/1b/b5/959a03ca011d1031abac03c18af9e767c18d6a9beb443eb106dda609748c/jupyterlite_pyodide_kernel-0.5.2-py3-none-any.whl#sha256=63ba6ce28d32f2cd19f636c40c153e171369a24189e11e2235457bd7000c5907 # pip jupyter-events @ https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl#sha256=6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb diff --git a/build_tools/circle/doc_min_dependencies_environment.yml b/build_tools/circle/doc_min_dependencies_environment.yml index 1a93231019fbb..1a441dc212006 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.5.0 # min - pandas=1.4.0 # min + - rich - pyamg=4.2.1 # min - 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 ab0a88ee474a3..14c25ced5b296 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: 1ff580fa5b39efc9a616b69d09ea9208049b15bb1bd5e42883b7295d717cc6ba +# input_hash: 2acbf3122c3f7857916af02d83eff485b6abcec74228113eb87458fee6774f6b @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 @@ -8,7 +8,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 @@ -29,8 +29,8 @@ https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda#2f659535feef3cfb782f7053c8775a32 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda#a09ce5decdef385bcce78c32809fa794 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9 https://conda.anaconda.org/conda-forge/linux-64/blis-0.9.0-h4ab18f5_2.conda#6f77ba1352b69c4a6f8a6d20def30e4e https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda#1d6afef758879ef5ee78127eb4cd2c4a +https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -137,7 +137,7 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.1-pyhd8ed1ab_0.conda#2ded25bc46cbae83d08807c89cb84747 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_2.conda#d92e51bf4b6bdbfe45e5884fb0755afe https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_8.conda#0c56ca4bfe2b04e71fe67652d5aa3079 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda#0754038c806eae440582da1c3af85577 @@ -160,6 +160,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h8d12d68_0.conda#109427e5576d0ce9c42257c2421b1680 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-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 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-pyhd8ed1ab_0.conda#cec8cc498664cc00a070676aa89e69a7 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa @@ -218,6 +219,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46 https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.7-ha7bfdaf_1.conda#6d2362046dce932eefbdeb0540de0c38 https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.1-ha7bfdaf_0.conda#2e234fb7d6eeb5c32eb5b256403b5795 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda#fee3164ac23dfca50cfcc8b85ddefb81 https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 @@ -241,12 +243,13 @@ https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.4.0-h76408a6_0.conda https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.7-default_hb5137d0_2.conda#62d6f9353753a12a281ae99e0a3403c4 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.1-default_h9c6a7e4_0.conda#f8b1b8c13c0a0fede5e1a204eafb48f8 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_0.conda#d67f3f3c33344ff3e9ef5270001e9011 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py310hc6cd4ac_5.conda#ef5333594a958b25912002886b82b253 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/rich-14.0.0-pyh29332c3_0.conda#202f08242192ce3ed8bdb439ba40c0fe https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 https://conda.anaconda.org/conda-forge/linux-64/compilers-1.9.0-ha770c72_0.conda#5859096e397aba423340d0bbbb11ec64 @@ -277,7 +280,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py310hff52083_0 https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.1-py310h7c3ba0c_0.tar.bz2#89f5a48e1f23b5cf3163a6094903d181 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py310h261611a_0.conda#4b8508bab02b2aa2cef12eab4883f4a1 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.13-pyhd8ed1ab_0.conda#4660bf736145d44fe220f0f95c9d9a2a +https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.30-pyhd8ed1ab_0.conda#14f46147fae19bb867f82a787c7059e9 https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.19.0-py310hb5077e9_0.tar.bz2#aa24b3a4aa979641ac3144405209cd89 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.2-pyhd8ed1ab_0.tar.bz2#025ad7ca2c7f65007ab6b6f5d93a56eb diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock index 9f4bf41811b54..4d4d5de47580c 100644 --- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock +++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: e141e0789f4a2b4be527fb91bb83f873bd14718407fa58b8790d2198f61bc6f5 +# input_hash: fca8e7ac83189ba92ed102801f5d603b391f4ac4d1e84dd7a9da61e7cb5e418a @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda#670f0e1593b8c1d84f57ad5fe5256799 @@ -9,7 +9,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-5_cp313.conda#381bbd2a92c863f640a55b6ff3c35161 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-6_cp313.conda#ef1d8e55d61220011cceed0b94a920d2 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 @@ -26,8 +26,8 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.1-h4e1184b_4. https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda#74e8c3e4df4ceae34aa2959df4b28101 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda#1d6afef758879ef5ee78127eb4cd2c4a +https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda#488f260ccda0afaf08acb286db439c2f @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a https://conda.anaconda.org/conda-forge/linux-64/fastrlock-0.8.3-py313h9800cb9_1.conda#54dd71b3be2ed6ccc50f180347c901db https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.1-pyhd8ed1ab_0.conda#2ded25bc46cbae83d08807c89cb84747 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py313h33d0bda_0.conda#9862d13a5e466273d5a4738cffcb8d6c https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 @@ -135,6 +135,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar. https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h8d12d68_0.conda#109427e5576d0ce9c42257c2421b1680 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda#21b62c55924f01b6eef6827167b46acb +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda#3585aa87c43ab15b167b574cd73b057b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -144,6 +145,7 @@ https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h97ab989_1.conda#2f46e https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba21d75dc722c29827988a575a65707 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad @@ -179,6 +181,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_open https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.1-ha7bfdaf_0.conda#2e234fb7d6eeb5c32eb5b256403b5795 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda#fee3164ac23dfca50cfcc8b85ddefb81 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 @@ -203,12 +206,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.1-default_h9c6a7 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.32.0-h804f50b_0.conda#3d96df4d6b1c88455e05b94ce8a14a53 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.8.0-h9ddd185_2.conda#8de40c4f75d36bb00a5870f682457f1d -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_0.conda#d67f3f3c33344ff3e9ef5270001e9011 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py313h17eae1a_0.conda#6c905a8f170edd64f3a390c76572e331 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py313h8db990d_0.conda#1e86810c6c3fb6d6aebdba26564eb2e8 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/rich-14.0.0-pyh29332c3_0.conda#202f08242192ce3ed8bdb439ba40c0fe https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_environment.yml b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_environment.yml index bbfb91d24fd1a..b3a699dc2f5eb 100644 --- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_environment.yml +++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_environment.yml @@ -15,6 +15,7 @@ dependencies: - threadpoolctl - matplotlib - pandas + - rich - pyamg - pytest - pytest-xdist diff --git a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock index 04f131445126d..b692019d41103 100644 --- a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock +++ b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock @@ -10,7 +10,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.co https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda#80c9ad5e05e91bb6c0967af3880c9742 https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda#9e115653741810778c9a915a2f8439e7 https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda#b11c09d9463daf4cae492d29806b1889 -https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.10-5_cp310.conda#c6694ec383fb171da3ab68cae8d0e8f1 +https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.10-6_cp310.conda#19ea13732057398dc3d5d33bce751646 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 @@ -21,8 +21,8 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.co https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.13-h86ecc28_0.conda#f643bb02c4bbcfe7de161a8ca5df530b https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda#3ee026955c688f551a9999840cff4c67 https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda#7e7ca2607b11b180120cefc2354fc0cb -https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda#f1b3fab36861b3ce945a13f0dfdfc688 -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda#966084fccf3ad62a3160666cda869f28 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.0-h5ad3122_0.conda#d41a057e7968705dae8dcb7c8ba2c8dd +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda#692c2bb75f32cfafb6799cf6d1c5d0e0 https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda#cd754566661513808ef2408c4ab99a2f https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda#81541d85a45fbf4d0a29346176f1f21c @@ -38,7 +38,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda#25a5a7b797fe6e084e04ffe2db02fc62 https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/double-conversion-3.3.1-h5ad3122_0.conda#399959d889e1a73fc99f12ce480e77e1 -https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.4-h5ad3122_0.conda#e8f1d587055376ea2419cc78696abd0b +https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.0-h5ad3122_0.conda#c22e14e241ade3d3a74c0409c3d582a2 https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda#e64d0f3b59c7c4047446b97a8624a72d https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda#0e9bd365480c72b25c71a448257b537d @@ -144,7 +144,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.0.0-hb5e3f52_0. https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.1-default_he324ac1_0.conda#e77c186cbd69b54d2be6e189a7c53981 https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.1-default_h4390ef5_0.conda#faa5920ac55e48c39732b018ba13d11c https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-31_hc659ca5_openblas.conda#256bb281d78e5b8927ff13a1cde9f6f5 -https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-17.4-hf590da8_0.conda#d5350c35cc7512a5035d24d8e23a0dc7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-17.4-hf590da8_1.conda#10fdc78be541c9017e2144f86d092aa2 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.2.4-py310h6e5608f_0.conda#3a7b45aaa7704194b823d2d34b75aad1 https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py310h34c99de_0.conda#c4fa80647a708505d65573c2353bc216 diff --git a/build_tools/update_environments_and_lock_files.py b/build_tools/update_environments_and_lock_files.py index 0edf62b5a0d7b..eeb3e0ef3262c 100644 --- a/build_tools/update_environments_and_lock_files.py +++ b/build_tools/update_environments_and_lock_files.py @@ -67,6 +67,7 @@ "threadpoolctl", "matplotlib", "pandas", + "rich", "pyamg", "pytest", "pytest-xdist", @@ -249,6 +250,7 @@ def remove_from(alist, to_remove): "numpy", "scipy", "pandas", + "rich", "cython", "joblib", "pillow", @@ -293,7 +295,9 @@ def remove_from(alist, to_remove): "folder": "build_tools/azure", "platform": "win-64", "channels": ["conda-forge"], - "conda_dependencies": remove_from(common_dependencies, ["pandas", "pyamg"]) + "conda_dependencies": remove_from( + common_dependencies, ["pandas", "rich", "pyamg"] + ) + [ "wheel", "pip", @@ -402,7 +406,7 @@ def remove_from(alist, to_remove): "platform": "linux-aarch64", "channels": ["conda-forge"], "conda_dependencies": remove_from( - common_dependencies_without_coverage, ["pandas", "pyamg"] + common_dependencies_without_coverage, ["pandas", "rich", "pyamg"] ) + ["pip", "ccache"], "package_constraints": { diff --git a/doc/api_reference.py b/doc/api_reference.py index 5f482ff7e756d..a8e0073670cb7 100644 --- a/doc/api_reference.py +++ b/doc/api_reference.py @@ -142,6 +142,23 @@ def _get_submodule(module_name, submodule_name): }, ], }, + "sklearn.callback": { + "short_summary": "Callbacks.", + "description": None, + "sections": [ + { + "title": None, + "autosummary": [ + "AutoPropagatedProtocol", + "CallbackContext", + "CallbackProtocol", + "CallbackSupportMixin", + "ProgressBar", + "TaskNode", + ], + }, + ], + }, "sklearn.cluster": { "short_summary": "Clustering.", "description": _get_guide("clustering", "biclustering"), diff --git a/pyproject.toml b/pyproject.toml index 6aa9c81bfaca9..73f487c5904bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,6 +50,7 @@ docs = [ "matplotlib>=3.5.0", "scikit-image>=0.19.0", "pandas>=1.4.0", + "rich>=13.6.0", "seaborn>=0.9.0", "memory_profiler>=0.57.0", "sphinx>=7.3.7", @@ -73,6 +74,7 @@ examples = [ "matplotlib>=3.5.0", "scikit-image>=0.19.0", "pandas>=1.4.0", + "rich>=13.6.0", "seaborn>=0.9.0", "pooch>=1.6.0", "plotly>=5.14.0", @@ -81,6 +83,7 @@ tests = [ "matplotlib>=3.5.0", "scikit-image>=0.19.0", "pandas>=1.4.0", + "rich>=13.6.0", "pytest>=7.1.2", "pytest-cov>=2.9.0", "ruff>=0.11.0", diff --git a/sklearn/__init__.py b/sklearn/__init__.py index 8ea5aacf84cf3..bca21dd0f012b 100644 --- a/sklearn/__init__.py +++ b/sklearn/__init__.py @@ -75,6 +75,7 @@ _submodules = [ "calibration", + "callback", "cluster", "covariance", "cross_decomposition", diff --git a/sklearn/_min_dependencies.py b/sklearn/_min_dependencies.py index 03fd53d047249..8b7ffc67f2b52 100644 --- a/sklearn/_min_dependencies.py +++ b/sklearn/_min_dependencies.py @@ -28,6 +28,7 @@ "matplotlib": ("3.5.0", "benchmark, docs, examples, tests"), "scikit-image": ("0.19.0", "docs, examples, tests"), "pandas": ("1.4.0", "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 bff0bf18bed37..02ea49e04015c 100644 --- a/sklearn/base.py +++ b/sklearn/base.py @@ -134,6 +134,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] @@ -1386,7 +1390,11 @@ def wrapper(estimator, *args, **kwargs): prefer_skip_nested_validation or global_skip_validation ) ): - return fit_method(estimator, *args, **kwargs) + try: + return fit_method(estimator, *args, **kwargs) + finally: + if hasattr(estimator, "_callback_fit_ctx"): + estimator._callback_fit_ctx.eval_on_fit_end(estimator=estimator) return wrapper diff --git a/sklearn/callback/__init__.py b/sklearn/callback/__init__.py new file mode 100644 index 0000000000000..e18fb01d11b44 --- /dev/null +++ b/sklearn/callback/__init__.py @@ -0,0 +1,22 @@ +""" +The :mod:`sklearn.callback` module implements the framework and off the shelf +callbacks for scikit-learn estimators. +""" + +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +from ._base import AutoPropagatedProtocol, CallbackProtocol +from ._callback_context import CallbackContext +from ._mixin import CallbackSupportMixin +from ._progressbar import ProgressBar +from ._task_tree import TaskNode + +__all__ = [ + "AutoPropagatedProtocol", + "CallbackContext", + "CallbackProtocol", + "CallbackSupportMixin", + "ProgressBar", + "TaskNode", +] diff --git a/sklearn/callback/_base.py b/sklearn/callback/_base.py new file mode 100644 index 0000000000000..c606920d375f2 --- /dev/null +++ b/sklearn/callback/_base.py @@ -0,0 +1,97 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +from typing import Protocol, runtime_checkable + + +@runtime_checkable +class CallbackProtocol(Protocol): + """Protocol for the callbacks""" + + def _on_fit_begin(self, estimator, *, data): + """Method called at the beginning of the fit method of the estimator. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. + + data : dict + Dictionary containing the training and validation data. The possible + keys are "X_train", "y_train", "sample_weight_train", "X_val", "y_val" + and "sample_weight_val". + """ + + def _on_fit_iter_end(self, estimator, task_node, **kwargs): + """Method called at the end of each task of the estimator. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. It might differ from the estimator + passed to the `on_fit_begin` method for auto-propagated callbacks. + + task_node : TaskNode instance + The caller task node. + + **kwargs : dict + arguments passed to the callback. Possible keys are + + - data: dict + Dictionary containing the training and validation data. The keys are + "X_train", "y_train", "sample_weight_train", "X_val", "y_val", + "sample_weight_val". The values are the corresponding data. If a key is + missing, the corresponding value is None. + + - stopping_criterion: float + Usually iterations stop when `stopping_criterion <= tol`. + This is only provided at the innermost level of iterations. + + - tol: float + Tolerance for the stopping criterion. + This is only provided at the innermost level of iterations. + + - from_reconstruction_attributes: estimator instance + A ready to predict, transform, etc ... estimator as if the fit stopped + at this node. Usually it's a copy of the caller estimator with the + necessary attributes set but it can sometimes be an instance of another + class (e.g. LogisticRegressionCV -> LogisticRegression) + + - fit_state: dict + Model specific quantities updated during fit. This is not meant to be + used by generic callbacks but by a callback designed for a specific + estimator instead. + + Returns + ------- + stop : bool + Whether or not to stop the current level of iterations at this task node. + """ + + def _on_fit_end(self, estimator, task_node): + """Method called at the end of the fit method of the estimator. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. + + task_node : TaskNode instance + The task node corresponding to the whole `fit` task. This is usually the + root of the task tree of the estimator but it can be an intermediate node + if the estimator is a sub-estimator of a meta-estimator. + """ + + +@runtime_checkable +class AutoPropagatedProtocol(Protocol): + """Protocol for the auto-propagated callbacks""" + + @property + def max_estimator_depth(self): + """The maximum number of nested estimators at which the callback should be + propagated. + + If set to None, the callback is propagated to sub-estimators at all nesting + levels. + """ diff --git a/sklearn/callback/_callback_context.py b/sklearn/callback/_callback_context.py new file mode 100644 index 0000000000000..a661036fc33f1 --- /dev/null +++ b/sklearn/callback/_callback_context.py @@ -0,0 +1,253 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +from . import AutoPropagatedProtocol +from ._task_tree import TaskNode + + +class CallbackContext: + """Task level context for the callbacks. + + This class is responsible for managing the callbacks and task tree of an estimator. + + Instances of this class should be created using the `init_callback_context` method + of the estimator. + """ + + @classmethod + def _from_estimator(cls, estimator, *, task_name, task_id, max_tasks=1): + """Private constructor to create a root context. + + Parameters + ---------- + estimator : estimator instance + The estimator this context is responsible for. + + task_name : str + The name of the task this context is responsible for. + + task_id : int + The id of the task this context is responsible for. + + max_tasks : int, default=1 + The maximum number of tasks that can be siblings of the task this context is + responsible for. + """ + new_ctx = cls.__new__(cls) + + # We don't store the estimator in the context to avoid circular references + # because the estimator already holds a reference to the context. + new_ctx._callbacks = getattr(estimator, "_skl_callbacks", []) + new_ctx._estimator_name = estimator.__class__.__name__ + + new_ctx._task_node = TaskNode( + task_name=task_name, + task_id=task_id, + max_tasks=max_tasks, + estimator_name=new_ctx._estimator_name, + ) + + if hasattr(estimator, "_parent_callback_ctx"): + # This task is the root task of the estimator which itself corresponds to + # a leaf task of a meta-estimator. Both tasks actually represent the same + # task so we merge both task nodes into a single task node, attaching the + # task tree of the sub-estimator to the task tree of the meta-estimator on + # the way. + parent_ctx = estimator._parent_callback_ctx + new_ctx._task_node._merge_with(parent_ctx._task_node) + new_ctx._estimator_depth = parent_ctx._estimator_depth + 1 + else: + new_ctx._estimator_depth = 0 + + return new_ctx + + @classmethod + def _from_parent(cls, parent_context, *, task_name, task_id, max_tasks=1): + """Private constructor to create a sub-context. + + Parameters + ---------- + parent_context : CallbackContext instance + The parent context of the new context. + + task_name : str + The name of the task this context is responsible for. + + task_id : int + The id of the task this context is responsible for. + + max_tasks : int, default=1 + The maximum number of tasks that can be siblings of the task this context is + responsible for. + """ + new_ctx = cls.__new__(cls) + + new_ctx._callbacks = parent_context._callbacks + new_ctx._estimator_name = parent_context._estimator_name + new_ctx._estimator_depth = parent_context._estimator_depth + + new_ctx._task_node = TaskNode( + task_name=task_name, + task_id=task_id, + max_tasks=max_tasks, + estimator_name=new_ctx._estimator_name, + ) + + # This task is a subtask of another task of a same estimator + parent_context._task_node._add_child(new_ctx._task_node) + + return new_ctx + + def subcontext(self, task_name="", task_id=0, max_tasks=1): + """Create a context for a subtask of the current task. + + Parameters + ---------- + task_name : str, default="" + The name of the subtask. + + task_id : int, default=0 + An identifier of the subtask. Usually a number between 0 and + `max_tasks - 1`, but can be any identifier. + + max_tasks : int, default=1 + The maximum number of tasks that can be siblings of the subtask. + """ + return CallbackContext._from_parent( + parent_context=self, + task_name=task_name, + task_id=task_id, + max_tasks=max_tasks, + ) + + def eval_on_fit_begin(self, estimator, *, data): + """Evaluate the _on_fit_begin method of the callbacks. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. + + data : dict + Dictionary containing the training and validation data. The possible + keys are "X_train", "y_train", "sample_weight_train", "X_val", "y_val" + and "sample_weight_val". + """ + for callback in self._callbacks: + # Only call the on_fit_begin method of callbacks that are not + # propagated from a meta-estimator. + if not ( + isinstance(callback, AutoPropagatedProtocol) + and self._task_node.parent is not None + ): + callback._on_fit_begin(estimator, data=data) + + return self + + def eval_on_fit_iter_end(self, estimator, **kwargs): + """Evaluate the _on_fit_iter_end method of the callbacks. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. + + **kwargs : dict + arguments passed to the callback. Possible keys are + + - data: dict + Dictionary containing the training and validation data. The keys are + "X_train", "y_train", "sample_weight_train", "X_val", "y_val", + "sample_weight_val". The values are the corresponding data. If a key is + missing, the corresponding value is None. + + - stopping_criterion: float + Usually iterations stop when `stopping_criterion <= tol`. + This is only provided at the innermost level of iterations. + + - tol: float + Tolerance for the stopping criterion. + This is only provided at the innermost level of iterations. + + - from_reconstruction_attributes: estimator instance + A ready to predict, transform, etc ... estimator as if the fit stopped + at this node. Usually it's a copy of the caller estimator with the + necessary attributes set but it can sometimes be an instance of another + class (e.g. LogisticRegressionCV -> LogisticRegression) + + - fit_state: dict + Model specific quantities updated during fit. This is not meant to be + used by generic callbacks but by a callback designed for a specific + estimator instead. + + Returns + ------- + stop : bool + Whether or not to stop the current level of iterations at this task node. + """ + return any( + callback._on_fit_iter_end(estimator, self._task_node, **kwargs) + for callback in self._callbacks + ) + + def eval_on_fit_end(self, estimator): + """Evaluate the _on_fit_end method of the callbacks. + + Parameters + ---------- + estimator : estimator instance + The estimator calling this callback hook. + """ + for callback in self._callbacks: + # Only call the on_fit_end method of callbacks that are not + # propagated from a meta-estimator. + if not ( + isinstance(callback, AutoPropagatedProtocol) + and self._task_node.parent is not None + ): + callback._on_fit_end(estimator, task_node=self._task_node) + + def propagate_callbacks(self, sub_estimator): + """Propagate the callbacks to a sub-estimator. + + Parameters + ---------- + sub_estimator : estimator instance + The estimator to which the callbacks should be propagated. + """ + bad_callbacks = [ + callback.__class__.__name__ + for callback in getattr(sub_estimator, "_skl_callbacks", []) + if isinstance(callback, AutoPropagatedProtocol) + ] + + if bad_callbacks: + raise TypeError( + f"The sub-estimator ({sub_estimator.__class__.__name__}) of a" + f" meta-estimator ({self._task_node.estimator_name}) can't have" + f" auto-propagated callbacks ({bad_callbacks})." + " Register them directly on the meta-estimator." + ) + + callbacks_to_propagate = [ + callback + for callback in self._callbacks + if isinstance(callback, AutoPropagatedProtocol) + and ( + callback.max_estimator_depth is None + or self._estimator_depth < callback.max_estimator_depth + ) + ] + + if not callbacks_to_propagate: + return self + + # We store the parent context in the sub-estimator to be able to merge the + # task trees of the sub-estimator and the meta-estimator. + sub_estimator._parent_callback_ctx = self + + sub_estimator.set_callbacks( + getattr(sub_estimator, "_skl_callbacks", []) + callbacks_to_propagate + ) + + return self diff --git a/sklearn/callback/_mixin.py b/sklearn/callback/_mixin.py new file mode 100644 index 0000000000000..9e363b73f34b4 --- /dev/null +++ b/sklearn/callback/_mixin.py @@ -0,0 +1,54 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +from ._base import CallbackProtocol +from ._callback_context import CallbackContext + + +class CallbackSupportMixin: + """Mixin class to add callback support to an estimator.""" + + def set_callbacks(self, callbacks): + """Set callbacks for the estimator. + + Parameters + ---------- + callbacks : callback or list of callbacks + the callbacks to set. + + Returns + ------- + self : estimator instance + The estimator instance itself. + """ + if not isinstance(callbacks, list): + callbacks = [callbacks] + + if not all(isinstance(callback, CallbackProtocol) for callback in callbacks): + raise TypeError("callbacks must follow the CallbackProtocol protocol.") + + self._skl_callbacks = callbacks + + return self + + def init_callback_context(self, task_name="fit"): + """Initialize the callback context for the estimator. + + Parameters + ---------- + task_name : str, default='fit' + The name of the root task. + + Returns + ------- + callback_fit_ctx : CallbackContext + The callback context for the estimator. + """ + # We don't initialize the callback context during _set_callbacks but in fit + # because in the future we might want to have callbacks in predict/transform + # which would require their own context. + self._callback_fit_ctx = CallbackContext._from_estimator( + estimator=self, task_name=task_name, task_id=0, max_tasks=1 + ) + + return self._callback_fit_ctx diff --git a/sklearn/callback/_progressbar.py b/sklearn/callback/_progressbar.py new file mode 100644 index 0000000000000..41712fbe1702a --- /dev/null +++ b/sklearn/callback/_progressbar.py @@ -0,0 +1,212 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +from multiprocessing import Manager +from threading import Thread + +from ..utils._optional_dependencies import check_rich_support + + +class ProgressBar: + """Callback that displays progress bars for each iterative steps of an estimator. + + Parameters + ---------- + max_estimator_depth : int, default=1 + The maximum number of nested levels of estimators to display progress bars for. + By default, only the progress bars of the outermost estimator are displayed. + If set to None, all levels are displayed. + """ + + def __init__(self, max_estimator_depth=1): + check_rich_support("Progressbar") + + self.max_estimator_depth = max_estimator_depth + + def _on_fit_begin(self, estimator, *, data): + self._queue = Manager().Queue() + self.progress_monitor = _RichProgressMonitor(queue=self._queue) + self.progress_monitor.start() + + def _on_fit_iter_end(self, estimator, task_node, **kwargs): + self._queue.put(task_node) + + def _on_fit_end(self, estimator, task_node): + self._queue.put(task_node) + self._queue.put(None) + self.progress_monitor.join() + + def __getstate__(self): + state = self.__dict__.copy() + if "progress_monitor" in state: + del state["progress_monitor"] # a thread is not picklable + return state + + +try: + from rich.progress import BarColumn, Progress, TextColumn, TimeRemainingColumn + from rich.style import Style + + class _Progress(Progress): + # Custom Progress class to allow showing the tasks in a given order (given by + # setting the _ordered_tasks attribute). In particular it allows to dynamically + # create and insert tasks between existing tasks. + def get_renderables(self): + table = self.make_tasks_table(getattr(self, "_ordered_tasks", [])) + yield table + +except ImportError: + pass + + +class _RichProgressMonitor(Thread): + """Thread monitoring the progress of an estimator with rich based display. + + The display is a list of nested rich tasks using `rich.Progress`. There is one for + each non-leaf node in the task tree of the estimator. + + Parameters + ---------- + queue : `multiprocessing.Manager.Queue` instance + This thread will run until the queue is empty. + """ + + def __init__(self, *, queue): + Thread.__init__(self) + self.queue = queue + + def run(self): + self.progress_ctx = _Progress( + TextColumn("[progress.description]{task.description}"), + BarColumn( + complete_style=Style(color="dark_orange"), + finished_style=Style(color="cyan"), + ), + TextColumn("[bright_magenta]{task.percentage:>3.0f}%"), + TimeRemainingColumn(elapsed_when_finished=True), + auto_refresh=False, + ) + + # Holds the root of the tree of rich tasks (i.e. progress bars) that will be + # created dynamically as the computation tree of the estimator is traversed. + self.root_rich_task = None + + with self.progress_ctx: + while task_node := self.queue.get(): + self._update_task_tree(task_node) + self._update_tasks() + self.progress_ctx.refresh() + + def _update_task_tree(self, task_node): + """Update the tree of tasks from a new node.""" + curr_rich_task, parent_rich_task = None, None + + for curr_node in task_node.path: + if curr_node.parent is None: # root node + if self.root_rich_task is None: + self.root_rich_task = RichTaskNode( + curr_node, progress_ctx=self.progress_ctx + ) + curr_rich_task = self.root_rich_task + elif curr_node.task_id not in parent_rich_task.children: + curr_rich_task = RichTaskNode( + curr_node, progress_ctx=self.progress_ctx, parent=parent_rich_task + ) + parent_rich_task.children[curr_node.task_id] = curr_rich_task + else: # task already exists + curr_rich_task = parent_rich_task.children[curr_node.task_id] + parent_rich_task = curr_rich_task + + # Mark the deepest task as finished (this is the one corresponding to the + # computation node that we just get from the queue). + curr_rich_task.finished = True + + def _update_tasks(self): + """Loop through the tasks in their display order and update their progress.""" + self.progress_ctx._ordered_tasks = [] + + for rich_task_node in self.root_rich_task: + task = self.progress_ctx.tasks[rich_task_node.task_id] + + total = task.total + + if rich_task_node.finished: + # It's possible that a task finishes without reaching its total + # (e.g. early stopping). We mark it as 100% completed. + + if task.total is None: + # Indeterminate task is finished. Set total to an arbitrary + # value to render its completion as 100%. + completed = total = 1 + else: + completed = total + else: + completed = sum(t.finished for t in rich_task_node.children.values()) + + self.progress_ctx.update( + rich_task_node.task_id, completed=completed, total=total, refresh=False + ) + self.progress_ctx._ordered_tasks.append(task) + + +class RichTaskNode: + """A node in the tree of rich tasks. + + Parameters + ---------- + task_node : `TaskNode` instance + The task node of an estimator this task corresponds to. + + progress_ctx : `rich.Progress` instance + The progress context to which this task belongs. + + parent : `RichTaskNode` instance + The parent of this task. + + Attributes + ---------- + finished : bool + Whether the task is finished. + + task_id : int + The ID of the task in the Progress context. + + children : dict + A mapping from the index of a child to the child node `{idx: RichTaskNode}`. + For a leaf, it's an empty dictionary. + """ + + def __init__(self, task_node, progress_ctx, parent=None): + self.parent = parent + self.children = {} + self.finished = False + + if task_node.max_subtasks != 0: + description = self._format_task_description(task_node) + self.task_id = progress_ctx.add_task( + description, total=task_node.max_subtasks + ) + + def _format_task_description(self, task_node): + """Return a formatted description for the task.""" + colors = ["bright_magenta", "cyan", "dark_orange"] + + indent = f"{' ' * (task_node.depth)}" + style = f"[{colors[(task_node.depth)%len(colors)]}]" + + task_desc = f"{task_node.estimator_name} - {task_node.task_name}" + id_mark = f" #{task_node.task_id}" if task_node.parent is not None else "" + prev_task_desc = ( + f"{task_node.prev_estimator_name} - {task_node.prev_task_name} | " + if task_node.prev_estimator_name is not None + else "" + ) + + return f"{style}{indent}{prev_task_desc}{task_desc}{id_mark}" + + def __iter__(self): + """Pre-order depth-first traversal, excluding leaves.""" + if self.children: + yield self + for child in self.children.values(): + yield from child diff --git a/sklearn/callback/_task_tree.py b/sklearn/callback/_task_tree.py new file mode 100644 index 0000000000000..eb6b3bec28a67 --- /dev/null +++ b/sklearn/callback/_task_tree.py @@ -0,0 +1,150 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + + +class TaskNode: + """A node in a task tree. + + The computations that an estimator performs has an inherent tree structure, each + loop representing a parent task and each iteration representing a child task. A + task node represents a task in this tree. Usually the root task node represents the + whole fit task and leaves the innermost loop iterations. + + For instance KMeans as two nested loops: the outer loop is controlled by `n_init` + and the inner loop is controlled by `max_iter`. Its task tree looks like this: + + KMeans fit + ├── init 0 + │ ├── iter 0 + │ ├── iter 1 + │ ├── ... + │ └── iter n + ├── init 1 + │ ├── iter 0 + │ ├── ... + │ └── iter n + └── init 2 + ├── iter 0 + ├── ... + └── iter n + + When the estimator is a meta-estimator, a task leaf usually correspond to fitting + a sub-estimator. So this leaf and the root task of the sub-estimator actually + represent the same task. In this case the leaf task node of the meta-estimator and + the root task node of the sub-estimator are merged into a single task node. + + For instance a `Pipeline` would have a task tree that looks like this: + Pipeline fit + ├── step 0 | preprocessor fit + │ └── + └── step 1 | estimator fit + └── + + The task tree is built by the `CallbackContext` class. It creates a root task node + and then the child tasks are created dynamically as the fitting process goes on. + + Parameters + ---------- + task_name : str + The name of the task this node represents. + + task_id : int + An identifier for this task that distinguishes it from its siblings. Usually + the index of this node among its siblings. + + max_tasks : int or None + The maximum number of its siblings. None means the maximum number of siblings + is not known in advance. + + estimator_name : str + The name of the estimator this task node belongs to. + + Attributes + ---------- + parent : TaskNode instance or None + The parent node. None means this is the root. + + Note that it's dynamic since the root task of an estimator can become an + intermediate node of a meta-estimator. + + children_map : dict + A mapping from the task_id of a child to the child node `{task_id: TaskNode}`. + For a leaf, it's an empty dictionary. + + max_subtasks : int or None + The maximum number of subtasks of this node. 0 means it's a leaf. None + means the maximum number of subtasks is not known in advance. + + prev_estimator_name : str or None + The estimator name of the node this node was merged with. None if it was not + merged with another node. + + prev_task_name : str + The task name of the node this node was merged with. None if it was not + merged with another node. + """ + + def __init__(self, *, task_name, task_id, max_tasks, estimator_name): + self.task_name = task_name + self.task_id = task_id + self.max_tasks = max_tasks + self.estimator_name = estimator_name + + self.parent = None + self.children_map = {} + self.max_subtasks = 0 + + # When an estimator is a sub-estimator of a meta-estimator, the root task of + # the estimator is merged with the corresponding leaf task of the + # meta-estimator because both correspond to the same computation step. + # The root task of the estimator takes the place of the leaf task of the + # meta-estimator in the task tree but we keep the information about the + # leaf task it was merged with to fully describe the merged node. + self.prev_estimator_name = None + self.prev_task_name = None + + def _add_child(self, task_node): + if task_node.task_id in self.children_map: + raise ValueError( + f"Task node {self.task_name} of estimator {self.estimator_name} " + f"already has a child with task_id={task_node.task_id}." + ) + + if len(self.children_map) == task_node.max_tasks: + raise ValueError( + f"Cannot add child to task node {self.task_name} of estimator " + f"{self.estimator_name} because it already has its maximum " + f"number of children ({task_node.max_tasks})." + ) + + self.children_map[task_node.task_id] = task_node + self.max_subtasks = task_node.max_tasks + task_node.parent = self + + def _merge_with(self, task_node): + # Set the parent of the sub-estimator's root task node to the parent + # of the meta-estimator's leaf task node + self.parent = task_node.parent + self.task_id = task_node.task_id + self.max_tasks = task_node.max_tasks + task_node.parent.children_map[self.task_id] = self + + # Keep information about the node it was merged with + self.prev_task_name = task_node.task_name + self.prev_estimator_name = task_node.estimator_name + + @property + def depth(self): + """The depth of this node in the computation tree.""" + return 0 if self.parent is None else self.parent.depth + 1 + + @property + def path(self): + """List of all the nodes in the path from the root to this node.""" + return [self] if self.parent is None else self.parent.path + [self] + + def __iter__(self): + """Pre-order depth-first traversal""" + yield self + for task_node in self.children_map.values(): + yield from task_node diff --git a/sklearn/callback/tests/__init__.py b/sklearn/callback/tests/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/sklearn/callback/tests/_utils.py b/sklearn/callback/tests/_utils.py new file mode 100644 index 0000000000000..9ab367889d206 --- /dev/null +++ b/sklearn/callback/tests/_utils.py @@ -0,0 +1,149 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +import time + +from sklearn.base import BaseEstimator, _fit_context, clone +from sklearn.callback import CallbackSupportMixin +from sklearn.utils.parallel import Parallel, delayed + + +class TestingCallback: + def _on_fit_begin(self, estimator, *, data): + pass + + def _on_fit_end(self): + pass + + def _on_fit_iter_end(self, estimator, node, **kwargs): + pass + + +class TestingAutoPropagatedCallback(TestingCallback): + max_estimator_depth = None + + +class NotValidCallback: + """Unvalid callback since it's missing a method from the protocol.'""" + + def _on_fit_begin(self, estimator, *, data): + pass # pragma: no cover + + def _on_fit_iter_end(self, estimator, node, **kwargs): + pass # pragma: no cover + + +class Estimator(CallbackSupportMixin, BaseEstimator): + _parameter_constraints: dict = {} + + def __init__(self, max_iter=20, computation_intensity=0.001): + self.max_iter = max_iter + self.computation_intensity = computation_intensity + + @_fit_context(prefer_skip_nested_validation=False) + def fit(self, X=None, y=None): + callback_ctx = self.init_callback_context().eval_on_fit_begin( + estimator=self, data={"X_train": X, "y_train": y} + ) + + for i in range(self.max_iter): + subcontext = callback_ctx.subcontext(task_id=i, max_tasks=self.max_iter) + + time.sleep(self.computation_intensity) # Computation intensive task + + if subcontext.eval_on_fit_iter_end( + estimator=self, + data={"X_train": X, "y_train": y}, + ): + break + + self.n_iter_ = i + 1 + + return self + + +class WhileEstimator(CallbackSupportMixin, BaseEstimator): + _parameter_constraints: dict = {} + + def __init__(self, computation_intensity=0.001): + self.computation_intensity = computation_intensity + + @_fit_context(prefer_skip_nested_validation=False) + def fit(self, X=None, y=None): + callback_ctx = self.init_callback_context().eval_on_fit_begin( + estimator=self, data={"X_train": X, "y_train": y} + ) + + i = 0 + while True: + subcontext = callback_ctx.subcontext(task_id=i, max_tasks=None) + + time.sleep(self.computation_intensity) # Computation intensive task + + if subcontext.eval_on_fit_iter_end( + estimator=self, + data={"X_train": X, "y_train": y}, + ): + break + + if i == 20: + break + + i += 1 + + return self + + +class MetaEstimator(CallbackSupportMixin, BaseEstimator): + _parameter_constraints: dict = {} + + def __init__( + self, estimator, n_outer=4, n_inner=3, n_jobs=None, prefer="processes" + ): + self.estimator = estimator + self.n_outer = n_outer + self.n_inner = n_inner + self.n_jobs = n_jobs + self.prefer = prefer + + @_fit_context(prefer_skip_nested_validation=False) + def fit(self, X=None, y=None): + callback_ctx = self.init_callback_context().eval_on_fit_begin( + estimator=self, data={"X_train": X, "y_train": y} + ) + + Parallel(n_jobs=self.n_jobs, prefer=self.prefer)( + delayed(_func)( + self, + self.estimator, + X, + y, + callback_ctx=callback_ctx.subcontext( + task_name="outer", task_id=i, max_tasks=self.n_outer + ), + ) + for i in range(self.n_outer) + ) + + return self + + +def _func(meta_estimator, inner_estimator, X, y, *, callback_ctx): + for i in range(meta_estimator.n_inner): + est = clone(inner_estimator) + + inner_ctx = callback_ctx.subcontext( + task_name="inner", task_id=i, max_tasks=meta_estimator.n_inner + ).propagate_callbacks(sub_estimator=est) + + est.fit(X, y) + + inner_ctx.eval_on_fit_iter_end( + estimator=meta_estimator, + data={"X_train": X, "y_train": y}, + ) + + callback_ctx.eval_on_fit_iter_end( + estimator=meta_estimator, + data={"X_train": X, "y_train": y}, + ) diff --git a/sklearn/callback/tests/test_callback_context.py b/sklearn/callback/tests/test_callback_context.py new file mode 100644 index 0000000000000..64ac50c0a5fd4 --- /dev/null +++ b/sklearn/callback/tests/test_callback_context.py @@ -0,0 +1,99 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +import pytest + +from sklearn.callback.tests._utils import ( + Estimator, + MetaEstimator, + NotValidCallback, + TestingAutoPropagatedCallback, + TestingCallback, +) + + +@pytest.mark.parametrize( + "callbacks", + [ + TestingCallback(), + [TestingCallback()], + [TestingCallback(), TestingAutoPropagatedCallback()], + ], +) +def test_set_callbacks(callbacks): + """Sanity check for the `set_callbacks` method.""" + estimator = Estimator() + + set_callbacks_return = estimator.set_callbacks(callbacks) + assert hasattr(estimator, "_skl_callbacks") + + expected_callbacks = [callbacks] if not isinstance(callbacks, list) else callbacks + assert estimator._skl_callbacks == expected_callbacks + + assert set_callbacks_return is estimator + + +@pytest.mark.parametrize("callbacks", [None, NotValidCallback()]) +def test_set_callbacks_error(callbacks): + """Check the error message when not passing a valid callback to `set_callbacks`.""" + estimator = Estimator() + + with pytest.raises( + TypeError, match="callbacks must follow the CallbackProtocol protocol." + ): + estimator.set_callbacks(callbacks) + + +def test_init_callback_context(): + """Sanity check for the `init_callback_context` method.""" + estimator = Estimator() + callback_ctx = estimator.init_callback_context() + + assert hasattr(estimator, "_callback_fit_ctx") + assert hasattr(callback_ctx, "_callbacks") + + +def test_propagate_callbacks(): + """Sanity check for the `propagate_callbacks` method.""" + not_propagated_callback = TestingCallback() + propagated_callback = TestingAutoPropagatedCallback() + + estimator = Estimator() + metaestimator = MetaEstimator(estimator) + metaestimator.set_callbacks([not_propagated_callback, propagated_callback]) + + callback_ctx = metaestimator.init_callback_context() + callback_ctx.propagate_callbacks(estimator) + + assert hasattr(estimator, "_parent_callback_ctx") + assert not_propagated_callback not in estimator._skl_callbacks + assert propagated_callback in estimator._skl_callbacks + + +def test_propagate_callback_no_callback(): + """Check that no callback is propagated if there's no callback.""" + estimator = Estimator() + metaestimator = MetaEstimator(estimator) + + callback_ctx = metaestimator.init_callback_context() + assert len(callback_ctx._callbacks) == 0 + + callback_ctx.propagate_callbacks(estimator) + + assert not hasattr(metaestimator, "_skl_callbacks") + assert not hasattr(estimator, "_skl_callbacks") + + +def test_auto_propagated_callbacks(): + """Check that it's not possible to set an auto-propagated callback on the + sub-estimator of a meta-estimator. + """ + estimator = Estimator() + estimator.set_callbacks(TestingAutoPropagatedCallback()) + meta_estimator = MetaEstimator(estimator=estimator) + + match = ( + r"sub-estimator .*of a meta-estimator .*can't have auto-propagated callbacks" + ) + with pytest.raises(TypeError, match=match): + meta_estimator.fit(X=None, y=None) diff --git a/sklearn/callback/tests/test_progressbar.py b/sklearn/callback/tests/test_progressbar.py new file mode 100644 index 0000000000000..a703ae008ca2f --- /dev/null +++ b/sklearn/callback/tests/test_progressbar.py @@ -0,0 +1,61 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +import re + +import pytest + +from sklearn.callback import ProgressBar +from sklearn.callback.tests._utils import Estimator, MetaEstimator, WhileEstimator +from sklearn.utils._optional_dependencies import check_rich_support +from sklearn.utils._testing import SkipTest + + +@pytest.mark.parametrize("n_jobs", [1, 2]) +@pytest.mark.parametrize("prefer", ["threads", "processes"]) +@pytest.mark.parametrize("InnerEstimator", [Estimator, WhileEstimator]) +@pytest.mark.parametrize("max_estimator_depth", [1, 2, None]) +def test_progressbar(n_jobs, prefer, InnerEstimator, max_estimator_depth, capsys): + """Check the output of the progress bars and their completion.""" + pytest.importorskip("rich") + + n_inner = 2 + n_outer = 3 + + est = InnerEstimator() + meta_est = MetaEstimator( + est, n_outer=n_outer, n_inner=n_inner, n_jobs=n_jobs, prefer=prefer + ) + meta_est.set_callbacks(ProgressBar(max_estimator_depth=max_estimator_depth)) + meta_est.fit() + + captured = capsys.readouterr() + + assert re.search(r"MetaEstimator - fit", captured.out) + for i in range(n_outer): + assert re.search(rf"MetaEstimator - outer #{i}", captured.out) + + # Progress bars of inner estimators are displayed only if max_estimator_depth > 1 + # (or None, which means all levels are displayed) + if max_estimator_depth is None or max_estimator_depth > 1: + for i in range(n_inner): + assert re.search( + rf"MetaEstimator - inner #{i} | {est.__class__.__name__} - fit", + captured.out, + ) + + # Check that all bars are 100% complete + assert re.search(r"100%", captured.out) + assert not re.search(r"[1-9]%", captured.out) + + +def test_progressbar_requires_rich_error(): + """Check that we raise an informative error when rich is not installed.""" + try: + check_rich_support("test_progressbar_requires_rich_error") + except ImportError: + err_msg = "Progressbar requires rich" + with pytest.raises(ImportError, match=err_msg): + ProgressBar() + else: + raise SkipTest("This test requires rich to not be installed.") diff --git a/sklearn/callback/tests/test_task_tree.py b/sklearn/callback/tests/test_task_tree.py new file mode 100644 index 0000000000000..c6f85d265b61d --- /dev/null +++ b/sklearn/callback/tests/test_task_tree.py @@ -0,0 +1,141 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +import numpy as np +import pytest + +from sklearn.callback import TaskNode + + +def _make_task_tree(n_children, n_grandchildren): + root = TaskNode( + task_name="root task", task_id=0, max_tasks=1, estimator_name="estimator" + ) + + for i in range(n_children): + child = TaskNode( + task_name="child task", + task_id=i, + max_tasks=n_children, + estimator_name="estimator", + ) + root._add_child(child) + + for j in range(n_grandchildren): + grandchild = TaskNode( + task_name="grandchild task", + task_id=j, + max_tasks=n_grandchildren, + estimator_name="estimator", + ) + child._add_child(grandchild) + + return root + + +def test_task_tree(): + """Check that the task tree is correctly built.""" + root = _make_task_tree(n_children=3, n_grandchildren=5) + + assert root.parent is None + assert root.depth == 0 + assert len(root.children_map) == 3 + + for child in root.children_map.values(): + assert child.parent is root + assert child.depth == 1 + assert len(child.children_map) == 5 + assert root.max_subtasks == child.max_tasks + + for grandchild in child.children_map.values(): + assert grandchild.parent is child + assert grandchild.depth == 2 + assert len(grandchild.children_map) == 0 + assert child.max_subtasks == grandchild.max_tasks + + # 1 root + 1 * 3 children + 1 * 3 * 5 grandchildren + expected_n_nodes = np.sum(np.cumprod([1, 3, 5])) + actual_n_nodes = sum(1 for _ in root) + assert actual_n_nodes == expected_n_nodes + + # None of the nodes should have been merged with another node + assert all(node.prev_estimator_name is None for node in root) + assert all(node.prev_task_name is None for node in root) + + +def test_path(): + """Sanity check for the path property.""" + root = _make_task_tree(n_children=3, n_grandchildren=5) + + assert root.path == [root] + + # pick an arbitrary node + node = root.children_map[1].children_map[2] + + expected_path = [root, root.children_map[1], node] + assert node.path == expected_path + + +def test_add_task(): + """Check that informative error messages are raised when adding tasks.""" + root = TaskNode(task_name="root task", task_id=0, max_tasks=1, estimator_name="est") + + # Before adding new task, it's considered a leaf + assert root.max_subtasks == 0 + + root._add_child( + TaskNode(task_name="child task", task_id=0, max_tasks=2, estimator_name="est") + ) + assert root.max_subtasks == 2 + assert len(root.children_map) == 1 + + # root already has a child with id 0 + with pytest.raises( + ValueError, match=r"Task node .* already has a child with task_id=0" + ): + root._add_child( + TaskNode( + task_name="child task", task_id=0, max_tasks=2, estimator_name="est" + ) + ) + + root._add_child( + TaskNode(task_name="child task", task_id=1, max_tasks=2, estimator_name="est") + ) + assert len(root.children_map) == 2 + + # root can have at most 2 children + with pytest.raises(ValueError, match=r"Cannot add child to task node"): + root._add_child( + TaskNode( + task_name="child task", task_id=2, max_tasks=2, estimator_name="est" + ) + ) + + +def test_merge_with(): + outer_root = TaskNode( + task_name="root", task_id=0, max_tasks=1, estimator_name="outer" + ) + + # Add a child task within the same estimator + outer_child = TaskNode( + task_name="child", task_id="id", max_tasks=2, estimator_name="outer" + ) + outer_root._add_child(outer_child) + + # The root task of the inner estimator is merged with (and effectively replaces) + # a leaf of the outer estimator because they correspond to the same formal task. + inner_root = TaskNode( + task_name="root", task_id=0, max_tasks=1, estimator_name="inner" + ) + inner_root._merge_with(outer_child) + + assert inner_root.parent is outer_root + assert inner_root.task_id == outer_child.task_id + assert outer_child not in outer_root.children_map.values() + assert inner_root in outer_root.children_map.values() + + # The name and estimator name of the tasks it was merged with are stored + assert inner_root.prev_task_name == outer_child.task_name + assert inner_root.prev_estimator_name == outer_child.estimator_name diff --git a/sklearn/utils/_optional_dependencies.py b/sklearn/utils/_optional_dependencies.py index 3bc8277fddab5..f2591a9fa3aa6 100644 --- a/sklearn/utils/_optional_dependencies.py +++ b/sklearn/utils/_optional_dependencies.py @@ -44,3 +44,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