@@ -34,11 +34,13 @@ class TestCanCast(unittest.TestCase):
34
34
@testing .for_all_dtypes_combination (names = ("from_dtype" , "to_dtype" ))
35
35
@testing .numpy_cupy_equal ()
36
36
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
+ ):
38
41
pytest .skip ("to be aligned with NEP-50" )
39
42
40
43
from_obj = _generate_type_routines_input (xp , from_dtype , self .obj_type )
41
-
42
44
ret = xp .can_cast (from_obj , to_dtype )
43
45
assert isinstance (ret , bool )
44
46
return ret
@@ -83,7 +85,9 @@ def test_common_type_bool(self, dtype):
83
85
@testing .parameterize (
84
86
* testing .product (
85
87
{
86
- "obj_type1" : ["dtype" , "specifier" , "scalar" , "array" , "primitive" ],
88
+ # obj_type1 is modified since at least one input should be an
89
+ # array for dpnp.result_dtype
90
+ "obj_type1" : ["array" ],
87
91
"obj_type2" : ["dtype" , "specifier" , "scalar" , "array" , "primitive" ],
88
92
}
89
93
)
@@ -92,37 +96,35 @@ class TestResultType(unittest.TestCase):
92
96
@testing .for_all_dtypes_combination (names = ("dtype1" , "dtype2" ))
93
97
@testing .numpy_cupy_equal ()
94
98
def test_result_type (self , xp , dtype1 , dtype2 ):
95
- if "scalar" in {self .obj_type1 , self .obj_type2 }:
99
+ if (
100
+ self .obj_type2 == "scalar"
101
+ and numpy .lib .NumpyVersion (numpy .__version__ ) < "2.0.0"
102
+ ):
96
103
pytest .skip ("to be aligned with NEP-50" )
97
104
98
105
input1 = _generate_type_routines_input (xp , dtype1 , self .obj_type1 )
99
-
100
106
input2 = _generate_type_routines_input (xp , dtype2 , self .obj_type2 )
101
107
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." )
108
+ # dpnp.result_type only takes into account device capabilities. If
109
+ # dtype2 is `float32` and the object is primitive, the `input2` variable
110
+ # is `float` which needs a device with double precision support.
111
+ # so we skip the test for such a case on a device that does not support fp64
112
+ flag = self .obj_type2 == "primitive" and input2 == float
113
+ if flag and not has_support_aspect64 ():
114
+ pytest .skip ("No fp64 support by device." )
115
115
116
116
ret = xp .result_type (input1 , input2 )
117
117
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
- )
118
+ # dpnp.result_type takes into account device capabilities.
119
+ # So, we have to modify the results for NumPy to align it with
120
+ # device capabilities.
121
+ flag1 = isinstance (input1 , numpy .ndarray )
122
+ flag2 = isinstance (input2 , numpy .ndarray )
123
+ if (flag1 or flag2 ) and not has_support_aspect64 ():
124
+ if ret == numpy .float64 :
125
+ ret = numpy .dtype (numpy .float32 )
126
+ elif ret == numpy .complex128 :
127
+ ret = numpy .dtype (numpy .complex64 )
126
128
127
129
assert isinstance (ret , numpy .dtype )
128
130
return ret
0 commit comments