Skip to content

Commit e236ad9

Browse files
vtavanaantonwolfy
andauthored
update dpnp.result_type tests (#2121)
* update dpnp.result_type tests * Update tests/third_party/cupy/test_type_routines.py Co-authored-by: Anton <100830759+antonwolfy@users.noreply.github.com> --------- Co-authored-by: Anton <100830759+antonwolfy@users.noreply.github.com>
1 parent ff049f9 commit e236ad9

File tree

2 files changed

+31
-25
lines changed

2 files changed

+31
-25
lines changed

.github/workflows/conda-package.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ env:
6363
third_party/cupy/statistics_tests/test_histogram.py
6464
third_party/cupy/statistics_tests/test_meanvar.py
6565
third_party/cupy/test_ndim.py
66+
third_party/cupy/test_type_routines.py
6667
VER_JSON_NAME: 'version.json'
6768
VER_SCRIPT1: "import json; f = open('version.json', 'r'); j = json.load(f); f.close(); "
6869
VER_SCRIPT2: "d = j['dpnp'][0]; print('='.join((d[s] for s in ('version', 'build'))))"

tests/third_party/cupy/test_type_routines.py

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@ class TestCanCast(unittest.TestCase):
3434
@testing.for_all_dtypes_combination(names=("from_dtype", "to_dtype"))
3535
@testing.numpy_cupy_equal()
3636
def test_can_cast(self, xp, from_dtype, to_dtype):
37-
if self.obj_type == "scalar":
37+
if (
38+
self.obj_type == "scalar"
39+
and numpy.lib.NumpyVersion(numpy.__version__) < "2.0.0"
40+
):
3841
pytest.skip("to be aligned with NEP-50")
3942

4043
from_obj = _generate_type_routines_input(xp, from_dtype, self.obj_type)
41-
4244
ret = xp.can_cast(from_obj, to_dtype)
4345
assert isinstance(ret, bool)
4446
return ret
@@ -92,37 +94,40 @@ class TestResultType(unittest.TestCase):
9294
@testing.for_all_dtypes_combination(names=("dtype1", "dtype2"))
9395
@testing.numpy_cupy_equal()
9496
def test_result_type(self, xp, dtype1, dtype2):
95-
if "scalar" in {self.obj_type1, self.obj_type2}:
97+
if (
98+
"scalar" in {self.obj_type1, self.obj_type2}
99+
and numpy.lib.NumpyVersion(numpy.__version__) < "2.0.0"
100+
):
96101
pytest.skip("to be aligned with NEP-50")
97102

98103
input1 = _generate_type_routines_input(xp, dtype1, self.obj_type1)
99-
100104
input2 = _generate_type_routines_input(xp, dtype2, self.obj_type2)
101105

102-
flag1 = isinstance(input1, (numpy.ndarray, cupy.ndarray))
103-
flag2 = isinstance(input2, (numpy.ndarray, cupy.ndarray))
104-
dt1 = cupy.dtype(input1) if not flag1 else None
105-
dt2 = cupy.dtype(input2) if not flag2 else None
106-
# dpnp takes into account device capabilities only if one of the
107-
# inputs is an array, for such a case, if the other dtype is not
108-
# supported by device, dpnp raise ValueError. So, we skip the test.
109-
if flag1 or flag2:
110-
if (
111-
dt1 in [cupy.float64, cupy.complex128]
112-
or dt2 in [cupy.float64, cupy.complex128]
113-
) and not has_support_aspect64():
114-
pytest.skip("No fp64 support by device.")
106+
# dpnp.result_type takes into account device capabilities, when one of
107+
# the inputs is an array. If dtype is `float32` and the object is
108+
# primitive, the final dtype is `float` which needs a device with
109+
# double precision support. So we have to skip the test for such a case
110+
# on a device that does not support fp64
111+
flag1 = self.obj_type1 == "array" or self.obj_type2 == "array"
112+
flag2 = (self.obj_type1 == "primitive" and input1 == float) or (
113+
self.obj_type2 == "primitive" and input2 == float
114+
)
115+
if flag1 and flag2 and not has_support_aspect64():
116+
pytest.skip("No fp64 support by device.")
115117

116118
ret = xp.result_type(input1, input2)
117119

118-
# dpnp takes into account device capabilities if one of the inputs
119-
# is an array, for such a case, we have to modify the results for
120-
# NumPy to align it with device capabilities.
121-
if (flag1 or flag2) and xp == numpy and not has_support_aspect64():
122-
ret = numpy.dtype(numpy.float32) if ret == numpy.float64 else ret
123-
ret = (
124-
numpy.dtype(numpy.complex64) if ret == numpy.complex128 else ret
125-
)
120+
# dpnp.result_type takes into account device capabilities, when one of the inputs
121+
# is an array.
122+
# So, we have to modify the results for NumPy to align it with
123+
# device capabilities.
124+
flag1 = isinstance(input1, numpy.ndarray)
125+
flag2 = isinstance(input2, numpy.ndarray)
126+
if (flag1 or flag2) and not has_support_aspect64():
127+
if ret == numpy.float64:
128+
ret = numpy.dtype(numpy.float32)
129+
elif ret == numpy.complex128:
130+
ret = numpy.dtype(numpy.complex64)
126131

127132
assert isinstance(ret, numpy.dtype)
128133
return ret

0 commit comments

Comments
 (0)