From 45284203b1e4a4cb53a6729cfe473d648e4f953e Mon Sep 17 00:00:00 2001 From: Lucas Colley Date: Fri, 3 Jan 2025 14:01:05 +0000 Subject: [PATCH 01/14] DEV: bump version to 0.5.1.dev0 --- pixi.lock | 2 +- src/array_api_extra/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pixi.lock b/pixi.lock index 6fb8ca0a..97b67120 100644 --- a/pixi.lock +++ b/pixi.lock @@ -2468,7 +2468,7 @@ packages: timestamp: 1735201429468 - pypi: . name: array-api-extra - version: 0.5.0 + version: 0.5.1.dev0 sha256: d251a42cf798c262b31d53a9ad6a39ccaee0da06f854d3d2380ef4c014e963dd requires_dist: - array-api-compat>=1.10.0,<2 diff --git a/src/array_api_extra/__init__.py b/src/array_api_extra/__init__.py index d1673378..a4f6815f 100644 --- a/src/array_api_extra/__init__.py +++ b/src/array_api_extra/__init__.py @@ -12,7 +12,7 @@ sinc, ) -__version__ = "0.5.0" +__version__ = "0.5.1.dev0" # pylint: disable=duplicate-code __all__ = [ From e75a97ea6d9707fc4759e947ae2a136add109520 Mon Sep 17 00:00:00 2001 From: Lucas Colley Date: Sat, 4 Jan 2025 09:14:58 +0000 Subject: [PATCH 02/14] TYP: fix basedmypy 2.9.0 errors (#79) --- pixi.lock | 159 +++++++++++++++++----------------- pyproject.toml | 2 +- src/array_api_extra/_funcs.py | 11 ++- tests/test_at.py | 8 +- 4 files changed, 92 insertions(+), 88 deletions(-) diff --git a/pixi.lock b/pixi.lock index 97b67120..3b33cd02 100644 --- a/pixi.lock +++ b/pixi.lock @@ -143,7 +143,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_1.conda - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/pillow-11.0.0-py310hfeaa1f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/psutil-6.1.1-py310ha75aee5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda @@ -317,7 +317,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pandas-2.2.3-py310hfd37619_1.conda - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pillow-11.0.0-py310h530beaf_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pillow-11.1.0-py310h61efb56_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/psutil-6.1.1-py310h078409c_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda @@ -462,7 +462,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/win-64/pandas-2.2.3-py310hb4db72f_1.conda - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pillow-11.0.0-py310h4dc435f_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pillow-11.1.0-py310h9595edc_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/psutil-6.1.1-py310ha8f682b_0.conda - conda: https://prefix.dev/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda @@ -847,7 +847,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/astroid-3.3.8-py313h78bf25f_0.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.8.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda @@ -857,7 +857,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cffi-1.17.1-py313hfab6e84_0.conda - conda: https://prefix.dev/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.6.10-py313h8060acc_0.conda - conda: https://prefix.dev/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda @@ -941,7 +941,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-2.5.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda @@ -962,7 +962,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ukkonen-1.0.1-py313h33d0bda_5.conda - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda @@ -976,7 +976,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/astroid-3.3.8-py313h8f79df9_0.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.8.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda @@ -986,7 +986,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-1.17.1-py313hc845a76_0.conda - conda: https://prefix.dev/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.6.10-py313ha9b7d5b_0.conda - conda: https://prefix.dev/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda @@ -1065,7 +1065,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-2.5.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda @@ -1086,7 +1086,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ukkonen-1.0.1-py313hf9c7212_5.conda - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda @@ -1100,7 +1100,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/astroid-3.3.8-py313hfa70ccb_0.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.8.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda @@ -1110,7 +1110,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/cffi-1.17.1-py313ha7868ed_0.conda - conda: https://prefix.dev/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/coverage-7.6.10-py313hb4c8b1a_0.conda - conda: https://prefix.dev/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda @@ -1184,7 +1184,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-2.5.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda @@ -1209,7 +1209,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda - - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda - conda: https://prefix.dev/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda @@ -1235,7 +1235,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cffi-1.17.1-py313hfab6e84_0.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/furo-2024.8.6-pyhd8ed1ab_2.conda @@ -1278,7 +1278,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-2.5.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda @@ -1305,7 +1305,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-1.17.1-py313hc845a76_0.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/furo-2024.8.6-pyhd8ed1ab_2.conda @@ -1342,7 +1342,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-2.5.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda @@ -1369,7 +1369,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda - conda: https://prefix.dev/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/cffi-1.17.1-py313ha7868ed_0.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/furo-2024.8.6-pyhd8ed1ab_2.conda @@ -1403,7 +1403,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-2.5.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.0.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda @@ -1439,7 +1439,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/astroid-3.3.8-py313h78bf25f_0.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.8.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.1.0-py313h46c70d0_2.conda @@ -1448,7 +1448,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cffi-1.17.1-py313hfab6e84_0.conda - conda: https://prefix.dev/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/dill-0.3.9-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda @@ -1528,7 +1528,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ukkonen-1.0.1-py313h33d0bda_5.conda - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/zstandard-0.23.0-py313h80202fe_1.conda @@ -1540,7 +1540,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/astroid-3.3.8-py313h8f79df9_0.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.8.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.1.0-py313h3579c5c_2.conda @@ -1549,7 +1549,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cffi-1.17.1-py313hc845a76_0.conda - conda: https://prefix.dev/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/dill-0.3.9-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda @@ -1624,7 +1624,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ukkonen-1.0.1-py313hf9c7212_5.conda - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstandard-0.23.0-py313hf2da073_1.conda @@ -1636,7 +1636,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/astroid-3.3.8-py313hfa70ccb_0.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.8.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py313h5813708_2.conda @@ -1645,7 +1645,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/cffi-1.17.1-py313ha7868ed_0.conda - conda: https://prefix.dev/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/dill-0.3.9-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda @@ -1721,7 +1721,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda - - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda - conda: https://prefix.dev/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://prefix.dev/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 @@ -2016,7 +2016,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_1.conda - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/pillow-11.0.0-py310hfeaa1f3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/psutil-6.1.1-py310ha75aee5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda @@ -2190,7 +2190,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pandas-2.2.3-py310hfd37619_1.conda - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pillow-11.0.0-py310h530beaf_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pillow-11.1.0-py310h61efb56_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/psutil-6.1.1-py310h078409c_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda @@ -2350,7 +2350,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/win-64/pandas-2.2.3-py310hb4db72f_1.conda - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/win-64/pillow-11.0.0-py310h4dc435f_0.conda + - conda: https://prefix.dev/conda-forge/win-64/pillow-11.1.0-py310h9595edc_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/psutil-6.1.1-py310ha8f682b_0.conda - conda: https://prefix.dev/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda @@ -2469,7 +2469,7 @@ packages: - pypi: . name: array-api-extra version: 0.5.1.dev0 - sha256: d251a42cf798c262b31d53a9ad6a39ccaee0da06f854d3d2380ef4c014e963dd + sha256: 08ad7e72202d8bde5a5e9025c0617e0652aa41fa82ca0469d3a11a09090f542a requires_dist: - array-api-compat>=1.10.0,<2 - furo>=2023.8.17 ; extra == 'docs' @@ -3263,9 +3263,9 @@ packages: - pkg:pypi/babel?source=hash-mapping size: 6551057 timestamp: 1733236466015 -- conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.8.1-pyhd8ed1ab_0.conda - sha256: b88c9921901b34c21b88f2c796510f2b7afeb60642a877b2a063fc3eb8ecac65 - md5: b5714d3fa2cbf4f1db2de22665f13bf7 +- conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda + sha256: 6338810705180c2b9f7827ad171e15849a47af70d705dc45dd0d8c4748f9bb30 + md5: 5fd36cc2d33dd4326daec09c8b926458 depends: - basedtyping >=0.0.3 - mypy_extensions >=1.0.0 @@ -3275,8 +3275,8 @@ packages: license: BSD-3-Clause AND Apache-2.0 purls: - pkg:pypi/basedmypy?source=hash-mapping - size: 1806951 - timestamp: 1733893194016 + size: 1849478 + timestamp: 1735780611775 - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda sha256: 992219d607c73d609f98d51dabf2ba928804dfe8e82f65985e93336cf490408c md5: cb9eaa8b1a78e9d6fe465a408244328f @@ -3640,17 +3640,16 @@ packages: - pkg:pypi/cfgv?source=hash-mapping size: 12973 timestamp: 1734267180483 -- conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda - sha256: 63022ee2c6a157a9f980250a66f54bdcdf5abee817348d0f9a74c2441a6fbf0e - md5: 6581a17bba6b948bb60130026404a9d6 +- conda: https://prefix.dev/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 depends: - python >=3.9 license: MIT - license_family: MIT purls: - pkg:pypi/charset-normalizer?source=hash-mapping - size: 47533 - timestamp: 1733218182393 + size: 47438 + timestamp: 1735929811779 - conda: https://prefix.dev/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab md5: f22f4d4970e09d68a10b922cbb0408d3 @@ -5017,6 +5016,7 @@ packages: - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 license: Apache-2.0 + license_family: APACHE purls: [] size: 5303299 timestamp: 1735686839461 @@ -5057,6 +5057,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.42.34433 license: Apache-2.0 + license_family: APACHE purls: [] size: 447461 timestamp: 1735686912086 @@ -5103,6 +5104,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.42.34433 license: Apache-2.0 + license_family: APACHE purls: [] size: 435269 timestamp: 1735687174564 @@ -5158,6 +5160,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.42.34433 license: Apache-2.0 + license_family: APACHE purls: [] size: 365444 timestamp: 1735687288606 @@ -6395,6 +6398,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.42.34433 license: Apache-2.0 + license_family: APACHE purls: [] size: 812887 timestamp: 1735687117032 @@ -8168,9 +8172,9 @@ packages: - pkg:pypi/pickleshare?source=hash-mapping size: 11748 timestamp: 1733327448200 -- conda: https://prefix.dev/conda-forge/linux-64/pillow-11.0.0-py310hfeaa1f3_0.conda - sha256: 74bd9d252f227710844103542a6d7042cf6df490ee93fb6095c46c7254ef4703 - md5: 1947280342c7259b82a707e38ebc212e +- conda: https://prefix.dev/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda + sha256: e11d694b7c12b6a76624e8c3e48892924668a97ec26f353ce37b0648bd12ad87 + md5: 14d300b9e1504748e70cc6499a7b4d25 depends: - __glibc >=2.17,<3.0.a0 - freetype >=2.12.1,<3.0a0 @@ -8178,31 +8182,31 @@ packages: - libgcc >=13 - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 + - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 + - openjpeg >=2.5.3,<3.0a0 - python >=3.10,<3.11.0a0 - python_abi 3.10.* *_cp310 - tk >=8.6.13,<8.7.0a0 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping - size: 42649358 - timestamp: 1729065834823 -- conda: https://prefix.dev/conda-forge/osx-arm64/pillow-11.0.0-py310h530beaf_0.conda - sha256: c96e782e51594b0f49999ad2daa55a3fae8ce42d9ce2530f9fec775beff791e4 - md5: 7e4b45cc390bed071d8ac49b2a54d113 + size: 42419230 + timestamp: 1735929858736 +- conda: https://prefix.dev/conda-forge/osx-arm64/pillow-11.1.0-py310h61efb56_0.conda + sha256: 7eb1bf423326ae0d372504cab421994f248e882daab6750ed5ea5df4fbb9858f + md5: 72579fcac27a82e99c2c115c6718dd06 depends: - __osx >=11.0 - freetype >=2.12.1,<3.0a0 - lcms2 >=2.16,<3.0a0 - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 + - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 + - openjpeg >=2.5.3,<3.0a0 - python >=3.10,<3.11.0a0 - python >=3.10,<3.11.0a0 *_cpython - python_abi 3.10.* *_cp310 @@ -8210,20 +8214,20 @@ packages: license: HPND purls: - pkg:pypi/pillow?source=hash-mapping - size: 41911525 - timestamp: 1729066088495 -- conda: https://prefix.dev/conda-forge/win-64/pillow-11.0.0-py310h4dc435f_0.conda - sha256: 157c6ee0999f84719d721082f83f229e995b44f02eba2200f4a9c36513d63de8 - md5: 80e0100d9f198fd2e4ed8c2e561b8fee + size: 41772845 + timestamp: 1735929952853 +- conda: https://prefix.dev/conda-forge/win-64/pillow-11.1.0-py310h9595edc_0.conda + sha256: a4cf9c10ecdc2ad2bbedce6eb76ba7d193e8be66f4424cfbbabfe53668b0d8bb + md5: 67a38507ac20bd85226fe6dd7ed87462 depends: - freetype >=2.12.1,<3.0a0 - lcms2 >=2.16,<3.0a0 - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 + - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 + - openjpeg >=2.5.3,<3.0a0 - python >=3.10,<3.11.0a0 - python_abi 3.10.* *_cp310 - tk >=8.6.13,<8.7.0a0 @@ -8233,8 +8237,8 @@ packages: license: HPND purls: - pkg:pypi/pillow?source=hash-mapping - size: 41919084 - timestamp: 1729066268963 + size: 41777634 + timestamp: 1735930357220 - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 md5: 577852c7e53901ddccc7e6a9959ddebe @@ -9311,18 +9315,18 @@ packages: - pkg:pypi/sphinx?source=hash-mapping size: 1387076 timestamp: 1733754175386 -- conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-2.5.0-pyhd8ed1ab_1.conda - sha256: de09aeff8819105fecdef2354d65af672a22ea092d7c7a2530bb4a43db50a2cf - md5: a84c2ed55076791d098dfa4e53676286 +- conda: https://prefix.dev/conda-forge/noarch/sphinx-autodoc-typehints-3.0.0-pyhd8ed1ab_0.conda + sha256: aeb036de447e78f2c7d718822d99b7e285d4d96b191afd85aab8a39d5ec19a85 + md5: 243019ab35941dc825817a5ee4fd7ef4 depends: - python >=3.10 - - sphinx >=8.0.2 + - sphinx >=8.1.3 license: MIT license_family: MIT purls: - pkg:pypi/sphinx-autodoc-typehints?source=hash-mapping - size: 23984 - timestamp: 1734685024740 + size: 23860 + timestamp: 1735917178684 - conda: https://prefix.dev/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_2.conda sha256: 091293964075ed1905731d09ff2691e053cd9d5335d99501f05683da29de0ee7 md5: 463d989a8f1506bcf51cc37d7beebdf1 @@ -9751,20 +9755,19 @@ packages: purls: [] size: 754247 timestamp: 1731710681163 -- conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda - sha256: 82776f74e90a296b79415361faa6b10f360755c1fb8e6d59ca68509e6fe7e115 - md5: 1d601bc1d28b5ce6d112b90f4b9b8ede +- conda: https://prefix.dev/conda-forge/noarch/virtualenv-20.28.1-pyhd8ed1ab_0.conda + sha256: c8bde4547ddbd21ea89e483a7c65d8a5e442c0db494b0b977e389b75b9d03d62 + md5: 680b1c287b10cefc8bda0530b217229f depends: - distlib >=0.3.7,<1 - filelock >=3.12.2,<4 - platformdirs >=3.9.1,<5 - python >=3.9 license: MIT - license_family: MIT purls: - pkg:pypi/virtualenv?source=hash-mapping - size: 3350255 - timestamp: 1732609542072 + size: 3350367 + timestamp: 1735929107438 - conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda sha256: 568ce8151eaae256f1cef752fc78651ad7a86ff05153cc7a4740b52ae6536118 md5: 5c176975ca2b8366abad3c97b3cd1e83 diff --git a/pyproject.toml b/pyproject.toml index 3e3a7584..58c02fab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,7 +71,7 @@ array-api-extra = { path = ".", editable = true } [tool.pixi.feature.lint.dependencies] pre-commit = "*" pylint = "*" -basedmypy = "2.8.*" +basedmypy = "*" basedpyright = "*" numpydoc = ">=1.8.0,<2" # import dependencies for mypy: diff --git a/src/array_api_extra/_funcs.py b/src/array_api_extra/_funcs.py index e0fa5f54..80ad3c2d 100644 --- a/src/array_api_extra/_funcs.py +++ b/src/array_api_extra/_funcs.py @@ -5,10 +5,9 @@ import operator import warnings - -# https://github.com/pylint-dev/pylint/issues/10112 -from collections.abc import Callable # pylint: disable=import-error -from typing import ClassVar, Literal +from collections.abc import Callable +from types import ModuleType +from typing import ClassVar, Literal, cast from ._lib import _compat, _utils from ._lib._compat import ( @@ -16,7 +15,7 @@ is_jax_array, is_writeable_array, ) -from ._lib._typing import Array, Index, ModuleType +from ._lib._typing import Array, Index __all__ = [ "at", @@ -779,7 +778,7 @@ def _update_common( if copy: if is_jax_array(x): # Use JAX's at[] - func = getattr(x.at[idx], at_op) + func = cast(Callable[[Array], Array], getattr(x.at[idx], at_op)) return func(y), None # Emulate at[] behaviour for non-JAX arrays # with a copy followed by an update diff --git a/tests/test_at.py b/tests/test_at.py index 1f660675..f50b9248 100644 --- a/tests/test_at.py +++ b/tests/test_at.py @@ -1,6 +1,7 @@ -from collections.abc import Generator +from collections.abc import Callable, Generator from contextlib import contextmanager from importlib import import_module +from typing import cast import numpy as np import pytest @@ -100,7 +101,8 @@ def test_update_ops( pytest.skip("at() does not support updates on sparse arrays") with assert_copy(array, expect_copy): - y = getattr(at(array)[1:], op)(arg, **kwargs) + func = cast(Callable[..., Array], getattr(at(array)[1:], op)) # type: ignore[no-any-explicit] + y = func(arg, **kwargs) assert isinstance(y, type(array)) assert_array_equal(y, expect) @@ -153,6 +155,6 @@ def test_iops_incompatible_dtype(op: str, copy: bool): to dtype('int64') with casting rule 'same_kind' """ a = np.asarray([2, 4]) - func = getattr(at(a)[:], op) + func = cast(Callable[..., Array], getattr(at(a)[:], op)) # type: ignore[no-any-explicit] with pytest.raises(TypeError, match="Cannot cast ufunc"): func(1.1, copy=copy) From a96dffb627c11b913ff83d9769144c2b9445722b Mon Sep 17 00:00:00 2001 From: Guido Imperiale Date: Tue, 7 Jan 2025 00:52:23 +0000 Subject: [PATCH 03/14] DOC: clarify `at()` patterns/antipatterns (#81) Co-authored-by: Lucas Colley --- src/array_api_extra/_funcs.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/array_api_extra/_funcs.py b/src/array_api_extra/_funcs.py index 80ad3c2d..db0a1af1 100644 --- a/src/array_api_extra/_funcs.py +++ b/src/array_api_extra/_funcs.py @@ -649,22 +649,39 @@ class at: # pylint: disable=invalid-name # numpydoc ignore=PR02 Warnings -------- - (a) When you omit the ``copy`` parameter, you should always immediately overwrite - the parameter array:: + (a) When you omit the ``copy`` parameter, you should never reuse the parameter + array later on; ideally, you should reassign it immediately:: >>> import array_api_extra as xpx >>> x = xpx.at(x, 0).set(2) - The anti-pattern below must be avoided, as it will result in different - behaviour on read-only versus writeable arrays:: + The above best practice pattern ensures that the behaviour won't change depending + on whether ``x`` is writeable or not, as the original ``x`` object is dereferenced + as soon as ``xpx.at`` returns; this way there is no risk to accidentally update it + twice. + + On the reverse, the anti-pattern below must be avoided, as it will result in + different behaviour on read-only versus writeable arrays:: >>> x = xp.asarray([0, 0, 0]) >>> y = xpx.at(x, 0).set(2) >>> z = xpx.at(x, 1).set(3) - In the above example, ``x == [0, 0, 0]``, ``y == [2, 0, 0]`` and z == ``[0, 3, 0]`` - when ``x`` is read-only, whereas ``x == y == z == [2, 3, 0]`` when ``x`` is - writeable! + In the above example, both calls to ``xpx.at`` update ``x`` in place *if possible*. + This causes the behaviour to diverge depending on whether ``x`` is writeable or not: + + - If ``x`` is writeable, then after the snippet above you'll have + ``x == y == z == [2, 3, 0]`` + - If ``x`` is read-only, then you'll end up with + ``x == [0, 0, 0]``, ``y == [2, 0, 0]`` and ``z == [0, 3, 0]``. + + The correct pattern to use if you want diverging outputs from the same input is + to enforce copies:: + + >>> x = xp.asarray([0, 0, 0]) + >>> y = xpx.at(x, 0).set(2, copy=True) # Never updates x + >>> z = xpx.at(x, 1).set(3) # May or may not update x in place + >>> del x # avoid accidental reuse of x as we don't know its state anymore (b) The array API standard does not support integer array indices. The behaviour of update methods when the index is an array of integers is From 70c22c0cd00a9ccad771281a8b78075404a24424 Mon Sep 17 00:00:00 2001 From: Evgeni Burovski Date: Tue, 7 Jan 2025 21:00:02 +0300 Subject: [PATCH 04/14] ENH: allow tuple pad_width in `pad` (#82) Co-authored-by: Lucas Colley --- pixi.lock | 765 +++++++++++++++++----------------- pyproject.toml | 7 +- src/array_api_extra/_funcs.py | 42 +- tests/test_funcs.py | 19 + 4 files changed, 446 insertions(+), 387 deletions(-) diff --git a/pixi.lock b/pixi.lock index 3b33cd02..23fcb3ee 100644 --- a/pixi.lock +++ b/pixi.lock @@ -67,11 +67,11 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://prefix.dev/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-h44a453e_6_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_6_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_6_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h3ee7192_6_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-hd595efa_7_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_7_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_7_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_7_cpu.conda - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda - conda: https://prefix.dev/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda @@ -80,7 +80,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 @@ -88,9 +88,9 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-2.32.0-h804f50b_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-storage-2.32.0-h0121fbd_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.67.1-hc2c308b_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-2.33.0-h2b5623c_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-storage-2.33.0-h0121fbd_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda @@ -100,9 +100,9 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_6_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_7_cpu.conda - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda @@ -110,7 +110,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda - - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_h791ef64_107.conda + - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_he8ec5d7_108.conda - conda: https://prefix.dev/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda @@ -125,7 +125,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/lz4-4.3.3-py310h80b8a69_2.conda - conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/mkl-2023.2.0-h84fe81f_50496.conda + - conda: https://prefix.dev/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.0-py310h5eaa309_0.conda - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda @@ -136,10 +136,10 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/numba-0.60.0-py310h5dc88bb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.0.2-py310hd6e36ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/orc-2.0.3-h97ab989_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_1.conda - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda @@ -157,13 +157,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.10-5_cp310.conda - - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h61efdf7_107.conda + - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h27a6d43_108.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda - conda: https://prefix.dev/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/linux-64/s2n-1.5.10-hb5b8611_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.14.1-py310hfcf56fc_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.0-py310hfa6ec8c_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.7-h1b44611_2.conda @@ -248,11 +248,11 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-h4a2f8bd_6_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_6_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_6_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h86344ea_6_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-h0ad35bc_7_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_7_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_7_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_7_cpu.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda @@ -262,15 +262,15 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20191231-hc8eb9b7_2.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-2.32.0-h8d8be31_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-storage-2.32.0-h7081f7f_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.67.1-hc70892a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-2.33.0-hdbe95d5_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-storage-2.33.0-h7081f7f_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.9.0-26_osxarm64_openblas.conda @@ -278,15 +278,15 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_6_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_7_cpu.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-5.28.2-h8f0b736_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_hf3ddf7c_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_hb579fdd_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libutf8proc-2.9.0-h5505292_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda @@ -310,10 +310,10 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.60.0-py310h0628f0e_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.0.2-py310h530be0a_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/orc-2.0.3-hbcee414_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pandas-2.2.3-py310hfd37619_1.conda - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda @@ -331,12 +331,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.10-5_cp310.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_hbae1486_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_h3256795_8.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.2-py310h493c2e1_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.14.1-py310hed58976_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.0-py310hd50a768_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.7-h8391f65_2.conda @@ -408,7 +408,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://prefix.dev/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - conda: https://prefix.dev/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/win-64/libabseil-20240722.0-cxx17_h4eb7d71_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libabseil-20240722.0-cxx17_h4eb7d71_4.conda - conda: https://prefix.dev/conda-forge/win-64/libarrow-18.1.0-he01b112_7_cpu.conda - conda: https://prefix.dev/conda-forge/win-64/libarrow-acero-18.1.0-h7d8d6a5_7_cpu.conda - conda: https://prefix.dev/conda-forge/win-64/libarrow-dataset-18.1.0-h7d8d6a5_7_cpu.conda @@ -457,7 +457,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/numba-0.60.0-py310h7793332_0.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.0.2-py310h1ec8c79_1.conda - conda: https://prefix.dev/conda-forge/win-64/openjpeg-2.5.3-h4d64b90_0.conda - - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - conda: https://prefix.dev/conda-forge/win-64/orc-2.0.3-haf104fe_2.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/win-64/pandas-2.2.3-py310hb4db72f_1.conda @@ -479,7 +479,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.2-py310ha8f682b_1.conda - conda: https://prefix.dev/conda-forge/win-64/re2-2024.07.02-haf4117d_2.conda - - conda: https://prefix.dev/conda-forge/win-64/scipy-1.14.1-py310hbd0dde3_2.conda + - conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.0-py310h164493e_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/snappy-1.2.1-h500f7fa_1.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2 @@ -544,7 +544,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.2.1-py310h5851e9f_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -580,7 +580,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.2.1-py310ha1ddda0_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -616,7 +616,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.2.1-py310hb9d903e_0.conda - - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -670,7 +670,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.2.1-py313hb30382a_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -708,7 +708,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.2.1-py313ha4a2180_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -746,7 +746,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.2.1-py313hd65a2fa_0.conda - - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -787,7 +787,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda @@ -805,7 +805,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda @@ -822,7 +822,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda @@ -848,7 +848,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.1.0-py313h46c70d0_2.conda @@ -872,7 +872,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda @@ -914,7 +914,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.2.1-py313hb30382a_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda @@ -926,7 +926,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -977,7 +977,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.1.0-py313h3579c5c_2.conda @@ -1001,7 +1001,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda @@ -1038,7 +1038,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.2.1-py313ha4a2180_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda @@ -1050,7 +1050,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -1101,7 +1101,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py313h5813708_2.conda @@ -1124,7 +1124,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda @@ -1160,7 +1160,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.2.1-py313hd65a2fa_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda @@ -1170,7 +1170,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -1264,10 +1264,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/myst-parser-4.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda @@ -1328,10 +1328,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/myst-parser-4.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda @@ -1390,10 +1390,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/myst-parser-4.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda @@ -1440,7 +1440,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/astroid-3.3.8-py313h78bf25f_0.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.1.0-py313h46c70d0_2.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda @@ -1459,7 +1459,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda @@ -1494,13 +1494,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.2.1-py313hb30382a_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -1541,7 +1541,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/astroid-3.3.8-py313h8f79df9_0.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.1.0-py313h3579c5c_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda @@ -1560,7 +1560,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda @@ -1590,13 +1590,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.2.1-py313ha4a2180_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -1637,7 +1637,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/astroid-3.3.8-py313hfa70ccb_0.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py313h5813708_2.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda @@ -1655,7 +1655,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda @@ -1684,13 +1684,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.2.1-py313hd65a2fa_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -1765,7 +1765,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.2.1-py313hb30382a_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -1803,7 +1803,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.2.1-py313ha4a2180_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -1841,7 +1841,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.2.1-py313hd65a2fa_0.conda - - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda @@ -1934,11 +1934,11 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://prefix.dev/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-h44a453e_6_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_6_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_6_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h3ee7192_6_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-hd595efa_7_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_7_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_7_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_7_cpu.conda - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda - conda: https://prefix.dev/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda @@ -1952,7 +1952,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libcusolver-11.7.1.2-hbd13f7d_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libcusparse-12.5.4.2-hbd13f7d_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 @@ -1960,9 +1960,9 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-2.32.0-h804f50b_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-storage-2.32.0-h0121fbd_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.67.1-hc2c308b_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-2.33.0-h2b5623c_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-storage-2.33.0-h0121fbd_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda @@ -1973,9 +1973,9 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnvjitlink-12.6.85-hbd13f7d_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_6_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_7_cpu.conda - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda @@ -1983,7 +1983,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda - - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_h791ef64_107.conda + - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_he8ec5d7_108.conda - conda: https://prefix.dev/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda @@ -1998,7 +1998,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/lz4-4.3.3-py310h80b8a69_2.conda - conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/mkl-2023.2.0-h84fe81f_50496.conda + - conda: https://prefix.dev/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.0-py310h5eaa309_0.conda - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda @@ -2009,10 +2009,10 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/numba-0.60.0-py310h5dc88bb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.0.2-py310hd6e36ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/orc-2.0.3-h97ab989_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_1.conda - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda @@ -2030,13 +2030,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.10-5_cp310.conda - - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h61efdf7_107.conda + - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h27a6d43_108.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda - conda: https://prefix.dev/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/linux-64/s2n-1.5.10-hb5b8611_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.14.1-py310hfcf56fc_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.0-py310hfa6ec8c_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.7-h1b44611_2.conda @@ -2121,11 +2121,11 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-h4a2f8bd_6_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_6_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_6_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h86344ea_6_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-h0ad35bc_7_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_7_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_7_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_7_cpu.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda @@ -2135,15 +2135,15 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20191231-hc8eb9b7_2.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-2.32.0-h8d8be31_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-storage-2.32.0-h7081f7f_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.67.1-hc70892a_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-2.33.0-hdbe95d5_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-storage-2.33.0-h7081f7f_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.9.0-26_osxarm64_openblas.conda @@ -2151,15 +2151,15 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_6_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_7_cpu.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-5.28.2-h8f0b736_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_hf3ddf7c_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_hb579fdd_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libutf8proc-2.9.0-h5505292_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda @@ -2183,10 +2183,10 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.60.0-py310h0628f0e_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.0.2-py310h530be0a_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/orc-2.0.3-hbcee414_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pandas-2.2.3-py310hfd37619_1.conda - conda: https://prefix.dev/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda @@ -2204,12 +2204,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.10-5_cp310.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_hbae1486_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_h3256795_8.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.2-py310h493c2e1_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.14.1-py310hed58976_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.0-py310hd50a768_0.conda - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.7-h8391f65_2.conda @@ -2290,7 +2290,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://prefix.dev/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - conda: https://prefix.dev/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - - conda: https://prefix.dev/conda-forge/win-64/libabseil-20240722.0-cxx17_h4eb7d71_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libabseil-20240722.0-cxx17_h4eb7d71_4.conda - conda: https://prefix.dev/conda-forge/win-64/libarrow-18.1.0-he01b112_7_cpu.conda - conda: https://prefix.dev/conda-forge/win-64/libarrow-acero-18.1.0-h7d8d6a5_7_cpu.conda - conda: https://prefix.dev/conda-forge/win-64/libarrow-dataset-18.1.0-h7d8d6a5_7_cpu.conda @@ -2345,7 +2345,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/numba-0.60.0-py310h7793332_0.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.0.2-py310h1ec8c79_1.conda - conda: https://prefix.dev/conda-forge/win-64/openjpeg-2.5.3-h4d64b90_0.conda - - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - conda: https://prefix.dev/conda-forge/win-64/orc-2.0.3-haf104fe_2.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/win-64/pandas-2.2.3-py310hb4db72f_1.conda @@ -2367,7 +2367,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.2-py310ha8f682b_1.conda - conda: https://prefix.dev/conda-forge/win-64/re2-2024.07.02-haf4117d_2.conda - - conda: https://prefix.dev/conda-forge/win-64/scipy-1.14.1-py310hbd0dde3_2.conda + - conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.0-py310h164493e_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/snappy-1.2.1-h500f7fa_1.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2 @@ -2469,7 +2469,7 @@ packages: - pypi: . name: array-api-extra version: 0.5.1.dev0 - sha256: 08ad7e72202d8bde5a5e9025c0617e0652aa41fa82ca0469d3a11a09090f542a + sha256: 844f582d7ea2045c164b04200b3bc32dd7f4c868cad9da16621a743f0d0bf381 requires_dist: - array-api-compat>=1.10.0,<2 - furo>=2023.8.17 ; extra == 'docs' @@ -3277,17 +3277,17 @@ packages: - pkg:pypi/basedmypy?source=hash-mapping size: 1849478 timestamp: 1735780611775 -- conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.1-pyhd8ed1ab_0.conda - sha256: 992219d607c73d609f98d51dabf2ba928804dfe8e82f65985e93336cf490408c - md5: cb9eaa8b1a78e9d6fe465a408244328f +- conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda + sha256: c66b5e90af123465f3b34dca54e839aeb2ef443018a008bf5b460a4549d807cc + md5: 9e92cdee91e7ab02b4bddd7883087f4c depends: - nodejs-wheel >=20.13.1 - python >=3.9 license: MIT AND Apache-2.0 purls: - pkg:pypi/basedpyright?source=hash-mapping - size: 6719677 - timestamp: 1734599412702 + size: 7535687 + timestamp: 1736098739733 - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda sha256: 73badfd807775e6e171de10ab752fd4706fe9360f6fd0cfabd509c670d12951b md5: 234a48e49c3913330665c444824e6533 @@ -3646,6 +3646,7 @@ packages: depends: - python >=3.9 license: MIT + license_family: MIT purls: - pkg:pypi/charset-normalizer?source=hash-mapping size: 47438 @@ -4515,9 +4516,9 @@ packages: purls: [] size: 11857802 timestamp: 1720853997952 -- conda: https://prefix.dev/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda - sha256: 8acc3bfc7781ea1ddc8c013faff5106a0539e5671e31bee0d81011a1e2df20d8 - md5: 5ec16e7ad9bab911ff0696940953f505 +- conda: https://prefix.dev/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda + sha256: e8ea11b8e39a98a9c34efb5c21c3fca718e31e1f41fd9ae5f6918b8eb402da59 + md5: c1b0f663ff141265d1be1242259063f0 depends: - python >=3.9 - ukkonen @@ -4525,8 +4526,8 @@ packages: license_family: MIT purls: - pkg:pypi/identify?source=hash-mapping - size: 78570 - timestamp: 1735518781514 + size: 78415 + timestamp: 1736026672643 - conda: https://prefix.dev/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 md5: 39a4f67be3286c86d696df570b1201b7 @@ -4862,38 +4863,38 @@ packages: purls: [] size: 194365 timestamp: 1657977692274 -- conda: https://prefix.dev/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_2.conda - sha256: 7003c0df066df8a48586a44c35684ff52dead2b6c0812bb22243a0680a5f37a8 - md5: 48099a5f37e331f5570abbf22b229961 +- conda: https://prefix.dev/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 constrains: - - abseil-cpp =20240722.0 - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 license: Apache-2.0 license_family: Apache purls: [] - size: 1309370 - timestamp: 1735453911208 -- conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_2.conda - sha256: 12b85cd25bd82bb2255f329b37f974b3035a109d6345b6fb762b633c845014f9 - md5: d97db28b64404efd1413d5c52f79cdae + size: 1311599 + timestamp: 1736008414161 +- conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 depends: - __osx >=11.0 - libcxx >=18 constrains: - - abseil-cpp =20240722.0 - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 license: Apache-2.0 license_family: Apache purls: [] - size: 1173485 - timestamp: 1735454097554 -- conda: https://prefix.dev/conda-forge/win-64/libabseil-20240722.0-cxx17_h4eb7d71_2.conda - sha256: 974ae7f043ecf61d4f7ac4bf673dad813dc63f7659b6988dc883a29354a5d135 - md5: c87f25815ad1a0c974df4f134d52c419 + size: 1178260 + timestamp: 1736008642885 +- conda: https://prefix.dev/conda-forge/win-64/libabseil-20240722.0-cxx17_h4eb7d71_4.conda + sha256: 846eacff96d36060fe5f7b351e4df6fafae56bf34cc6426497f12b5c13f317cf + md5: c57ee7f404d1aa84deb3e15852bec6fa depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 @@ -4904,12 +4905,12 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 1792490 - timestamp: 1735454161865 -- conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-h44a453e_6_cpu.conda - build_number: 6 - sha256: abf17e99b03356a9d6248e965826c1352ff01b00d3a62cc51393bb0744d72803 - md5: 2cf6d608d6e66506f69797d5c6944c35 + size: 1784929 + timestamp: 1736008778245 +- conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-hd595efa_7_cpu.conda + build_number: 7 + sha256: 554ffa338264c1dc34d95adb7eb856d50a2f25e7fa303a1a51e4372301b7c96f + md5: 08d4aff5ee6dee9a1b9ab13fca927697 depends: - __glibc >=2.17,<3.0.a0 - aws-crt-cpp >=0.29.7,<0.29.8.0a0 @@ -4926,8 +4927,8 @@ packages: - libbrotlidec >=1.1.0,<1.2.0a0 - libbrotlienc >=1.1.0,<1.2.0a0 - libgcc >=13 - - libgoogle-cloud >=2.32.0,<2.33.0a0 - - libgoogle-cloud-storage >=2.32.0,<2.33.0a0 + - libgoogle-cloud >=2.33.0,<2.34.0a0 + - libgoogle-cloud-storage >=2.33.0,<2.34.0a0 - libre2-11 >=2024.7.2 - libstdcxx >=13 - libutf8proc >=2.9.0,<2.10.0a0 @@ -4938,18 +4939,18 @@ packages: - snappy >=1.2.1,<1.3.0a0 - zstd >=1.5.6,<1.6.0a0 constrains: - - parquet-cpp <0.0a0 - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 8786061 - timestamp: 1733810643966 -- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-h4a2f8bd_6_cpu.conda - build_number: 6 - sha256: 9ed3ea1bc15005c0df187268ef91407afaa908cf82f36f5acbbf50ac24d7f806 - md5: 835cdd84195b84dc34d128bd5d3580b9 + size: 8770256 + timestamp: 1735684696564 +- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-h0ad35bc_7_cpu.conda + build_number: 7 + sha256: 4fbdd8bb89d912bf03f10f9373a8d96a1cdd7a7851e107393418a3d2715bc27e + md5: 4ba2173203f44bbf03d19aaba6ed07d3 depends: - __osx >=11.0 - aws-crt-cpp >=0.29.7,<0.29.8.0a0 @@ -4965,8 +4966,8 @@ packages: - libbrotlidec >=1.1.0,<1.2.0a0 - libbrotlienc >=1.1.0,<1.2.0a0 - libcxx >=18 - - libgoogle-cloud >=2.32.0,<2.33.0a0 - - libgoogle-cloud-storage >=2.32.0,<2.33.0a0 + - libgoogle-cloud >=2.33.0,<2.34.0a0 + - libgoogle-cloud-storage >=2.33.0,<2.34.0a0 - libre2-11 >=2024.7.2 - libutf8proc >=2.9.0,<2.10.0a0 - libzlib >=1.3.1,<2.0a0 @@ -4976,14 +4977,14 @@ packages: - snappy >=1.2.1,<1.3.0a0 - zstd >=1.5.6,<1.6.0a0 constrains: - - apache-arrow-proc =*=cpu - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 5494797 - timestamp: 1733808145854 + size: 5506699 + timestamp: 1735682962976 - conda: https://prefix.dev/conda-forge/win-64/libarrow-18.1.0-he01b112_7_cpu.conda build_number: 7 sha256: b995701632370977fc7e20fe9d9222314f0d67fac0a2ea606685414d48d46588 @@ -5020,33 +5021,33 @@ packages: purls: [] size: 5303299 timestamp: 1735686839461 -- conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_6_cpu.conda - build_number: 6 - sha256: a32fa1d71415afc02b5cf3cd4c0a6ec0af9e749308829cc65ff79689222ce479 - md5: 143f9288b64759a6427563f058c62f2b +- conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_7_cpu.conda + build_number: 7 + sha256: 87ea5d6a84d922d73975dce8661fccf257e72e755175b12c30e1181a34e37987 + md5: 12d84228204c56fec6ed113288014d11 depends: - __glibc >=2.17,<3.0.a0 - - libarrow 18.1.0 h44a453e_6_cpu + - libarrow 18.1.0 hd595efa_7_cpu - libgcc >=13 - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 611745 - timestamp: 1733810698469 -- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_6_cpu.conda - build_number: 6 - sha256: e1cae46409927470439ef9ae93ed09b3493d0579501ca9ebfa79ded212ee98d8 - md5: 97fc01254714e1572624baefdd7cc898 + size: 612463 + timestamp: 1735684749868 +- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_7_cpu.conda + build_number: 7 + sha256: 86e20cebfdb4f335e98265c1b88f5053bf3e3648768a317856295846bfdbf2b4 + md5: 3eaf71fe987de13061db795e03bb1a1c depends: - __osx >=11.0 - - libarrow 18.1.0 h4a2f8bd_6_cpu + - libarrow 18.1.0 h0ad35bc_7_cpu - libcxx >=18 license: Apache-2.0 license_family: APACHE purls: [] - size: 483713 - timestamp: 1733808246880 + size: 485185 + timestamp: 1735683071232 - conda: https://prefix.dev/conda-forge/win-64/libarrow-acero-18.1.0-h7d8d6a5_7_cpu.conda build_number: 7 sha256: e9f8e3f5bbef3251ca5a16a40ea6237af9f5d6372afc3adfeed11b9cc42caa41 @@ -5061,37 +5062,37 @@ packages: purls: [] size: 447461 timestamp: 1735686912086 -- conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_6_cpu.conda - build_number: 6 - sha256: 74eeb178070002842d3ed721769399320e3a68a0843319eaf899a092a31def26 - md5: 20ca46a6bc714a6ab189d5b3f46e66d8 +- conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_7_cpu.conda + build_number: 7 + sha256: 99c12511fba79c7947f78d676eae5857659084f687f375f68bc20bd4cddb0a0e + md5: 0a81eb63d7cd150f598c752e86388d57 depends: - __glibc >=2.17,<3.0.a0 - - libarrow 18.1.0 h44a453e_6_cpu - - libarrow-acero 18.1.0 hcb10f89_6_cpu + - libarrow 18.1.0 hd595efa_7_cpu + - libarrow-acero 18.1.0 hcb10f89_7_cpu - libgcc >=13 - - libparquet 18.1.0 h081d1f1_6_cpu + - libparquet 18.1.0 h081d1f1_7_cpu - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 586627 - timestamp: 1733810842604 -- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_6_cpu.conda - build_number: 6 - sha256: 6eba942ce926419f74e6e0a7c3994a7d78ab6be47115e6bb70e02136554736be - md5: 0774276be6659aaa0007f1b0f6ee19b0 + size: 587497 + timestamp: 1735684880531 +- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_7_cpu.conda + build_number: 7 + sha256: 52c5c4e9cd5f2ac91dcebb6a920ab2536febcea116ff8767e5439329d7da820b + md5: 97a2d3606682d94f7d73112e9ad684ae depends: - __osx >=11.0 - - libarrow 18.1.0 h4a2f8bd_6_cpu - - libarrow-acero 18.1.0 hf07054f_6_cpu + - libarrow 18.1.0 h0ad35bc_7_cpu + - libarrow-acero 18.1.0 hf07054f_7_cpu - libcxx >=18 - - libparquet 18.1.0 h636d7b7_6_cpu + - libparquet 18.1.0 h636d7b7_7_cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 489948 - timestamp: 1733809328231 + size: 491237 + timestamp: 1735684688308 - conda: https://prefix.dev/conda-forge/win-64/libarrow-dataset-18.1.0-h7d8d6a5_7_cpu.conda build_number: 7 sha256: ee32fc23819e10c58e9be6620d2ad6153d8b326f84cbd134aafe6a60a5d00c88 @@ -5108,43 +5109,43 @@ packages: purls: [] size: 435269 timestamp: 1735687174564 -- conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h3ee7192_6_cpu.conda - build_number: 6 - sha256: bda6728db019dd0c409b1996ad9ef6ab0bcee3a94dc66a8045e8c1049c566055 - md5: aa313b3168caf98d00b3753f5ba27650 +- conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_7_cpu.conda + build_number: 7 + sha256: 53ea53a06e137c2f81ebfdff3f978babb8b59e31f705a19b57056ec8754c1abf + md5: e128def53c133e8a23ac00cd4a479335 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 18.1.0 h44a453e_6_cpu - - libarrow-acero 18.1.0 hcb10f89_6_cpu - - libarrow-dataset 18.1.0 hcb10f89_6_cpu + - libarrow 18.1.0 hd595efa_7_cpu + - libarrow-acero 18.1.0 hcb10f89_7_cpu + - libarrow-dataset 18.1.0 hcb10f89_7_cpu - libgcc >=13 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 519989 - timestamp: 1733810903274 -- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h86344ea_6_cpu.conda - build_number: 6 - sha256: bafd9ca59ebb5ad34b77aff316ef7b59c5fb1eb8a7b6a15de8dcbdf3ce37556d - md5: c1c162f5bf569cff8bed6def705a899f + size: 521861 + timestamp: 1735684940668 +- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_7_cpu.conda + build_number: 7 + sha256: a45bbdd6932aed972d6c6ce30a7439aa8ec9d9b8ee5affb350d41e50abdc0127 + md5: 91927747173f65695e441346c7145e26 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 18.1.0 h4a2f8bd_6_cpu - - libarrow-acero 18.1.0 hf07054f_6_cpu - - libarrow-dataset 18.1.0 hf07054f_6_cpu + - libarrow 18.1.0 h0ad35bc_7_cpu + - libarrow-acero 18.1.0 hf07054f_7_cpu + - libarrow-dataset 18.1.0 hf07054f_7_cpu - libcxx >=18 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 451623 - timestamp: 1733809487176 + size: 452385 + timestamp: 1735684993831 - conda: https://prefix.dev/conda-forge/win-64/libarrow-substrait-18.1.0-h3dbecdf_7_cpu.conda build_number: 7 sha256: 600548a5ef61ae4f3ea41fd2a02878fdf9a6ebf1223ff4f18c67a3063910513e @@ -5617,27 +5618,31 @@ packages: purls: [] size: 155723 timestamp: 1734374084110 -- conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf - md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 +- conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda + sha256: 4d0d69ddf9cc7d724a1ccf3a9852e44c8aea9825692582bac2c4e8d21ec95ccd + md5: 8247f80f3dc464d9322e85007e307fe8 depends: - - libgcc-ng >=7.5.0 - - ncurses >=6.2,<7.0.0a0 + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 license: BSD-2-Clause license_family: BSD purls: [] - size: 123878 - timestamp: 1597616541093 -- conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20191231-hc8eb9b7_2.tar.bz2 - sha256: 3912636197933ecfe4692634119e8644904b41a58f30cad9d1fc02f6ba4d9fca - md5: 30e4362988a2623e9eb34337b83e01f9 + size: 134657 + timestamp: 1736191912705 +- conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda + sha256: fb934d7a03279ec8eae4bf1913ac9058fcf6fed35290d8ffa6e04157f396a3b1 + md5: af89aa84ffb5ee551ce0c137b951a3b5 depends: - - ncurses >=6.2,<7.0.0a0 + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 license: BSD-2-Clause license_family: BSD purls: [] - size: 96607 - timestamp: 1597616630749 + size: 107634 + timestamp: 1736192034117 - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 md5: 172bf1cd1ff8629f2b1179945ed45055 @@ -5865,45 +5870,45 @@ packages: purls: [] size: 524249 timestamp: 1729089441747 -- conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-2.32.0-h804f50b_0.conda - sha256: 126856add750013390dff664a3c3cd0f6f0cbbc683b0025a7ce9d1618968bc70 - md5: 3d96df4d6b1c88455e05b94ce8a14a53 +- conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-2.33.0-h2b5623c_1.conda + sha256: ae48ee93e2c226bf682f1e389c2fd51ae7bf77c2ce4b3aee069764f4be1c63f2 + md5: 61829a8dd5f4e2327e707572065bae41 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libcurl >=8.10.1,<9.0a0 + - libcurl >=8.11.1,<9.0a0 - libgcc >=13 - libgrpc >=1.67.1,<1.68.0a0 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libstdcxx >=13 - openssl >=3.4.0,<4.0a0 constrains: - - libgoogle-cloud 2.32.0 *_0 + - libgoogle-cloud 2.33.0 *_1 license: Apache-2.0 license_family: Apache purls: [] - size: 1249557 - timestamp: 1733512191906 -- conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-2.32.0-h8d8be31_0.conda - sha256: 722e49dbdc4486105d9f5b79a7ba4f9064602fe20c4015e97684c898ab8d3386 - md5: d7ab9e0eb7d55eac4943913073de61d7 + size: 1254656 + timestamp: 1735648569457 +- conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-2.33.0-hdbe95d5_1.conda + sha256: ce95aca02451694a4154c7770b6addf4fb859abf17912de6ec947da8469a56ce + md5: 91de1fbab8610974c0094c266bc63435 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libcurl >=8.10.1,<9.0a0 + - libcurl >=8.11.1,<9.0a0 - libcxx >=18 - libgrpc >=1.67.1,<1.68.0a0 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 - openssl >=3.4.0,<4.0a0 constrains: - - libgoogle-cloud 2.32.0 *_0 + - libgoogle-cloud 2.33.0 *_1 license: Apache-2.0 license_family: Apache purls: [] - size: 876210 - timestamp: 1733512539476 + size: 877594 + timestamp: 1735648230965 - conda: https://prefix.dev/conda-forge/win-64/libgoogle-cloud-2.33.0-h95c5cb2_1.conda sha256: ff10a5e71ae42c2e29849468b2fe6785bc9bcb1e61db0a40158c6638c28fee90 md5: 3c63396fe52bd0649c72fec64b92f641 @@ -5923,41 +5928,41 @@ packages: purls: [] size: 14439 timestamp: 1735649066152 -- conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-storage-2.32.0-h0121fbd_0.conda - sha256: d1b53d17df38b52a4bc6d1fe6af0e611d6480ce10b0af570c84bd38c8aa83b91 - md5: 877a5ec0431a5af83bf0cd0522bfe661 +- conda: https://prefix.dev/conda-forge/linux-64/libgoogle-cloud-storage-2.33.0-h0121fbd_1.conda + sha256: 41022523320ca8633a6c615710823e596efadb50f06d724e1a0c81e27994f257 + md5: b0cfb5044685a7a9fa43ae669124f0a0 depends: - __glibc >=2.17,<3.0.a0 - libabseil - libcrc32c >=1.1.2,<1.2.0a0 - libcurl - libgcc >=13 - - libgoogle-cloud 2.32.0 h804f50b_0 + - libgoogle-cloud 2.33.0 h2b5623c_1 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - openssl license: Apache-2.0 license_family: Apache purls: [] - size: 782108 - timestamp: 1733512329104 -- conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-storage-2.32.0-h7081f7f_0.conda - sha256: 609df2cf376ba66460f40143f835fc567cae4458df80705587cd2efd59c09bf1 - md5: 28f5ab5cf95170dfacd05d2bb301e573 + size: 784357 + timestamp: 1735648759177 +- conda: https://prefix.dev/conda-forge/osx-arm64/libgoogle-cloud-storage-2.33.0-h7081f7f_1.conda + sha256: c0524a22064bc17f5c037da09ba54cc9e767741ef645178e499750c44bec2531 + md5: af8e51382464d4cc2d0054977c40a732 depends: - __osx >=11.0 - libabseil - libcrc32c >=1.1.2,<1.2.0a0 - libcurl - libcxx >=18 - - libgoogle-cloud 2.32.0 h8d8be31_0 + - libgoogle-cloud 2.33.0 hdbe95d5_1 - libzlib >=1.3.1,<2.0a0 - openssl license: Apache-2.0 license_family: Apache purls: [] - size: 526895 - timestamp: 1733513644846 + size: 526963 + timestamp: 1735649222088 - conda: https://prefix.dev/conda-forge/win-64/libgoogle-cloud-storage-2.33.0-he5eb982_1.conda sha256: 76a916fba00a4bb395b85e7c2563d5ba325b04febb4f0e0066884ff39c54ec62 md5: 6ae574bba5f1294487936e5d5f0f4c11 @@ -5975,49 +5980,49 @@ packages: purls: [] size: 14336 timestamp: 1735649423845 -- conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.67.1-hc2c308b_0.conda - sha256: 870550c1faf524e9a695262cd4c31441b18ad542f16893bd3c5dbc93106705f7 - md5: 4606a4647bfe857e3cfe21ca12ac3afb +- conda: https://prefix.dev/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e + md5: 0c6497a760b99a926c7c12b74951a39c depends: - __glibc >=2.17,<3.0.a0 - - c-ares >=1.32.3,<2.0a0 + - c-ares >=1.34.4,<2.0a0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - libgcc >=13 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libre2-11 >=2024.7.2 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 + - openssl >=3.4.0,<4.0a0 - re2 constrains: - grpc-cpp =1.67.1 license: Apache-2.0 license_family: APACHE purls: [] - size: 7362336 - timestamp: 1730236333879 -- conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.67.1-hc70892a_0.conda - sha256: d2393fcd3c3584e5d58da4122f48bcf297567d2f6f14b3d1fcbd34fdd5040694 - md5: 624e27571fde34f8acc2afec840ac435 + size: 7792251 + timestamp: 1735584856826 +- conda: https://prefix.dev/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 depends: - __osx >=11.0 - - c-ares >=1.34.2,<2.0a0 + - c-ares >=1.34.4,<2.0a0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=17 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libre2-11 >=2024.7.2 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 + - openssl >=3.4.0,<4.0a0 - re2 constrains: - grpc-cpp =1.67.1 license: Apache-2.0 license_family: APACHE purls: [] - size: 4882208 - timestamp: 1730236299095 + size: 5311706 + timestamp: 1735585137716 - conda: https://prefix.dev/conda-forge/win-64/libgrpc-1.67.1-h0ac93cb_1.conda sha256: 4bf4b455fc8c56ac84001d394f93465c0cd42e78d8053a7c99668bba681b0973 md5: d41dfb3f07ea2f3687e9a2d7db31c506 @@ -6355,13 +6360,13 @@ packages: purls: [] size: 4165774 timestamp: 1730772154295 -- conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_6_cpu.conda - build_number: 6 - sha256: c691a59f1ebb6cedbf827f49f6cf414e08b0eec911f589133e6a8321e8ac701c - md5: 68788df49ce7480187eb6387f15b2b67 +- conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_7_cpu.conda + build_number: 7 + sha256: 55945b761130f60abdecf1551907ecfd05cb4a5958cf74d855b30c005ecb3592 + md5: b97013ef4e1dd2cf11594f06d5b5e83a depends: - __glibc >=2.17,<3.0.a0 - - libarrow 18.1.0 h44a453e_6_cpu + - libarrow 18.1.0 hd595efa_7_cpu - libgcc >=13 - libstdcxx >=13 - libthrift >=0.21.0,<0.21.1.0a0 @@ -6369,23 +6374,23 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 1204535 - timestamp: 1733810811118 -- conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_6_cpu.conda - build_number: 6 - sha256: 88c1e810bede65c54f1ebc51c14400f9e8cf0fc1f88a8c0a99210e2f5dfed582 - md5: 9b333c3a38e55f6c1b8733222e22f528 + size: 1205598 + timestamp: 1735684849150 +- conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_7_cpu.conda + build_number: 7 + sha256: bf42e43542a90edd86ba5aa5fd4543671625f1bc35f62be32688f00e18bae990 + md5: 93de9ba66a20db32a2646d313794b3a8 depends: - __osx >=11.0 - - libarrow 18.1.0 h4a2f8bd_6_cpu + - libarrow 18.1.0 h0ad35bc_7_cpu - libcxx >=18 - libthrift >=0.21.0,<0.21.1.0a0 - openssl >=3.4.0,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 873134 - timestamp: 1733809271282 + size: 873251 + timestamp: 1735684582558 - conda: https://prefix.dev/conda-forge/win-64/libparquet-18.1.0-ha850022_7_cpu.conda build_number: 7 sha256: 5b901e940bf1a4e8d9a776c8435713b44e19ab45970acb80ac17e28fa0ce830f @@ -6435,9 +6440,9 @@ packages: purls: [] size: 348933 timestamp: 1726235196095 -- conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda - sha256: 5e8fd4aa00193c85602ce6101dd28fe31306dff85c9725048f6dc828dfa7c421 - md5: ab0bff36363bec94720275a681af8b83 +- conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* @@ -6448,22 +6453,22 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 2945348 - timestamp: 1728565355702 -- conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-5.28.2-h8f0b736_0.conda - sha256: f732a6fa918428e2d5ba61e78fe11bb44a002cc8f6bb74c94ee5b1297fefcfd8 - md5: d2cb5991f2fb8eb079c80084435e9ce6 + size: 2960815 + timestamp: 1735577210663 +- conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libcxx >=17 + - libcxx >=18 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 2374965 - timestamp: 1728565334796 + size: 2271580 + timestamp: 1735576361997 - conda: https://prefix.dev/conda-forge/win-64/libprotobuf-5.28.3-h8309712_1.conda sha256: 78c1b917d50c0317579bd9a5714a6d544d69786fd3228a4201dc4e8710ef6348 md5: 3be9f2fb7dce19d66d5cf1003a34b0e1 @@ -6712,9 +6717,9 @@ packages: purls: [] size: 978878 timestamp: 1734399004259 -- conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_h791ef64_107.conda - sha256: 9e3703bc75f8e05864e75554f1026716ed8e4eb649caf5d75f7fea9e9b52d41b - md5: 02fbdf715b5b6405fedf744facd72d14 +- conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_he8ec5d7_108.conda + sha256: 96e04252aa1a64c8a50fcccb6e36a0f53f54b7eb9a61b2e1930191b67cce655c + md5: a070bb62918bea542fbb092c2abd7004 depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 @@ -6722,23 +6727,23 @@ packages: - libabseil >=20240722.0,<20240723.0a0 - libcblas >=3.9.0,<4.0a0 - libgcc >=13 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libstdcxx >=13 - libuv >=1.49.2,<2.0a0 - - mkl >=2023.2.0,<2024.0a0 + - mkl >=2024.2.2,<2025.0a0 - sleef >=3.7,<4.0a0 constrains: - - pytorch-gpu ==99999999 - - pytorch 2.5.1 cpu_mkl_*_107 - pytorch-cpu ==2.5.1 + - pytorch 2.5.1 cpu_mkl_*_108 + - pytorch-gpu ==99999999 license: BSD-3-Clause license_family: BSD purls: [] - size: 53345678 - timestamp: 1735189220828 -- conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_hf3ddf7c_7.conda - sha256: a06ddeb6b13b84f7fb2a9934962b390098b6194334ca880277193d9bcb227c7b - md5: 5deacd9c994edac6093bb8529eee85d7 + size: 53384470 + timestamp: 1736088424107 +- conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_hb579fdd_8.conda + sha256: 3e1306ca33285261dcb950ebba397dfe47ad36ae66d451746f107f5f9484fc12 + md5: fcd141fc3b6e5df95f175360c32c09eb depends: - __osx >=11.0 - libabseil * cxx17* @@ -6746,7 +6751,7 @@ packages: - libcblas >=3.9.0,<4.0a0 - libcxx >=18 - liblapack >=3.9.0,<4.0a0 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libuv >=1.49.2,<2.0a0 - llvm-openmp >=18.1.8 - numpy >=1.19,<3 @@ -6754,14 +6759,14 @@ packages: - python_abi 3.10.* *_cp310 - sleef >=3.7,<4.0a0 constrains: + - pytorch 2.5.1 cpu_generic_*_8 - pytorch-gpu ==99999999 - - pytorch 2.5.1 cpu_generic_*_7 - pytorch-cpu ==2.5.1 license: BSD-3-Clause license_family: BSD purls: [] - size: 28187542 - timestamp: 1735123792745 + size: 28266322 + timestamp: 1736093877602 - conda: https://prefix.dev/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda sha256: 9794e6388e780c3310d46f773bbc924d4053375c3fcdb07a704b57f4616db928 md5: 1e936bd23d737aac62a18e9a1e7f8b18 @@ -7334,19 +7339,19 @@ packages: - pkg:pypi/mdurl?source=hash-mapping size: 14465 timestamp: 1733255681319 -- conda: https://prefix.dev/conda-forge/linux-64/mkl-2023.2.0-h84fe81f_50496.conda - sha256: 046073737bf73153b0c39e343b197cdf0b7867d336962369407465a17ea5979a - md5: 81d4a1a57d618adf0152db973d93b2ad +- conda: https://prefix.dev/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda + sha256: 77906b0acead8f86b489da46f53916e624897338770dbf70b04b8f673c9273c1 + md5: 1459379c79dda834673426504d52b319 depends: - _openmp_mutex * *_llvm - _openmp_mutex >=4.5 - - llvm-openmp >=17.0.3 + - llvm-openmp >=19.1.2 - tbb 2021.* - license: LicenseRef-ProprietaryIntel + license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary purls: [] - size: 164432797 - timestamp: 1698350676814 + size: 124718448 + timestamp: 1730231808335 - conda: https://prefix.dev/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda sha256: 20e52b0389586d0b914a49cd286c5ccc9c47949bed60ca6df004d1d295f2edbd md5: 302dff2807f2927b3e9e0d19d60121de @@ -7945,9 +7950,9 @@ packages: purls: [] size: 240148 timestamp: 1733817010335 -- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda - sha256: 814b9dff1847b132c676ee6cc1a8cb2d427320779b93e1b6d76552275c128705 - md5: 23cc74f77eb99315c0360ec3533147a9 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda + sha256: f62f6bca4a33ca5109b6d571b052a394d836956d21b25b7ffd03376abf7a481f + md5: 4ce6875f75469b2757a65e10a5d05e31 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates @@ -7955,22 +7960,22 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 2947466 - timestamp: 1731377666602 -- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda - sha256: bd1d58ced46e75efa3b842c61642fd12272c69e9fe4d7261078bc082153a1d53 - md5: df307bbc703324722df0293c9ca2e418 + size: 2937158 + timestamp: 1736086387286 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + sha256: 97772762abc70b3a537683ca9fc3ff3d6099eb64e4aba3b9c99e6fce48422d21 + md5: 22f971393637480bda8c679f374d8861 depends: - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache purls: [] - size: 2935176 - timestamp: 1731377561525 -- conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda - sha256: e03045a0837e01ff5c75e9273a572553e7522290799807f918c917a9826a6484 - md5: d0d805d9b5524a14efb51b3bff965e83 + size: 2936415 + timestamp: 1736086108693 +- conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda + sha256: 519a06eaab7c878fbebb8cab98ea4a4465eafb1e9ed8c6ce67226068a80a92f0 + md5: fb45308ba8bfe1abf1f4a27bad24a743 depends: - ca-certificates - ucrt >=10.0.20348.0 @@ -7979,8 +7984,8 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 8491156 - timestamp: 1731379715927 + size: 8462960 + timestamp: 1736088436984 - conda: https://prefix.dev/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda sha256: 8db3d841c72f184de69e1237b900a2d79c742e30e8378973814543bf987b6bc6 md5: b94f689d8b1ce7dd212946e0331037ad @@ -8002,13 +8007,13 @@ packages: - pkg:pypi/opt-einsum?source=hash-mapping size: 62479 timestamp: 1733688053334 -- conda: https://prefix.dev/conda-forge/linux-64/orc-2.0.3-h97ab989_1.conda - sha256: 9de7e2746fde57c9b7f08ee87142014f6bb9b2d3a506839ea3e98baa99711576 - md5: 2f46eae652623114e112df13fae311cf +- conda: https://prefix.dev/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc + md5: 4f6f9f3f80354ad185e276c120eac3f0 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 @@ -8018,15 +8023,15 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 1189462 - timestamp: 1733509801323 -- conda: https://prefix.dev/conda-forge/osx-arm64/orc-2.0.3-hbcee414_1.conda - sha256: e5e72438a3cd967ebc774070e8c49500d2d6d4175f349400b327fee75d3bfc05 - md5: e808cf7819eaa1735c8790d7f9f482c7 + size: 1188881 + timestamp: 1735630209320 +- conda: https://prefix.dev/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 depends: - __osx >=11.0 - libcxx >=18 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - snappy >=1.2.1,<1.3.0a0 @@ -8035,8 +8040,8 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 437391 - timestamp: 1733510118673 + size: 438520 + timestamp: 1735630624140 - conda: https://prefix.dev/conda-forge/win-64/orc-2.0.3-haf104fe_2.conda sha256: 35522ebcdd10f9d8600cbffa99efd59053bf2148965cfbb4575680e61c1d41dd md5: c8abacd8bdb242c9ba9c9a6c7ec09b01 @@ -8507,17 +8512,16 @@ packages: purls: [] size: 110100 timestamp: 1733195786147 -- conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - sha256: 0d6133545f268b2b89c2617c196fc791f365b538d4057ecd636d658c3b1e885d - md5: b38dc0206e2a530e5c2cf11dc086b31a +- conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + sha256: 28a3e3161390a9d23bc02b4419448f8d27679d9e2c250e29849e37749c8de86b + md5: 232fb4577b6687b2d503ef8e254270c9 depends: - python >=3.9 license: BSD-2-Clause - license_family: BSD purls: - pkg:pypi/pygments?source=hash-mapping - size: 876700 - timestamp: 1733221731178 + size: 888600 + timestamp: 1736243563082 - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda sha256: a8192c823bfb6cdc57d2e12a8748ac1acb588c960c53e71c763f6359c5602e46 md5: 5842a1fa3b9b4f9fe7069b9ca5ed068d @@ -8828,9 +8832,9 @@ packages: purls: [] size: 6716 timestamp: 1723823166911 -- conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h61efdf7_107.conda - sha256: a7c7311dc097b79bbe313961a446eb40d10466a4bb9e954bde5a97fa86c063a5 - md5: 8c7e2eea5cb5a5f28bff495d2812195c +- conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h27a6d43_108.conda + sha256: ebd999d7d1612c87cdd15ecd893be759345712b7471937f9c917690210f419bb + md5: 9aec633b09fd455e84a637454068bfa8 depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 @@ -8841,11 +8845,11 @@ packages: - libabseil >=20240722.0,<20240723.0a0 - libcblas >=3.9.0,<4.0a0 - libgcc >=13 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libstdcxx >=13 - libtorch 2.5.1.* - libuv >=1.49.2,<2.0a0 - - mkl >=2023.2.0,<2024.0a0 + - mkl >=2024.2.2,<2025.0a0 - networkx - numpy >=1.19,<3 - python >=3.10,<3.11.0a0 @@ -8855,17 +8859,17 @@ packages: - sympy >=1.13.1,!=1.13.2 - typing_extensions constrains: - - pytorch-gpu ==99999999 - pytorch-cpu ==2.5.1 + - pytorch-gpu ==99999999 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/torch?source=hash-mapping - size: 34363522 - timestamp: 1735190907555 -- conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_hbae1486_7.conda - sha256: eeda4fd6288313c4c85d552af53fe6e01ad58b003c0237ecba3dda02b0d5847a - md5: 7137062a858e5988ba12271892db9158 + size: 34307765 + timestamp: 1736090964088 +- conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_h3256795_8.conda + sha256: 2f548d400e5014028b89339889768093730e0cf2e3e5d7c7ece9eddde646a0a2 + md5: 16985e88a59d007aa4d0a8b13f820e7c depends: - __osx >=11.0 - filelock @@ -8876,7 +8880,7 @@ packages: - libcblas >=3.9.0,<4.0a0 - libcxx >=18 - liblapack >=3.9.0,<4.0a0 - - libprotobuf >=5.28.2,<5.28.3.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 - libtorch 2.5.1.* - libuv >=1.49.2,<2.0a0 - llvm-openmp >=18.1.8 @@ -8897,8 +8901,8 @@ packages: license_family: BSD purls: - pkg:pypi/torch?source=hash-mapping - size: 22808644 - timestamp: 1735124463647 + size: 22573321 + timestamp: 1736094550662 - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 md5: 3eeeeb9e4827ace8c0c1419c85d590ad @@ -9093,9 +9097,9 @@ packages: purls: [] size: 355142 timestamp: 1734415467047 -- conda: https://prefix.dev/conda-forge/linux-64/scipy-1.14.1-py310hfcf56fc_2.conda - sha256: a15008a51fd6b6dcaeb5563869ff0a8a015f1e0a8634a9d89d2c189eefbd7182 - md5: b5d548b2a7cf8d0c74fc6c4bf42d1ca5 +- conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.0-py310hfa6ec8c_0.conda + sha256: 6d3a2e3a942f8a2b383c9a94a0a06c34b75511adbe93158c20427b659d0cafae + md5: 5af85973838c580ab7f4f72008c8b237 depends: - __glibc >=2.17,<3.0.a0 - libblas >=3.9.0,<4.0a0 @@ -9114,11 +9118,11 @@ packages: license_family: BSD purls: - pkg:pypi/scipy?source=hash-mapping - size: 16791594 - timestamp: 1733621553250 -- conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.14.1-py310hed58976_2.conda - sha256: 58bdf102dec51c487125efa354504b1bfbcc522503ed73d8981a0ba4be84beed - md5: d4c01f1e543b31787b1e88dfe6598e76 + size: 18405029 + timestamp: 1736010557840 +- conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.0-py310hd50a768_0.conda + sha256: 3a5f5a1f3a9b8c9e0fec02821638c8958de4a579f8637d5a66eeff682deb246d + md5: b1c91b7bfece72a5bf5f03dc0b7a3055 depends: - __osx >=11.0 - libblas >=3.9.0,<4.0a0 @@ -9137,11 +9141,11 @@ packages: license_family: BSD purls: - pkg:pypi/scipy?source=hash-mapping - size: 14414516 - timestamp: 1733621656037 -- conda: https://prefix.dev/conda-forge/win-64/scipy-1.14.1-py310hbd0dde3_2.conda - sha256: 761829fa9c91fdffff0ba5a1f56f7d4cc00bec71ca7fa06859dc7f5a98117273 - md5: 72a2a7c264a8b48d113111756c2bbbb4 + size: 15057534 + timestamp: 1736010232496 +- conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.0-py310h164493e_0.conda + sha256: c06c0722006125176005e77a9d739d19eb4003c315b0092fc5358a9005f6abb7 + md5: eb011c11b5f60006cab90584b3a7053d depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 @@ -9158,8 +9162,8 @@ packages: license_family: BSD purls: - pkg:pypi/scipy?source=hash-mapping - size: 15278855 - timestamp: 1733622652965 + size: 17162281 + timestamp: 1736011322833 - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda sha256: abb12e1dd515b13660aacb5d0fd43835bc2186cab472df25b7716cd65e095111 md5: fc80f7995e396cbaeabd23cf46c413dc @@ -9764,6 +9768,7 @@ packages: - platformdirs >=3.9.1,<5 - python >=3.9 license: MIT + license_family: MIT purls: - pkg:pypi/virtualenv?source=hash-mapping size: 3350367 diff --git a/pyproject.toml b/pyproject.toml index 58c02fab..d139278e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -200,12 +200,13 @@ files = ["src", "tests"] python_version = "3.10" warn_unused_configs = true strict = true -enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] -warn_unreachable = true +enable_error_code = ["ignore-without-code", "truthy-bool"] disallow_untyped_defs = false disallow_incomplete_defs = false # data-apis/array-api#589 disallow_any_expr = false +# false positives with input validation +disable_error_code = ["redundant-expr", "unreachable"] [[tool.mypy.overrides]] module = "array_api_extra.*" @@ -228,6 +229,8 @@ reportExplicitAny = false reportUnknownMemberType = false # no array-api-compat type stubs reportUnknownVariableType = false +# false positives for input validation +reportUnreachable = false # Ruff diff --git a/src/array_api_extra/_funcs.py b/src/array_api_extra/_funcs.py index db0a1af1..2f4bc0f4 100644 --- a/src/array_api_extra/_funcs.py +++ b/src/array_api_extra/_funcs.py @@ -555,7 +555,7 @@ def sinc(x: Array, /, *, xp: ModuleType | None = None) -> Array: def pad( x: Array, - pad_width: int, + pad_width: int | tuple[int, int] | list[tuple[int, int]], mode: str = "constant", *, xp: ModuleType | None = None, @@ -568,8 +568,12 @@ def pad( ---------- x : array Input array. - pad_width : int + pad_width : int or tuple of ints or list of pairs of ints Pad the input array with this many elements from each side. + If a list of tuples, ``[(before_0, after_0), ... (before_N, after_N)]``, + each pair applies to the corresponding axis of ``x``. + A single tuple, ``(before, after)``, is equivalent to a list of ``x.ndim`` + copies of this tuple. mode : str, optional Only "constant" mode is currently supported, which pads with the value passed to `constant_values`. @@ -590,16 +594,44 @@ def pad( value = constant_values + # make pad_width a list of length-2 tuples of ints + x_ndim = cast(int, x.ndim) + if isinstance(pad_width, int): + pad_width = [(pad_width, pad_width)] * x_ndim + if isinstance(pad_width, tuple): + pad_width = [pad_width] * x_ndim + if xp is None: xp = array_namespace(x) + # https://github.com/data-apis/array-api-extra/pull/82#discussion_r1905688819 + slices: list[slice] = [] # type: ignore[no-any-explicit] + newshape: list[int] = [] + for ax, w_tpl in enumerate(pad_width): + if len(w_tpl) != 2: + msg = f"expect a 2-tuple (before, after), got {w_tpl}." + raise ValueError(msg) + + sh = x.shape[ax] + if w_tpl[0] == 0 and w_tpl[1] == 0: + sl = slice(None, None, None) + else: + start, stop = w_tpl + stop = None if stop == 0 else -stop + + sl = slice(start, stop, None) + sh += w_tpl[0] + w_tpl[1] + + newshape.append(sh) + slices.append(sl) + padded = xp.full( - tuple(x + 2 * pad_width for x in x.shape), + tuple(newshape), fill_value=value, dtype=x.dtype, device=_compat.device(x), ) - padded[(slice(pad_width, -pad_width, None),) * x.ndim] = x + padded[tuple(slices)] = x return padded @@ -781,7 +813,7 @@ def _update_common( raise ValueError(msg) if copy not in (True, False, None): - msg = f"copy must be True, False, or None; got {copy!r}" # pyright: ignore[reportUnreachable] + msg = f"copy must be True, False, or None; got {copy!r}" raise ValueError(msg) if copy is None: diff --git a/tests/test_funcs.py b/tests/test_funcs.py index 938a4f31..2fc9041a 100644 --- a/tests/test_funcs.py +++ b/tests/test_funcs.py @@ -416,3 +416,22 @@ def test_device(self): def test_xp(self): assert_array_equal(pad(xp.asarray(0), 1, xp=xp), xp.zeros(3)) + + def test_tuple_width(self): + a = xp.reshape(xp.arange(12), (3, 4)) + padded = pad(a, (1, 0)) + assert padded.shape == (4, 5) + + padded = pad(a, (1, 2)) + assert padded.shape == (6, 7) + + with pytest.raises(ValueError, match="expect a 2-tuple"): + pad(a, [(1, 2, 3)]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] + + def test_list_of_tuples_width(self): + a = xp.reshape(xp.arange(12), (3, 4)) + padded = pad(a, [(1, 0), (0, 2)]) + assert padded.shape == (4, 6) + + padded = pad(a, [(1, 0), (0, 0)]) + assert padded.shape == (4, 4) From bdb4df04721c26337f8d18d3acd9010dff96b0ad Mon Sep 17 00:00:00 2001 From: Lucas Colley Date: Tue, 7 Jan 2025 22:21:15 +0000 Subject: [PATCH 05/14] MAINT: use some enums (#84) --- pixi.lock | 100 +++++++++++++++++----------------- pyproject.toml | 5 ++ src/array_api_extra/_funcs.py | 52 +++++++++++++----- tests/test_at.py | 63 ++++++++++++--------- 4 files changed, 129 insertions(+), 91 deletions(-) diff --git a/pixi.lock b/pixi.lock index 23fcb3ee..5d3612f7 100644 --- a/pixi.lock +++ b/pixi.lock @@ -170,7 +170,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_104.conda + - conda: https://prefix.dev/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda - conda: https://prefix.dev/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda - conda: https://prefix.dev/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda @@ -343,7 +343,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_104.conda + - conda: https://prefix.dev/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda - conda: https://prefix.dev/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda @@ -675,7 +675,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda @@ -713,7 +713,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda @@ -751,7 +751,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda @@ -788,7 +788,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda @@ -806,7 +806,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda @@ -823,7 +823,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda @@ -931,7 +931,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.2-py313h536fd9c_1.conda @@ -1055,7 +1055,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.2-py313h20a7fcf_1.conda @@ -1175,7 +1175,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.2-py313ha7868ed_1.conda @@ -1269,7 +1269,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.2-py313h536fd9c_1.conda @@ -1333,7 +1333,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.2-py313h20a7fcf_1.conda @@ -1395,7 +1395,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.2-py313ha7868ed_1.conda @@ -1504,7 +1504,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.2-py313h536fd9c_1.conda @@ -1600,7 +1600,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.2-py313h20a7fcf_1.conda @@ -1694,7 +1694,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.2-py313ha7868ed_1.conda @@ -1770,7 +1770,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda @@ -1808,7 +1808,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda @@ -1846,7 +1846,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda @@ -2043,7 +2043,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_104.conda + - conda: https://prefix.dev/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda - conda: https://prefix.dev/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda - conda: https://prefix.dev/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda @@ -2216,7 +2216,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda - - conda: https://prefix.dev/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_104.conda + - conda: https://prefix.dev/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda - conda: https://prefix.dev/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://prefix.dev/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda @@ -2469,7 +2469,7 @@ packages: - pypi: . name: array-api-extra version: 0.5.1.dev0 - sha256: 844f582d7ea2045c164b04200b3bc32dd7f4c868cad9da16621a743f0d0bf381 + sha256: d8083ec4ee363a390f2afd622df56756078ce3ba5f1f67e88867111a2d306b57 requires_dist: - array-api-compat>=1.10.0,<2 - furo>=2023.8.17 ; extra == 'docs' @@ -8627,10 +8627,10 @@ packages: purls: [] size: 25199631 timestamp: 1733409331823 -- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda - build_number: 102 - sha256: b10f25c5edc203d15b3f54861bec4868b8200ebc16c8cbc82202e4c8da2b183e - md5: 6e7535f1d1faf524e9210d2689b3149b +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda + build_number: 103 + sha256: 365f9294ba2d36513f85085b95b705d4d02110a6d11ec4b683f5a10d37dde020 + md5: 899de8f76e198a36bc5a36132a6db887 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -8640,7 +8640,7 @@ packages: - libgcc >=13 - liblzma >=5.6.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.47.0,<4.0a0 + - libsqlite >=3.47.2,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 @@ -8651,8 +8651,8 @@ packages: - tzdata license: Python-2.0 purls: [] - size: 33263183 - timestamp: 1733436074842 + size: 33262248 + timestamp: 1736273267565 - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.10.16-h870587a_1_cpython.conda build_number: 1 sha256: cd617b15712c4f9316b22c75459311ed106ccb0659c0bf36e281a9162b4e2d95 @@ -8675,10 +8675,10 @@ packages: purls: [] size: 12372048 timestamp: 1733408850559 -- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda - build_number: 102 - sha256: 0379adf6bb35ca47036860983701e8f6fae89c028d422f2b9439f3110893bc24 - md5: 8c65c1dfc98312ef8666dbb7c7fc47ca +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda + build_number: 103 + sha256: 0ebda5e85d5d37f0af1dae8ad500ef298a547ec790cdbfdb271ffbe4d2c56770 + md5: b43efdca6d96347894527844a4cdd5c8 depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 @@ -8686,7 +8686,7 @@ packages: - libffi >=3.4,<4.0a0 - liblzma >=5.6.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.47.0,<4.0a0 + - libsqlite >=3.47.2,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.4.0,<4.0a0 @@ -8696,8 +8696,8 @@ packages: - tzdata license: Python-2.0 purls: [] - size: 12905237 - timestamp: 1733433280639 + size: 11727435 + timestamp: 1736271845822 - conda: https://prefix.dev/conda-forge/win-64/python-3.10.16-h37870fc_1_cpython.conda build_number: 1 sha256: 3392db6a7a90864d3fd1ce281859a49e27ee68121b63eece2ae6f1dbb2a8aaf1 @@ -8720,17 +8720,17 @@ packages: purls: [] size: 16061214 timestamp: 1733408154785 -- conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda - build_number: 102 - sha256: ee41eda85ebc3a257a3b21a76d255d986b08a285d891e418cbfb70113ee14684 - md5: 70568ba8bbd5f0c7b830e690775eb8b7 +- conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda + build_number: 103 + sha256: 1517cbdf453557c7445c05b77c23da95a8b45586b270c6534f822c5b64bfeeaf + md5: 884ad80bf8454b8feff00b1f77a3dda9 depends: - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - liblzma >=5.6.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.47.0,<4.0a0 + - libsqlite >=3.47.2,<4.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.4.0,<4.0a0 - python_abi 3.13.* *_cp313 @@ -8741,8 +8741,8 @@ packages: - vc14_runtime >=14.29.30139 license: Python-2.0 purls: [] - size: 16753813 - timestamp: 1733433028707 + size: 16841405 + timestamp: 1736270799704 - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 md5: 5ba79d7c71f03c678c8ead841f347d6e @@ -9440,21 +9440,21 @@ packages: - pkg:pypi/stack-data?source=hash-mapping size: 26988 timestamp: 1733569565672 -- conda: https://prefix.dev/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_104.conda - sha256: 35b2620d109c8a01a301222b4f546690316b7ed61d5c0325ec4a317fa27ea8d7 - md5: 68085d736d2b2f54498832b65059875d +- conda: https://prefix.dev/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda + sha256: 929d939c5a8bcdc10a17501890918da68cf14a5883b36fddf77b8f0fbf040be2 + md5: 254cd5083ffa04d96e3173397a3d30f4 depends: - __unix - cpython - gmpy2 >=2.0.8 - mpmath >=0.19 - - python >=3.8 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/sympy?source=hash-mapping - size: 4561387 - timestamp: 1728484644967 + size: 4523617 + timestamp: 1736248315124 - conda: https://prefix.dev/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda sha256: 090023bddd40d83468ef86573976af8c514f64119b2bd814ee63a838a542720a md5: 959484a66b4b76befcddc4fa97c95567 diff --git a/pyproject.toml b/pyproject.toml index d139278e..dadc311f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -232,6 +232,11 @@ reportUnknownVariableType = false # false positives for input validation reportUnreachable = false +executionEnvironments = [ + { root = "tests", reportPrivateUsage = false }, + { root = "src" }, +] + # Ruff diff --git a/src/array_api_extra/_funcs.py b/src/array_api_extra/_funcs.py index 2f4bc0f4..0d8bb162 100644 --- a/src/array_api_extra/_funcs.py +++ b/src/array_api_extra/_funcs.py @@ -6,8 +6,9 @@ import operator import warnings from collections.abc import Callable +from enum import Enum from types import ModuleType -from typing import ClassVar, Literal, cast +from typing import ClassVar, cast from ._lib import _compat, _utils from ._lib._compat import ( @@ -635,6 +636,31 @@ def pad( return padded +class _AtOp(Enum): + """Operations for use in `xpx.at`.""" + + SET = "set" + ADD = "add" + SUBTRACT = "subtract" + MULTIPLY = "multiply" + DIVIDE = "divide" + POWER = "power" + MIN = "min" + MAX = "max" + + # @override from Python 3.12 + def __str__(self) -> str: # type: ignore[explicit-override] # pyright: ignore[reportImplicitOverride] + """ + Return string representation (useful for pytest logs). + + Returns + ------- + str + The operation's name. + """ + return self.value + + _undef = object() @@ -784,7 +810,7 @@ def __getitem__(self, idx: Index, /) -> at: # numpydoc ignore=PR01,RT01 def _update_common( self, - at_op: str, + at_op: _AtOp, y: Array, /, copy: bool | None, @@ -827,7 +853,7 @@ def _update_common( if copy: if is_jax_array(x): # Use JAX's at[] - func = cast(Callable[[Array], Array], getattr(x.at[idx], at_op)) + func = cast(Callable[[Array], Array], getattr(x.at[idx], at_op.value)) return func(y), None # Emulate at[] behaviour for non-JAX arrays # with a copy followed by an update @@ -856,7 +882,7 @@ def set( xp: ModuleType | None = None, ) -> Array: # numpydoc ignore=PR01,RT01 """Apply ``x[idx] = y`` and return the update array.""" - res, x = self._update_common("set", y, copy=copy, xp=xp) + res, x = self._update_common(_AtOp.SET, y, copy=copy, xp=xp) if res is not None: return res assert x is not None @@ -865,9 +891,7 @@ def set( def _iop( self, - at_op: Literal[ - "set", "add", "subtract", "multiply", "divide", "power", "min", "max" - ], + at_op: _AtOp, elwise_op: Callable[[Array, Array], Array], y: Array, /, @@ -903,7 +927,7 @@ def add( # Note for this and all other methods based on _iop: # operator.iadd and operator.add subtly differ in behaviour, as # only iadd will trigger exceptions when y has an incompatible dtype. - return self._iop("add", operator.iadd, y, copy=copy, xp=xp) + return self._iop(_AtOp.ADD, operator.iadd, y, copy=copy, xp=xp) def subtract( self, @@ -913,7 +937,7 @@ def subtract( xp: ModuleType | None = None, ) -> Array: # numpydoc ignore=PR01,RT01 """Apply ``x[idx] -= y`` and return the updated array.""" - return self._iop("subtract", operator.isub, y, copy=copy, xp=xp) + return self._iop(_AtOp.SUBTRACT, operator.isub, y, copy=copy, xp=xp) def multiply( self, @@ -923,7 +947,7 @@ def multiply( xp: ModuleType | None = None, ) -> Array: # numpydoc ignore=PR01,RT01 """Apply ``x[idx] *= y`` and return the updated array.""" - return self._iop("multiply", operator.imul, y, copy=copy, xp=xp) + return self._iop(_AtOp.MULTIPLY, operator.imul, y, copy=copy, xp=xp) def divide( self, @@ -933,7 +957,7 @@ def divide( xp: ModuleType | None = None, ) -> Array: # numpydoc ignore=PR01,RT01 """Apply ``x[idx] /= y`` and return the updated array.""" - return self._iop("divide", operator.itruediv, y, copy=copy, xp=xp) + return self._iop(_AtOp.DIVIDE, operator.itruediv, y, copy=copy, xp=xp) def power( self, @@ -943,7 +967,7 @@ def power( xp: ModuleType | None = None, ) -> Array: # numpydoc ignore=PR01,RT01 """Apply ``x[idx] **= y`` and return the updated array.""" - return self._iop("power", operator.ipow, y, copy=copy, xp=xp) + return self._iop(_AtOp.POWER, operator.ipow, y, copy=copy, xp=xp) def min( self, @@ -956,7 +980,7 @@ def min( if xp is None: xp = array_namespace(self._x) y = xp.asarray(y) - return self._iop("min", xp.minimum, y, copy=copy, xp=xp) + return self._iop(_AtOp.MIN, xp.minimum, y, copy=copy, xp=xp) def max( self, @@ -969,4 +993,4 @@ def max( if xp is None: xp = array_namespace(self._x) y = xp.asarray(y) - return self._iop("max", xp.maximum, y, copy=copy, xp=xp) + return self._iop(_AtOp.MAX, xp.maximum, y, copy=copy, xp=xp) diff --git a/tests/test_at.py b/tests/test_at.py index f50b9248..bd4e444a 100644 --- a/tests/test_at.py +++ b/tests/test_at.py @@ -1,5 +1,6 @@ from collections.abc import Callable, Generator from contextlib import contextmanager +from enum import Enum from importlib import import_module from typing import cast @@ -13,31 +14,37 @@ ) from array_api_extra import at +from array_api_extra._funcs import _AtOp from array_api_extra._lib._typing import Array -all_libraries = ( - "array_api_strict", - "numpy", - "numpy_readonly", - "cupy", - "torch", - "dask.array", - "sparse", - "jax.numpy", -) + +class Library(Enum): + ARRAY_API_STRICT = "array_api_strict" + NUMPY = "numpy" + NUMPY_READONLY = "numpy_readonly" + CUPY = "cupy" + TORCH = "torch" + DASK_ARRAY = "dask.array" + SPARSE = "sparse" + JAX_NUMPY = "jax.numpy" + + # @override from Python 3.12 + def __str__(self) -> str: # type: ignore[explicit-override] # pyright: ignore[reportImplicitOverride] + return self.value -@pytest.fixture(params=all_libraries) +@pytest.fixture(params=tuple(Library)) def array(request: pytest.FixtureRequest) -> Array: library = request.param - if library == "numpy_readonly": + if library is Library.NUMPY_READONLY: x = np.asarray([10.0, 20.0, 30.0]) x.flags.writeable = False else: + library_name = library.value try: - lib = import_module(library) + lib = import_module(library_name) except ImportError: - pytest.skip(f"{library} is not installed") + pytest.skip(f"{library_name} is not installed") x = lib.asarray([10.0, 20.0, 30.0]) return x @@ -79,21 +86,21 @@ def assert_copy(array: Array, copy: bool | None) -> Generator[None, None, None]: @pytest.mark.parametrize( ("op", "arg", "expect"), [ - ("set", 40.0, [10.0, 40.0, 40.0]), - ("add", 40.0, [10.0, 60.0, 70.0]), - ("subtract", 100.0, [10.0, -80.0, -70.0]), - ("multiply", 2.0, [10.0, 40.0, 60.0]), - ("divide", 2.0, [10.0, 10.0, 15.0]), - ("power", 2.0, [10.0, 400.0, 900.0]), - ("min", 25.0, [10.0, 20.0, 25.0]), - ("max", 25.0, [10.0, 25.0, 30.0]), + (_AtOp.SET, 40.0, [10.0, 40.0, 40.0]), + (_AtOp.ADD, 40.0, [10.0, 60.0, 70.0]), + (_AtOp.SUBTRACT, 100.0, [10.0, -80.0, -70.0]), + (_AtOp.MULTIPLY, 2.0, [10.0, 40.0, 60.0]), + (_AtOp.DIVIDE, 2.0, [10.0, 10.0, 15.0]), + (_AtOp.POWER, 2.0, [10.0, 400.0, 900.0]), + (_AtOp.MIN, 25.0, [10.0, 20.0, 25.0]), + (_AtOp.MAX, 25.0, [10.0, 25.0, 30.0]), ], ) def test_update_ops( array: Array, kwargs: dict[str, bool | None], expect_copy: bool | None, - op: str, + op: _AtOp, arg: float, expect: list[float], ): @@ -101,7 +108,7 @@ def test_update_ops( pytest.skip("at() does not support updates on sparse arrays") with assert_copy(array, expect_copy): - func = cast(Callable[..., Array], getattr(at(array)[1:], op)) # type: ignore[no-any-explicit] + func = cast(Callable[..., Array], getattr(at(array)[1:], op.value)) # type: ignore[no-any-explicit] y = func(arg, **kwargs) assert isinstance(y, type(array)) assert_array_equal(y, expect) @@ -141,8 +148,10 @@ def test_alternate_index_syntax(): @pytest.mark.parametrize("copy", [True, False]) -@pytest.mark.parametrize("op", ["add", "subtract", "multiply", "divide", "power"]) -def test_iops_incompatible_dtype(op: str, copy: bool): +@pytest.mark.parametrize( + "op", [_AtOp.ADD, _AtOp.SUBTRACT, _AtOp.MULTIPLY, _AtOp.DIVIDE, _AtOp.POWER] +) +def test_iops_incompatible_dtype(op: _AtOp, copy: bool): """Test that at() replicates the backend's behaviour for in-place operations with incompatible dtypes. @@ -155,6 +164,6 @@ def test_iops_incompatible_dtype(op: str, copy: bool): to dtype('int64') with casting rule 'same_kind' """ a = np.asarray([2, 4]) - func = cast(Callable[..., Array], getattr(at(a)[:], op)) # type: ignore[no-any-explicit] + func = cast(Callable[..., Array], getattr(at(a)[:], op.value)) # type: ignore[no-any-explicit] with pytest.raises(TypeError, match="Cannot cast ufunc"): func(1.1, copy=copy) From 5eaf84eaafd4174d94fde72d8111573377338292 Mon Sep 17 00:00:00 2001 From: Guido Imperiale Date: Wed, 8 Jan 2025 12:37:43 +0000 Subject: [PATCH 06/14] TST: use pytest.importorskip (#85) --- tests/test_at.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/test_at.py b/tests/test_at.py index bd4e444a..24d356c0 100644 --- a/tests/test_at.py +++ b/tests/test_at.py @@ -1,7 +1,6 @@ from collections.abc import Callable, Generator from contextlib import contextmanager from enum import Enum -from importlib import import_module from typing import cast import numpy as np @@ -40,12 +39,8 @@ def array(request: pytest.FixtureRequest) -> Array: x = np.asarray([10.0, 20.0, 30.0]) x.flags.writeable = False else: - library_name = library.value - try: - lib = import_module(library_name) - except ImportError: - pytest.skip(f"{library_name} is not installed") - x = lib.asarray([10.0, 20.0, 30.0]) + xp = pytest.importorskip(library.value) + x = xp.asarray([10.0, 20.0, 30.0]) return x From 17084826a7715d4c4e82d6e92544e1cf05237efa Mon Sep 17 00:00:00 2001 From: Lucas Colley Date: Wed, 8 Jan 2025 15:49:01 +0000 Subject: [PATCH 07/14] MAINT: update comment with upstream issue --- src/array_api_extra/_funcs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/array_api_extra/_funcs.py b/src/array_api_extra/_funcs.py index 0d8bb162..5efbe315 100644 --- a/src/array_api_extra/_funcs.py +++ b/src/array_api_extra/_funcs.py @@ -605,7 +605,7 @@ def pad( if xp is None: xp = array_namespace(x) - # https://github.com/data-apis/array-api-extra/pull/82#discussion_r1905688819 + # https://github.com/python/typeshed/issues/13376 slices: list[slice] = [] # type: ignore[no-any-explicit] newshape: list[int] = [] for ax, w_tpl in enumerate(pad_width): From cc9f4030b7b1cf914cb354f5707539a665763f2f Mon Sep 17 00:00:00 2001 From: Guido Imperiale Date: Tue, 14 Jan 2025 15:51:34 +0000 Subject: [PATCH 08/14] TST/BUG: run all tests on all backends; fix backend-specific bugs (#88) --- .pre-commit-config.yaml | 2 +- pixi.lock | 2 +- pyproject.toml | 3 +- src/array_api_extra/_funcs.py | 16 +- src/array_api_extra/_lib/_compat.py | 15 ++ src/array_api_extra/_lib/_compat.pyi | 5 + src/array_api_extra/_lib/_testing.py | 144 ++++++++++++++ src/array_api_extra/_lib/_utils.py | 4 +- tests/__init__.py | 1 + tests/conftest.py | 86 ++++++++ tests/test_at.py | 54 ++--- tests/test_funcs.py | 287 ++++++++++++++------------- tests/test_testing.py | 68 +++++++ tests/test_utils.py | 33 +-- vendor_tests/test_vendor.py | 10 + 15 files changed, 529 insertions(+), 201 deletions(-) create mode 100644 src/array_api_extra/_lib/_testing.py create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/test_testing.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 42e22062..655be69a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,9 +44,9 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: "v0.8.2" hooks: + - id: ruff-format - id: ruff args: ["--fix", "--show-fixes"] - - id: ruff-format - repo: https://github.com/codespell-project/codespell rev: "v2.3.0" diff --git a/pixi.lock b/pixi.lock index 5d3612f7..2790b207 100644 --- a/pixi.lock +++ b/pixi.lock @@ -2469,7 +2469,7 @@ packages: - pypi: . name: array-api-extra version: 0.5.1.dev0 - sha256: d8083ec4ee363a390f2afd622df56756078ce3ba5f1f67e88867111a2d306b57 + sha256: 8b4533cc75534abb69425a1e5c9f6a4ab96949562d2e90d41ea0e22187a02c1b requires_dist: - array-api-compat>=1.10.0,<2 - furo>=2023.8.17 ; extra == 'docs' diff --git a/pyproject.toml b/pyproject.toml index dadc311f..4f5ddac0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -180,7 +180,7 @@ xfail_strict = true filterwarnings = ["error"] log_cli_level = "INFO" testpaths = ["tests"] - +markers = ["skip_xp_backend(library, *, reason=None): Skip test for a specific backend"] # Coverage @@ -315,6 +315,7 @@ checks = [ exclude = [ # don't report on objects that match any of these regex '.*test_at.*', '.*test_funcs.*', + '.*test_testing.*', '.*test_utils.*', '.*test_version.*', '.*test_vendor.*', diff --git a/src/array_api_extra/_funcs.py b/src/array_api_extra/_funcs.py index 5efbe315..7502561a 100644 --- a/src/array_api_extra/_funcs.py +++ b/src/array_api_extra/_funcs.py @@ -214,8 +214,12 @@ def create_diagonal( raise ValueError(err_msg) n = x.shape[0] + abs(offset) diag = xp.zeros(n**2, dtype=x.dtype, device=_compat.device(x)) - i = offset if offset >= 0 else abs(offset) * n - diag[i : min(n * (n - offset), diag.shape[0]) : n + 1] = x + + start = offset if offset >= 0 else abs(offset) * n + stop = min(n * (n - offset), diag.shape[0]) + step = n + 1 + diag = at(diag)[start:stop:step].set(x) + return xp.reshape(diag, (n, n)) @@ -407,9 +411,8 @@ def kron(a: Array, b: Array, /, *, xp: ModuleType | None = None) -> Array: result = xp.multiply(a_arr, b_arr) # Reshape back and return - a_shape = xp.asarray(a_shape) - b_shape = xp.asarray(b_shape) - return xp.reshape(result, tuple(xp.multiply(a_shape, b_shape))) + res_shape = tuple(a_s * b_s for a_s, b_s in zip(a_shape, b_shape, strict=True)) + return xp.reshape(result, res_shape) def setdiff1d( @@ -632,8 +635,7 @@ def pad( dtype=x.dtype, device=_compat.device(x), ) - padded[tuple(slices)] = x - return padded + return at(padded, tuple(slices)).set(x) class _AtOp(Enum): diff --git a/src/array_api_extra/_lib/_compat.py b/src/array_api_extra/_lib/_compat.py index a24175da..7d843f19 100644 --- a/src/array_api_extra/_lib/_compat.py +++ b/src/array_api_extra/_lib/_compat.py @@ -6,20 +6,35 @@ from ..._array_api_compat_vendor import ( # pyright: ignore[reportMissingImports] array_namespace, device, + is_cupy_namespace, is_jax_array, + is_jax_namespace, + is_pydata_sparse_namespace, + is_torch_namespace, is_writeable_array, + size, ) except ImportError: from array_api_compat import ( # pyright: ignore[reportMissingTypeStubs] array_namespace, device, + is_cupy_namespace, is_jax_array, + is_jax_namespace, + is_pydata_sparse_namespace, + is_torch_namespace, is_writeable_array, + size, ) __all__ = [ "array_namespace", "device", + "is_cupy_namespace", "is_jax_array", + "is_jax_namespace", + "is_pydata_sparse_namespace", + "is_torch_namespace", "is_writeable_array", + "size", ] diff --git a/src/array_api_extra/_lib/_compat.pyi b/src/array_api_extra/_lib/_compat.pyi index 4d06a7f1..8532584c 100644 --- a/src/array_api_extra/_lib/_compat.pyi +++ b/src/array_api_extra/_lib/_compat.pyi @@ -18,5 +18,10 @@ def array_namespace( use_compat: bool | None = None, ) -> ArrayModule: ... def device(x: Array, /) -> Device: ... +def is_cupy_namespace(x: object, /) -> bool: ... def is_jax_array(x: object, /) -> bool: ... +def is_jax_namespace(x: object, /) -> bool: ... +def is_pydata_sparse_namespace(x: object, /) -> bool: ... +def is_torch_namespace(x: object, /) -> bool: ... def is_writeable_array(x: object, /) -> bool: ... +def size(x: Array, /) -> int | None: ... diff --git a/src/array_api_extra/_lib/_testing.py b/src/array_api_extra/_lib/_testing.py new file mode 100644 index 00000000..b866012f --- /dev/null +++ b/src/array_api_extra/_lib/_testing.py @@ -0,0 +1,144 @@ +""" +Testing utilities. + +Note that this is private API; don't expect it to be stable. +""" + +from ._compat import ( + array_namespace, + is_cupy_namespace, + is_pydata_sparse_namespace, + is_torch_namespace, +) +from ._typing import Array, ModuleType + +__all__ = ["xp_assert_close", "xp_assert_equal"] + + +def _check_ns_shape_dtype( + actual: Array, desired: Array +) -> ModuleType: # numpydoc ignore=RT03 + """ + Assert that namespace, shape and dtype of the two arrays match. + + Parameters + ---------- + actual : Array + The array produced by the tested function. + desired : Array + The expected array (typically hardcoded). + + Returns + ------- + Arrays namespace. + """ + actual_xp = array_namespace(actual) # Raises on scalars and lists + desired_xp = array_namespace(desired) + + msg = f"namespaces do not match: {actual_xp} != f{desired_xp}" + assert actual_xp == desired_xp, msg + + msg = f"shapes do not match: {actual.shape} != f{desired.shape}" + assert actual.shape == desired.shape, msg + + msg = f"dtypes do not match: {actual.dtype} != {desired.dtype}" + assert actual.dtype == desired.dtype, msg + + return desired_xp + + +def xp_assert_equal(actual: Array, desired: Array, err_msg: str = "") -> None: + """ + Array-API compatible version of `np.testing.assert_array_equal`. + + Parameters + ---------- + actual : Array + The array produced by the tested function. + desired : Array + The expected array (typically hardcoded). + err_msg : str, optional + Error message to display on failure. + """ + xp = _check_ns_shape_dtype(actual, desired) + + if is_cupy_namespace(xp): + xp.testing.assert_array_equal(actual, desired, err_msg=err_msg) + elif is_torch_namespace(xp): + # PyTorch recommends using `rtol=0, atol=0` like this + # to test for exact equality + xp.testing.assert_close( + actual, + desired, + rtol=0, + atol=0, + equal_nan=True, + check_dtype=False, + msg=err_msg or None, + ) + else: + import numpy as np # pylint: disable=import-outside-toplevel + + if is_pydata_sparse_namespace(xp): + actual = actual.todense() + desired = desired.todense() + + # JAX uses `np.testing` + np.testing.assert_array_equal(actual, desired, err_msg=err_msg) + + +def xp_assert_close( + actual: Array, + desired: Array, + *, + rtol: float | None = None, + atol: float = 0, + err_msg: str = "", +) -> None: + """ + Array-API compatible version of `np.testing.assert_allclose`. + + Parameters + ---------- + actual : Array + The array produced by the tested function. + desired : Array + The expected array (typically hardcoded). + rtol : float, optional + Relative tolerance. Default: dtype-dependent. + atol : float, optional + Absolute tolerance. Default: 0. + err_msg : str, optional + Error message to display on failure. + """ + xp = _check_ns_shape_dtype(actual, desired) + + floating = xp.isdtype(actual.dtype, ("real floating", "complex floating")) + if rtol is None and floating: + # multiplier of 4 is used as for `np.float64` this puts the default `rtol` + # roughly half way between sqrt(eps) and the default for + # `numpy.testing.assert_allclose`, 1e-7 + rtol = xp.finfo(actual.dtype).eps ** 0.5 * 4 + elif rtol is None: + rtol = 1e-7 + + if is_cupy_namespace(xp): + xp.testing.assert_allclose( + actual, desired, rtol=rtol, atol=atol, err_msg=err_msg + ) + elif is_torch_namespace(xp): + xp.testing.assert_close( + actual, desired, rtol=rtol, atol=atol, equal_nan=True, msg=err_msg or None + ) + else: + import numpy as np # pylint: disable=import-outside-toplevel + + if is_pydata_sparse_namespace(xp): + actual = actual.to_dense() + desired = desired.to_dense() + + # JAX uses `np.testing` + assert isinstance(rtol, float) + np.testing.assert_allclose( + actual, desired, rtol=rtol, atol=atol, err_msg=err_msg + ) diff --git a/src/array_api_extra/_lib/_utils.py b/src/array_api_extra/_lib/_utils.py index 1191b4f3..afb4cfc4 100644 --- a/src/array_api_extra/_lib/_utils.py +++ b/src/array_api_extra/_lib/_utils.py @@ -54,7 +54,9 @@ def in1d( order = xp.argsort(ar, stable=True) reverse_order = xp.argsort(order, stable=True) sar = xp.take(ar, order, axis=0) - if sar.size >= 1: + ar_size = _compat.size(sar) + assert ar_size is not None, "xp.unique*() on lazy backends raises" + if ar_size >= 1: bool_ar = sar[1:] != sar[:-1] if invert else sar[1:] == sar[:-1] else: bool_ar = xp.asarray([False]) if invert else xp.asarray([True]) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..3ccaf52b --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Needed to import .conftest from the test modules.""" diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..0bf3114f --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,86 @@ +"""Pytest fixtures.""" + +from enum import Enum +from typing import cast + +import pytest + +from array_api_extra._lib._compat import array_namespace +from array_api_extra._lib._compat import device as get_device +from array_api_extra._lib._typing import Device, ModuleType + + +class Library(Enum): + """All array libraries explicitly tested by array-api-extra.""" + + ARRAY_API_STRICT = "array_api_strict" + NUMPY = "numpy" + NUMPY_READONLY = "numpy_readonly" + CUPY = "cupy" + TORCH = "torch" + DASK_ARRAY = "dask.array" + SPARSE = "sparse" + JAX_NUMPY = "jax.numpy" + + def __str__(self) -> str: # type: ignore[explicit-override] # pyright: ignore[reportImplicitOverride] # numpydoc ignore=RT01 + """Pretty-print parameterized test names.""" + return self.value + + +@pytest.fixture(params=tuple(Library)) +def library(request: pytest.FixtureRequest) -> Library: # numpydoc ignore=PR01,RT03 + """ + Parameterized fixture that iterates on all libraries. + + Returns + ------- + The current Library enum. + """ + elem = cast(Library, request.param) + + for marker in request.node.iter_markers("skip_xp_backend"): + skip_library = marker.kwargs.get("library") or marker.args[0] # type: ignore[no-untyped-usage] + if not isinstance(skip_library, Library): + msg = "argument of skip_xp_backend must be a Library enum" + raise TypeError(msg) + if skip_library == elem: + reason = cast(str, marker.kwargs.get("reason", "skip_xp_backend")) + pytest.skip(reason=reason) + + return elem + + +@pytest.fixture +def xp(library: Library) -> ModuleType: # numpydoc ignore=PR01,RT03 + """ + Parameterized fixture that iterates on all libraries. + + Returns + ------- + The current array namespace. + """ + name = "numpy" if library == Library.NUMPY_READONLY else library.value + xp = pytest.importorskip(name) + if library == Library.JAX_NUMPY: + import jax # type: ignore[import-not-found] # pyright: ignore[reportMissingImports] + + jax.config.update("jax_enable_x64", True) + + # Possibly wrap module with array_api_compat + return array_namespace(xp.empty(0)) + + +@pytest.fixture +def device( + library: Library, xp: ModuleType +) -> Device: # numpydoc ignore=PR01,RT01,RT03 + """ + Return a valid device for the backend. + + Where possible, return a device that is not the default one. + """ + if library == Library.ARRAY_API_STRICT: + d = xp.Device("device1") + assert get_device(xp.empty(0)) != d + return d + return get_device(xp.empty(0)) diff --git a/tests/test_at.py b/tests/test_at.py index 24d356c0..ed56f615 100644 --- a/tests/test_at.py +++ b/tests/test_at.py @@ -1,58 +1,31 @@ from collections.abc import Callable, Generator from contextlib import contextmanager -from enum import Enum from typing import cast import numpy as np import pytest from array_api_compat import ( # type: ignore[import-untyped] # pyright: ignore[reportMissingTypeStubs] array_namespace, - is_dask_array, is_pydata_sparse_array, is_writeable_array, ) from array_api_extra import at from array_api_extra._funcs import _AtOp -from array_api_extra._lib._typing import Array +from array_api_extra._lib._testing import xp_assert_equal +from array_api_extra._lib._typing import Array, ModuleType +from .conftest import Library -class Library(Enum): - ARRAY_API_STRICT = "array_api_strict" - NUMPY = "numpy" - NUMPY_READONLY = "numpy_readonly" - CUPY = "cupy" - TORCH = "torch" - DASK_ARRAY = "dask.array" - SPARSE = "sparse" - JAX_NUMPY = "jax.numpy" - # @override from Python 3.12 - def __str__(self) -> str: # type: ignore[explicit-override] # pyright: ignore[reportImplicitOverride] - return self.value - - -@pytest.fixture(params=tuple(Library)) -def array(request: pytest.FixtureRequest) -> Array: - library = request.param - if library is Library.NUMPY_READONLY: - x = np.asarray([10.0, 20.0, 30.0]) +@pytest.fixture +def array(library: Library, xp: ModuleType) -> Array: + x = xp.asarray([10.0, 20.0, 30.0]) + if library == Library.NUMPY_READONLY: x.flags.writeable = False - else: - xp = pytest.importorskip(library.value) - x = xp.asarray([10.0, 20.0, 30.0]) return x -def assert_array_equal(a: Array, b: Array) -> None: - xp = array_namespace(a) - b = xp.asarray(b) - eq = xp.all(a == b) - if is_dask_array(a): - eq = eq.compute() - assert eq - - @contextmanager def assert_copy(array: Array, copy: bool | None) -> Generator[None, None, None]: if copy is False and not is_writeable_array(array): @@ -66,7 +39,7 @@ def assert_copy(array: Array, copy: bool | None) -> Generator[None, None, None]: if copy is None: copy = not is_writeable_array(array) - assert_array_equal(xp.all(array == array_orig), copy) + xp_assert_equal(xp.all(array == array_orig), xp.asarray(copy)) @pytest.mark.parametrize( @@ -92,6 +65,7 @@ def assert_copy(array: Array, copy: bool | None) -> Generator[None, None, None]: ], ) def test_update_ops( + xp: ModuleType, array: Array, kwargs: dict[str, bool | None], expect_copy: bool | None, @@ -106,7 +80,7 @@ def test_update_ops( func = cast(Callable[..., Array], getattr(at(array)[1:], op.value)) # type: ignore[no-any-explicit] y = func(arg, **kwargs) assert isinstance(y, type(array)) - assert_array_equal(y, expect) + xp_assert_equal(y, xp.asarray(expect)) def test_copy_invalid(): @@ -129,12 +103,12 @@ def test_xp(): def test_alternate_index_syntax(): a = np.asarray([1, 2, 3]) - assert_array_equal(at(a, 0).set(4, copy=True), [4, 2, 3]) - assert_array_equal(at(a)[0].set(4, copy=True), [4, 2, 3]) + xp_assert_equal(at(a, 0).set(4, copy=True), np.asarray([4, 2, 3])) + xp_assert_equal(at(a)[0].set(4, copy=True), np.asarray([4, 2, 3])) a_at = at(a) - assert_array_equal(a_at[0].add(1, copy=True), [2, 2, 3]) - assert_array_equal(a_at[1].add(2, copy=True), [1, 4, 3]) + xp_assert_equal(a_at[0].add(1, copy=True), np.asarray([2, 2, 3])) + xp_assert_equal(a_at[1].add(2, copy=True), np.asarray([1, 4, 3])) with pytest.raises(ValueError, match="Index"): at(a).set(4) diff --git a/tests/test_funcs.py b/tests/test_funcs.py index 2fc9041a..5f18ef61 100644 --- a/tests/test_funcs.py +++ b/tests/test_funcs.py @@ -1,13 +1,11 @@ import contextlib import warnings -# data-apis/array-api-strict#6 -import array_api_strict as xp # type: ignore[import-untyped] # pyright: ignore[reportMissingTypeStubs] import numpy as np import pytest -from numpy.testing import assert_allclose, assert_array_equal, assert_equal from array_api_extra import ( + at, atleast_nd, cov, create_diagonal, @@ -17,175 +15,184 @@ setdiff1d, sinc, ) -from array_api_extra._lib._typing import Array +from array_api_extra._lib._compat import device as get_device +from array_api_extra._lib._testing import xp_assert_close, xp_assert_equal +from array_api_extra._lib._typing import Array, Device, ModuleType +from .conftest import Library +# mypy: disable-error-code=no-untyped-usage + + +@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no expand_dims") class TestAtLeastND: - def test_0D(self): - x = xp.asarray(1) + def test_0D(self, xp: ModuleType): + x = xp.asarray(1.0) y = atleast_nd(x, ndim=0) - assert_array_equal(y, x) + xp_assert_equal(y, x) y = atleast_nd(x, ndim=1) - assert_array_equal(y, xp.ones((1,))) + xp_assert_equal(y, xp.ones((1,))) y = atleast_nd(x, ndim=5) - assert_array_equal(y, xp.ones((1, 1, 1, 1, 1))) + xp_assert_equal(y, xp.ones((1, 1, 1, 1, 1))) - def test_1D(self): + def test_1D(self, xp: ModuleType): x = xp.asarray([0, 1]) y = atleast_nd(x, ndim=0) - assert_array_equal(y, x) + xp_assert_equal(y, x) y = atleast_nd(x, ndim=1) - assert_array_equal(y, x) + xp_assert_equal(y, x) y = atleast_nd(x, ndim=2) - assert_array_equal(y, xp.asarray([[0, 1]])) + xp_assert_equal(y, xp.asarray([[0, 1]])) y = atleast_nd(x, ndim=5) - assert_array_equal(y, xp.reshape(xp.arange(2), (1, 1, 1, 1, 2))) + xp_assert_equal(y, xp.reshape(xp.arange(2), (1, 1, 1, 1, 2))) - def test_2D(self): - x = xp.asarray([[3]]) + def test_2D(self, xp: ModuleType): + x = xp.asarray([[3.0]]) y = atleast_nd(x, ndim=0) - assert_array_equal(y, x) + xp_assert_equal(y, x) y = atleast_nd(x, ndim=2) - assert_array_equal(y, x) + xp_assert_equal(y, x) y = atleast_nd(x, ndim=3) - assert_array_equal(y, 3 * xp.ones((1, 1, 1))) + xp_assert_equal(y, 3 * xp.ones((1, 1, 1))) y = atleast_nd(x, ndim=5) - assert_array_equal(y, 3 * xp.ones((1, 1, 1, 1, 1))) + xp_assert_equal(y, 3 * xp.ones((1, 1, 1, 1, 1))) - def test_5D(self): + def test_5D(self, xp: ModuleType): x = xp.ones((1, 1, 1, 1, 1)) y = atleast_nd(x, ndim=0) - assert_array_equal(y, x) + xp_assert_equal(y, x) y = atleast_nd(x, ndim=4) - assert_array_equal(y, x) + xp_assert_equal(y, x) y = atleast_nd(x, ndim=5) - assert_array_equal(y, x) + xp_assert_equal(y, x) y = atleast_nd(x, ndim=6) - assert_array_equal(y, xp.ones((1, 1, 1, 1, 1, 1))) + xp_assert_equal(y, xp.ones((1, 1, 1, 1, 1, 1))) y = atleast_nd(x, ndim=9) - assert_array_equal(y, xp.ones((1, 1, 1, 1, 1, 1, 1, 1, 1))) + xp_assert_equal(y, xp.ones((1, 1, 1, 1, 1, 1, 1, 1, 1))) - def test_device(self): - device = xp.Device("device1") + def test_device(self, xp: ModuleType, device: Device): x = xp.asarray([1, 2, 3], device=device) - assert atleast_nd(x, ndim=2).device == device + assert get_device(atleast_nd(x, ndim=2)) == device - def test_xp(self): + def test_xp(self, xp: ModuleType): x = xp.asarray(1) y = atleast_nd(x, ndim=0, xp=xp) - assert_array_equal(y, x) + xp_assert_equal(y, x) +@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no isdtype") class TestCov: - def test_basic(self): - assert_allclose( + def test_basic(self, xp: ModuleType): + xp_assert_close( cov(xp.asarray([[0, 2], [1, 1], [2, 0]]).T), - xp.asarray([[1.0, -1.0], [-1.0, 1.0]]), + xp.asarray([[1.0, -1.0], [-1.0, 1.0]], dtype=xp.float64), ) - def test_complex(self): - x = xp.asarray([[1, 2, 3], [1j, 2j, 3j]]) - res = xp.asarray([[1.0, -1.0j], [1.0j, 1.0]]) - assert_allclose(cov(x), res) + def test_complex(self, xp: ModuleType): + actual = cov(xp.asarray([[1, 2, 3], [1j, 2j, 3j]])) + expect = xp.asarray([[1.0, -1.0j], [1.0j, 1.0]], dtype=xp.complex128) + xp_assert_close(actual, expect) - def test_empty(self): + def test_empty(self, xp: ModuleType): with warnings.catch_warnings(record=True): warnings.simplefilter("always", RuntimeWarning) - assert_array_equal(cov(xp.asarray([])), xp.nan) - assert_array_equal( + xp_assert_equal(cov(xp.asarray([])), xp.asarray(xp.nan, dtype=xp.float64)) + xp_assert_equal( cov(xp.reshape(xp.asarray([]), (0, 2))), - xp.reshape(xp.asarray([]), (0, 0)), + xp.reshape(xp.asarray([], dtype=xp.float64), (0, 0)), ) - assert_array_equal( + xp_assert_equal( cov(xp.reshape(xp.asarray([]), (2, 0))), - xp.asarray([[xp.nan, xp.nan], [xp.nan, xp.nan]]), + xp.asarray([[xp.nan, xp.nan], [xp.nan, xp.nan]], dtype=xp.float64), ) - def test_combination(self): + def test_combination(self, xp: ModuleType): x = xp.asarray([-2.1, -1, 4.3]) y = xp.asarray([3, 1.1, 0.12]) X = xp.stack((x, y), axis=0) - desired = xp.asarray([[11.71, -4.286], [-4.286, 2.144133]]) - assert_allclose(cov(X), desired, rtol=1e-6) - assert_allclose(cov(x), xp.asarray(11.71)) - assert_allclose(cov(y), xp.asarray(2.144133), rtol=1e-6) + desired = xp.asarray([[11.71, -4.286], [-4.286, 2.144133]], dtype=xp.float64) + xp_assert_close(cov(X), desired, rtol=1e-6) + xp_assert_close(cov(x), xp.asarray(11.71, dtype=xp.float64)) + xp_assert_close(cov(y), xp.asarray(2.144133, dtype=xp.float64), rtol=1e-6) - def test_device(self): - device = xp.Device("device1") + def test_device(self, xp: ModuleType, device: Device): x = xp.asarray([1, 2, 3], device=device) - assert cov(x).device == device + assert get_device(cov(x)) == device - def test_xp(self): - assert_allclose( - cov(xp.asarray([[0, 2], [1, 1], [2, 0]]).T, xp=xp), - xp.asarray([[1.0, -1.0], [-1.0, 1.0]]), + def test_xp(self, xp: ModuleType): + xp_assert_close( + cov(xp.asarray([[0.0, 2.0], [1.0, 1.0], [2.0, 0.0]]).T, xp=xp), + xp.asarray([[1.0, -1.0], [-1.0, 1.0]], dtype=xp.float64), ) +@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no device") class TestCreateDiagonal: - def test_1d(self): + def test_1d(self, xp: ModuleType): # from np.diag tests vals = 100 * xp.arange(5, dtype=xp.float64) - b = xp.zeros((5, 5)) + b = xp.zeros((5, 5), dtype=xp.float64) for k in range(5): - b[k, k] = vals[k] - assert_array_equal(create_diagonal(vals), b) - b = xp.zeros((7, 7)) + b = at(b)[k, k].set(vals[k]) + xp_assert_equal(create_diagonal(vals), b) + b = xp.zeros((7, 7), dtype=xp.float64) c = xp.asarray(b, copy=True) for k in range(5): - b[k, k + 2] = vals[k] - c[k + 2, k] = vals[k] - assert_array_equal(create_diagonal(vals, offset=2), b) - assert_array_equal(create_diagonal(vals, offset=-2), c) + b = at(b)[k, k + 2].set(vals[k]) + c = at(c)[k + 2, k].set(vals[k]) + xp_assert_equal(create_diagonal(vals, offset=2), b) + xp_assert_equal(create_diagonal(vals, offset=-2), c) @pytest.mark.parametrize("n", range(1, 10)) @pytest.mark.parametrize("offset", range(1, 10)) - def test_create_diagonal(self, n: int, offset: int): + def test_create_diagonal(self, xp: ModuleType, n: int, offset: int): # from scipy._lib tests rng = np.random.default_rng(2347823) one = xp.asarray(1.0) x = rng.random(n) A = create_diagonal(xp.asarray(x, dtype=one.dtype), offset=offset) B = xp.asarray(np.diag(x, offset), dtype=one.dtype) - assert_array_equal(A, B) + xp_assert_equal(A, B) - def test_0d(self): + def test_0d(self, xp: ModuleType): with pytest.raises(ValueError, match="1-dimensional"): create_diagonal(xp.asarray(1)) - def test_2d(self): + def test_2d(self, xp: ModuleType): with pytest.raises(ValueError, match="1-dimensional"): create_diagonal(xp.asarray([[1]])) - def test_device(self): - device = xp.Device("device1") + def test_device(self, xp: ModuleType, device: Device): x = xp.asarray([1, 2, 3], device=device) - assert create_diagonal(x).device == device + assert get_device(create_diagonal(x)) == device - def test_xp(self): + def test_xp(self, xp: ModuleType): x = xp.asarray([1, 2]) y = create_diagonal(x, xp=xp) - assert_array_equal(y, xp.asarray([[1, 0], [0, 2]])) + xp_assert_equal(y, xp.asarray([[1, 0], [0, 2]])) +@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no sparse.expand_dims") class TestExpandDims: - def test_functionality(self): + @pytest.mark.skip_xp_backend(Library.DASK_ARRAY, reason="tuple index out of range") + @pytest.mark.skip_xp_backend(Library.TORCH, reason="tuple index out of range") + def test_functionality(self, xp: ModuleType): def _squeeze_all(b: Array) -> Array: """Mimics `np.squeeze(b)`. `xpx.squeeze`?""" for axis in range(b.ndim): @@ -200,14 +207,14 @@ def _squeeze_all(b: Array) -> Array: assert b.shape[axis] == 1 assert _squeeze_all(b).shape == s - def test_axis_tuple(self): + def test_axis_tuple(self, xp: ModuleType): a = xp.empty((3, 3, 3)) assert expand_dims(a, axis=(0, 1, 2)).shape == (1, 1, 1, 3, 3, 3) assert expand_dims(a, axis=(0, -1, -2)).shape == (1, 3, 3, 3, 1, 1) assert expand_dims(a, axis=(0, 3, 5)).shape == (1, 3, 3, 1, 3, 1) assert expand_dims(a, axis=(0, -3, -5)).shape == (1, 1, 3, 1, 3, 3) - def test_axis_out_of_range(self): + def test_axis_out_of_range(self, xp: ModuleType): s = (2, 3, 4, 5) a = xp.empty(s) with pytest.raises(IndexError, match="out of bounds"): @@ -221,64 +228,64 @@ def test_axis_out_of_range(self): with pytest.raises(IndexError, match="out of bounds"): expand_dims(a, axis=(0, 5)) - def test_repeated_axis(self): + def test_repeated_axis(self, xp: ModuleType): a = xp.empty((3, 3, 3)) with pytest.raises(ValueError, match="Duplicate dimensions"): expand_dims(a, axis=(1, 1)) - def test_positive_negative_repeated(self): + def test_positive_negative_repeated(self, xp: ModuleType): # https://github.com/data-apis/array-api/issues/760#issuecomment-1989449817 a = xp.empty((2, 3, 4, 5)) with pytest.raises(ValueError, match="Duplicate dimensions"): expand_dims(a, axis=(3, -3)) - def test_device(self): - device = xp.Device("device1") + def test_device(self, xp: ModuleType, device: Device): x = xp.asarray([1, 2, 3], device=device) - assert expand_dims(x, axis=0).device == device + assert get_device(expand_dims(x, axis=0)) == device - def test_xp(self): + def test_xp(self, xp: ModuleType): x = xp.asarray([1, 2, 3]) y = expand_dims(x, axis=(0, 1, 2), xp=xp) assert y.shape == (1, 1, 1, 3) +@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no sparse.expand_dims") class TestKron: - def test_basic(self): + def test_basic(self, xp: ModuleType): # Using 0-dimensional array a = xp.asarray(1) b = xp.asarray([[1, 2], [3, 4]]) k = xp.asarray([[1, 2], [3, 4]]) - assert_array_equal(kron(a, b), k) + xp_assert_equal(kron(a, b), k) a = xp.asarray([[1, 2], [3, 4]]) b = xp.asarray(1) - assert_array_equal(kron(a, b), k) + xp_assert_equal(kron(a, b), k) # Using 1-dimensional array a = xp.asarray([3]) b = xp.asarray([[1, 2], [3, 4]]) k = xp.asarray([[3, 6], [9, 12]]) - assert_array_equal(kron(a, b), k) + xp_assert_equal(kron(a, b), k) a = xp.asarray([[1, 2], [3, 4]]) b = xp.asarray([3]) - assert_array_equal(kron(a, b), k) + xp_assert_equal(kron(a, b), k) # Using 3-dimensional array a = xp.asarray([[[1]], [[2]]]) b = xp.asarray([[1, 2], [3, 4]]) k = xp.asarray([[[1, 2], [3, 4]], [[2, 4], [6, 8]]]) - assert_array_equal(kron(a, b), k) + xp_assert_equal(kron(a, b), k) a = xp.asarray([[1, 2], [3, 4]]) b = xp.asarray([[[1]], [[2]]]) k = xp.asarray([[[1, 2], [3, 4]], [[2, 4], [6, 8]]]) - assert_array_equal(kron(a, b), k) + xp_assert_equal(kron(a, b), k) - def test_kron_smoke(self): + def test_kron_smoke(self, xp: ModuleType): a = xp.ones((3, 3)) b = xp.ones((3, 3)) k = xp.ones((9, 9)) - assert_array_equal(kron(a, b), k) + xp_assert_equal(kron(a, b), k) @pytest.mark.parametrize( ("shape_a", "shape_b"), @@ -291,7 +298,9 @@ def test_kron_smoke(self): ((2, 0, 0, 2), (2, 0, 2)), ], ) - def test_kron_shape(self, shape_a: tuple[int, ...], shape_b: tuple[int, ...]): + def test_kron_shape( + self, xp: ModuleType, shape_a: tuple[int, ...], shape_b: tuple[int, ...] + ): a = xp.ones(shape_a) b = xp.ones(shape_b) normalised_shape_a = xp.asarray( @@ -305,119 +314,123 @@ def test_kron_shape(self, shape_a: tuple[int, ...], shape_b: tuple[int, ...]): ) k = kron(a, b) - assert_equal(k.shape, expected_shape, err_msg="Unexpected shape from kron") + assert k.shape == expected_shape - def test_device(self): - device = xp.Device("device1") + def test_device(self, xp: ModuleType, device: Device): x1 = xp.asarray([1, 2, 3], device=device) x2 = xp.asarray([4, 5], device=device) - assert kron(x1, x2).device == device + assert get_device(kron(x1, x2)) == device - def test_xp(self): + def test_xp(self, xp: ModuleType): a = xp.ones((3, 3)) b = xp.ones((3, 3)) k = xp.ones((9, 9)) - assert_array_equal(kron(a, b, xp=xp), k) + xp_assert_equal(kron(a, b, xp=xp), k) +@pytest.mark.skip_xp_backend(Library.DASK_ARRAY, reason="no argsort") +@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no device") class TestSetDiff1D: - def test_setdiff1d(self): + @pytest.mark.skip_xp_backend( + Library.TORCH, reason="index_select not implemented for uint32" + ) + def test_setdiff1d(self, xp: ModuleType): x1 = xp.asarray([6, 5, 4, 7, 1, 2, 7, 4]) x2 = xp.asarray([2, 4, 3, 3, 2, 1, 5]) expected = xp.asarray([6, 7]) actual = setdiff1d(x1, x2) - assert_array_equal(actual, expected) + xp_assert_equal(actual, expected) x1 = xp.arange(21) x2 = xp.arange(19) expected = xp.asarray([19, 20]) actual = setdiff1d(x1, x2) - assert_array_equal(actual, expected) + xp_assert_equal(actual, expected) - assert_array_equal(setdiff1d(xp.empty(0), xp.empty(0)), xp.empty(0)) + xp_assert_equal(setdiff1d(xp.empty(0), xp.empty(0)), xp.empty(0)) x1 = xp.empty(0, dtype=xp.uint32) x2 = x1 - assert_equal(setdiff1d(x1, x2).dtype, xp.uint32) + assert xp.isdtype(setdiff1d(x1, x2).dtype, xp.uint32) - def test_assume_unique(self): + def test_assume_unique(self, xp: ModuleType): x1 = xp.asarray([3, 2, 1]) x2 = xp.asarray([7, 5, 2]) expected = xp.asarray([3, 1]) actual = setdiff1d(x1, x2, assume_unique=True) - assert_array_equal(actual, expected) + xp_assert_equal(actual, expected) - def test_device(self): - device = xp.Device("device1") + def test_device(self, xp: ModuleType, device: Device): x1 = xp.asarray([3, 8, 20], device=device) x2 = xp.asarray([2, 3, 4], device=device) - assert setdiff1d(x1, x2).device == device + assert get_device(setdiff1d(x1, x2)) == device - def test_xp(self): + def test_xp(self, xp: ModuleType): x1 = xp.asarray([3, 8, 20]) x2 = xp.asarray([2, 3, 4]) expected = xp.asarray([8, 20]) actual = setdiff1d(x1, x2, xp=xp) - assert_array_equal(actual, expected) + xp_assert_equal(actual, expected) +@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no isdtype") class TestSinc: - def test_simple(self): - assert_array_equal(sinc(xp.asarray(0.0)), xp.asarray(1.0)) + def test_simple(self, xp: ModuleType): + xp_assert_equal(sinc(xp.asarray(0.0)), xp.asarray(1.0)) w = sinc(xp.linspace(-1, 1, 100)) # check symmetry - assert_allclose(w, xp.flip(w, axis=0)) + xp_assert_close(w, xp.flip(w, axis=0)) @pytest.mark.parametrize("x", [0, 1 + 3j]) - def test_dtype(self, x: int | complex): + def test_dtype(self, xp: ModuleType, x: int | complex): with pytest.raises(ValueError, match="real floating data type"): sinc(xp.asarray(x)) - def test_3d(self): + def test_3d(self, xp: ModuleType): x = xp.reshape(xp.arange(18, dtype=xp.float64), (3, 3, 2)) - expected = xp.zeros((3, 3, 2)) - expected[0, 0, 0] = 1.0 - assert_allclose(sinc(x), expected, atol=1e-15) + expected = xp.zeros((3, 3, 2), dtype=xp.float64) + expected = at(expected)[0, 0, 0].set(1.0) + xp_assert_close(sinc(x), expected, atol=1e-15) - def test_device(self): - device = xp.Device("device1") + def test_device(self, xp: ModuleType, device: Device): x = xp.asarray(0.0, device=device) - assert sinc(x).device == device + assert get_device(sinc(x)) == device - def test_xp(self): - assert_array_equal(sinc(xp.asarray(0.0), xp=xp), xp.asarray(1.0)) + def test_xp(self, xp: ModuleType): + xp_assert_equal(sinc(xp.asarray(0.0), xp=xp), xp.asarray(1.0)) +@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no arange, no device") class TestPad: - def test_simple(self): + def test_simple(self, xp: ModuleType): a = xp.arange(1, 4) padded = pad(a, 2) - assert xp.all(padded == xp.asarray([0, 0, 1, 2, 3, 0, 0])) + xp_assert_equal(padded, xp.asarray([0, 0, 1, 2, 3, 0, 0])) - def test_fill_value(self): + def test_fill_value(self, xp: ModuleType): a = xp.arange(1, 4) padded = pad(a, 2, constant_values=42) - assert xp.all(padded == xp.asarray([42, 42, 1, 2, 3, 42, 42])) + xp_assert_equal(padded, xp.asarray([42, 42, 1, 2, 3, 42, 42])) - def test_ndim(self): + def test_ndim(self, xp: ModuleType): a = xp.reshape(xp.arange(2 * 3 * 4), (2, 3, 4)) padded = pad(a, 2) assert padded.shape == (6, 7, 8) - def test_mode_not_implemented(self): + def test_mode_not_implemented(self, xp: ModuleType): a = xp.arange(3) with pytest.raises(NotImplementedError, match="Only `'constant'`"): pad(a, 2, mode="edge") - def test_device(self): - device = xp.Device("device1") + def test_device(self, xp: ModuleType, device: Device): a = xp.asarray(0.0, device=device) - assert pad(a, 2).device == device + assert get_device(pad(a, 2)) == device - def test_xp(self): - assert_array_equal(pad(xp.asarray(0), 1, xp=xp), xp.zeros(3)) + def test_xp(self, xp: ModuleType): + padded = pad(xp.asarray(0), 1, xp=xp) + xp_assert_equal(padded, xp.asarray(0)) - def test_tuple_width(self): + def test_tuple_width(self, xp: ModuleType): a = xp.reshape(xp.arange(12), (3, 4)) padded = pad(a, (1, 0)) assert padded.shape == (4, 5) @@ -428,7 +441,7 @@ def test_tuple_width(self): with pytest.raises(ValueError, match="expect a 2-tuple"): pad(a, [(1, 2, 3)]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] - def test_list_of_tuples_width(self): + def test_list_of_tuples_width(self, xp: ModuleType): a = xp.reshape(xp.arange(12), (3, 4)) padded = pad(a, [(1, 0), (0, 2)]) assert padded.shape == (4, 6) diff --git a/tests/test_testing.py b/tests/test_testing.py new file mode 100644 index 00000000..28b37d03 --- /dev/null +++ b/tests/test_testing.py @@ -0,0 +1,68 @@ +import numpy as np +import pytest + +from array_api_extra._lib._testing import xp_assert_close, xp_assert_equal + +from .conftest import Library + +# mypy: disable-error-code=no-any-decorated +# pyright: reportUnknownParameterType=false,reportMissingParameterType=false + + +@pytest.mark.parametrize( + "func", + [ + xp_assert_equal, + pytest.param( + xp_assert_close, + marks=pytest.mark.skip_xp_backend(Library.SPARSE, reason="no isdtype"), + ), + ], +) +def test_assert_close_equal_basic(xp, func): + func(xp.asarray(0), xp.asarray(0)) + func(xp.asarray([1, 2]), xp.asarray([1, 2])) + + with pytest.raises(AssertionError, match="shapes do not match"): + func(xp.asarray([0]), xp.asarray([[0]])) + + with pytest.raises(AssertionError, match="dtypes do not match"): + func(xp.asarray(0, dtype=xp.float32), xp.asarray(0, dtype=xp.float64)) + + with pytest.raises(AssertionError): + func(xp.asarray([1, 2]), xp.asarray([1, 3])) + + with pytest.raises(AssertionError, match="hello"): + func(xp.asarray([1, 2]), xp.asarray([1, 3]), err_msg="hello") + + +@pytest.mark.skip_xp_backend(Library.NUMPY) +@pytest.mark.skip_xp_backend(Library.NUMPY_READONLY) +@pytest.mark.parametrize( + "func", + [ + xp_assert_equal, + pytest.param( + xp_assert_close, + marks=pytest.mark.skip_xp_backend(Library.SPARSE, reason="no isdtype"), + ), + ], +) +def test_assert_close_equal_namespace(xp, func): + with pytest.raises(AssertionError): + func(xp.asarray(0), np.asarray(0)) + with pytest.raises(TypeError): + func(xp.asarray(0), 0) + with pytest.raises(TypeError): + func(xp.asarray([0]), [0]) + + +@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no isdtype") +def test_assert_close_tolerance(xp): + xp_assert_close(xp.asarray([100.0]), xp.asarray([102.0]), rtol=0.03) + with pytest.raises(AssertionError): + xp_assert_close(xp.asarray([100.0]), xp.asarray([102.0]), rtol=0.01) + + xp_assert_close(xp.asarray([100.0]), xp.asarray([102.0]), atol=3) + with pytest.raises(AssertionError): + xp_assert_close(xp.asarray([100.0]), xp.asarray([102.0]), atol=1) diff --git a/tests/test_utils.py b/tests/test_utils.py index 1807627d..8cf49c2a 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,31 +1,38 @@ -# data-apis/array-api-strict#6 -import array_api_strict as xp # type: ignore[import-untyped] # pyright: ignore[reportMissingTypeStubs] +import numpy as np import pytest -from numpy.testing import assert_array_equal -from array_api_extra._lib._typing import Array +from array_api_extra._lib._compat import device as get_device +from array_api_extra._lib._testing import xp_assert_equal +from array_api_extra._lib._typing import Array, Device, ModuleType from array_api_extra._lib._utils import in1d +from .conftest import Library + +# mypy: disable-error-code=no-untyped-usage + -# some test coverage already provided by TestSetDiff1D class TestIn1D: + @pytest.mark.skip_xp_backend(Library.DASK_ARRAY, reason="no argsort") + @pytest.mark.skip_xp_backend(Library.SPARSE, reason="no unique_inverse, no device") # cover both code paths - @pytest.mark.parametrize("x2", [xp.arange(9), xp.arange(15)]) - def test_no_invert_assume_unique(self, x2: Array): + @pytest.mark.parametrize("x2", [np.arange(9), np.arange(15)]) + def test_no_invert_assume_unique(self, xp: ModuleType, x2: Array): x1 = xp.asarray([3, 8, 20]) + x2 = xp.asarray(x2) expected = xp.asarray([True, True, False]) actual = in1d(x1, x2) - assert_array_equal(actual, expected) + xp_assert_equal(actual, expected) - def test_device(self): - device = xp.Device("device1") + @pytest.mark.skip_xp_backend(Library.SPARSE, reason="no device") + def test_device(self, xp: ModuleType, device: Device): x1 = xp.asarray([3, 8, 20], device=device) x2 = xp.asarray([2, 3, 4], device=device) - assert in1d(x1, x2).device == device + assert get_device(in1d(x1, x2)) == device - def test_xp(self): + @pytest.mark.skip_xp_backend(Library.SPARSE, reason="no arange, no device") + def test_xp(self, xp: ModuleType): x1 = xp.asarray([1, 6]) x2 = xp.arange(5) expected = xp.asarray([True, False]) actual = in1d(x1, x2, xp=xp) - assert_array_equal(actual, expected) + xp_assert_equal(actual, expected) diff --git a/vendor_tests/test_vendor.py b/vendor_tests/test_vendor.py index c2e6570d..e3202803 100644 --- a/vendor_tests/test_vendor.py +++ b/vendor_tests/test_vendor.py @@ -6,8 +6,13 @@ def test_vendor_compat(): from ._array_api_compat_vendor import ( # type: ignore[attr-defined] array_namespace, device, + is_cupy_namespace, is_jax_array, + is_jax_namespace, + is_pydata_sparse_namespace, + is_torch_namespace, is_writeable_array, + size, ) x = xp.asarray([1, 2, 3]) @@ -15,6 +20,11 @@ def test_vendor_compat(): device(x) assert not is_jax_array(x) assert is_writeable_array(x) + assert not is_cupy_namespace(xp) + assert not is_jax_namespace(xp) + assert not is_pydata_sparse_namespace(xp) + assert not is_torch_namespace(xp) + assert size(x) == 3 def test_vendor_extra(): From ec890f1e57217e768c337e08290670290fb58f80 Mon Sep 17 00:00:00 2001 From: Guido Imperiale Date: Tue, 14 Jan 2025 17:21:25 +0000 Subject: [PATCH 09/14] ENH: new function `nunique` (#90) Co-authored-by: Lucas Colley --- docs/api-reference.md | 1 + pixi.lock | 2 +- pyproject.toml | 1 + src/array_api_extra/__init__.py | 2 ++ src/array_api_extra/_funcs.py | 38 +++++++++++++++++++++++++++++++++ tests/test_funcs.py | 19 +++++++++++++++++ 6 files changed, 62 insertions(+), 1 deletion(-) diff --git a/docs/api-reference.md b/docs/api-reference.md index b43c960f..279c84c4 100644 --- a/docs/api-reference.md +++ b/docs/api-reference.md @@ -12,6 +12,7 @@ create_diagonal expand_dims kron + nunique setdiff1d sinc ``` diff --git a/pixi.lock b/pixi.lock index 2790b207..ed262f2f 100644 --- a/pixi.lock +++ b/pixi.lock @@ -2469,7 +2469,7 @@ packages: - pypi: . name: array-api-extra version: 0.5.1.dev0 - sha256: 8b4533cc75534abb69425a1e5c9f6a4ab96949562d2e90d41ea0e22187a02c1b + sha256: 09d6a4b1405fd64596379826065a09bc3787a4fc4e1535dc369f74a3b96f86e3 requires_dist: - array-api-compat>=1.10.0,<2 - furo>=2023.8.17 ; extra == 'docs' diff --git a/pyproject.toml b/pyproject.toml index 4f5ddac0..a5594541 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -299,6 +299,7 @@ messages_control.disable = [ "line-too-long", "missing-module-docstring", "missing-function-docstring", + "too-many-lines", "wrong-import-position", ] diff --git a/src/array_api_extra/__init__.py b/src/array_api_extra/__init__.py index a4f6815f..3f973307 100644 --- a/src/array_api_extra/__init__.py +++ b/src/array_api_extra/__init__.py @@ -7,6 +7,7 @@ create_diagonal, expand_dims, kron, + nunique, pad, setdiff1d, sinc, @@ -23,6 +24,7 @@ "create_diagonal", "expand_dims", "kron", + "nunique", "pad", "setdiff1d", "sinc", diff --git a/src/array_api_extra/_funcs.py b/src/array_api_extra/_funcs.py index 7502561a..017c7297 100644 --- a/src/array_api_extra/_funcs.py +++ b/src/array_api_extra/_funcs.py @@ -3,6 +3,7 @@ # https://github.com/scikit-learn/scikit-learn/pull/27910#issuecomment-2568023972 from __future__ import annotations +import math import operator import warnings from collections.abc import Callable @@ -25,6 +26,7 @@ "create_diagonal", "expand_dims", "kron", + "nunique", "pad", "setdiff1d", "sinc", @@ -638,6 +640,42 @@ def pad( return at(padded, tuple(slices)).set(x) +def nunique(x: Array, /, *, xp: ModuleType | None = None) -> Array: + """ + Count the number of unique elements in an array. + + Compatible with JAX and Dask, whose laziness would be otherwise + problematic. + + Parameters + ---------- + x : Array + Input array. + xp : array_namespace, optional + The standard-compatible namespace for `x`. Default: infer. + + Returns + ------- + array: 0-dimensional integer array + The number of unique elements in `x`. It can be lazy. + """ + if xp is None: + xp = array_namespace(x) + + if is_jax_array(x): + # size= is JAX-specific + # https://github.com/data-apis/array-api/issues/883 + _, counts = xp.unique_counts(x, size=_compat.size(x)) + return xp.astype(counts, xp.bool).sum() + + _, counts = xp.unique_counts(x) + n = _compat.size(counts) + # FIXME https://github.com/data-apis/array-api-compat/pull/231 + if n is None or math.isnan(n): # e.g. Dask, ndonnx + return xp.astype(counts, xp.bool).sum() + return xp.asarray(n, device=_compat.device(x)) + + class _AtOp(Enum): """Operations for use in `xpx.at`.""" diff --git a/tests/test_funcs.py b/tests/test_funcs.py index 5f18ef61..201295da 100644 --- a/tests/test_funcs.py +++ b/tests/test_funcs.py @@ -11,6 +11,7 @@ create_diagonal, expand_dims, kron, + nunique, pad, setdiff1d, sinc, @@ -448,3 +449,21 @@ def test_list_of_tuples_width(self, xp: ModuleType): padded = pad(a, [(1, 0), (0, 0)]) assert padded.shape == (4, 4) + + +class TestNUnique: + def test_simple(self, xp: ModuleType): + a = xp.asarray([[1, 1], [0, 2], [2, 2]]) + xp_assert_equal(nunique(a), xp.asarray(3)) + + def test_empty(self, xp: ModuleType): + a = xp.asarray([]) + xp_assert_equal(nunique(a), xp.asarray(0)) + + def test_device(self, xp: ModuleType, device: Device): + a = xp.asarray(0.0, device=device) + assert get_device(nunique(a)) == device + + def test_xp(self, xp: ModuleType): + a = xp.asarray([[1, 1], [0, 2], [2, 2]]) + xp_assert_equal(nunique(a, xp=xp), xp.asarray(3)) From 290ebb57a990bfde8b73c070184c5485b752d683 Mon Sep 17 00:00:00 2001 From: Lucas Colley Date: Wed, 15 Jan 2025 13:06:36 +0000 Subject: [PATCH 10/14] ENH: `pad`: add delegation (#72) Co-authored-by: Guido Imperiale --- docs/api-reference.md | 1 + docs/index.md | 61 +- pixi.lock | 969 +++++++++--------- pyproject.toml | 6 +- src/array_api_extra/__init__.py | 4 +- src/array_api_extra/_delegation.py | 83 ++ src/array_api_extra/_lib/__init__.py | 6 +- src/array_api_extra/_lib/_backends.py | 59 ++ src/array_api_extra/{ => _lib}/_funcs.py | 60 +- src/array_api_extra/_lib/_testing.py | 6 +- src/array_api_extra/_lib/_utils/__init__.py | 1 + .../_lib/{ => _utils}/_compat.py | 11 +- .../_lib/{ => _utils}/_compat.pyi | 11 +- .../_lib/{_utils.py => _utils/_helpers.py} | 6 +- .../_lib/{ => _utils}/_typing.py | 3 +- tests/conftest.py | 49 +- tests/test_at.py | 12 +- tests/test_funcs.py | 36 +- tests/test_testing.py | 13 +- tests/test_utils.py | 19 +- vendor_tests/test_vendor.py | 2 +- 21 files changed, 797 insertions(+), 621 deletions(-) create mode 100644 src/array_api_extra/_delegation.py create mode 100644 src/array_api_extra/_lib/_backends.py rename src/array_api_extra/{ => _lib}/_funcs.py (95%) create mode 100644 src/array_api_extra/_lib/_utils/__init__.py rename src/array_api_extra/_lib/{ => _utils}/_compat.py (71%) rename src/array_api_extra/_lib/{ => _utils}/_compat.pyi (62%) rename src/array_api_extra/_lib/{_utils.py => _utils/_helpers.py} (96%) rename src/array_api_extra/_lib/{ => _utils}/_typing.py (75%) diff --git a/docs/api-reference.md b/docs/api-reference.md index 279c84c4..e2c115c6 100644 --- a/docs/api-reference.md +++ b/docs/api-reference.md @@ -13,6 +13,7 @@ expand_dims kron nunique + pad setdiff1d sinc ``` diff --git a/docs/index.md b/docs/index.md index 9470d452..c1998cdd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -10,7 +10,8 @@ contributors.md ``` This is a library housing "array-agnostic" implementations of functions built on -top of [the Python array API standard](https://data-apis.org/array-api/). +top of [the Python array API standard](https://data-apis.org/array-api/), as +well as delegation to existing implementations for known array library backends. The intended users of this library are "array-consuming" libraries which are using [array-api-compat](https://data-apis.org/array-api-compat/) to make their @@ -23,7 +24,7 @@ It is currently used by: - [SciPy](https://github.com/scipy/scipy) - Fundamental algorithms for scientific computing. -- ... +- _your library? Let us know!_ (installation)= @@ -33,6 +34,8 @@ It is currently used by: [on PyPI](https://pypi.org/project/array-api-extra/): ```shell +uv add array-api-extra +# or python -m pip install array-api-extra ``` @@ -40,9 +43,9 @@ And [on conda-forge](https://prefix.dev/channels/conda-forge/packages/array-api-extra): ```shell -mamba install array-api-extra -# or pixi add array-api-extra +# or +mamba install array-api-extra ``` ```{warning} @@ -52,7 +55,7 @@ a specific version, or vendor the library inside your own. ``` ```{note} -This library depends on array-api-compat. We aim for compatibility with +This library depends on `array-api-compat`. We aim for compatibility with the latest released version of array-api-compat, and your mileage may vary with older or dev versions. ``` @@ -69,8 +72,8 @@ and copy it into the appropriate place in your library, like: cp -a array-api-extra/src/array_api_extra mylib/vendored/ ``` -`array-api-extra` depends on `array-api-compat`. You may either add a dependency -in your own project to `array-api-compat` or vendor it too: +You may either add a dependency to array-api-compat in your own project, or +vendor it too: 1. Clone [the array-api-compat repository](https://github.com/data-apis/array-api-compat) @@ -81,14 +84,14 @@ in your own project to `array-api-compat` or vendor it too: ``` 2. Create a new hook file which array-api-extra will use instead of the - top-level `array-api-compat` if present: + top-level array-api-compat if present: ``` echo 'from mylib.vendored.array_api_compat import *' > mylib/vendored/_array_api_compat_vendor.py ``` -This also allows overriding `array-api-compat` functions if you so wish. E.g. -your `mylib/vendored/_array_api_compat_vendor.py` could look like this: +This also allows overriding array-api-compat functions if you so wish. E.g. your +`mylib/vendored/_array_api_compat_vendor.py` could look like this: ```python from mylib.vendored.array_api_compat import * @@ -104,6 +107,13 @@ def array_namespace(*xs, **kwargs): return _array_namespace_orig(*xs, **kwargs) ``` +```{tip} +See [an example of this in SciPy][scipy-vendor-example]. +``` + +[scipy-vendor-example]: +https://github.com/scipy/scipy/blob/main/scipy/_lib/_array_api_compat_vendor.py + (usage)= ## Usage @@ -115,9 +125,9 @@ import array_api_extra as xpx ... xp = array_namespace(x) -y = xp.sum(x) +y = xp.sum(x) # use functions from `xp` as normal ... -return xpx.atleast_nd(y, ndim=2, xp=xp) +return xpx.atleast_nd(y, ndim=2, xp=xp) # use functions from `xpx`, passing `xp=xp` ``` ```{note} @@ -131,13 +141,13 @@ is called internally to determine the namespace. ``` In the examples shown in the docstrings of functions from this library, -[`array-api-strict`](https://data-apis.org/array-api-strict/) is used as the -array namespace `xp`. In reality, code using this library will be written to -work with any compatible array namespace as `xp`, not any particular -implementation. +[array-api-strict](https://data-apis.org/array-api-strict/) is used as the array +namespace `xp`. In reality, code using this library will be written to work with +any compatible array namespace as `xp`, not any particular implementation. -Some functions may only work with array libraries supported by array-api-compat. -This will be clearly indicated in the docs. +Some functions may only work with specific array libraries supported by +array-api-compat. This should be clearly indicated in the docs - please open an +issue if this is not the case! (scope)= @@ -151,13 +161,17 @@ Functions that are in-scope for this library will: libraries. - Be implemented with type annotations and [numpydoc-style docstrings](https://numpydoc.readthedocs.io/en/latest/format.html). -- Be tested against `array-api-strict`. +- Be tested against array-api-strict and various existing backends. Functions are implemented purely in terms of the array API standard where possible. Where functions must use library-specific helpers for libraries supported by array-api-compat, this will be clearly marked in their API reference page. +Delegation is added for some functions to use native implementations for the +given array type, instead of the array-agnostic implementations, as this may +increase performance. + In particular, the following kinds of function are also in-scope: - Functions which implement @@ -168,15 +182,12 @@ In particular, the following kinds of function are also in-scope: The following features are currently out-of-scope for this library: -- Delegation to known, existing array libraries (unless necessary). - - It is quite simple to wrap functions in this library to also use existing - implementations. Such delegation will not live in this library for now, but - the array-agnostic functions in this library could form an array-agnostic - backend for such delegating functions in the future, here or elsewhere. - Functions which accept "array-like" input, or standard-incompatible namespaces. - It is possible to prepare input arrays and a standard-compatible namespace - via `array-api-compat` downstream in consumer libraries. + via array-api-compat downstream in consumer libraries. The `xp` argument can + also be omitted to infer the standard-compatible namespace using + `array_namespace` internally. - Functions which are specific to a particular domain. - These functions may belong better in an array-consuming library which is specific to that domain. diff --git a/pixi.lock b/pixi.lock index ed262f2f..153a692b 100644 --- a/pixi.lock +++ b/pixi.lock @@ -11,7 +11,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.10.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/aws-c-auth-0.8.0-hb921021_15.conda + - conda: https://prefix.dev/conda-forge/linux-64/aws-c-auth-0.8.0-h205f482_16.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda @@ -20,10 +20,10 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/aws-c-io-0.15.3-h831e299_5.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-c-s3-0.7.7-hf454442_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/aws-c-sdkutils-0.2.1-h4e1184b_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda - - conda: https://prefix.dev/conda-forge/linux-64/aws-crt-cpp-0.29.7-hd92328a_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/aws-sdk-cpp-1.11.458-hc430e4a_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/aws-crt-cpp-0.29.8-h8570fcd_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/aws-sdk-cpp-1.11.458-h7001638_5.conda - conda: https://prefix.dev/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda - conda: https://prefix.dev/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda - conda: https://prefix.dev/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda @@ -68,15 +68,15 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://prefix.dev/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-hd595efa_7_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_7_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_7_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_7_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-h9d9f30d_8_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_8_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_8_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_8_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-26_linux64_mkl.conda - conda: https://prefix.dev/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.9.0-26_linux64_mkl.conda - conda: https://prefix.dev/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda @@ -94,14 +94,13 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.9.0-26_linux64_mkl.conda - conda: https://prefix.dev/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_7_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_8_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda @@ -110,7 +109,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda - - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_he8ec5d7_108.conda + - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_ha4c6a95_109.conda - conda: https://prefix.dev/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda @@ -126,12 +125,12 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda - conda: https://prefix.dev/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda - - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.0-py310h5eaa309_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.1-py310h5eaa309_0.conda - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/msgpack-python-1.1.0-py310h3788b33_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda - conda: https://prefix.dev/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda - conda: https://prefix.dev/conda-forge/linux-64/numba-0.60.0-py310h5dc88bb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.0.2-py310hd6e36ab_1.conda @@ -157,14 +156,14 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.10-5_cp310.conda - - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h27a6d43_108.conda + - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h1c118fa_109.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda - conda: https://prefix.dev/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/linux-64/s2n-1.5.10-hb5b8611_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.0-py310hfa6ec8c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.1-py310hfa6ec8c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.7-h1b44611_2.conda - conda: https://prefix.dev/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda @@ -193,7 +192,7 @@ environments: osx-arm64: - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.10.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-auth-0.8.0-h8bc59a9_15.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-auth-0.8.0-hfc2798a_16.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda @@ -202,10 +201,10 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_5.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-s3-0.7.7-h1be5864_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-sdkutils-0.2.1-hc8a0bd2_4.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/aws-crt-cpp-0.29.7-h19a973c_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-he0ff2e4_4.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/aws-crt-cpp-0.29.8-h23176ea_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-h794939a_5.conda - conda: https://prefix.dev/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda @@ -249,10 +248,10 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-h0ad35bc_7_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_7_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_7_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_7_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-hf3eb8e5_8_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_8_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_8_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_8_cpu.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda @@ -260,7 +259,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda @@ -278,15 +277,15 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_7_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_8_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.45-h3783ad8_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_hb579fdd_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_h266890c_9.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libutf8proc-2.9.0-h5505292_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda @@ -299,12 +298,12 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/lz4-4.3.3-py310hedecf87_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.2-py310hc74094e_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.0-py310hfd37619_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.1-py310h5936506_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/msgpack-python-1.1.0-py310h7306fd8_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda - conda: https://prefix.dev/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda - conda: https://prefix.dev/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.60.0-py310h0628f0e_0.conda @@ -331,13 +330,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.10-5_cp310.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_h3256795_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_h3256795_9.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.2-py310h493c2e1_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.0-py310hd50a768_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.1-py310hd50a768_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.7-h8391f65_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda @@ -366,7 +365,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.10.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/aws-c-auth-0.8.0-h2219d47_15.conda + - conda: https://prefix.dev/conda-forge/win-64/aws-c-auth-0.8.0-hd11252f_16.conda - conda: https://prefix.dev/conda-forge/win-64/aws-c-cal-0.8.1-h099ea23_3.conda - conda: https://prefix.dev/conda-forge/win-64/aws-c-common-0.10.6-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/aws-c-compression-0.3.0-h099ea23_5.conda @@ -375,10 +374,10 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/aws-c-io-0.15.3-hc5a9e45_5.conda - conda: https://prefix.dev/conda-forge/win-64/aws-c-mqtt-0.11.0-h2c94728_12.conda - conda: https://prefix.dev/conda-forge/win-64/aws-c-s3-0.7.7-h6a38c86_0.conda - - conda: https://prefix.dev/conda-forge/win-64/aws-c-sdkutils-0.2.1-h099ea23_4.conda + - conda: https://prefix.dev/conda-forge/win-64/aws-c-sdkutils-0.2.2-h099ea23_0.conda - conda: https://prefix.dev/conda-forge/win-64/aws-checksums-0.2.2-h099ea23_4.conda - - conda: https://prefix.dev/conda-forge/win-64/aws-crt-cpp-0.29.7-h0642867_7.conda - - conda: https://prefix.dev/conda-forge/win-64/aws-sdk-cpp-1.11.458-h5f5f9c4_4.conda + - conda: https://prefix.dev/conda-forge/win-64/aws-crt-cpp-0.29.8-h703467b_1.conda + - conda: https://prefix.dev/conda-forge/win-64/aws-sdk-cpp-1.11.458-h41fbdec_5.conda - conda: https://prefix.dev/conda-forge/noarch/bokeh-3.6.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py310h9e98ed7_2.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda @@ -409,10 +408,10 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - conda: https://prefix.dev/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/libabseil-20240722.0-cxx17_h4eb7d71_4.conda - - conda: https://prefix.dev/conda-forge/win-64/libarrow-18.1.0-he01b112_7_cpu.conda - - conda: https://prefix.dev/conda-forge/win-64/libarrow-acero-18.1.0-h7d8d6a5_7_cpu.conda - - conda: https://prefix.dev/conda-forge/win-64/libarrow-dataset-18.1.0-h7d8d6a5_7_cpu.conda - - conda: https://prefix.dev/conda-forge/win-64/libarrow-substrait-18.1.0-h3dbecdf_7_cpu.conda + - conda: https://prefix.dev/conda-forge/win-64/libarrow-18.1.0-hb928929_8_cpu.conda + - conda: https://prefix.dev/conda-forge/win-64/libarrow-acero-18.1.0-h7d8d6a5_8_cpu.conda + - conda: https://prefix.dev/conda-forge/win-64/libarrow-dataset-18.1.0-h7d8d6a5_8_cpu.conda + - conda: https://prefix.dev/conda-forge/win-64/libarrow-substrait-18.1.0-h3dbecdf_8_cpu.conda - conda: https://prefix.dev/conda-forge/win-64/libblas-3.9.0-26_win64_mkl.conda - conda: https://prefix.dev/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda @@ -433,8 +432,8 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.9.0-26_win64_mkl.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.6.3-h2466b09_1.conda - - conda: https://prefix.dev/conda-forge/win-64/libparquet-18.1.0-ha850022_7_cpu.conda - - conda: https://prefix.dev/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libparquet-18.1.0-ha850022_8_cpu.conda + - conda: https://prefix.dev/conda-forge/win-64/libpng-1.6.45-had7236b_0.conda - conda: https://prefix.dev/conda-forge/win-64/libprotobuf-5.28.3-h8309712_1.conda - conda: https://prefix.dev/conda-forge/win-64/libre2-11-2024.07.02-h4eb7d71_2.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda @@ -479,7 +478,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.2-py310ha8f682b_1.conda - conda: https://prefix.dev/conda-forge/win-64/re2-2024.07.02-haf4117d_2.conda - - conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.0-py310h164493e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.1-py310h164493e_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/snappy-1.2.1-h500f7fa_1.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2 @@ -542,7 +541,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.2.1-py310h5851e9f_0.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda @@ -568,7 +567,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda @@ -578,7 +577,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.2.1-py310ha1ddda0_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda @@ -668,14 +667,14 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.2.1-py313hb30382a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_105_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda @@ -694,7 +693,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda @@ -706,14 +705,14 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.2.1-py313ha4a2180_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_105_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda @@ -751,7 +750,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_105_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda @@ -786,9 +785,9 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_105_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda @@ -804,9 +803,9 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_105_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda @@ -823,7 +822,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_105_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda @@ -847,7 +846,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/astroid-3.3.8-py313h78bf25f_0.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda @@ -908,10 +907,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/myst-parser-4.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda - conda: https://prefix.dev/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/nodejs-22.12.0-hf235a45_0.conda - - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.13.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.2.1-py313hb30382a_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda @@ -931,13 +930,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_105_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.2-py313h536fd9c_1.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda @@ -976,7 +975,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/astroid-3.3.8-py313h8f79df9_0.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda @@ -1011,7 +1010,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda @@ -1032,10 +1031,10 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/myst-parser-4.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda - conda: https://prefix.dev/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/nodejs-22.12.0-h02a13b7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.13.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.2.1-py313ha4a2180_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda @@ -1055,13 +1054,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_105_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.2-py313h20a7fcf_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda @@ -1100,7 +1099,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/astroid-3.3.8-py313hfa70ccb_0.conda - conda: https://prefix.dev/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda @@ -1157,7 +1156,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/myst-parser-4.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/nodejs-22.12.0-hfeaa22a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.13.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.2.1-py313hd65a2fa_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda @@ -1175,12 +1174,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_105_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.2-py313ha7868ed_1.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda @@ -1263,13 +1262,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/myst-parser-4.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_105_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.2-py313h536fd9c_1.conda @@ -1315,7 +1314,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda @@ -1327,13 +1326,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/myst-parser-4.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_105_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.2-py313h20a7fcf_1.conda @@ -1395,7 +1394,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_105_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.2-py313ha7868ed_1.conda @@ -1439,7 +1438,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/astroid-3.3.8-py313h78bf25f_0.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/brotli-python-1.1.0-py313h46c70d0_2.conda @@ -1488,10 +1487,10 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda - conda: https://prefix.dev/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/nodejs-22.12.0-hf235a45_0.conda - - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.13.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.2.1-py313hb30382a_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda @@ -1504,13 +1503,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_105_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.2-py313h536fd9c_1.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda @@ -1540,7 +1539,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/astroid-3.3.8-py313h8f79df9_0.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/brotli-python-1.1.0-py313h3579c5c_2.conda @@ -1568,7 +1567,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda @@ -1584,10 +1583,10 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.2-py313ha9b7d5b_1.conda - conda: https://prefix.dev/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda - conda: https://prefix.dev/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/nodejs-22.12.0-h02a13b7_0.conda - - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.13.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.2.1-py313ha4a2180_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda @@ -1600,13 +1599,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_105_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.2-py313h20a7fcf_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda @@ -1636,7 +1635,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/astroid-3.3.8-py313hfa70ccb_0.conda - conda: https://prefix.dev/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/basedtyping-0.1.10-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py313h5813708_2.conda @@ -1681,7 +1680,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/nodejs-22.12.0-hfeaa22a_0.conda - - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.13.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.2.1-py313hd65a2fa_0.conda - conda: https://prefix.dev/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda @@ -1694,12 +1693,12 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_105_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.2-py313ha7868ed_1.conda - conda: https://prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda @@ -1763,14 +1762,14 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.2.1-py313hb30382a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_105_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda @@ -1789,7 +1788,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda @@ -1801,14 +1800,14 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/numpy-2.2.1-py313ha4a2180_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_105_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda @@ -1846,7 +1845,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_105_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda @@ -1869,7 +1868,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.10.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/aws-c-auth-0.8.0-hb921021_15.conda + - conda: https://prefix.dev/conda-forge/linux-64/aws-c-auth-0.8.0-h205f482_16.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda @@ -1878,10 +1877,10 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/aws-c-io-0.15.3-h831e299_5.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-c-s3-0.7.7-hf454442_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/aws-c-sdkutils-0.2.1-h4e1184b_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda - conda: https://prefix.dev/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda - - conda: https://prefix.dev/conda-forge/linux-64/aws-crt-cpp-0.29.7-hd92328a_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/aws-sdk-cpp-1.11.458-hc430e4a_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/aws-crt-cpp-0.29.8-h8570fcd_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/aws-sdk-cpp-1.11.458-h7001638_5.conda - conda: https://prefix.dev/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda - conda: https://prefix.dev/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda - conda: https://prefix.dev/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda @@ -1935,15 +1934,15 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://prefix.dev/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-hd595efa_7_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_7_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_7_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_7_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-h9d9f30d_8_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_8_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_8_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_8_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-26_linux64_mkl.conda - conda: https://prefix.dev/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.9.0-26_linux64_mkl.conda - conda: https://prefix.dev/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/libcublas-12.6.4.1-hbd13f7d_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libcufft-11.3.0.4-hbd13f7d_0.conda @@ -1966,15 +1965,14 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.9.0-26_linux64_mkl.conda - conda: https://prefix.dev/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnvjitlink-12.6.85-hbd13f7d_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_7_cpu.conda - - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_8_cpu.conda + - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda @@ -1983,7 +1981,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda - - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_he8ec5d7_108.conda + - conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_ha4c6a95_109.conda - conda: https://prefix.dev/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda @@ -1999,12 +1997,12 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://prefix.dev/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda - conda: https://prefix.dev/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda - - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.0-py310h5eaa309_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.1-py310h5eaa309_0.conda - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda - conda: https://prefix.dev/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/msgpack-python-1.1.0-py310h3788b33_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda - conda: https://prefix.dev/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda - conda: https://prefix.dev/conda-forge/linux-64/numba-0.60.0-py310h5dc88bb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.0.2-py310hd6e36ab_1.conda @@ -2030,14 +2028,14 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.10-5_cp310.conda - - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h27a6d43_108.conda + - conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h1c118fa_109.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda - conda: https://prefix.dev/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://prefix.dev/conda-forge/linux-64/s2n-1.5.10-hb5b8611_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.0-py310hfa6ec8c_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.1-py310hfa6ec8c_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.7-h1b44611_2.conda - conda: https://prefix.dev/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda @@ -2066,7 +2064,7 @@ environments: osx-arm64: - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.10.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-auth-0.8.0-h8bc59a9_15.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-auth-0.8.0-hfc2798a_16.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda @@ -2075,10 +2073,10 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_5.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-s3-0.7.7-h1be5864_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-sdkutils-0.2.1-hc8a0bd2_4.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/aws-crt-cpp-0.29.7-h19a973c_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-he0ff2e4_4.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/aws-crt-cpp-0.29.8-h23176ea_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-h794939a_5.conda - conda: https://prefix.dev/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda @@ -2122,10 +2120,10 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-h0ad35bc_7_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_7_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_7_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_7_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-hf3eb8e5_8_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_8_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_8_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_8_cpu.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda @@ -2133,7 +2131,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda @@ -2151,15 +2149,15 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_7_cpu.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_8_cpu.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.45-h3783ad8_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_hb579fdd_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_h266890c_9.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libutf8proc-2.9.0-h5505292_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda @@ -2172,12 +2170,12 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/lz4-4.3.3-py310hedecf87_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/markupsafe-3.0.2-py310hc74094e_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.0-py310hfd37619_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.1-py310h5936506_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - conda: https://prefix.dev/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/msgpack-python-1.1.0-py310h7306fd8_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda - conda: https://prefix.dev/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda - conda: https://prefix.dev/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/numba-0.60.0-py310h0628f0e_0.conda @@ -2204,13 +2202,13 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - conda: https://prefix.dev/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.10-5_cp310.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_h3256795_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_h3256795_9.conda - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pyyaml-6.0.2-py310h493c2e1_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.0-py310hd50a768_0.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.1-py310hd50a768_0.conda + - conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.7-h8391f65_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda @@ -2239,7 +2237,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.10.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.2-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/aws-c-auth-0.8.0-h2219d47_15.conda + - conda: https://prefix.dev/conda-forge/win-64/aws-c-auth-0.8.0-hd11252f_16.conda - conda: https://prefix.dev/conda-forge/win-64/aws-c-cal-0.8.1-h099ea23_3.conda - conda: https://prefix.dev/conda-forge/win-64/aws-c-common-0.10.6-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/win-64/aws-c-compression-0.3.0-h099ea23_5.conda @@ -2248,10 +2246,10 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/aws-c-io-0.15.3-hc5a9e45_5.conda - conda: https://prefix.dev/conda-forge/win-64/aws-c-mqtt-0.11.0-h2c94728_12.conda - conda: https://prefix.dev/conda-forge/win-64/aws-c-s3-0.7.7-h6a38c86_0.conda - - conda: https://prefix.dev/conda-forge/win-64/aws-c-sdkutils-0.2.1-h099ea23_4.conda + - conda: https://prefix.dev/conda-forge/win-64/aws-c-sdkutils-0.2.2-h099ea23_0.conda - conda: https://prefix.dev/conda-forge/win-64/aws-checksums-0.2.2-h099ea23_4.conda - - conda: https://prefix.dev/conda-forge/win-64/aws-crt-cpp-0.29.7-h0642867_7.conda - - conda: https://prefix.dev/conda-forge/win-64/aws-sdk-cpp-1.11.458-h5f5f9c4_4.conda + - conda: https://prefix.dev/conda-forge/win-64/aws-crt-cpp-0.29.8-h703467b_1.conda + - conda: https://prefix.dev/conda-forge/win-64/aws-sdk-cpp-1.11.458-h41fbdec_5.conda - conda: https://prefix.dev/conda-forge/noarch/bokeh-3.6.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py310h9e98ed7_2.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda @@ -2291,10 +2289,10 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - conda: https://prefix.dev/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - conda: https://prefix.dev/conda-forge/win-64/libabseil-20240722.0-cxx17_h4eb7d71_4.conda - - conda: https://prefix.dev/conda-forge/win-64/libarrow-18.1.0-he01b112_7_cpu.conda - - conda: https://prefix.dev/conda-forge/win-64/libarrow-acero-18.1.0-h7d8d6a5_7_cpu.conda - - conda: https://prefix.dev/conda-forge/win-64/libarrow-dataset-18.1.0-h7d8d6a5_7_cpu.conda - - conda: https://prefix.dev/conda-forge/win-64/libarrow-substrait-18.1.0-h3dbecdf_7_cpu.conda + - conda: https://prefix.dev/conda-forge/win-64/libarrow-18.1.0-hb928929_8_cpu.conda + - conda: https://prefix.dev/conda-forge/win-64/libarrow-acero-18.1.0-h7d8d6a5_8_cpu.conda + - conda: https://prefix.dev/conda-forge/win-64/libarrow-dataset-18.1.0-h7d8d6a5_8_cpu.conda + - conda: https://prefix.dev/conda-forge/win-64/libarrow-substrait-18.1.0-h3dbecdf_8_cpu.conda - conda: https://prefix.dev/conda-forge/win-64/libblas-3.9.0-26_win64_mkl.conda - conda: https://prefix.dev/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda - conda: https://prefix.dev/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda @@ -2321,8 +2319,8 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.9.0-26_win64_mkl.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.6.3-h2466b09_1.conda - conda: https://prefix.dev/conda-forge/win-64/libnvjitlink-12.6.85-he0c23c2_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libparquet-18.1.0-ha850022_7_cpu.conda - - conda: https://prefix.dev/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libparquet-18.1.0-ha850022_8_cpu.conda + - conda: https://prefix.dev/conda-forge/win-64/libpng-1.6.45-had7236b_0.conda - conda: https://prefix.dev/conda-forge/win-64/libprotobuf-5.28.3-h8309712_1.conda - conda: https://prefix.dev/conda-forge/win-64/libre2-11-2024.07.02-h4eb7d71_2.conda - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda @@ -2367,7 +2365,7 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/pyyaml-6.0.2-py310ha8f682b_1.conda - conda: https://prefix.dev/conda-forge/win-64/re2-2024.07.02-haf4117d_2.conda - - conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.0-py310h164493e_0.conda + - conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.1-py310h164493e_0.conda - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/win-64/snappy-1.2.1-h500f7fa_1.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2 @@ -2469,7 +2467,7 @@ packages: - pypi: . name: array-api-extra version: 0.5.1.dev0 - sha256: 09d6a4b1405fd64596379826065a09bc3787a4fc4e1535dc369f74a3b96f86e3 + sha256: 4ec1183114a670b9c9b9b351826c962ad92ab470b1914a163e4a5ed02d0e04a0 requires_dist: - array-api-compat>=1.10.0,<2 - furo>=2023.8.17 ; extra == 'docs' @@ -2545,54 +2543,54 @@ packages: - pkg:pypi/asttokens?source=hash-mapping size: 28206 timestamp: 1733250564754 -- conda: https://prefix.dev/conda-forge/linux-64/aws-c-auth-0.8.0-hb921021_15.conda - sha256: 537006ad6d5097c134494166a6a1dc1451d5d050878d7b82cef498bfda40ba8a - md5: c79d50f64cffa5ad51ecc1a81057962f +- conda: https://prefix.dev/conda-forge/linux-64/aws-c-auth-0.8.0-h205f482_16.conda + sha256: 0695c285b70385913dc7dce05888d3ad1378247b65273bdab509494a2f8f0eea + md5: b0815d37ab812ade9c07239da7c3c369 depends: - __glibc >=2.17,<3.0.a0 - aws-c-cal >=0.8.1,<0.8.2.0a0 - aws-c-common >=0.10.6,<0.10.7.0a0 - aws-c-http >=0.9.2,<0.9.3.0a0 - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-c-sdkutils >=0.2.1,<0.2.2.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 107614 - timestamp: 1734021692519 -- conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-auth-0.8.0-h8bc59a9_15.conda - sha256: 0e41e56b662e76e024182adebcd91d09a4d38a83b35217c84e4967354dfff9a2 - md5: f688b8893c20ad9477a19e7ce614014a + size: 107478 + timestamp: 1736592747413 +- conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-auth-0.8.0-hfc2798a_16.conda + sha256: cdcd932332311db1b614289101b61e32cbae2478ba2bf85763aaf5a5cc7db6f6 + md5: 1e9a41d5296f50c08ae511d61fddef85 depends: - __osx >=11.0 - aws-c-cal >=0.8.1,<0.8.2.0a0 - aws-c-common >=0.10.6,<0.10.7.0a0 - aws-c-http >=0.9.2,<0.9.3.0a0 - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-c-sdkutils >=0.2.1,<0.2.2.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 92507 - timestamp: 1734021831330 -- conda: https://prefix.dev/conda-forge/win-64/aws-c-auth-0.8.0-h2219d47_15.conda - sha256: 77dd27caf1ce46c195f4ae9fae3e45cbb3b113c5418b2426db95038912178206 - md5: d8aa3355ad0360a42b5c57fedb1ad87e + size: 92547 + timestamp: 1736592866387 +- conda: https://prefix.dev/conda-forge/win-64/aws-c-auth-0.8.0-hd11252f_16.conda + sha256: 7b071c929ce10670bcc0b62674cf32cddd82540520efb86e9401a7ec38d77378 + md5: 77b180b437094a263f059f91463c73b7 depends: - aws-c-cal >=0.8.1,<0.8.2.0a0 - aws-c-common >=0.10.6,<0.10.7.0a0 - aws-c-http >=0.9.2,<0.9.3.0a0 - aws-c-io >=0.15.3,<0.15.4.0a0 - - aws-c-sdkutils >=0.2.1,<0.2.2.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 102644 - timestamp: 1734022070771 + size: 102957 + timestamp: 1736592944745 - conda: https://prefix.dev/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 md5: 55a8561fdbbbd34f50f57d9be12ed084 @@ -2924,9 +2922,9 @@ packages: purls: [] size: 109362 timestamp: 1734146367350 -- conda: https://prefix.dev/conda-forge/linux-64/aws-c-sdkutils-0.2.1-h4e1184b_4.conda - sha256: df586f42210af1134b1c88ff4c278c3cb6d6c807c84eac48860062464b28554d - md5: a5126a90e74ac739b00564a4c7ddcc36 +- conda: https://prefix.dev/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc + md5: dcd498d493818b776a77fbc242fbf8e4 depends: - __glibc >=2.17,<3.0.a0 - aws-c-common >=0.10.6,<0.10.7.0a0 @@ -2934,22 +2932,22 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 56094 - timestamp: 1733994449690 -- conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-sdkutils-0.2.1-hc8a0bd2_4.conda - sha256: de98343ce42d2e569b3380292d20f47bf39bda08aadabcbb8e650d3f38fd742f - md5: 22f72f8cd7ead211304ac17d337d96e0 + size: 55911 + timestamp: 1736535960724 +- conda: https://prefix.dev/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 depends: - __osx >=11.0 - aws-c-common >=0.10.6,<0.10.7.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 49664 - timestamp: 1733994553014 -- conda: https://prefix.dev/conda-forge/win-64/aws-c-sdkutils-0.2.1-h099ea23_4.conda - sha256: 41dc53b95bc426e591bf294aaa844d81acec7033ab4586c25b56b7ed4e2c7254 - md5: 9b209470fc80add34e822f4abeade3a3 + size: 49872 + timestamp: 1736536152332 +- conda: https://prefix.dev/conda-forge/win-64/aws-c-sdkutils-0.2.2-h099ea23_0.conda + sha256: af9cc0696b9fb60e7d0738b140b3d93efcf7f354e56c3034f459fc1651d53921 + md5: 6292ef653d6002edc721d2dc9356aa57 depends: - aws-c-common >=0.10.6,<0.10.7.0a0 - ucrt >=10.0.20348.0 @@ -2958,8 +2956,8 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 55419 - timestamp: 1733994591200 + size: 55109 + timestamp: 1736536467087 - conda: https://prefix.dev/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 md5: 74e8c3e4df4ceae34aa2959df4b28101 @@ -2996,9 +2994,9 @@ packages: purls: [] size: 91909 timestamp: 1733994821424 -- conda: https://prefix.dev/conda-forge/linux-64/aws-crt-cpp-0.29.7-hd92328a_7.conda - sha256: 094cd81f1e5ba713e9e7a272ee52b5dde3ccc4842ea90f19c0354a00bbdac3d9 - md5: 02b95564257d5c3db9c06beccf711f95 +- conda: https://prefix.dev/conda-forge/linux-64/aws-crt-cpp-0.29.8-h8570fcd_1.conda + sha256: ff8f08bc615d3ef6d970df80988200b3ecee76ecfa4885109cd82b30176cfda9 + md5: f21296b496cca1c1fa426b9a3b676e79 depends: - __glibc >=2.17,<3.0.a0 - aws-c-auth >=0.8.0,<0.8.1.0a0 @@ -3009,17 +3007,17 @@ packages: - aws-c-io >=0.15.3,<0.15.4.0a0 - aws-c-mqtt >=0.11.0,<0.11.1.0a0 - aws-c-s3 >=0.7.7,<0.7.8.0a0 - - aws-c-sdkutils >=0.2.1,<0.2.2.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - libgcc >=13 - libstdcxx >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 354703 - timestamp: 1734177883319 -- conda: https://prefix.dev/conda-forge/osx-arm64/aws-crt-cpp-0.29.7-h19a973c_7.conda - sha256: 8269e6746eb3a5d15b732a3983888bf98dfc1f6594e95250fc8d16b43cfd5ff9 - md5: 95714136bef3e917bd5a2942d4682b20 + size: 354328 + timestamp: 1736598991291 +- conda: https://prefix.dev/conda-forge/osx-arm64/aws-crt-cpp-0.29.8-h23176ea_1.conda + sha256: db6a31078bb82fb12044d7706239c003568273729f7ba4971c1479b7926ada82 + md5: 31fdd3ffb00f5472196fa95ef08087b7 depends: - __osx >=11.0 - aws-c-auth >=0.8.0,<0.8.1.0a0 @@ -3030,16 +3028,16 @@ packages: - aws-c-io >=0.15.3,<0.15.4.0a0 - aws-c-mqtt >=0.11.0,<0.11.1.0a0 - aws-c-s3 >=0.7.7,<0.7.8.0a0 - - aws-c-sdkutils >=0.2.1,<0.2.2.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - libcxx >=18 license: Apache-2.0 license_family: Apache purls: [] - size: 236249 - timestamp: 1734178020924 -- conda: https://prefix.dev/conda-forge/win-64/aws-crt-cpp-0.29.7-h0642867_7.conda - sha256: dfd3375bc197e5cd2221dcddd0d8d6c42344ad9ea7c22112adcc94ec0ba43994 - md5: ff9d226385f7b626b1db36120a1fa36b + size: 236269 + timestamp: 1736599024242 +- conda: https://prefix.dev/conda-forge/win-64/aws-crt-cpp-0.29.8-h703467b_1.conda + sha256: 26bf5f5c644d5ff00783dd06d493bfdb9c6c20b9e82f200dbc3ae60754ef1e7f + md5: b1d3b02bde39ffe4ffa61ce87d86abc2 depends: - aws-c-auth >=0.8.0,<0.8.1.0a0 - aws-c-cal >=0.8.1,<0.8.2.0a0 @@ -3049,24 +3047,24 @@ packages: - aws-c-io >=0.15.3,<0.15.4.0a0 - aws-c-mqtt >=0.11.0,<0.11.1.0a0 - aws-c-s3 >=0.7.7,<0.7.8.0a0 - - aws-c-sdkutils >=0.2.1,<0.2.2.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 262833 - timestamp: 1734178062584 -- conda: https://prefix.dev/conda-forge/linux-64/aws-sdk-cpp-1.11.458-hc430e4a_4.conda - sha256: 2dc09f6f9c49127b5f96e7535b64a9c521b944d76d8b7d03d48ae80257ac1cea - md5: aeefac461bea1f126653c1285cf5af08 + size: 262760 + timestamp: 1736599347130 +- conda: https://prefix.dev/conda-forge/linux-64/aws-sdk-cpp-1.11.458-h7001638_5.conda + sha256: 849524b09865e84d6926aa814944cf71511aa4a00fffc5ad174c286d5dfac5f0 + md5: fc01d77a7f383b2915f276c73b7d0934 depends: - __glibc >=2.17,<3.0.a0 - aws-c-common >=0.10.6,<0.10.7.0a0 - aws-c-event-stream >=0.5.0,<0.5.1.0a0 - aws-checksums >=0.2.2,<0.2.3.0a0 - - aws-crt-cpp >=0.29.7,<0.29.8.0a0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 - libcurl >=8.11.1,<9.0a0 - libgcc >=13 - libstdcxx >=13 @@ -3075,17 +3073,17 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 3060561 - timestamp: 1734093737431 -- conda: https://prefix.dev/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-he0ff2e4_4.conda - sha256: 535b970aaa13be45f8cab8205c59f044b17364111c41a227f061775a5c834e18 - md5: 0981ed87098b149bdb7d99a4a3fd0e58 + size: 3088636 + timestamp: 1736598504343 +- conda: https://prefix.dev/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-h794939a_5.conda + sha256: 2b1e7d5a45e82604bfdb6de63c53cf0e9495f596cfd90e644a1e67910de7f91c + md5: a2374b4182bf5b2d08b2903393d0c487 depends: - __osx >=11.0 - aws-c-common >=0.10.6,<0.10.7.0a0 - aws-c-event-stream >=0.5.0,<0.5.1.0a0 - aws-checksums >=0.2.2,<0.2.3.0a0 - - aws-crt-cpp >=0.29.7,<0.29.8.0a0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 - libcurl >=8.11.1,<9.0a0 - libcxx >=18 - libzlib >=1.3.1,<2.0a0 @@ -3093,16 +3091,16 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 2826534 - timestamp: 1734094018287 -- conda: https://prefix.dev/conda-forge/win-64/aws-sdk-cpp-1.11.458-h5f5f9c4_4.conda - sha256: 89d285f1f0878900150487686d7471a6f98563a03b9754f819e08a1c5df292c0 - md5: bf0f2ff816f47326f932c66badef8192 + size: 2824168 + timestamp: 1736598935034 +- conda: https://prefix.dev/conda-forge/win-64/aws-sdk-cpp-1.11.458-h41fbdec_5.conda + sha256: 97abee16a2171ae38934102a8056b3b2656cb7d711ae4563624fab1d47d77f22 + md5: ce1338d55e45416282f8b3921a2b2a54 depends: - aws-c-common >=0.10.6,<0.10.7.0a0 - aws-c-event-stream >=0.5.0,<0.5.1.0a0 - aws-checksums >=0.2.2,<0.2.3.0a0 - - aws-crt-cpp >=0.29.7,<0.29.8.0a0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 @@ -3110,8 +3108,8 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 2969711 - timestamp: 1734094848306 + size: 2948912 + timestamp: 1736599399277 - conda: https://prefix.dev/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a md5: 0a8838771cc2e985cd295e01ae83baf1 @@ -3263,9 +3261,9 @@ packages: - pkg:pypi/babel?source=hash-mapping size: 6551057 timestamp: 1733236466015 -- conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.0-pyhd8ed1ab_0.conda - sha256: 6338810705180c2b9f7827ad171e15849a47af70d705dc45dd0d8c4748f9bb30 - md5: 5fd36cc2d33dd4326daec09c8b926458 +- conda: https://prefix.dev/conda-forge/noarch/basedmypy-2.9.1-pyhd8ed1ab_0.conda + sha256: fd98c651dc13618bfc427b548c109b6526603fcf1dca197bdb561a2a5a956622 + md5: ad268761b26971fa1e3c2629f4e5db56 depends: - basedtyping >=0.0.3 - mypy_extensions >=1.0.0 @@ -3275,8 +3273,8 @@ packages: license: BSD-3-Clause AND Apache-2.0 purls: - pkg:pypi/basedmypy?source=hash-mapping - size: 1849478 - timestamp: 1735780611775 + size: 1850703 + timestamp: 1736398661625 - conda: https://prefix.dev/conda-forge/noarch/basedpyright-1.23.2-pyhd8ed1ab_0.conda sha256: c66b5e90af123465f3b34dca54e839aeb2ef443018a008bf5b460a4549d807cc md5: 9e92cdee91e7ab02b4bddd7883087f4c @@ -4907,13 +4905,13 @@ packages: purls: [] size: 1784929 timestamp: 1736008778245 -- conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-hd595efa_7_cpu.conda - build_number: 7 - sha256: 554ffa338264c1dc34d95adb7eb856d50a2f25e7fa303a1a51e4372301b7c96f - md5: 08d4aff5ee6dee9a1b9ab13fca927697 +- conda: https://prefix.dev/conda-forge/linux-64/libarrow-18.1.0-h9d9f30d_8_cpu.conda + build_number: 8 + sha256: f6c72ce82d145cb94a1131b68547b88056fb48158a382f9ce763286fce53ee65 + md5: 1c9caae53b14a385b59e87687adad2d6 depends: - __glibc >=2.17,<3.0.a0 - - aws-crt-cpp >=0.29.7,<0.29.8.0a0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 - aws-sdk-cpp >=1.11.458,<1.11.459.0a0 - azure-core-cpp >=1.14.0,<1.14.1.0a0 - azure-identity-cpp >=1.10.0,<1.10.1.0a0 @@ -4945,15 +4943,15 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 8770256 - timestamp: 1735684696564 -- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-h0ad35bc_7_cpu.conda - build_number: 7 - sha256: 4fbdd8bb89d912bf03f10f9373a8d96a1cdd7a7851e107393418a3d2715bc27e - md5: 4ba2173203f44bbf03d19aaba6ed07d3 + size: 8801586 + timestamp: 1736610546493 +- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-18.1.0-hf3eb8e5_8_cpu.conda + build_number: 8 + sha256: 766e46b45520773db93ee1a91951cc135a85544bba738e7b378d31f16097753f + md5: fdc79871e6c243b819497337215416d9 depends: - __osx >=11.0 - - aws-crt-cpp >=0.29.7,<0.29.8.0a0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 - aws-sdk-cpp >=1.11.458,<1.11.459.0a0 - azure-core-cpp >=1.14.0,<1.14.1.0a0 - azure-identity-cpp >=1.10.0,<1.10.1.0a0 @@ -4983,14 +4981,14 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 5506699 - timestamp: 1735682962976 -- conda: https://prefix.dev/conda-forge/win-64/libarrow-18.1.0-he01b112_7_cpu.conda - build_number: 7 - sha256: b995701632370977fc7e20fe9d9222314f0d67fac0a2ea606685414d48d46588 - md5: 422fb7333012e97c2659c43558f1ed65 + size: 5497383 + timestamp: 1736608604724 +- conda: https://prefix.dev/conda-forge/win-64/libarrow-18.1.0-hb928929_8_cpu.conda + build_number: 8 + sha256: 9323e933e603b15bca2231ccda45849a80e7cf415c2872c194286e84e4a09290 + md5: 8d18b506794c1e583998a6d54054145b depends: - - aws-crt-cpp >=0.29.7,<0.29.8.0a0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 - aws-sdk-cpp >=1.11.458,<1.11.459.0a0 - bzip2 >=1.0.8,<2.0a0 - libabseil * cxx17* @@ -5013,149 +5011,149 @@ packages: - vc14_runtime >=14.42.34433 - zstd >=1.5.6,<1.6.0a0 constrains: - - apache-arrow-proc =*=cpu - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 5303299 - timestamp: 1735686839461 -- conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_7_cpu.conda - build_number: 7 - sha256: 87ea5d6a84d922d73975dce8661fccf257e72e755175b12c30e1181a34e37987 - md5: 12d84228204c56fec6ed113288014d11 + size: 5248568 + timestamp: 1736611659169 +- conda: https://prefix.dev/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_8_cpu.conda + build_number: 8 + sha256: 126a6e78199311d99e38b9d633ce3e0290795ac68ce3ee8a9b91436c85c4095d + md5: 544759904898499f634f8f88a9907f88 depends: - __glibc >=2.17,<3.0.a0 - - libarrow 18.1.0 hd595efa_7_cpu + - libarrow 18.1.0 h9d9f30d_8_cpu - libgcc >=13 - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 612463 - timestamp: 1735684749868 -- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_7_cpu.conda - build_number: 7 - sha256: 86e20cebfdb4f335e98265c1b88f5053bf3e3648768a317856295846bfdbf2b4 - md5: 3eaf71fe987de13061db795e03bb1a1c + size: 611558 + timestamp: 1736610592458 +- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_8_cpu.conda + build_number: 8 + sha256: 29196dc6b2e4488f98bd8950de6333efe5d1a9d0cc62e186694946766185475e + md5: 8db96829f8e427167f450c7467a1ba44 depends: - __osx >=11.0 - - libarrow 18.1.0 h0ad35bc_7_cpu + - libarrow 18.1.0 hf3eb8e5_8_cpu - libcxx >=18 license: Apache-2.0 license_family: APACHE purls: [] - size: 485185 - timestamp: 1735683071232 -- conda: https://prefix.dev/conda-forge/win-64/libarrow-acero-18.1.0-h7d8d6a5_7_cpu.conda - build_number: 7 - sha256: e9f8e3f5bbef3251ca5a16a40ea6237af9f5d6372afc3adfeed11b9cc42caa41 - md5: 6fd4586665caaf723fb8334eb40ae6da + size: 484442 + timestamp: 1736608695654 +- conda: https://prefix.dev/conda-forge/win-64/libarrow-acero-18.1.0-h7d8d6a5_8_cpu.conda + build_number: 8 + sha256: 43470dc8369d6ffab8699780c744ee75d04989641c0dc60afcf68db0213c4d5c + md5: 7e11f505623fda50814299f0c066b7e9 depends: - - libarrow 18.1.0 he01b112_7_cpu + - libarrow 18.1.0 hb928929_8_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.42.34433 license: Apache-2.0 license_family: APACHE purls: [] - size: 447461 - timestamp: 1735686912086 -- conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_7_cpu.conda - build_number: 7 - sha256: 99c12511fba79c7947f78d676eae5857659084f687f375f68bc20bd4cddb0a0e - md5: 0a81eb63d7cd150f598c752e86388d57 + size: 446853 + timestamp: 1736611713691 +- conda: https://prefix.dev/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_8_cpu.conda + build_number: 8 + sha256: fe50edf030b5ccbadec2bf8f90d4cdf32d63ec52ba26233fc2c8bfbe43df3b15 + md5: 894a5ed78728b77c997fefeee222ac4d depends: - __glibc >=2.17,<3.0.a0 - - libarrow 18.1.0 hd595efa_7_cpu - - libarrow-acero 18.1.0 hcb10f89_7_cpu + - libarrow 18.1.0 h9d9f30d_8_cpu + - libarrow-acero 18.1.0 hcb10f89_8_cpu - libgcc >=13 - - libparquet 18.1.0 h081d1f1_7_cpu + - libparquet 18.1.0 h081d1f1_8_cpu - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 587497 - timestamp: 1735684880531 -- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_7_cpu.conda - build_number: 7 - sha256: 52c5c4e9cd5f2ac91dcebb6a920ab2536febcea116ff8767e5439329d7da820b - md5: 97a2d3606682d94f7d73112e9ad684ae + size: 588032 + timestamp: 1736610711976 +- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_8_cpu.conda + build_number: 8 + sha256: bff2d39e418eadab8c522a536449ac90f070dd8e83e2bd5e67a9c3eb8ecf712f + md5: 7b3736f49b3ba299b7799aeb448cb830 depends: - __osx >=11.0 - - libarrow 18.1.0 h0ad35bc_7_cpu - - libarrow-acero 18.1.0 hf07054f_7_cpu + - libarrow 18.1.0 hf3eb8e5_8_cpu + - libarrow-acero 18.1.0 hf07054f_8_cpu - libcxx >=18 - - libparquet 18.1.0 h636d7b7_7_cpu + - libparquet 18.1.0 h636d7b7_8_cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 491237 - timestamp: 1735684688308 -- conda: https://prefix.dev/conda-forge/win-64/libarrow-dataset-18.1.0-h7d8d6a5_7_cpu.conda - build_number: 7 - sha256: ee32fc23819e10c58e9be6620d2ad6153d8b326f84cbd134aafe6a60a5d00c88 - md5: ea567b6a24c3eb4f2b3ed8f8314cae99 + size: 491001 + timestamp: 1736609758514 +- conda: https://prefix.dev/conda-forge/win-64/libarrow-dataset-18.1.0-h7d8d6a5_8_cpu.conda + build_number: 8 + sha256: 34cd6707c28efbf5cabef6e57e19e0aedcb670ec559e95885704872c7b42077c + md5: b93e516a5a780f722e9ed9b3d12c9213 depends: - - libarrow 18.1.0 he01b112_7_cpu - - libarrow-acero 18.1.0 h7d8d6a5_7_cpu - - libparquet 18.1.0 ha850022_7_cpu + - libarrow 18.1.0 hb928929_8_cpu + - libarrow-acero 18.1.0 h7d8d6a5_8_cpu + - libparquet 18.1.0 ha850022_8_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.42.34433 license: Apache-2.0 license_family: APACHE purls: [] - size: 435269 - timestamp: 1735687174564 -- conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_7_cpu.conda - build_number: 7 - sha256: 53ea53a06e137c2f81ebfdff3f978babb8b59e31f705a19b57056ec8754c1abf - md5: e128def53c133e8a23ac00cd4a479335 + size: 434392 + timestamp: 1736611904846 +- conda: https://prefix.dev/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_8_cpu.conda + build_number: 8 + sha256: dca372e27724904577315b8db3793e027a5c152a485e505e630a57b15634cd85 + md5: 46eaf81238da6f3ffab1f3ffdcee382e depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 18.1.0 hd595efa_7_cpu - - libarrow-acero 18.1.0 hcb10f89_7_cpu - - libarrow-dataset 18.1.0 hcb10f89_7_cpu + - libarrow 18.1.0 h9d9f30d_8_cpu + - libarrow-acero 18.1.0 hcb10f89_8_cpu + - libarrow-dataset 18.1.0 hcb10f89_8_cpu - libgcc >=13 - libprotobuf >=5.28.3,<5.28.4.0a0 - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 521861 - timestamp: 1735684940668 -- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_7_cpu.conda - build_number: 7 - sha256: a45bbdd6932aed972d6c6ce30a7439aa8ec9d9b8ee5affb350d41e50abdc0127 - md5: 91927747173f65695e441346c7145e26 + size: 521707 + timestamp: 1736610765240 +- conda: https://prefix.dev/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_8_cpu.conda + build_number: 8 + sha256: ae52d926ebfc8edb0728824f2918a825d39bd85a4ef27fe2b73656cfecdd7c69 + md5: f67eb19d22ba355cced8c86073ad49b1 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 18.1.0 h0ad35bc_7_cpu - - libarrow-acero 18.1.0 hf07054f_7_cpu - - libarrow-dataset 18.1.0 hf07054f_7_cpu + - libarrow 18.1.0 hf3eb8e5_8_cpu + - libarrow-acero 18.1.0 hf07054f_8_cpu + - libarrow-dataset 18.1.0 hf07054f_8_cpu - libcxx >=18 - libprotobuf >=5.28.3,<5.28.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 452385 - timestamp: 1735684993831 -- conda: https://prefix.dev/conda-forge/win-64/libarrow-substrait-18.1.0-h3dbecdf_7_cpu.conda - build_number: 7 - sha256: 600548a5ef61ae4f3ea41fd2a02878fdf9a6ebf1223ff4f18c67a3063910513e - md5: bdeede0a6516f2a1a7f29c2ff8e2885d + size: 452161 + timestamp: 1736609917123 +- conda: https://prefix.dev/conda-forge/win-64/libarrow-substrait-18.1.0-h3dbecdf_8_cpu.conda + build_number: 8 + sha256: 4ddb7ac8c2f7caf9a357696c0ab448884480d4cd7d72516dc9b63b0833c5abb2 + md5: f4b70d99b8e7e1334735a215205b686b depends: - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 - - libarrow 18.1.0 he01b112_7_cpu - - libarrow-acero 18.1.0 h7d8d6a5_7_cpu - - libarrow-dataset 18.1.0 h7d8d6a5_7_cpu + - libarrow 18.1.0 hb928929_8_cpu + - libarrow-acero 18.1.0 h7d8d6a5_8_cpu + - libarrow-dataset 18.1.0 h7d8d6a5_8_cpu - libprotobuf >=5.28.3,<5.28.4.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -5163,8 +5161,26 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 365444 - timestamp: 1735687288606 + size: 364597 + timestamp: 1736611987931 +- conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-26_linux64_mkl.conda + build_number: 26 + sha256: 11cc33993e1865e6caa3e05f117effb3f7cbacc632e5adc572ffd36b4fa47241 + md5: 60463d3ec26e0860bfc7fc1547e005ef + depends: + - mkl >=2024.2.2,<2025.0a0 + constrains: + - liblapack 3.9.0 26_linux64_mkl + - blas * mkl + - libcblas 3.9.0 26_linux64_mkl + - liblapacke 3.9.0 26_linux64_mkl + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16766 + timestamp: 1734432542498 - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda build_number: 26 sha256: 30bd658682b124243f8e52d8edf8a19e7be1bc31e4fe4baec30a64002dc8cd0c @@ -5320,6 +5336,23 @@ packages: purls: [] size: 245929 timestamp: 1725268238259 +- conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.9.0-26_linux64_mkl.conda + build_number: 26 + sha256: 23866eb509e5896b8fcf647e9cef8f0923d5bb378c0dd14b44b94abe1b24c4d7 + md5: 760c109bfe25518d6f9af51d7af8b9f3 + depends: + - libblas 3.9.0 26_linux64_mkl + constrains: + - liblapack 3.9.0 26_linux64_mkl + - blas * mkl + - liblapacke 3.9.0 26_linux64_mkl + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16269 + timestamp: 1734432548754 - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda build_number: 26 sha256: 9c74e536c9bc868e356ffd43f81c2cb398aec84b40fcadc312315b164a5500ee @@ -5575,16 +5608,16 @@ packages: purls: [] size: 122556064 timestamp: 1727811617684 -- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - sha256: 2b2443404503cd862385fd2f2a2c73f9624686fd1e5a45050b4034cfc06904ec - md5: ce5252d8db110cdb4ae4173d0a63c7c5 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 520992 - timestamp: 1734494699681 + size: 523505 + timestamp: 1736877862502 - conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 md5: 8dfae1d2e74767e9ce36d5fa0d8605db @@ -6132,6 +6165,23 @@ packages: purls: [] size: 822966 timestamp: 1694475223854 +- conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.9.0-26_linux64_mkl.conda + build_number: 26 + sha256: 4ab8f00c325e1aacb6edc881b39c7c294adafc9d485cdde82979d1617fcd1e6f + md5: 84112111a50db59ca64153e0054fa73e + depends: + - libblas 3.9.0 26_linux64_mkl + constrains: + - blas * mkl + - libcblas 3.9.0 26_linux64_mkl + - liblapacke 3.9.0 26_linux64_mkl + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16302 + timestamp: 1734432554916 - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda build_number: 26 sha256: b76458c36331376911e0f98fa68109e02f4d5e5ebfffa79587ac69cef748bba1 @@ -6360,13 +6410,13 @@ packages: purls: [] size: 4165774 timestamp: 1730772154295 -- conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_7_cpu.conda - build_number: 7 - sha256: 55945b761130f60abdecf1551907ecfd05cb4a5958cf74d855b30c005ecb3592 - md5: b97013ef4e1dd2cf11594f06d5b5e83a +- conda: https://prefix.dev/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_8_cpu.conda + build_number: 8 + sha256: 2c6d900d4e9dd3c4000886d76d3f8a099e904667ebc6935b49428e6e9b766481 + md5: a9fa0ef309406c84b46db3a28efd761e depends: - __glibc >=2.17,<3.0.a0 - - libarrow 18.1.0 hd595efa_7_cpu + - libarrow 18.1.0 h9d9f30d_8_cpu - libgcc >=13 - libstdcxx >=13 - libthrift >=0.21.0,<0.21.1.0a0 @@ -6374,29 +6424,29 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 1205598 - timestamp: 1735684849150 -- conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_7_cpu.conda - build_number: 7 - sha256: bf42e43542a90edd86ba5aa5fd4543671625f1bc35f62be32688f00e18bae990 - md5: 93de9ba66a20db32a2646d313794b3a8 + size: 1207011 + timestamp: 1736610684584 +- conda: https://prefix.dev/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_8_cpu.conda + build_number: 8 + sha256: 4991519ef4264abc7160e9faaf8ff01d4731bf1497076bef1895d6c366f796eb + md5: b8bd275a49877fdec62ff787818a869d depends: - __osx >=11.0 - - libarrow 18.1.0 h0ad35bc_7_cpu + - libarrow 18.1.0 hf3eb8e5_8_cpu - libcxx >=18 - libthrift >=0.21.0,<0.21.1.0a0 - openssl >=3.4.0,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 873251 - timestamp: 1735684582558 -- conda: https://prefix.dev/conda-forge/win-64/libparquet-18.1.0-ha850022_7_cpu.conda - build_number: 7 - sha256: 5b901e940bf1a4e8d9a776c8435713b44e19ab45970acb80ac17e28fa0ce830f - md5: c6ec79824da8a0cc92fc0f87dedcce12 + size: 873593 + timestamp: 1736609701839 +- conda: https://prefix.dev/conda-forge/win-64/libparquet-18.1.0-ha850022_8_cpu.conda + build_number: 8 + sha256: 3292cd6efa06a20362fdb212e64783f8c8df4fe4687ed01a4c4ad3f8843cbb92 + md5: fc609e4314b53f0980a6f09862bc92a2 depends: - - libarrow 18.1.0 he01b112_7_cpu + - libarrow 18.1.0 hb928929_8_cpu - libthrift >=0.21.0,<0.21.1.0a0 - openssl >=3.4.0,<4.0a0 - ucrt >=10.0.20348.0 @@ -6405,32 +6455,32 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 812887 - timestamp: 1735687117032 -- conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - sha256: e5b14f7a01c2db4362d8591f42f82f336ed48d5e4079e4d1f65d0c2a3637ea78 - md5: f4cc49d7aa68316213e4b12be35308d1 + size: 812306 + timestamp: 1736611863777 +- conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda + sha256: b8f5b5ba9a14dedf7c97c01300de492b1b52b68eacbc3249a13fdbfa82349a2f + md5: 85cbdaacad93808395ac295b5667d25b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement purls: [] - size: 290661 - timestamp: 1726234747153 -- conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - sha256: 38f8759a3eb8060deabd4db41f0f023514d853e46ddcbd0ba21768fc4e563bb1 - md5: fb36e93f0ea6a6f5d2b99984f34b049e + size: 289426 + timestamp: 1736339058310 +- conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.45-h3783ad8_0.conda + sha256: ddcc81c049b32fb5eb3ac1f9a6d3a589c08325c8ec6f89eb912208b19330d68c + md5: d554c806d065b1763cb9e1cb1d25741d depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement purls: [] - size: 263385 - timestamp: 1726234714421 -- conda: https://prefix.dev/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda - sha256: 0d3d6ff9225f6918ac225e3839c0d91e5af1da08a4ebf59cac1bfd86018db945 - md5: 639ac6b55a40aa5de7b8c1b4d78f9e81 + size: 263151 + timestamp: 1736339184358 +- conda: https://prefix.dev/conda-forge/win-64/libpng-1.6.45-had7236b_0.conda + sha256: e39c4f1bc8fee08f6a2eb4a88174d14c3a99dbb4850c98f3a87eb83b4dabbfca + md5: 41fb9e522ec6e0b34a6f23c98b07e1cf depends: - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 @@ -6438,8 +6488,8 @@ packages: - vc14_runtime >=14.29.30139 license: zlib-acknowledgement purls: [] - size: 348933 - timestamp: 1726235196095 + size: 348982 + timestamp: 1736339314098 - conda: https://prefix.dev/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 md5: d8703f1ffe5a06356f06467f1d0b9464 @@ -6717,14 +6767,15 @@ packages: purls: [] size: 978878 timestamp: 1734399004259 -- conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_he8ec5d7_108.conda - sha256: 96e04252aa1a64c8a50fcccb6e36a0f53f54b7eb9a61b2e1930191b67cce655c - md5: a070bb62918bea542fbb092c2abd7004 +- conda: https://prefix.dev/conda-forge/linux-64/libtorch-2.5.1-cpu_mkl_ha4c6a95_109.conda + sha256: 021dd776fc6482b31bcc27330d262f9a7df54bc3d199e9af2dfcc513d0320d2c + md5: 01be7598624eb315ee63c807dfe3f242 depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 + - libblas * *mkl - libcblas >=3.9.0,<4.0a0 - libgcc >=13 - libprotobuf >=5.28.3,<5.28.4.0a0 @@ -6734,20 +6785,21 @@ packages: - sleef >=3.7,<4.0a0 constrains: - pytorch-cpu ==2.5.1 - - pytorch 2.5.1 cpu_mkl_*_108 - pytorch-gpu ==99999999 + - pytorch 2.5.1 cpu_mkl_*_109 license: BSD-3-Clause license_family: BSD purls: [] - size: 53384470 - timestamp: 1736088424107 -- conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_hb579fdd_8.conda - sha256: 3e1306ca33285261dcb950ebba397dfe47ad36ae66d451746f107f5f9484fc12 - md5: fcd141fc3b6e5df95f175360c32c09eb + size: 53428361 + timestamp: 1736828519709 +- conda: https://prefix.dev/conda-forge/osx-arm64/libtorch-2.5.1-cpu_generic_h266890c_9.conda + sha256: bf5e9ce558b516988a41e1fbc73b368ef03b6f89a6b34edbde3203e131fcd455 + md5: ad9069009d26de3551e1053fa77a6355 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 + - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - libcxx >=18 - liblapack >=3.9.0,<4.0a0 @@ -6759,14 +6811,15 @@ packages: - python_abi 3.10.* *_cp310 - sleef >=3.7,<4.0a0 constrains: - - pytorch 2.5.1 cpu_generic_*_8 - - pytorch-gpu ==99999999 - pytorch-cpu ==2.5.1 + - pytorch 2.5.1 cpu_generic_*_9 + - openblas * openmp_* + - pytorch-gpu ==99999999 license: BSD-3-Clause license_family: BSD purls: [] - size: 28266322 - timestamp: 1736093877602 + size: 28341435 + timestamp: 1736896460239 - conda: https://prefix.dev/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda sha256: 9794e6388e780c3310d46f773bbc924d4053375c3fcdb07a704b57f4616db928 md5: 1e936bd23d737aac62a18e9a1e7f8b18 @@ -7363,9 +7416,9 @@ packages: purls: [] size: 103106385 timestamp: 1730232843711 -- conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.0-py310h5eaa309_0.conda - sha256: a4899aba9d82ed20d5c3fcbd8714d438e4000b0250c40816b95a5df64066f8dc - md5: 431846c13cf7b44ef56d6a6be8143727 +- conda: https://prefix.dev/conda-forge/linux-64/ml_dtypes-0.5.1-py310h5eaa309_0.conda + sha256: 80bb8601139177f4dab0d830993de9769bc6f1db13d275e5dbcf5d6568b6e337 + md5: 080f68e04d194abdba4a0a6a5178bf61 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -7376,14 +7429,14 @@ packages: license: MPL-2.0 AND Apache-2.0 purls: - pkg:pypi/ml-dtypes?source=hash-mapping - size: 285598 - timestamp: 1726376467402 -- conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.0-py310hfd37619_0.conda - sha256: 5bf79855b2275914899f69003c58ed06dd1832dc1f026975a8d17ffa5576047c - md5: ddb5c62069a0a72ddb076f63e99a9475 + size: 283388 + timestamp: 1736538961486 +- conda: https://prefix.dev/conda-forge/osx-arm64/ml_dtypes-0.5.1-py310h5936506_0.conda + sha256: a75c01da122fc1043e32adba9094922afc5f758ddaea47f5e56e0c111123294b + md5: 23c80623fc06fa0fa60237b14674cc69 depends: - __osx >=11.0 - - libcxx >=17 + - libcxx >=18 - numpy >=1.19,<3 - python >=3.10,<3.11.0a0 - python >=3.10,<3.11.0a0 *_cpython @@ -7391,8 +7444,8 @@ packages: license: MPL-2.0 AND Apache-2.0 purls: - pkg:pypi/ml-dtypes?source=hash-mapping - size: 201729 - timestamp: 1726376542680 + size: 202079 + timestamp: 1736539243508 - conda: https://prefix.dev/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda sha256: 1bf794ddf2c8b3a3e14ae182577c624fa92dea975537accff4bc7e5fea085212 md5: aa14b9a5196a6d8dd364164b7ce56acf @@ -7525,25 +7578,25 @@ packages: - pkg:pypi/myst-parser?source=hash-mapping size: 72901 timestamp: 1734472043484 -- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a - md5: 70caf8bb6cf39a0b6b7efc885f51c0fe +- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda + sha256: 17fe6afd8a00446010220d52256bd222b1e4fcb93bd587e7784b03219f3dc358 + md5: 04b34b9a40cdc48cfdab261ab176ff74 depends: - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 + - libgcc >=13 license: X11 AND BSD-3-Clause purls: [] - size: 889086 - timestamp: 1724658547447 -- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc - md5: cb2b0ea909b97b3d70cd3921d1445e1a + size: 894452 + timestamp: 1736683239706 +- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda + sha256: b45c73348ec9841d5c893acc2e97adff24127548fe8c786109d03c41ed564e91 + md5: f6f7c5b7d0983be186c46c4f6f8f9af8 depends: - __osx >=11.0 license: X11 AND BSD-3-Clause purls: [] - size: 802321 - timestamp: 1724658775723 + size: 796754 + timestamp: 1736683572099 - conda: https://prefix.dev/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda sha256: 39625cd0c9747fa5c46a9a90683b8997d8b9649881b3dc88336b13b7bdd60117 md5: fd40bf7f7f4bc4b647dc8512053d9873 @@ -7613,9 +7666,9 @@ packages: purls: [] size: 26256775 timestamp: 1734108943224 -- conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.12.0-pyhd8ed1ab_0.conda - sha256: fe6b3e568d1ac8dd41a02e3c3ab938cbc70a34a9f19f18894c0fb386a2e680e7 - md5: 0c0b2dd84667461e950e9297de8aceb9 +- conda: https://prefix.dev/conda-forge/noarch/nodejs-wheel-22.13.0-pyhd8ed1ab_0.conda + sha256: 6c36ec2f56105bd6bfe572b8ce7b6b4eb770a2c3db3655d99ead99c5a8b1a5d7 + md5: 17efc155ae707cdc9fe2970ebd74ee01 depends: - nodejs - python >=3.9 @@ -7623,8 +7676,8 @@ packages: license_family: MIT purls: - pkg:pypi/nodejs-wheel-binaries?source=hash-mapping - size: 11797 - timestamp: 1734322201782 + size: 11810 + timestamp: 1736400170073 - conda: https://prefix.dev/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 sha256: d38542a151a90417065c1a234866f97fd1ea82a81de75ecb725955ab78f88b4b md5: 9a66894dfd07c4510beb6b3f9672ccc0 @@ -8518,6 +8571,7 @@ packages: depends: - python >=3.9 license: BSD-2-Clause + license_family: BSD purls: - pkg:pypi/pygments?source=hash-mapping size: 888600 @@ -8627,10 +8681,10 @@ packages: purls: [] size: 25199631 timestamp: 1733409331823 -- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_103_cp313.conda - build_number: 103 - sha256: 365f9294ba2d36513f85085b95b705d4d02110a6d11ec4b683f5a10d37dde020 - md5: 899de8f76e198a36bc5a36132a6db887 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_105_cp313.conda + build_number: 105 + sha256: d3eb7d0820cf0189103bba1e60e242ffc15fd2f727640ac3a10394b27adf3cca + md5: 34945787453ee52a8f8271c1d19af1e8 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -8651,8 +8705,8 @@ packages: - tzdata license: Python-2.0 purls: [] - size: 33262248 - timestamp: 1736273267565 + size: 33169840 + timestamp: 1736763984540 - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.10.16-h870587a_1_cpython.conda build_number: 1 sha256: cd617b15712c4f9316b22c75459311ed106ccb0659c0bf36e281a9162b4e2d95 @@ -8675,10 +8729,10 @@ packages: purls: [] size: 12372048 timestamp: 1733408850559 -- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_103_cp313.conda - build_number: 103 - sha256: 0ebda5e85d5d37f0af1dae8ad500ef298a547ec790cdbfdb271ffbe4d2c56770 - md5: b43efdca6d96347894527844a4cdd5c8 +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_105_cp313.conda + build_number: 105 + sha256: 7d27cc8ef214abbdf7dd8a5d473e744f4bd9beb7293214a73c58e4895c2830b8 + md5: 11d916b508764b7d881dd5c75d222d6e depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 @@ -8696,8 +8750,8 @@ packages: - tzdata license: Python-2.0 purls: [] - size: 11727435 - timestamp: 1736271845822 + size: 12919840 + timestamp: 1736761931666 - conda: https://prefix.dev/conda-forge/win-64/python-3.10.16-h37870fc_1_cpython.conda build_number: 1 sha256: 3392db6a7a90864d3fd1ce281859a49e27ee68121b63eece2ae6f1dbb2a8aaf1 @@ -8720,10 +8774,10 @@ packages: purls: [] size: 16061214 timestamp: 1733408154785 -- conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_103_cp313.conda - build_number: 103 - sha256: 1517cbdf453557c7445c05b77c23da95a8b45586b270c6534f822c5b64bfeeaf - md5: 884ad80bf8454b8feff00b1f77a3dda9 +- conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_105_cp313.conda + build_number: 105 + sha256: de3bb832ff3982c993c6af15e6c45bb647159f25329caceed6f73fd4769c7628 + md5: 3ddb0531ecfb2e7274d471203e053d78 depends: - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.6.4,<3.0a0 @@ -8741,8 +8795,8 @@ packages: - vc14_runtime >=14.29.30139 license: Python-2.0 purls: [] - size: 16841405 - timestamp: 1736270799704 + size: 16778758 + timestamp: 1736761341620 - conda: https://prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 md5: 5ba79d7c71f03c678c8ead841f347d6e @@ -8832,9 +8886,9 @@ packages: purls: [] size: 6716 timestamp: 1723823166911 -- conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h27a6d43_108.conda - sha256: ebd999d7d1612c87cdd15ecd893be759345712b7471937f9c917690210f419bb - md5: 9aec633b09fd455e84a637454068bfa8 +- conda: https://prefix.dev/conda-forge/linux-64/pytorch-2.5.1-cpu_mkl_py310_h1c118fa_109.conda + sha256: c1fcbc00995e84ce54a48301b57c90101b99e6f230873765efdf70d8e52282db + md5: 7ae3aba3aed36993e7700b7c9e2b8cfb depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 @@ -8843,6 +8897,7 @@ packages: - jinja2 - libabseil * cxx17* - libabseil >=20240722.0,<20240723.0a0 + - libblas * *mkl - libcblas >=3.9.0,<4.0a0 - libgcc >=13 - libprotobuf >=5.28.3,<5.28.4.0a0 @@ -8865,11 +8920,11 @@ packages: license_family: BSD purls: - pkg:pypi/torch?source=hash-mapping - size: 34307765 - timestamp: 1736090964088 -- conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_h3256795_8.conda - sha256: 2f548d400e5014028b89339889768093730e0cf2e3e5d7c7ece9eddde646a0a2 - md5: 16985e88a59d007aa4d0a8b13f820e7c + size: 34033082 + timestamp: 1736831182336 +- conda: https://prefix.dev/conda-forge/osx-arm64/pytorch-2.5.1-cpu_generic_py310_h3256795_9.conda + sha256: c2f85319da078b86e81523b6a92c5761342123ed5b7bf8828082e34eab59cbc4 + md5: 5472d797227aa217036da7ec899358c5 depends: - __osx >=11.0 - filelock @@ -8895,14 +8950,14 @@ packages: - sympy >=1.13.1,!=1.13.2 - typing_extensions constrains: - - pytorch-gpu ==99999999 - pytorch-cpu ==2.5.1 + - pytorch-gpu ==99999999 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/torch?source=hash-mapping - size: 22573321 - timestamp: 1736094550662 + size: 22861302 + timestamp: 1736897435420 - conda: https://prefix.dev/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 md5: 3eeeeb9e4827ace8c0c1419c85d590ad @@ -9097,9 +9152,9 @@ packages: purls: [] size: 355142 timestamp: 1734415467047 -- conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.0-py310hfa6ec8c_0.conda - sha256: 6d3a2e3a942f8a2b383c9a94a0a06c34b75511adbe93158c20427b659d0cafae - md5: 5af85973838c580ab7f4f72008c8b237 +- conda: https://prefix.dev/conda-forge/linux-64/scipy-1.15.1-py310hfa6ec8c_0.conda + sha256: 9941f3bc9af712e60ce7b3910f9da0298f6b6f4c0b4fbc85f43b3db6342e21e4 + md5: a24baa04ee53ee3078ac1856887c3dea depends: - __glibc >=2.17,<3.0.a0 - libblas >=3.9.0,<4.0a0 @@ -9109,7 +9164,7 @@ packages: - libgfortran5 >=13.3.0 - liblapack >=3.9.0,<4.0a0 - libstdcxx >=13 - - numpy <2.3 + - numpy <2.5 - numpy >=1.19,<3 - numpy >=1.23.5 - python >=3.10,<3.11.0a0 @@ -9118,11 +9173,11 @@ packages: license_family: BSD purls: - pkg:pypi/scipy?source=hash-mapping - size: 18405029 - timestamp: 1736010557840 -- conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.0-py310hd50a768_0.conda - sha256: 3a5f5a1f3a9b8c9e0fec02821638c8958de4a579f8637d5a66eeff682deb246d - md5: b1c91b7bfece72a5bf5f03dc0b7a3055 + size: 18436262 + timestamp: 1736618466062 +- conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.15.1-py310hd50a768_0.conda + sha256: 387cacd510792d7c7cf86b46374f2885b06f3b9505067cf9d9742a7034aa79bf + md5: 8e181e12d183fd4e44fc2f941cfe8f47 depends: - __osx >=11.0 - libblas >=3.9.0,<4.0a0 @@ -9131,7 +9186,7 @@ packages: - libgfortran 5.* - libgfortran5 >=13.2.0 - liblapack >=3.9.0,<4.0a0 - - numpy <2.3 + - numpy <2.5 - numpy >=1.19,<3 - numpy >=1.23.5 - python >=3.10,<3.11.0a0 @@ -9141,16 +9196,16 @@ packages: license_family: BSD purls: - pkg:pypi/scipy?source=hash-mapping - size: 15057534 - timestamp: 1736010232496 -- conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.0-py310h164493e_0.conda - sha256: c06c0722006125176005e77a9d739d19eb4003c315b0092fc5358a9005f6abb7 - md5: eb011c11b5f60006cab90584b3a7053d + size: 14530851 + timestamp: 1736618488135 +- conda: https://prefix.dev/conda-forge/win-64/scipy-1.15.1-py310h164493e_0.conda + sha256: 3b2342ce7edd3b8391cf321da8cb2bc50ac7dca36b3444b91f82688f9d0671dc + md5: 2b18926b32f740cb76d7cdaf983c1e6f depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - - numpy <2.3 + - numpy <2.5 - numpy >=1.19,<3 - numpy >=1.23.5 - python >=3.10,<3.11.0a0 @@ -9162,19 +9217,19 @@ packages: license_family: BSD purls: - pkg:pypi/scipy?source=hash-mapping - size: 17162281 - timestamp: 1736011322833 -- conda: https://prefix.dev/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda - sha256: abb12e1dd515b13660aacb5d0fd43835bc2186cab472df25b7716cd65e095111 - md5: fc80f7995e396cbaeabd23cf46c413dc + size: 16956039 + timestamp: 1736619650525 +- conda: https://prefix.dev/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + sha256: e0778e4f276e9a81b51c56f51ec22a27b4d8fc955abc0be77ad09ca9bea06bb9 + md5: 8f28e299c11afdd79e0ec1e279dcdc52 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/setuptools?source=hash-mapping - size: 774252 - timestamp: 1732632769210 + size: 775598 + timestamp: 1736512753595 - conda: https://prefix.dev/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db md5: a451d576819089b0d672f18768be0f65 diff --git a/pyproject.toml b/pyproject.toml index a5594541..fee54b1a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -177,7 +177,11 @@ tests-backends = ["py310", "tests", "backends", "cuda-backends"] minversion = "6.0" addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"] xfail_strict = true -filterwarnings = ["error"] +filterwarnings = [ + "error", + # TODO: when Python 3.10 is dropped, use `enum.member` in `_delegation.py` + "ignore:functools.partial will be a method descriptor:FutureWarning", +] log_cli_level = "INFO" testpaths = ["tests"] markers = ["skip_xp_backend(library, *, reason=None): Skip test for a specific backend"] diff --git a/src/array_api_extra/__init__.py b/src/array_api_extra/__init__.py index 3f973307..57d728ef 100644 --- a/src/array_api_extra/__init__.py +++ b/src/array_api_extra/__init__.py @@ -1,6 +1,7 @@ """Extra array functions built on top of the array API standard.""" -from ._funcs import ( +from ._delegation import pad +from ._lib._funcs import ( at, atleast_nd, cov, @@ -8,7 +9,6 @@ expand_dims, kron, nunique, - pad, setdiff1d, sinc, ) diff --git a/src/array_api_extra/_delegation.py b/src/array_api_extra/_delegation.py new file mode 100644 index 00000000..4a1740e6 --- /dev/null +++ b/src/array_api_extra/_delegation.py @@ -0,0 +1,83 @@ +"""Delegation to existing implementations for Public API Functions.""" + +from types import ModuleType +from typing import Literal + +from ._lib import Backend, _funcs +from ._lib._utils._compat import array_namespace +from ._lib._utils._typing import Array + +__all__ = ["pad"] + + +def _delegate(xp: ModuleType, *backends: Backend) -> bool: + """ + Check whether `xp` is one of the `backends` to delegate to. + + Parameters + ---------- + xp : array_namespace + Array namespace to check. + *backends : IsNamespace + Arbitrarily many backends (from the ``IsNamespace`` enum) to check. + + Returns + ------- + bool + ``True`` if `xp` matches one of the `backends`, ``False`` otherwise. + """ + return any(backend.is_namespace(xp) for backend in backends) + + +def pad( + x: Array, + pad_width: int | tuple[int, int] | list[tuple[int, int]], + mode: Literal["constant"] = "constant", + *, + constant_values: bool | int | float | complex = 0, + xp: ModuleType | None = None, +) -> Array: + """ + Pad the input array. + + Parameters + ---------- + x : array + Input array. + pad_width : int or tuple of ints or list of pairs of ints + Pad the input array with this many elements from each side. + If a list of tuples, ``[(before_0, after_0), ... (before_N, after_N)]``, + each pair applies to the corresponding axis of ``x``. + A single tuple, ``(before, after)``, is equivalent to a list of ``x.ndim`` + copies of this tuple. + mode : str, optional + Only "constant" mode is currently supported, which pads with + the value passed to `constant_values`. + constant_values : python scalar, optional + Use this value to pad the input. Default is zero. + xp : array_namespace, optional + The standard-compatible namespace for `x`. Default: infer. + + Returns + ------- + array + The input array, + padded with ``pad_width`` elements equal to ``constant_values``. + """ + xp = array_namespace(x) if xp is None else xp + + if mode != "constant": + msg = "Only `'constant'` mode is currently supported" + raise NotImplementedError(msg) + + # https://github.com/pytorch/pytorch/blob/cf76c05b4dc629ac989d1fb8e789d4fac04a095a/torch/_numpy/_funcs_impl.py#L2045-L2056 + if _delegate(xp, Backend.TORCH): + pad_width = xp.asarray(pad_width) + pad_width = xp.broadcast_to(pad_width, (x.ndim, 2)) + pad_width = xp.flip(pad_width, axis=(0,)).flatten() + return xp.nn.functional.pad(x, tuple(pad_width), value=constant_values) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] + + if _delegate(xp, Backend.NUMPY, Backend.JAX_NUMPY, Backend.CUPY): + return xp.pad(x, pad_width, mode, constant_values=constant_values) + + return _funcs.pad(x, pad_width, constant_values=constant_values, xp=xp) diff --git a/src/array_api_extra/_lib/__init__.py b/src/array_api_extra/_lib/__init__.py index d7a79525..b83d7e8c 100644 --- a/src/array_api_extra/_lib/__init__.py +++ b/src/array_api_extra/_lib/__init__.py @@ -1 +1,5 @@ -"""Modules housing private functions.""" +"""Internals of array-api-extra.""" + +from ._backends import Backend + +__all__ = ["Backend"] diff --git a/src/array_api_extra/_lib/_backends.py b/src/array_api_extra/_lib/_backends.py new file mode 100644 index 00000000..93c43272 --- /dev/null +++ b/src/array_api_extra/_lib/_backends.py @@ -0,0 +1,59 @@ +"""Backends with which array-api-extra interacts in delegation and testing.""" + +from collections.abc import Callable +from enum import Enum +from types import ModuleType +from typing import cast + +from ._utils import _compat + +__all__ = ["Backend"] + + +class Backend(Enum): # numpydoc ignore=PR01,PR02 # type: ignore[no-subclass-any] + """ + All array library backends explicitly tested by array-api-extra. + + Parameters + ---------- + value : str + String describing the backend. + is_namespace : Callable[[ModuleType], bool] + Function to check whether an input module is the array namespace + corresponding to the backend. + module_name : str + Name of the backend's module. + """ + + ARRAY_API_STRICT = ( + "array_api_strict", + _compat.is_array_api_strict_namespace, + "array_api_strict", + ) + NUMPY = "numpy", _compat.is_numpy_namespace, "numpy" + NUMPY_READONLY = "numpy_readonly", _compat.is_numpy_namespace, "numpy" + CUPY = "cupy", _compat.is_cupy_namespace, "cupy" + TORCH = "torch", _compat.is_torch_namespace, "torch" + DASK_ARRAY = "dask.array", _compat.is_dask_namespace, "dask.array" + SPARSE = "sparse", _compat.is_pydata_sparse_namespace, "sparse" + JAX_NUMPY = "jax.numpy", _compat.is_jax_namespace, "jax.numpy" + + def __new__( + cls, value: str, _is_namespace: Callable[[ModuleType], bool], _module_name: str + ): # numpydoc ignore=GL08 + obj = object.__new__(cls) + obj._value_ = value + return obj + + def __init__( + self, + value: str, # noqa: ARG002 # pylint: disable=unused-argument + is_namespace: Callable[[ModuleType], bool], + module_name: str, + ): # numpydoc ignore=GL08 + self.is_namespace = is_namespace + self.module_name = module_name + + def __str__(self) -> str: # type: ignore[explicit-override] # pyright: ignore[reportImplicitOverride] # numpydoc ignore=RT01 + """Pretty-print parameterized test names.""" + return cast(str, self.value) diff --git a/src/array_api_extra/_funcs.py b/src/array_api_extra/_lib/_funcs.py similarity index 95% rename from src/array_api_extra/_funcs.py rename to src/array_api_extra/_lib/_funcs.py index 017c7297..320e5455 100644 --- a/src/array_api_extra/_funcs.py +++ b/src/array_api_extra/_lib/_funcs.py @@ -1,4 +1,4 @@ -"""Public API Functions.""" +"""Array-agnostic implementations for the public API.""" # https://github.com/scikit-learn/scikit-learn/pull/27910#issuecomment-2568023972 from __future__ import annotations @@ -11,13 +11,9 @@ from types import ModuleType from typing import ClassVar, cast -from ._lib import _compat, _utils -from ._lib._compat import ( - array_namespace, - is_jax_array, - is_writeable_array, -) -from ._lib._typing import Array, Index +from ._utils import _compat, _helpers +from ._utils._compat import array_namespace, is_jax_array, is_writeable_array +from ._utils._typing import Array, Index __all__ = [ "at", @@ -151,7 +147,7 @@ def cov(m: Array, /, *, xp: ModuleType | None = None) -> Array: m = atleast_nd(m, ndim=2, xp=xp) m = xp.astype(m, dtype) - avg = _utils.mean(m, axis=1, xp=xp) + avg = _helpers.mean(m, axis=1, xp=xp) fact = m.shape[1] - 1 if fact <= 0: @@ -467,7 +463,7 @@ def setdiff1d( else: x1 = xp.unique_values(x1) x2 = xp.unique_values(x2) - return x1[_utils.in1d(x1, x2, assume_unique=True, invert=True, xp=xp)] + return x1[_helpers.in1d(x1, x2, assume_unique=True, invert=True, xp=xp)] def sinc(x: Array, /, *, xp: ModuleType | None = None) -> Array: @@ -562,44 +558,11 @@ def sinc(x: Array, /, *, xp: ModuleType | None = None) -> Array: def pad( x: Array, pad_width: int | tuple[int, int] | list[tuple[int, int]], - mode: str = "constant", *, - xp: ModuleType | None = None, constant_values: bool | int | float | complex = 0, -) -> Array: - """ - Pad the input array. - - Parameters - ---------- - x : array - Input array. - pad_width : int or tuple of ints or list of pairs of ints - Pad the input array with this many elements from each side. - If a list of tuples, ``[(before_0, after_0), ... (before_N, after_N)]``, - each pair applies to the corresponding axis of ``x``. - A single tuple, ``(before, after)``, is equivalent to a list of ``x.ndim`` - copies of this tuple. - mode : str, optional - Only "constant" mode is currently supported, which pads with - the value passed to `constant_values`. - xp : array_namespace, optional - The standard-compatible namespace for `x`. Default: infer. - constant_values : python scalar, optional - Use this value to pad the input. Default is zero. - - Returns - ------- - array - The input array, - padded with ``pad_width`` elements equal to ``constant_values``. - """ - if mode != "constant": - msg = "Only `'constant'` mode is currently supported" - raise NotImplementedError(msg) - - value = constant_values - + xp: ModuleType, +) -> Array: # numpydoc ignore=PR01,RT01 + """See docstring in `array_api_extra._delegation.py`.""" # make pad_width a list of length-2 tuples of ints x_ndim = cast(int, x.ndim) if isinstance(pad_width, int): @@ -607,9 +570,6 @@ def pad( if isinstance(pad_width, tuple): pad_width = [pad_width] * x_ndim - if xp is None: - xp = array_namespace(x) - # https://github.com/python/typeshed/issues/13376 slices: list[slice] = [] # type: ignore[no-any-explicit] newshape: list[int] = [] @@ -633,7 +593,7 @@ def pad( padded = xp.full( tuple(newshape), - fill_value=value, + fill_value=constant_values, dtype=x.dtype, device=_compat.device(x), ) diff --git a/src/array_api_extra/_lib/_testing.py b/src/array_api_extra/_lib/_testing.py index b866012f..b6993a16 100644 --- a/src/array_api_extra/_lib/_testing.py +++ b/src/array_api_extra/_lib/_testing.py @@ -4,13 +4,15 @@ Note that this is private API; don't expect it to be stable. """ -from ._compat import ( +from types import ModuleType + +from ._utils._compat import ( array_namespace, is_cupy_namespace, is_pydata_sparse_namespace, is_torch_namespace, ) -from ._typing import Array, ModuleType +from ._utils._typing import Array __all__ = ["xp_assert_close", "xp_assert_equal"] diff --git a/src/array_api_extra/_lib/_utils/__init__.py b/src/array_api_extra/_lib/_utils/__init__.py new file mode 100644 index 00000000..3628c45f --- /dev/null +++ b/src/array_api_extra/_lib/_utils/__init__.py @@ -0,0 +1 @@ +"""Modules housing private utility functions.""" diff --git a/src/array_api_extra/_lib/_compat.py b/src/array_api_extra/_lib/_utils/_compat.py similarity index 71% rename from src/array_api_extra/_lib/_compat.py rename to src/array_api_extra/_lib/_utils/_compat.py index 7d843f19..d7f7e83a 100644 --- a/src/array_api_extra/_lib/_compat.py +++ b/src/array_api_extra/_lib/_utils/_compat.py @@ -3,12 +3,15 @@ # `array-api-compat` to override the import location try: - from ..._array_api_compat_vendor import ( # pyright: ignore[reportMissingImports] + from ...._array_api_compat_vendor import ( # pyright: ignore[reportMissingImports] array_namespace, device, + is_array_api_strict_namespace, is_cupy_namespace, + is_dask_namespace, is_jax_array, is_jax_namespace, + is_numpy_namespace, is_pydata_sparse_namespace, is_torch_namespace, is_writeable_array, @@ -18,9 +21,12 @@ from array_api_compat import ( # pyright: ignore[reportMissingTypeStubs] array_namespace, device, + is_array_api_strict_namespace, is_cupy_namespace, + is_dask_namespace, is_jax_array, is_jax_namespace, + is_numpy_namespace, is_pydata_sparse_namespace, is_torch_namespace, is_writeable_array, @@ -30,9 +36,12 @@ __all__ = [ "array_namespace", "device", + "is_array_api_strict_namespace", "is_cupy_namespace", + "is_dask_namespace", "is_jax_array", "is_jax_namespace", + "is_numpy_namespace", "is_pydata_sparse_namespace", "is_torch_namespace", "is_writeable_array", diff --git a/src/array_api_extra/_lib/_compat.pyi b/src/array_api_extra/_lib/_utils/_compat.pyi similarity index 62% rename from src/array_api_extra/_lib/_compat.pyi rename to src/array_api_extra/_lib/_utils/_compat.pyi index 8532584c..6086dcfe 100644 --- a/src/array_api_extra/_lib/_compat.pyi +++ b/src/array_api_extra/_lib/_utils/_compat.pyi @@ -18,10 +18,13 @@ def array_namespace( use_compat: bool | None = None, ) -> ArrayModule: ... def device(x: Array, /) -> Device: ... -def is_cupy_namespace(x: object, /) -> bool: ... +def is_array_api_strict_namespace(xp: ModuleType, /) -> bool: ... +def is_cupy_namespace(xp: ModuleType, /) -> bool: ... +def is_dask_namespace(xp: ModuleType, /) -> bool: ... +def is_jax_namespace(xp: ModuleType, /) -> bool: ... +def is_numpy_namespace(xp: ModuleType, /) -> bool: ... +def is_torch_namespace(xp: ModuleType, /) -> bool: ... def is_jax_array(x: object, /) -> bool: ... -def is_jax_namespace(x: object, /) -> bool: ... -def is_pydata_sparse_namespace(x: object, /) -> bool: ... -def is_torch_namespace(x: object, /) -> bool: ... +def is_pydata_sparse_namespace(xp: ModuleType, /) -> bool: ... def is_writeable_array(x: object, /) -> bool: ... def size(x: Array, /) -> int | None: ... diff --git a/src/array_api_extra/_lib/_utils.py b/src/array_api_extra/_lib/_utils/_helpers.py similarity index 96% rename from src/array_api_extra/_lib/_utils.py rename to src/array_api_extra/_lib/_utils/_helpers.py index afb4cfc4..84efcc35 100644 --- a/src/array_api_extra/_lib/_utils.py +++ b/src/array_api_extra/_lib/_utils/_helpers.py @@ -1,10 +1,12 @@ -"""Utility functions used by `array_api_extra/_funcs.py`.""" +"""Helper functions used by `array_api_extra/_funcs.py`.""" # https://github.com/scikit-learn/scikit-learn/pull/27910#issuecomment-2568023972 from __future__ import annotations +from types import ModuleType + from . import _compat -from ._typing import Array, ModuleType +from ._typing import Array __all__ = ["in1d", "mean"] diff --git a/src/array_api_extra/_lib/_typing.py b/src/array_api_extra/_lib/_utils/_typing.py similarity index 75% rename from src/array_api_extra/_lib/_typing.py rename to src/array_api_extra/_lib/_utils/_typing.py index c612020f..83b51d04 100644 --- a/src/array_api_extra/_lib/_typing.py +++ b/src/array_api_extra/_lib/_utils/_typing.py @@ -1,6 +1,5 @@ """Static typing helpers.""" -from types import ModuleType from typing import Any # To be changed to a Protocol later (see data-apis/array-api#589) @@ -8,4 +7,4 @@ Device = Any # type: ignore[no-any-explicit] Index = Any # type: ignore[no-any-explicit] -__all__ = ["Array", "Device", "Index", "ModuleType"] +__all__ = ["Array", "Device", "Index"] diff --git a/tests/conftest.py b/tests/conftest.py index 0bf3114f..4b07c205 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,47 +1,31 @@ """Pytest fixtures.""" -from enum import Enum +from types import ModuleType from typing import cast import pytest -from array_api_extra._lib._compat import array_namespace -from array_api_extra._lib._compat import device as get_device -from array_api_extra._lib._typing import Device, ModuleType +from array_api_extra._lib import Backend +from array_api_extra._lib._utils._compat import array_namespace +from array_api_extra._lib._utils._compat import device as get_device +from array_api_extra._lib._utils._typing import Device -class Library(Enum): - """All array libraries explicitly tested by array-api-extra.""" - - ARRAY_API_STRICT = "array_api_strict" - NUMPY = "numpy" - NUMPY_READONLY = "numpy_readonly" - CUPY = "cupy" - TORCH = "torch" - DASK_ARRAY = "dask.array" - SPARSE = "sparse" - JAX_NUMPY = "jax.numpy" - - def __str__(self) -> str: # type: ignore[explicit-override] # pyright: ignore[reportImplicitOverride] # numpydoc ignore=RT01 - """Pretty-print parameterized test names.""" - return self.value - - -@pytest.fixture(params=tuple(Library)) -def library(request: pytest.FixtureRequest) -> Library: # numpydoc ignore=PR01,RT03 +@pytest.fixture(params=tuple(Backend)) +def library(request: pytest.FixtureRequest) -> Backend: # numpydoc ignore=PR01,RT03 """ Parameterized fixture that iterates on all libraries. Returns ------- - The current Library enum. + The current Backend enum. """ - elem = cast(Library, request.param) + elem = cast(Backend, request.param) for marker in request.node.iter_markers("skip_xp_backend"): skip_library = marker.kwargs.get("library") or marker.args[0] # type: ignore[no-untyped-usage] - if not isinstance(skip_library, Library): - msg = "argument of skip_xp_backend must be a Library enum" + if not isinstance(skip_library, Backend): + msg = "argument of skip_xp_backend must be a Backend enum" raise TypeError(msg) if skip_library == elem: reason = cast(str, marker.kwargs.get("reason", "skip_xp_backend")) @@ -51,7 +35,7 @@ def library(request: pytest.FixtureRequest) -> Library: # numpydoc ignore=PR01, @pytest.fixture -def xp(library: Library) -> ModuleType: # numpydoc ignore=PR01,RT03 +def xp(library: Backend) -> ModuleType: # numpydoc ignore=PR01,RT03 """ Parameterized fixture that iterates on all libraries. @@ -59,9 +43,8 @@ def xp(library: Library) -> ModuleType: # numpydoc ignore=PR01,RT03 ------- The current array namespace. """ - name = "numpy" if library == Library.NUMPY_READONLY else library.value - xp = pytest.importorskip(name) - if library == Library.JAX_NUMPY: + xp = pytest.importorskip(library.module_name) + if library == Backend.JAX_NUMPY: import jax # type: ignore[import-not-found] # pyright: ignore[reportMissingImports] jax.config.update("jax_enable_x64", True) @@ -72,14 +55,14 @@ def xp(library: Library) -> ModuleType: # numpydoc ignore=PR01,RT03 @pytest.fixture def device( - library: Library, xp: ModuleType + library: Backend, xp: ModuleType ) -> Device: # numpydoc ignore=PR01,RT01,RT03 """ Return a valid device for the backend. Where possible, return a device that is not the default one. """ - if library == Library.ARRAY_API_STRICT: + if library == Backend.ARRAY_API_STRICT: d = xp.Device("device1") assert get_device(xp.empty(0)) != d return d diff --git a/tests/test_at.py b/tests/test_at.py index ed56f615..e9159712 100644 --- a/tests/test_at.py +++ b/tests/test_at.py @@ -1,5 +1,6 @@ from collections.abc import Callable, Generator from contextlib import contextmanager +from types import ModuleType from typing import cast import numpy as np @@ -11,17 +12,16 @@ ) from array_api_extra import at -from array_api_extra._funcs import _AtOp +from array_api_extra._lib import Backend +from array_api_extra._lib._funcs import _AtOp from array_api_extra._lib._testing import xp_assert_equal -from array_api_extra._lib._typing import Array, ModuleType - -from .conftest import Library +from array_api_extra._lib._utils._typing import Array @pytest.fixture -def array(library: Library, xp: ModuleType) -> Array: +def array(library: Backend, xp: ModuleType) -> Array: x = xp.asarray([10.0, 20.0, 30.0]) - if library == Library.NUMPY_READONLY: + if library == Backend.NUMPY_READONLY: x.flags.writeable = False return x diff --git a/tests/test_funcs.py b/tests/test_funcs.py index 201295da..5be4a9ad 100644 --- a/tests/test_funcs.py +++ b/tests/test_funcs.py @@ -1,5 +1,6 @@ import contextlib import warnings +from types import ModuleType import numpy as np import pytest @@ -16,16 +17,15 @@ setdiff1d, sinc, ) -from array_api_extra._lib._compat import device as get_device +from array_api_extra._lib import Backend from array_api_extra._lib._testing import xp_assert_close, xp_assert_equal -from array_api_extra._lib._typing import Array, Device, ModuleType - -from .conftest import Library +from array_api_extra._lib._utils._compat import device as get_device +from array_api_extra._lib._utils._typing import Array, Device # mypy: disable-error-code=no-untyped-usage -@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no expand_dims") +@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no expand_dims") class TestAtLeastND: def test_0D(self, xp: ModuleType): x = xp.asarray(1.0) @@ -97,7 +97,7 @@ def test_xp(self, xp: ModuleType): xp_assert_equal(y, x) -@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no isdtype") +@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no isdtype") class TestCov: def test_basic(self, xp: ModuleType): xp_assert_close( @@ -143,7 +143,7 @@ def test_xp(self, xp: ModuleType): ) -@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no device") +@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no device") class TestCreateDiagonal: def test_1d(self, xp: ModuleType): # from np.diag tests @@ -189,10 +189,10 @@ def test_xp(self, xp: ModuleType): xp_assert_equal(y, xp.asarray([[1, 0], [0, 2]])) -@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no sparse.expand_dims") +@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no sparse.expand_dims") class TestExpandDims: - @pytest.mark.skip_xp_backend(Library.DASK_ARRAY, reason="tuple index out of range") - @pytest.mark.skip_xp_backend(Library.TORCH, reason="tuple index out of range") + @pytest.mark.skip_xp_backend(Backend.DASK_ARRAY, reason="tuple index out of range") + @pytest.mark.skip_xp_backend(Backend.TORCH, reason="tuple index out of range") def test_functionality(self, xp: ModuleType): def _squeeze_all(b: Array) -> Array: """Mimics `np.squeeze(b)`. `xpx.squeeze`?""" @@ -250,7 +250,7 @@ def test_xp(self, xp: ModuleType): assert y.shape == (1, 1, 1, 3) -@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no sparse.expand_dims") +@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no sparse.expand_dims") class TestKron: def test_basic(self, xp: ModuleType): # Using 0-dimensional array @@ -329,11 +329,11 @@ def test_xp(self, xp: ModuleType): xp_assert_equal(kron(a, b, xp=xp), k) -@pytest.mark.skip_xp_backend(Library.DASK_ARRAY, reason="no argsort") -@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no device") +@pytest.mark.skip_xp_backend(Backend.DASK_ARRAY, reason="no argsort") +@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no device") class TestSetDiff1D: @pytest.mark.skip_xp_backend( - Library.TORCH, reason="index_select not implemented for uint32" + Backend.TORCH, reason="index_select not implemented for uint32" ) def test_setdiff1d(self, xp: ModuleType): x1 = xp.asarray([6, 5, 4, 7, 1, 2, 7, 4]) @@ -374,7 +374,7 @@ def test_xp(self, xp: ModuleType): xp_assert_equal(actual, expected) -@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no isdtype") +@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no isdtype") class TestSinc: def test_simple(self, xp: ModuleType): xp_assert_equal(sinc(xp.asarray(0.0)), xp.asarray(1.0)) @@ -401,7 +401,7 @@ def test_xp(self, xp: ModuleType): xp_assert_equal(sinc(xp.asarray(0.0), xp=xp), xp.asarray(1.0)) -@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no arange, no device") +@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no arange, no device") class TestPad: def test_simple(self, xp: ModuleType): a = xp.arange(1, 4) @@ -421,7 +421,7 @@ def test_ndim(self, xp: ModuleType): def test_mode_not_implemented(self, xp: ModuleType): a = xp.arange(3) with pytest.raises(NotImplementedError, match="Only `'constant'`"): - pad(a, 2, mode="edge") + pad(a, 2, mode="edge") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] def test_device(self, xp: ModuleType, device: Device): a = xp.asarray(0.0, device=device) @@ -439,7 +439,7 @@ def test_tuple_width(self, xp: ModuleType): padded = pad(a, (1, 2)) assert padded.shape == (6, 7) - with pytest.raises(ValueError, match="expect a 2-tuple"): + with pytest.raises((ValueError, RuntimeError)): pad(a, [(1, 2, 3)]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] def test_list_of_tuples_width(self, xp: ModuleType): diff --git a/tests/test_testing.py b/tests/test_testing.py index 28b37d03..2dbc913a 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -1,10 +1,9 @@ import numpy as np import pytest +from array_api_extra._lib import Backend from array_api_extra._lib._testing import xp_assert_close, xp_assert_equal -from .conftest import Library - # mypy: disable-error-code=no-any-decorated # pyright: reportUnknownParameterType=false,reportMissingParameterType=false @@ -15,7 +14,7 @@ xp_assert_equal, pytest.param( xp_assert_close, - marks=pytest.mark.skip_xp_backend(Library.SPARSE, reason="no isdtype"), + marks=pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no isdtype"), ), ], ) @@ -36,15 +35,15 @@ def test_assert_close_equal_basic(xp, func): func(xp.asarray([1, 2]), xp.asarray([1, 3]), err_msg="hello") -@pytest.mark.skip_xp_backend(Library.NUMPY) -@pytest.mark.skip_xp_backend(Library.NUMPY_READONLY) +@pytest.mark.skip_xp_backend(Backend.NUMPY) +@pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY) @pytest.mark.parametrize( "func", [ xp_assert_equal, pytest.param( xp_assert_close, - marks=pytest.mark.skip_xp_backend(Library.SPARSE, reason="no isdtype"), + marks=pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no isdtype"), ), ], ) @@ -57,7 +56,7 @@ def test_assert_close_equal_namespace(xp, func): func(xp.asarray([0]), [0]) -@pytest.mark.skip_xp_backend(Library.SPARSE, reason="no isdtype") +@pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no isdtype") def test_assert_close_tolerance(xp): xp_assert_close(xp.asarray([100.0]), xp.asarray([102.0]), rtol=0.03) with pytest.raises(AssertionError): diff --git a/tests/test_utils.py b/tests/test_utils.py index 8cf49c2a..1960b3eb 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,19 +1,20 @@ +from types import ModuleType + import numpy as np import pytest -from array_api_extra._lib._compat import device as get_device +from array_api_extra._lib import Backend from array_api_extra._lib._testing import xp_assert_equal -from array_api_extra._lib._typing import Array, Device, ModuleType -from array_api_extra._lib._utils import in1d - -from .conftest import Library +from array_api_extra._lib._utils._compat import device as get_device +from array_api_extra._lib._utils._helpers import in1d +from array_api_extra._lib._utils._typing import Array, Device # mypy: disable-error-code=no-untyped-usage class TestIn1D: - @pytest.mark.skip_xp_backend(Library.DASK_ARRAY, reason="no argsort") - @pytest.mark.skip_xp_backend(Library.SPARSE, reason="no unique_inverse, no device") + @pytest.mark.skip_xp_backend(Backend.DASK_ARRAY, reason="no argsort") + @pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no unique_inverse, no device") # cover both code paths @pytest.mark.parametrize("x2", [np.arange(9), np.arange(15)]) def test_no_invert_assume_unique(self, xp: ModuleType, x2: Array): @@ -23,13 +24,13 @@ def test_no_invert_assume_unique(self, xp: ModuleType, x2: Array): actual = in1d(x1, x2) xp_assert_equal(actual, expected) - @pytest.mark.skip_xp_backend(Library.SPARSE, reason="no device") + @pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no device") def test_device(self, xp: ModuleType, device: Device): x1 = xp.asarray([3, 8, 20], device=device) x2 = xp.asarray([2, 3, 4], device=device) assert get_device(in1d(x1, x2)) == device - @pytest.mark.skip_xp_backend(Library.SPARSE, reason="no arange, no device") + @pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no arange, no device") def test_xp(self, xp: ModuleType): x1 = xp.asarray([1, 6]) x2 = xp.arange(5) diff --git a/vendor_tests/test_vendor.py b/vendor_tests/test_vendor.py index e3202803..d94b73f8 100644 --- a/vendor_tests/test_vendor.py +++ b/vendor_tests/test_vendor.py @@ -37,6 +37,6 @@ def test_vendor_extra(): def test_vendor_extra_uses_vendor_compat(): from ._array_api_compat_vendor import array_namespace as n1 - from .array_api_extra._lib._compat import array_namespace as n2 + from .array_api_extra._lib._utils._compat import array_namespace as n2 assert n1 is n2 From 7f1f4d5ec67469b45a8ede44505fef0a5e4eda6d Mon Sep 17 00:00:00 2001 From: Lucas Colley Date: Wed, 15 Jan 2025 13:55:05 +0000 Subject: [PATCH 11/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3dc28bd3..3165e70d 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Used by: - [SciPy](https://github.com/scipy/scipy) - Fundamental algorithms for scientific computing. -- ... +- _your library? Let us know!_ ## Contributors From 5f4fa99d9f3e774b11027c6bd34690ba0faf6308 Mon Sep 17 00:00:00 2001 From: Guido Imperiale Date: Wed, 15 Jan 2025 14:12:24 +0000 Subject: [PATCH 12/14] TST: Run all tests on read-only numpy arrays (#92) --- src/array_api_extra/_lib/_backends.py | 28 +++++------- tests/conftest.py | 64 ++++++++++++++++++++++++++- tests/test_at.py | 16 ++----- tests/test_funcs.py | 2 + tests/test_utils.py | 10 ++--- 5 files changed, 83 insertions(+), 37 deletions(-) diff --git a/src/array_api_extra/_lib/_backends.py b/src/array_api_extra/_lib/_backends.py index 93c43272..ee2e051e 100644 --- a/src/array_api_extra/_lib/_backends.py +++ b/src/array_api_extra/_lib/_backends.py @@ -17,29 +17,23 @@ class Backend(Enum): # numpydoc ignore=PR01,PR02 # type: ignore[no-subclass-an Parameters ---------- value : str - String describing the backend. + Name of the backend's module. is_namespace : Callable[[ModuleType], bool] Function to check whether an input module is the array namespace corresponding to the backend. - module_name : str - Name of the backend's module. """ - ARRAY_API_STRICT = ( - "array_api_strict", - _compat.is_array_api_strict_namespace, - "array_api_strict", - ) - NUMPY = "numpy", _compat.is_numpy_namespace, "numpy" - NUMPY_READONLY = "numpy_readonly", _compat.is_numpy_namespace, "numpy" - CUPY = "cupy", _compat.is_cupy_namespace, "cupy" - TORCH = "torch", _compat.is_torch_namespace, "torch" - DASK_ARRAY = "dask.array", _compat.is_dask_namespace, "dask.array" - SPARSE = "sparse", _compat.is_pydata_sparse_namespace, "sparse" - JAX_NUMPY = "jax.numpy", _compat.is_jax_namespace, "jax.numpy" + ARRAY_API_STRICT = "array_api_strict", _compat.is_array_api_strict_namespace + NUMPY = "numpy", _compat.is_numpy_namespace + NUMPY_READONLY = "numpy_readonly", _compat.is_numpy_namespace + CUPY = "cupy", _compat.is_cupy_namespace + TORCH = "torch", _compat.is_torch_namespace + DASK_ARRAY = "dask.array", _compat.is_dask_namespace + SPARSE = "sparse", _compat.is_pydata_sparse_namespace + JAX_NUMPY = "jax.numpy", _compat.is_jax_namespace def __new__( - cls, value: str, _is_namespace: Callable[[ModuleType], bool], _module_name: str + cls, value: str, _is_namespace: Callable[[ModuleType], bool] ): # numpydoc ignore=GL08 obj = object.__new__(cls) obj._value_ = value @@ -49,10 +43,8 @@ def __init__( self, value: str, # noqa: ARG002 # pylint: disable=unused-argument is_namespace: Callable[[ModuleType], bool], - module_name: str, ): # numpydoc ignore=GL08 self.is_namespace = is_namespace - self.module_name = module_name def __str__(self) -> str: # type: ignore[explicit-override] # pyright: ignore[reportImplicitOverride] # numpydoc ignore=RT01 """Pretty-print parameterized test names.""" diff --git a/tests/conftest.py b/tests/conftest.py index 4b07c205..c588d802 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,8 +1,11 @@ """Pytest fixtures.""" +from collections.abc import Callable +from functools import wraps from types import ModuleType -from typing import cast +from typing import ParamSpec, TypeVar, cast +import numpy as np import pytest from array_api_extra._lib import Backend @@ -10,6 +13,11 @@ from array_api_extra._lib._utils._compat import device as get_device from array_api_extra._lib._utils._typing import Device +T = TypeVar("T") +P = ParamSpec("P") + +np_compat = array_namespace(np.empty(0)) + @pytest.fixture(params=tuple(Backend)) def library(request: pytest.FixtureRequest) -> Backend: # numpydoc ignore=PR01,RT03 @@ -34,6 +42,56 @@ def library(request: pytest.FixtureRequest) -> Backend: # numpydoc ignore=PR01, return elem +class NumPyReadOnly: + """ + Variant of array_api_compat.numpy producing read-only arrays. + + Read-only numpy arrays fail on `__iadd__` etc., whereas read-only libraries such as + JAX and Sparse simply don't define those methods, which makes calls to `+=` fall + back to `__add__`. + + Note that this is not a full read-only Array API library. Notably, + `array_namespace(x)` returns array_api_compat.numpy. This is actually the desired + behaviour, so that when a tested function internally calls `xp = + array_namespace(*args) or xp`, it will internally create writeable arrays. + For this reason, tests that explicitly pass xp=xp to the tested functions may + misbehave and should be skipped for NUMPY_READONLY. + """ + + def __getattr__(self, name: str) -> object: # numpydoc ignore=PR01,RT01 + """Wrap all functions that return arrays to make their output read-only.""" + func = getattr(np_compat, name) + if not callable(func) or isinstance(func, type): + return func + return self._wrap(func) + + @staticmethod + def _wrap(func: Callable[P, T]) -> Callable[P, T]: # numpydoc ignore=PR01,RT01 + """Wrap func to make all np.ndarrays it returns read-only.""" + + def as_readonly(o: T) -> T: # numpydoc ignore=PR01,RT01 + """Unset the writeable flag in o.""" + try: + # Don't use is_numpy_array(o), as it includes np.generic + if isinstance(o, np.ndarray): + o.flags.writeable = False + except TypeError: + # Cannot interpret as a data type + return o + + # This works with namedtuples too + if isinstance(o, tuple | list): + return type(o)(*(as_readonly(i) for i in o)) # type: ignore[arg-type,return-value] # pyright: ignore[reportArgumentType,reportUnknownArgumentType] + + return o + + @wraps(func) + def wrapper(*args: P.args, **kwargs: P.kwargs) -> T: # numpydoc ignore=GL08 + return as_readonly(func(*args, **kwargs)) + + return wrapper + + @pytest.fixture def xp(library: Backend) -> ModuleType: # numpydoc ignore=PR01,RT03 """ @@ -43,7 +101,9 @@ def xp(library: Backend) -> ModuleType: # numpydoc ignore=PR01,RT03 ------- The current array namespace. """ - xp = pytest.importorskip(library.module_name) + if library == Backend.NUMPY_READONLY: + return NumPyReadOnly() # type: ignore[return-value] # pyright: ignore[reportReturnType] + xp = pytest.importorskip(library.value) if library == Backend.JAX_NUMPY: import jax # type: ignore[import-not-found] # pyright: ignore[reportMissingImports] diff --git a/tests/test_at.py b/tests/test_at.py index e9159712..749c1b55 100644 --- a/tests/test_at.py +++ b/tests/test_at.py @@ -7,7 +7,6 @@ import pytest from array_api_compat import ( # type: ignore[import-untyped] # pyright: ignore[reportMissingTypeStubs] array_namespace, - is_pydata_sparse_array, is_writeable_array, ) @@ -18,14 +17,6 @@ from array_api_extra._lib._utils._typing import Array -@pytest.fixture -def array(library: Backend, xp: ModuleType) -> Array: - x = xp.asarray([10.0, 20.0, 30.0]) - if library == Backend.NUMPY_READONLY: - x.flags.writeable = False - return x - - @contextmanager def assert_copy(array: Array, copy: bool | None) -> Generator[None, None, None]: if copy is False and not is_writeable_array(array): @@ -42,6 +33,9 @@ def assert_copy(array: Array, copy: bool | None) -> Generator[None, None, None]: xp_assert_equal(xp.all(array == array_orig), xp.asarray(copy)) +@pytest.mark.skip_xp_backend( + Backend.SPARSE, reason="read-only backend without .at support" +) @pytest.mark.parametrize( ("kwargs", "expect_copy"), [ @@ -66,15 +60,13 @@ def assert_copy(array: Array, copy: bool | None) -> Generator[None, None, None]: ) def test_update_ops( xp: ModuleType, - array: Array, kwargs: dict[str, bool | None], expect_copy: bool | None, op: _AtOp, arg: float, expect: list[float], ): - if is_pydata_sparse_array(array): - pytest.skip("at() does not support updates on sparse arrays") + array = xp.asarray([10.0, 20.0, 30.0]) with assert_copy(array, expect_copy): func = cast(Callable[..., Array], getattr(at(array)[1:], op.value)) # type: ignore[no-any-explicit] diff --git a/tests/test_funcs.py b/tests/test_funcs.py index 5be4a9ad..897b7811 100644 --- a/tests/test_funcs.py +++ b/tests/test_funcs.py @@ -136,6 +136,7 @@ def test_device(self, xp: ModuleType, device: Device): x = xp.asarray([1, 2, 3], device=device) assert get_device(cov(x)) == device + @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY) def test_xp(self, xp: ModuleType): xp_assert_close( cov(xp.asarray([[0.0, 2.0], [1.0, 1.0], [2.0, 0.0]]).T, xp=xp), @@ -366,6 +367,7 @@ def test_device(self, xp: ModuleType, device: Device): x2 = xp.asarray([2, 3, 4], device=device) assert get_device(setdiff1d(x1, x2)) == device + @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY) def test_xp(self, xp: ModuleType): x1 = xp.asarray([3, 8, 20]) x2 = xp.asarray([2, 3, 4]) diff --git a/tests/test_utils.py b/tests/test_utils.py index 1960b3eb..981d5c03 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,13 +1,12 @@ from types import ModuleType -import numpy as np import pytest from array_api_extra._lib import Backend from array_api_extra._lib._testing import xp_assert_equal from array_api_extra._lib._utils._compat import device as get_device from array_api_extra._lib._utils._helpers import in1d -from array_api_extra._lib._utils._typing import Array, Device +from array_api_extra._lib._utils._typing import Device # mypy: disable-error-code=no-untyped-usage @@ -16,10 +15,10 @@ class TestIn1D: @pytest.mark.skip_xp_backend(Backend.DASK_ARRAY, reason="no argsort") @pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no unique_inverse, no device") # cover both code paths - @pytest.mark.parametrize("x2", [np.arange(9), np.arange(15)]) - def test_no_invert_assume_unique(self, xp: ModuleType, x2: Array): + @pytest.mark.parametrize("n", [9, 15]) + def test_no_invert_assume_unique(self, xp: ModuleType, n: int): x1 = xp.asarray([3, 8, 20]) - x2 = xp.asarray(x2) + x2 = xp.arange(n) expected = xp.asarray([True, True, False]) actual = in1d(x1, x2) xp_assert_equal(actual, expected) @@ -30,6 +29,7 @@ def test_device(self, xp: ModuleType, device: Device): x2 = xp.asarray([2, 3, 4], device=device) assert get_device(in1d(x1, x2)) == device + @pytest.mark.skip_xp_backend(Backend.NUMPY_READONLY) @pytest.mark.skip_xp_backend(Backend.SPARSE, reason="no arange, no device") def test_xp(self, xp: ModuleType): x1 = xp.asarray([1, 6]) From ec915ffe0ef8bb2e5ee48fa9088f4798a3f9370f Mon Sep 17 00:00:00 2001 From: Guido Imperiale Date: Wed, 15 Jan 2025 14:22:11 +0000 Subject: [PATCH 13/14] TST: test coverage for vendored functions (#93) --- src/array_api_extra/_lib/_utils/_compat.pyi | 2 +- vendor_tests/test_vendor.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/array_api_extra/_lib/_utils/_compat.pyi b/src/array_api_extra/_lib/_utils/_compat.pyi index 6086dcfe..1e81c984 100644 --- a/src/array_api_extra/_lib/_utils/_compat.pyi +++ b/src/array_api_extra/_lib/_utils/_compat.pyi @@ -23,8 +23,8 @@ def is_cupy_namespace(xp: ModuleType, /) -> bool: ... def is_dask_namespace(xp: ModuleType, /) -> bool: ... def is_jax_namespace(xp: ModuleType, /) -> bool: ... def is_numpy_namespace(xp: ModuleType, /) -> bool: ... +def is_pydata_sparse_namespace(xp: ModuleType, /) -> bool: ... def is_torch_namespace(xp: ModuleType, /) -> bool: ... def is_jax_array(x: object, /) -> bool: ... -def is_pydata_sparse_namespace(xp: ModuleType, /) -> bool: ... def is_writeable_array(x: object, /) -> bool: ... def size(x: Array, /) -> int | None: ... diff --git a/vendor_tests/test_vendor.py b/vendor_tests/test_vendor.py index d94b73f8..38249378 100644 --- a/vendor_tests/test_vendor.py +++ b/vendor_tests/test_vendor.py @@ -7,6 +7,7 @@ def test_vendor_compat(): array_namespace, device, is_cupy_namespace, + is_dask_namespace, is_jax_array, is_jax_namespace, is_pydata_sparse_namespace, @@ -18,12 +19,13 @@ def test_vendor_compat(): x = xp.asarray([1, 2, 3]) assert array_namespace(x) is xp device(x) - assert not is_jax_array(x) - assert is_writeable_array(x) assert not is_cupy_namespace(xp) + assert not is_dask_namespace(xp) + assert not is_jax_array(x) assert not is_jax_namespace(xp) assert not is_pydata_sparse_namespace(xp) assert not is_torch_namespace(xp) + assert is_writeable_array(x) assert size(x) == 3 From b463cc8e61ae3b9d51b83cbac56aa8474867506f Mon Sep 17 00:00:00 2001 From: Lucas Colley Date: Wed, 15 Jan 2025 14:31:12 +0000 Subject: [PATCH 14/14] REL: set version to 0.6.0 --- pixi.lock | 2 +- src/array_api_extra/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pixi.lock b/pixi.lock index 153a692b..438cf49e 100644 --- a/pixi.lock +++ b/pixi.lock @@ -2466,7 +2466,7 @@ packages: timestamp: 1735201429468 - pypi: . name: array-api-extra - version: 0.5.1.dev0 + version: 0.6.0 sha256: 4ec1183114a670b9c9b9b351826c962ad92ab470b1914a163e4a5ed02d0e04a0 requires_dist: - array-api-compat>=1.10.0,<2 diff --git a/src/array_api_extra/__init__.py b/src/array_api_extra/__init__.py index 57d728ef..ea660f1e 100644 --- a/src/array_api_extra/__init__.py +++ b/src/array_api_extra/__init__.py @@ -13,7 +13,7 @@ sinc, ) -__version__ = "0.5.1.dev0" +__version__ = "0.6.0" # pylint: disable=duplicate-code __all__ = [