@@ -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,41 @@ 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+ flag1 = self . obj_type1 == "array" or self . obj_type2 == "array"
107+ flag2 = ( self . obj_type1 == "primitive" and input1 == float ) or (
108+ self . obj_type2 == "primitive" and input2 == float
109+ )
110+ # dpnp.result_type only takes into account device capabilities if
111+ # at least one of the inputs is an array, for such a case, if the other
112+ # input not supported by device, dpnp raises ValueError.
113+ # If input dtype is `float32` and the object is primitive, the final
114+ # dtype is `float` which needs a device with double precision support.
115+ # so we skip the test in such case, i.e. for a case when one input is
116+ # array and the other is a primitive obj with dtype 'float`.
117+ if flag1 and flag2 and not has_support_aspect64 ():
118+ pytest .skip ("No fp64 support by device." )
115119
116120 ret = xp .result_type (input1 , input2 )
117121
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- )
122+ # dpnp.result_type only takes into account device capabilities if at least one
123+ # of the inputs is an array, for such a case, we have to modify the
124+ # results for NumPy to align it with device capabilities.
125+ flag1 = isinstance (input1 , numpy .ndarray )
126+ flag2 = isinstance (input2 , numpy .ndarray )
127+ if (flag1 or flag2 ) and not has_support_aspect64 ():
128+ if ret == numpy .float64 :
129+ ret = numpy .dtype (numpy .float32 )
130+ elif ret == numpy .complex128 :
131+ ret = numpy .dtype (numpy .complex64 )
126132
127133 assert isinstance (ret , numpy .dtype )
128134 return ret
0 commit comments