@@ -262,10 +262,6 @@ class TestModulus:
262
262
def test_modulus_basic (self ):
263
263
dt = np .typecodes ['AllInteger' ] + np .typecodes ['Float' ]
264
264
for op in [floordiv_and_mod , divmod ]:
265
-
266
- if op == divmod :
267
- pytest .xfail (reason = "__divmod__ not implemented" )
268
-
269
265
for dt1 , dt2 in itertools .product (dt , dt ):
270
266
for sg1 , sg2 in itertools .product (_signs (dt1 ), _signs (dt2 )):
271
267
fmt = 'op: %s, dt1: %s, dt2: %s, sg1: %s, sg2: %s'
@@ -279,7 +275,7 @@ def test_modulus_basic(self):
279
275
else :
280
276
assert_ (b > rem >= 0 , msg )
281
277
282
- @pytest .mark .xfail ( reason = 'divmod not implemented' )
278
+ @pytest .mark .slow
283
279
def test_float_modulus_exact (self ):
284
280
# test that float results are exact for small integers. This also
285
281
# holds for the same integers scaled by powers of two.
@@ -311,10 +307,6 @@ def test_float_modulus_roundoff(self):
311
307
# gh-6127
312
308
dt = np .typecodes ['Float' ]
313
309
for op in [floordiv_and_mod , divmod ]:
314
-
315
- if op == divmod :
316
- pytest .xfail (reason = "__divmod__ not implemented" )
317
-
318
310
for dt1 , dt2 in itertools .product (dt , dt ):
319
311
for sg1 , sg2 in itertools .product ((+ 1 , - 1 ), (+ 1 , - 1 )):
320
312
fmt = 'op: %s, dt1: %s, dt2: %s, sg1: %s, sg2: %s'
@@ -329,41 +321,42 @@ def test_float_modulus_roundoff(self):
329
321
else :
330
322
assert_ (b > rem >= 0 , msg )
331
323
332
- @pytest .mark .skip (reason = 'float16 on cpu is incomplete in pytorch' )
333
- def test_float_modulus_corner_cases (self ):
334
- # Check remainder magnitude.
335
- for dt in np .typecodes ['Float' ]:
336
- b = np .array (1.0 , dtype = dt )
337
- a = np .nextafter (np .array (0.0 , dtype = dt ), - b )
338
- rem = operator .mod (a , b )
339
- assert_ (rem <= b , 'dt: %s' % dt )
340
- rem = operator .mod (- a , - b )
341
- assert_ (rem >= - b , 'dt: %s' % dt )
324
+ @pytest .mark .parametrize ('dt' , np .typecodes ['Float' ])
325
+ def test_float_modulus_corner_cases (self , dt ):
326
+ if dt == 'e' :
327
+ pytest .xfail (reason = "RuntimeError: 'nextafter_cpu' not implemented for 'Half'" )
328
+
329
+ b = np .array (1.0 , dtype = dt )
330
+ a = np .nextafter (np .array (0.0 , dtype = dt ), - b )
331
+ rem = operator .mod (a , b )
332
+ assert_ (rem <= b , 'dt: %s' % dt )
333
+ rem = operator .mod (- a , - b )
334
+ assert_ (rem >= - b , 'dt: %s' % dt )
342
335
343
336
# Check nans, inf
344
- with suppress_warnings () as sup :
345
- sup .filter (RuntimeWarning , "invalid value encountered in remainder" )
346
- sup .filter (RuntimeWarning , "divide by zero encountered in remainder" )
347
- sup .filter (RuntimeWarning , "divide by zero encountered in floor_divide" )
348
- sup .filter (RuntimeWarning , "divide by zero encountered in divmod" )
349
- sup .filter (RuntimeWarning , "invalid value encountered in divmod" )
350
- for dt in np .typecodes ['Float' ]:
351
- fone = np .array (1.0 , dtype = dt )
352
- fzer = np .array (0.0 , dtype = dt )
353
- finf = np .array (np .inf , dtype = dt )
354
- fnan = np .array (np .nan , dtype = dt )
355
- rem = operator .mod (fone , fzer )
356
- assert_ (np .isnan (rem ), 'dt: %s' % dt )
357
- # MSVC 2008 returns NaN here, so disable the check.
358
- #rem = operator.mod(fone, finf)
359
- #assert_(rem == fone, 'dt: %s' % dt)
360
- rem = operator .mod (fone , fnan )
361
- assert_ (np .isnan (rem ), 'dt: %s' % dt )
362
- rem = operator .mod (finf , fone )
363
- assert_ (np .isnan (rem ), 'dt: %s' % dt )
364
- for op in [floordiv_and_mod , divmod ]:
365
- div , mod = op (fone , fzer )
366
- assert_ (np .isinf (div )) and assert_ (np .isnan (mod ))
337
+ # with suppress_warnings() as sup:
338
+ # sup.filter(RuntimeWarning, "invalid value encountered in remainder")
339
+ # sup.filter(RuntimeWarning, "divide by zero encountered in remainder")
340
+ # sup.filter(RuntimeWarning, "divide by zero encountered in floor_divide")
341
+ # sup.filter(RuntimeWarning, "divide by zero encountered in divmod")
342
+ # sup.filter(RuntimeWarning, "invalid value encountered in divmod")
343
+ for dt in np .typecodes ['Float' ]:
344
+ fone = np .array (1.0 , dtype = dt )
345
+ fzer = np .array (0.0 , dtype = dt )
346
+ finf = np .array (np .inf , dtype = dt )
347
+ fnan = np .array (np .nan , dtype = dt )
348
+ rem = operator .mod (fone , fzer )
349
+ assert_ (np .isnan (rem ), 'dt: %s' % dt )
350
+ # MSVC 2008 returns NaN here, so disable the check.
351
+ #rem = operator.mod(fone, finf)
352
+ #assert_(rem == fone, 'dt: %s' % dt)
353
+ rem = operator .mod (fone , fnan )
354
+ assert_ (np .isnan (rem ), 'dt: %s' % dt )
355
+ rem = operator .mod (finf , fone )
356
+ assert_ (np .isnan (rem ), 'dt: %s' % dt )
357
+ for op in [floordiv_and_mod , divmod ]:
358
+ div , mod = op (fone , fzer )
359
+ assert_ (np .isinf (div )) and assert_ (np .isnan (mod ))
367
360
368
361
369
362
class TestComplexDivision :
0 commit comments