Skip to content

Commit fe6f1eb

Browse files
authored
Merge branch 'main' into dependabot/github_actions/actions-5909998ba8
2 parents eea5f77 + 51daace commit fe6f1eb

9 files changed

+119
-17
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
name: Array API Tests (NumPy 1.26)
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
array-api-tests-numpy-latest:
7+
uses: ./.github/workflows/array-api-tests.yml
8+
with:
9+
package-name: numpy
10+
package-version: '== 1.26.*'
11+
xfails-file-extra: '-1-26'

.github/workflows/tests.yml

+5
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ jobs:
2828
else
2929
PIP_EXTRA='numpy==1.26.*'
3030
fi
31+
32+
if [ "${{ matrix.python-version }}" == "3.9" ]; then
33+
sed -i '/^ndonnx/d' requirements-dev.txt
34+
fi
35+
3136
python -m pip install -r requirements-dev.txt $PIP_EXTRA
3237
3338
- name: Run Tests

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
This is a small wrapper around common array libraries that is compatible with
44
the [Array API standard](https://data-apis.org/array-api/latest/). Currently,
5-
NumPy, CuPy, PyTorch, Dask, JAX and `sparse` are supported. If you want support
6-
for other array libraries, or if you encounter any issues, please [open an
7-
issue](https://github.com/data-apis/array-api-compat/issues).
5+
NumPy, CuPy, PyTorch, Dask, JAX, ndonnx and `sparse` are supported. If you want
6+
support for other array libraries, or if you encounter any issues, please [open
7+
an issue](https://github.com/data-apis/array-api-compat/issues).
88

99
See the documentation for more details https://data-apis.org/array-api-compat/

array_api_compat/common/_helpers.py

+35-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def is_numpy_array(x):
4848
is_array_api_obj
4949
is_cupy_array
5050
is_torch_array
51+
is_ndonnx_array
5152
is_dask_array
5253
is_jax_array
5354
is_pydata_sparse_array
@@ -78,11 +79,12 @@ def is_cupy_array(x):
7879
is_array_api_obj
7980
is_numpy_array
8081
is_torch_array
82+
is_ndonnx_array
8183
is_dask_array
8284
is_jax_array
8385
is_pydata_sparse_array
8486
"""
85-
# Avoid importing NumPy if it isn't already
87+
# Avoid importing CuPy if it isn't already
8688
if 'cupy' not in sys.modules:
8789
return False
8890

@@ -118,6 +120,33 @@ def is_torch_array(x):
118120
# TODO: Should we reject ndarray subclasses?
119121
return isinstance(x, torch.Tensor)
120122

123+
def is_ndonnx_array(x):
124+
"""
125+
Return True if `x` is a ndonnx Array.
126+
127+
This function does not import ndonnx if it has not already been imported
128+
and is therefore cheap to use.
129+
130+
See Also
131+
--------
132+
133+
array_namespace
134+
is_array_api_obj
135+
is_numpy_array
136+
is_cupy_array
137+
is_ndonnx_array
138+
is_dask_array
139+
is_jax_array
140+
is_pydata_sparse_array
141+
"""
142+
# Avoid importing torch if it isn't already
143+
if 'ndonnx' not in sys.modules:
144+
return False
145+
146+
import ndonnx as ndx
147+
148+
return isinstance(x, ndx.Array)
149+
121150
def is_dask_array(x):
122151
"""
123152
Return True if `x` is a dask.array Array.
@@ -133,6 +162,7 @@ def is_dask_array(x):
133162
is_numpy_array
134163
is_cupy_array
135164
is_torch_array
165+
is_ndonnx_array
136166
is_jax_array
137167
is_pydata_sparse_array
138168
"""
@@ -160,6 +190,7 @@ def is_jax_array(x):
160190
is_numpy_array
161191
is_cupy_array
162192
is_torch_array
193+
is_ndonnx_array
163194
is_dask_array
164195
is_pydata_sparse_array
165196
"""
@@ -188,6 +219,7 @@ def is_pydata_sparse_array(x) -> bool:
188219
is_numpy_array
189220
is_cupy_array
190221
is_torch_array
222+
is_ndonnx_array
191223
is_dask_array
192224
is_jax_array
193225
"""
@@ -211,6 +243,7 @@ def is_array_api_obj(x):
211243
is_numpy_array
212244
is_cupy_array
213245
is_torch_array
246+
is_ndonnx_array
214247
is_dask_array
215248
is_jax_array
216249
"""
@@ -613,6 +646,7 @@ def size(x):
613646
"is_jax_array",
614647
"is_numpy_array",
615648
"is_torch_array",
649+
"is_ndonnx_array",
616650
"is_pydata_sparse_array",
617651
"size",
618652
"to_device",

dask-skips.txt

+12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# FFT isn't conformant
22
array_api_tests/test_fft.py
3+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.fft]
4+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.ifft]
5+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.fftn]
6+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.ifftn]
7+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.rfft]
8+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.irfft]
9+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.rfftn]
10+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.irfftn]
11+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.hfft]
12+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.ihfft]
13+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.fftfreq]
14+
array_api_tests/test_signatures.py::test_extension_func_signature[fft.rfftfreq]
315

416
# slow and not implemented in dask
517
array_api_tests/test_linalg.py::test_matrix_power

numpy-1-26-xfails.txt

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# asarray(copy=False) is not yet implemented
2+
array_api_tests/test_creation_functions.py::test_asarray_arrays
3+
4+
# finfo(float32).eps returns float32 but should return float
5+
array_api_tests/test_data_type_functions.py::test_finfo[float32]
6+
7+
# Array methods and attributes not already on np.ndarray cannot be wrapped
8+
array_api_tests/test_has_names.py::test_has_names[array_method-__array_namespace__]
9+
array_api_tests/test_has_names.py::test_has_names[array_method-to_device]
10+
array_api_tests/test_has_names.py::test_has_names[array_attribute-device]
11+
array_api_tests/test_has_names.py::test_has_names[array_attribute-mT]
12+
13+
# Array methods and attributes not already on np.ndarray cannot be wrapped
14+
array_api_tests/test_signatures.py::test_array_method_signature[__array_namespace__]
15+
array_api_tests/test_signatures.py::test_array_method_signature[to_device]
16+
17+
# NumPy deviates in some special cases for floordiv
18+
array_api_tests/test_special_cases.py::test_binary[floor_divide(x1_i is +infinity and isfinite(x2_i) and x2_i > 0) -> +infinity]
19+
array_api_tests/test_special_cases.py::test_binary[floor_divide(x1_i is +infinity and isfinite(x2_i) and x2_i < 0) -> -infinity]
20+
array_api_tests/test_special_cases.py::test_binary[floor_divide(x1_i is -infinity and isfinite(x2_i) and x2_i > 0) -> -infinity]
21+
array_api_tests/test_special_cases.py::test_binary[floor_divide(x1_i is -infinity and isfinite(x2_i) and x2_i < 0) -> +infinity]
22+
array_api_tests/test_special_cases.py::test_binary[floor_divide(isfinite(x1_i) and x1_i > 0 and x2_i is -infinity) -> -0]
23+
array_api_tests/test_special_cases.py::test_binary[floor_divide(isfinite(x1_i) and x1_i < 0 and x2_i is +infinity) -> -0]
24+
array_api_tests/test_special_cases.py::test_binary[__floordiv__(x1_i is +infinity and isfinite(x2_i) and x2_i > 0) -> +infinity]
25+
array_api_tests/test_special_cases.py::test_binary[__floordiv__(x1_i is +infinity and isfinite(x2_i) and x2_i < 0) -> -infinity]
26+
array_api_tests/test_special_cases.py::test_binary[__floordiv__(x1_i is -infinity and isfinite(x2_i) and x2_i > 0) -> -infinity]
27+
array_api_tests/test_special_cases.py::test_binary[__floordiv__(x1_i is -infinity and isfinite(x2_i) and x2_i < 0) -> +infinity]
28+
array_api_tests/test_special_cases.py::test_binary[__floordiv__(isfinite(x1_i) and x1_i > 0 and x2_i is -infinity) -> -0]
29+
array_api_tests/test_special_cases.py::test_binary[__floordiv__(isfinite(x1_i) and x1_i < 0 and x2_i is +infinity) -> -0]
30+
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(x1_i is +infinity and isfinite(x2_i) and x2_i > 0) -> +infinity]
31+
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(x1_i is +infinity and isfinite(x2_i) and x2_i < 0) -> -infinity]
32+
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(x1_i is -infinity and isfinite(x2_i) and x2_i > 0) -> -infinity]
33+
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(x1_i is -infinity and isfinite(x2_i) and x2_i < 0) -> +infinity]
34+
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(isfinite(x1_i) and x1_i > 0 and x2_i is -infinity) -> -0]
35+
array_api_tests/test_special_cases.py::test_iop[__ifloordiv__(isfinite(x1_i) and x1_i < 0 and x2_i is +infinity) -> -0]
36+
37+
# https://github.com/numpy/numpy/issues/21213
38+
array_api_tests/test_special_cases.py::test_binary[__pow__(x1_i is -infinity and x2_i > 0 and not (x2_i.is_integer() and x2_i % 2 == 1)) -> +infinity]
39+
array_api_tests/test_special_cases.py::test_binary[__pow__(x1_i is -0 and x2_i > 0 and not (x2_i.is_integer() and x2_i % 2 == 1)) -> +0]
40+
array_api_tests/test_special_cases.py::test_iop[__ipow__(x1_i is -infinity and x2_i > 0 and not (x2_i.is_integer() and x2_i % 2 == 1)) -> +infinity]
41+
array_api_tests/test_special_cases.py::test_iop[__ipow__(x1_i is -0 and x2_i > 0 and not (x2_i.is_integer() and x2_i % 2 == 1)) -> +0]
42+
array_api_tests/meta/test_hypothesis_helpers.py::test_symmetric_matrices
43+
44+
# The test suite is incorrectly checking sums that have loss of significance
45+
# (https://github.com/data-apis/array-api-tests/issues/168)
46+
array_api_tests/test_statistical_functions.py::test_sum
47+
array_api_tests/test_statistical_functions.py::test_prod

numpy-xfails.txt

+5-13
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,6 @@
1-
# asarray(copy=False) is not yet implemented
2-
array_api_tests/test_creation_functions.py::test_asarray_arrays
3-
41
# finfo(float32).eps returns float32 but should return float
52
array_api_tests/test_data_type_functions.py::test_finfo[float32]
63

7-
# Array methods and attributes not already on np.ndarray cannot be wrapped
8-
array_api_tests/test_has_names.py::test_has_names[array_method-__array_namespace__]
9-
array_api_tests/test_has_names.py::test_has_names[array_method-to_device]
10-
array_api_tests/test_has_names.py::test_has_names[array_attribute-device]
11-
array_api_tests/test_has_names.py::test_has_names[array_attribute-mT]
12-
13-
# Array methods and attributes not already on np.ndarray cannot be wrapped
14-
array_api_tests/test_signatures.py::test_array_method_signature[__array_namespace__]
15-
array_api_tests/test_signatures.py::test_array_method_signature[to_device]
16-
174
# NumPy deviates in some special cases for floordiv
185
array_api_tests/test_special_cases.py::test_binary[floor_divide(x1_i is +infinity and isfinite(x2_i) and x2_i > 0) -> +infinity]
196
array_api_tests/test_special_cases.py::test_binary[floor_divide(x1_i is +infinity and isfinite(x2_i) and x2_i < 0) -> -infinity]
@@ -45,3 +32,8 @@ array_api_tests/meta/test_hypothesis_helpers.py::test_symmetric_matrices
4532
# (https://github.com/data-apis/array-api-tests/issues/168)
4633
array_api_tests/test_statistical_functions.py::test_sum
4734
array_api_tests/test_statistical_functions.py::test_prod
35+
36+
# The test suite cannot properly get the signature for vecdot
37+
# https://github.com/numpy/numpy/pull/26237
38+
array_api_tests/test_signatures.py::test_func_signature[vecdot]
39+
array_api_tests/test_signatures.py::test_extension_func_signature[linalg.vecdot]

requirements-dev.txt

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ numpy
55
pytest
66
torch
77
sparse >=0.15.1
8+
ndonnx

0 commit comments

Comments
 (0)