Skip to content

Updating support for Array API to v2024.12 #863

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
May 19, 2025
126 changes: 119 additions & 7 deletions ci/Numba-array-api-xfails.txt
Original file line number Diff line number Diff line change
@@ -55,10 +55,122 @@ array_api_tests/test_signatures.py::test_array_method_signature[__dlpack__]
array_api_tests/test_signatures.py::test_array_method_signature[__dlpack_device__]
array_api_tests/test_signatures.py::test_array_method_signature[__setitem__]
array_api_tests/test_sorting_functions.py::test_argsort
array_api_tests/test_special_cases.py::test_nan_propagation[max]
array_api_tests/test_special_cases.py::test_nan_propagation[mean]
array_api_tests/test_special_cases.py::test_nan_propagation[min]
array_api_tests/test_special_cases.py::test_nan_propagation[prod]
array_api_tests/test_special_cases.py::test_nan_propagation[std]
array_api_tests/test_special_cases.py::test_nan_propagation[sum]
array_api_tests/test_special_cases.py::test_nan_propagation[var]
array_api_tests/test_has_names.py::test_has_names[fft-hfft]
array_api_tests/test_has_names.py::test_has_names[fft-ihfft]
array_api_tests/test_has_names.py::test_has_names[fft-fftfreq]
array_api_tests/test_has_names.py::test_has_names[fft-rfftfreq]
array_api_tests/test_has_names.py::test_has_names[fft-fftshift]
array_api_tests/test_has_names.py::test_has_names[fft-ifftshift]
array_api_tests/test_has_names.py::test_has_names[fft-fft]
array_api_tests/test_has_names.py::test_has_names[fft-ifft]
array_api_tests/test_has_names.py::test_has_names[fft-fftn]
array_api_tests/test_has_names.py::test_has_names[fft-ifftn]
array_api_tests/test_has_names.py::test_has_names[fft-rfft]
array_api_tests/test_has_names.py::test_has_names[fft-irfft]
array_api_tests/test_has_names.py::test_has_names[fft-rfftn]
array_api_tests/test_has_names.py::test_has_names[fft-irfftn]
array_api_tests/test_creation_functions.py::test_empty_like
array_api_tests/test_data_type_functions.py::test_finfo[complex64]
array_api_tests/test_manipulation_functions.py::test_squeeze
array_api_tests/test_has_names.py::test_has_names[utility-diff]
array_api_tests/test_has_names.py::test_has_names[manipulation-repeat]
array_api_tests/test_has_names.py::test_has_names[elementwise-copysign]
array_api_tests/test_has_names.py::test_has_names[manipulation-tile]
array_api_tests/test_has_names.py::test_has_names[manipulation-unstack]
array_api_tests/test_has_names.py::test_has_names[elementwise-hypot]
array_api_tests/test_has_names.py::test_has_names[elementwise-maximum]
array_api_tests/test_has_names.py::test_has_names[elementwise-minimum]
array_api_tests/test_has_names.py::test_has_names[elementwise-nextafter]
array_api_tests/test_has_names.py::test_has_names[elementwise-reciprocal]
array_api_tests/test_has_names.py::test_has_names[elementwise-signbit]
array_api_tests/test_has_names.py::test_has_names[statistical-cumulative_sum]
array_api_tests/test_has_names.py::test_has_names[statistical-cumulative_prod]
array_api_tests/test_has_names.py::test_has_names[indexing-take_along_axis]
array_api_tests/test_has_names.py::test_has_names[info-__array_namespace_info__]
array_api_tests/test_has_names.py::test_has_names[searching-count_nonzero]
array_api_tests/test_has_names.py::test_has_names[searching-searchsorted]
array_api_tests/test_inspection_functions.py::test_array_namespace_info
array_api_tests/test_inspection_functions.py::test_array_namespace_info_dtypes
array_api_tests/test_signatures.py::test_func_signature[diff]
array_api_tests/test_signatures.py::test_func_signature[repeat]
array_api_tests/test_signatures.py::test_func_signature[tile]
array_api_tests/test_signatures.py::test_func_signature[unstack]
array_api_tests/test_signatures.py::test_func_signature[astype]
array_api_tests/test_signatures.py::test_func_signature[copysign]
array_api_tests/test_signatures.py::test_func_signature[hypot]
array_api_tests/test_signatures.py::test_func_signature[maximum]
array_api_tests/test_signatures.py::test_func_signature[minimum]
array_api_tests/test_signatures.py::test_func_signature[nextafter]
array_api_tests/test_signatures.py::test_func_signature[reciprocal]
array_api_tests/test_signatures.py::test_func_signature[signbit]
array_api_tests/test_signatures.py::test_func_signature[take_along_axis]
array_api_tests/test_signatures.py::test_func_signature[__array_namespace_info__]
array_api_tests/test_signatures.py::test_info_func_signature[capabilities]
array_api_tests/test_signatures.py::test_info_func_signature[default_device]
array_api_tests/test_signatures.py::test_info_func_signature[default_dtypes]
array_api_tests/test_signatures.py::test_info_func_signature[devices]
array_api_tests/test_signatures.py::test_info_func_signature[dtypes]
array_api_tests/test_special_cases.py::test_unary[clip(x_i is NaN) -> NaN]
array_api_tests/test_special_cases.py::test_unary[signbit(x_i is +0) -> False]
array_api_tests/test_special_cases.py::test_unary[signbit(x_i is -0) -> True]
array_api_tests/test_special_cases.py::test_unary[signbit(x_i is +infinity) -> False]
array_api_tests/test_special_cases.py::test_unary[signbit(x_i is -infinity) -> True]
array_api_tests/test_special_cases.py::test_unary[signbit(isfinite(x_i) and x_i > 0) -> False]
array_api_tests/test_special_cases.py::test_unary[signbit(isfinite(x_i) and x_i < 0) -> True]
array_api_tests/test_special_cases.py::test_unary[signbit(x_i is +NaN) -> False]
array_api_tests/test_special_cases.py::test_unary[signbit(x_i is -NaN) -> True]
array_api_tests/test_special_cases.py::test_binary[copysign(x1_i is NaN and x2_i < 0) -> NaN]
array_api_tests/test_special_cases.py::test_binary[copysign(x1_i is NaN and x2_i is -0) -> NaN]
array_api_tests/test_special_cases.py::test_binary[copysign(x1_i is NaN and x2_i is +0) -> NaN]
array_api_tests/test_special_cases.py::test_binary[copysign(x1_i is NaN and x2_i > 0) -> NaN]
array_api_tests/test_special_cases.py::test_binary[floor_divide(x1_i is +infinity and isfinite(x2_i) and x2_i > 0) -> +infinity]
array_api_tests/test_special_cases.py::test_binary[floor_divide(x1_i is +infinity and isfinite(x2_i) and x2_i < 0) -> -infinity]
array_api_tests/test_special_cases.py::test_binary[floor_divide(x1_i is -infinity and isfinite(x2_i) and x2_i > 0) -> -infinity]
array_api_tests/test_special_cases.py::test_binary[floor_divide(x1_i is -infinity and isfinite(x2_i) and x2_i < 0) -> +infinity]
array_api_tests/test_special_cases.py::test_binary[floor_divide(isfinite(x1_i) and x1_i > 0 and x2_i is -infinity) -> -0]
array_api_tests/test_operators_and_elementwise_functions.py::test_nextafter
array_api_tests/test_special_cases.py::test_binary[__floordiv__(x1_i is +infinity and isfinite(x2_i) and x2_i > 0) -> +infinity]
array_api_tests/test_special_cases.py::test_binary[floor_divide(isfinite(x1_i) and x1_i < 0 and x2_i is +infinity) -> -0]
array_api_tests/test_special_cases.py::test_binary[__floordiv__(x1_i is +infinity and isfinite(x2_i) and x2_i < 0) -> -infinity]
array_api_tests/test_special_cases.py::test_binary[maximum(x1_i is NaN or x2_i is NaN) -> NaN]
array_api_tests/test_special_cases.py::test_binary[__floordiv__(x1_i is -infinity and isfinite(x2_i) and x2_i > 0) -> -infinity]
array_api_tests/test_special_cases.py::test_binary[minimum(x1_i is NaN or x2_i is NaN) -> NaN]
array_api_tests/test_special_cases.py::test_binary[__floordiv__(x1_i is -infinity and isfinite(x2_i) and x2_i < 0) -> +infinity]
array_api_tests/test_special_cases.py::test_binary[nextafter(x1_i is NaN or x2_i is NaN) -> NaN]
array_api_tests/test_special_cases.py::test_binary[nextafter(x1_i is -0 and x2_i is +0) -> +0]
array_api_tests/test_special_cases.py::test_binary[nextafter(x1_i is +0 and x2_i is -0) -> -0]
array_api_tests/test_special_cases.py::test_binary[__floordiv__(isfinite(x1_i) and x1_i > 0 and x2_i is -infinity) -> -0]
array_api_tests/test_special_cases.py::test_binary[__floordiv__(isfinite(x1_i) and x1_i < 0 and x2_i is +infinity) -> -0]
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(x1_i is +infinity and isfinite(x2_i) and x2_i > 0) -> +infinity]
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(x1_i is -infinity and isfinite(x2_i) and x2_i < 0) -> +infinity]
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(x1_i is +infinity and isfinite(x2_i) and x2_i < 0) -> -infinity]
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(isfinite(x1_i) and x1_i > 0 and x2_i is -infinity) -> -0]
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(x1_i is -infinity and isfinite(x2_i) and x2_i > 0) -> -infinity]
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(isfinite(x1_i) and x1_i < 0 and x2_i is +infinity) -> -0]
array_api_tests/test_operators_and_elementwise_functions.py::test_reciprocal
array_api_tests/test_array_object.py::test_getitem_arrays_and_ints_1[1]
array_api_tests/test_statistical_functions.py::test_cumulative_prod
array_api_tests/test_statistical_functions.py::test_cumulative_sum
array_api_tests/test_array_object.py::test_getitem_arrays_and_ints_1[None]
array_api_tests/test_operators_and_elementwise_functions.py::test_signbit
array_api_tests/test_array_object.py::test_getitem_arrays_and_ints_2[1]
array_api_tests/test_array_object.py::test_getitem_arrays_and_ints_2[None]
array_api_tests/test_manipulation_functions.py::test_repeat
array_api_tests/test_searching_functions.py::test_count_nonzero
array_api_tests/test_operators_and_elementwise_functions.py::test_copysign
array_api_tests/test_operators_and_elementwise_functions.py::test_maximum
array_api_tests/test_searching_functions.py::test_searchsorted
array_api_tests/test_manipulation_functions.py::test_tile
array_api_tests/test_signatures.py::test_func_signature[cumulative_sum]
array_api_tests/test_signatures.py::test_func_signature[cumulative_prod]
array_api_tests/test_manipulation_functions.py::test_unstack
array_api_tests/test_operators_and_elementwise_functions.py::test_minimum
array_api_tests/test_operators_and_elementwise_functions.py::test_hypot
array_api_tests/test_operators_and_elementwise_functions.py::test_clip
array_api_tests/test_signatures.py::test_func_signature[count_nonzero]
array_api_tests/test_signatures.py::test_func_signature[searchsorted]
array_api_tests/test_operators_and_elementwise_functions.py::test_binary_with_scalars_real[copysign]
array_api_tests/test_operators_and_elementwise_functions.py::test_binary_with_scalars_real[hypot]
array_api_tests/test_operators_and_elementwise_functions.py::test_binary_with_scalars_real[nextafter]
array_api_tests/test_operators_and_elementwise_functions.py::test_binary_with_scalars_real[maximum]
array_api_tests/test_operators_and_elementwise_functions.py::test_binary_with_scalars_real[minimum]
2 changes: 1 addition & 1 deletion ci/array-api-tests-rev.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
33f2d2ea2f3dd2b3ceeeb4519d55e08096184149
2db6c7b807a609a1539e312e01af093a45d34764
2 changes: 1 addition & 1 deletion sparse/__init__.py
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@

from ._version import __version__, __version_tuple__ # noqa: F401

__array_api_version__ = "2022.12"
__array_api_version__ = "2024.12"


class _BackendType(Enum):
14 changes: 7 additions & 7 deletions sparse/numba_backend/_coo/common.py
Original file line number Diff line number Diff line change
@@ -1013,7 +1013,7 @@ def _diagonal_idx(coordlist, axis1, axis2, offset):
return np.array([i for i in range(len(coordlist[axis1])) if coordlist[axis1][i] + offset == coordlist[axis2][i]])


def clip(a, a_min=None, a_max=None, out=None):
def clip(a, min=None, max=None, out=None):
"""
Clip (limit) the values in the array.

@@ -1023,10 +1023,10 @@ def clip(a, a_min=None, a_max=None, out=None):
Parameters
----------
a
a_min : scalar or `SparseArray` or `None`
min : scalar or `SparseArray` or `None`
Minimum value. If `None`, clipping is not performed on lower
interval edge.
a_max : scalar or `SparseArray` or `None`
max : scalar or `SparseArray` or `None`
Maximum value. If `None`, clipping is not performed on upper
interval edge.
out : SparseArray, optional
@@ -1044,19 +1044,19 @@ def clip(a, a_min=None, a_max=None, out=None):
--------
>>> import sparse
>>> x = sparse.COO.from_numpy([0, 0, 0, 1, 2, 3])
>>> sparse.clip(x, a_min=1).todense() # doctest: +NORMALIZE_WHITESPACE
>>> sparse.clip(x, min=1).todense() # doctest: +NORMALIZE_WHITESPACE
array([1, 1, 1, 1, 2, 3])
>>> sparse.clip(x, a_max=1).todense() # doctest: +NORMALIZE_WHITESPACE
>>> sparse.clip(x, max=1).todense() # doctest: +NORMALIZE_WHITESPACE
array([0, 0, 0, 1, 1, 1])
>>> sparse.clip(x, a_min=1, a_max=2).todense() # doctest: +NORMALIZE_WHITESPACE
>>> sparse.clip(x, min=1, max=2).todense() # doctest: +NORMALIZE_WHITESPACE
array([1, 1, 1, 1, 2, 2])

See Also
--------
numpy.clip : Equivalent NumPy function
"""
a = asCOO(a, name="clip")
return a.clip(a_min, a_max)
return a.clip(min, max)


def expand_dims(x, /, *, axis=0):
4 changes: 2 additions & 2 deletions sparse/numba_backend/_sparse_array.py
Original file line number Diff line number Diff line change
@@ -953,9 +953,9 @@

def __array_namespace__(self, *, api_version=None):
if api_version is None:
api_version = "2022.12"
api_version = "2024.12"

Check warning on line 956 in sparse/numba_backend/_sparse_array.py

Codecov / codecov/patch

sparse/numba_backend/_sparse_array.py#L956

Added line #L956 was not covered by tests

if api_version not in {"2021.12", "2022.12"}:
if api_version not in {"2021.12", "2022.12", "2023.12", "2024.12"}:

Check warning on line 958 in sparse/numba_backend/_sparse_array.py

Codecov / codecov/patch

sparse/numba_backend/_sparse_array.py#L958

Added line #L958 was not covered by tests
raise ValueError(f'"{api_version}" Array API version not supported.')
import sparse

Loading
Oops, something went wrong.