mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 21:14:14 +08:00
Add CPython complex tests (#152015)
Tests: * test_complex.py Pull Request resolved: https://github.com/pytorch/pytorch/pull/152015 Approved by: https://github.com/williamwen42
This commit is contained in:
committed by
PyTorch MergeBot
parent
3b218e56dc
commit
12fc06d267
231
test/dynamo/cpython/3_13/test_complex.diff
Normal file
231
test/dynamo/cpython/3_13/test_complex.diff
Normal file
@ -0,0 +1,231 @@
|
||||
diff --git a/test/dynamo/cpython/3_13/test_complex.py b/test/dynamo/cpython/3_13/test_complex.py
|
||||
index 6ff1a8ab29d..ab5bd3dab62 100644
|
||||
--- a/test/dynamo/cpython/3_13/test_complex.py
|
||||
+++ b/test/dynamo/cpython/3_13/test_complex.py
|
||||
@@ -1,16 +1,143 @@
|
||||
+# ======= BEGIN Dynamo patch =======
|
||||
+# Owner(s): ["module: dynamo"]
|
||||
+
|
||||
+# ruff: noqa
|
||||
+# flake8: noqa
|
||||
+
|
||||
+import sys
|
||||
+import torch
|
||||
+import torch._dynamo.test_case
|
||||
import unittest
|
||||
+from torch._dynamo.test_case import CPythonTestCase
|
||||
+from torch.testing._internal.common_utils import (
|
||||
+ run_tests,
|
||||
+ xfailIfTorchDynamo,
|
||||
+)
|
||||
+
|
||||
+__TestCase = CPythonTestCase
|
||||
+
|
||||
+
|
||||
+# redirect import statements
|
||||
import sys
|
||||
-from test import support
|
||||
-from test.support.testcase import ComplexesAreIdenticalMixin
|
||||
-from test.support.numbers import (
|
||||
- VALID_UNDERSCORE_LITERALS,
|
||||
- INVALID_UNDERSCORE_LITERALS,
|
||||
+import importlib.abc
|
||||
+
|
||||
+redirect_imports = (
|
||||
+ "test.mapping_tests",
|
||||
+ "test.typinganndata",
|
||||
+ "test.test_grammar",
|
||||
+ "test.test_math",
|
||||
+ "test.test_iter",
|
||||
+ "test.typinganndata.ann_module",
|
||||
)
|
||||
|
||||
+class RedirectImportFinder(importlib.abc.MetaPathFinder):
|
||||
+ def find_spec(self, fullname, path, target=None):
|
||||
+ # Check if the import is the problematic one
|
||||
+ if fullname in redirect_imports:
|
||||
+ try:
|
||||
+ # Attempt to import the standalone module
|
||||
+ name = fullname.removeprefix("test.")
|
||||
+ r = importlib.import_module(name)
|
||||
+ # Redirect the module in sys.modules
|
||||
+ sys.modules[fullname] = r
|
||||
+ # Return a module spec from the found module
|
||||
+ return importlib.util.find_spec(name)
|
||||
+ except ImportError:
|
||||
+ return None
|
||||
+ return None
|
||||
+
|
||||
+# Add the custom finder to sys.meta_path
|
||||
+sys.meta_path.insert(0, RedirectImportFinder())
|
||||
+
|
||||
+
|
||||
+# ======= END DYNAMO PATCH =======
|
||||
+
|
||||
+import unittest
|
||||
+import sys
|
||||
+from test import support
|
||||
+from test.support.testcase import ComplexesAreIdenticalMixin
|
||||
from random import random
|
||||
from math import isnan, copysign
|
||||
+import math
|
||||
import operator
|
||||
|
||||
+VALID_UNDERSCORE_LITERALS = [
|
||||
+ '0_0_0',
|
||||
+ '4_2',
|
||||
+ '1_0000_0000',
|
||||
+ '0b1001_0100',
|
||||
+ '0xffff_ffff',
|
||||
+ '0o5_7_7',
|
||||
+ '1_00_00.5',
|
||||
+ '1_00_00.5e5',
|
||||
+ '1_00_00e5_1',
|
||||
+ '1e1_0',
|
||||
+ '.1_4',
|
||||
+ '.1_4e1',
|
||||
+ '0b_0',
|
||||
+ '0x_f',
|
||||
+ '0o_5',
|
||||
+ '1_00_00j',
|
||||
+ '1_00_00.5j',
|
||||
+ '1_00_00e5_1j',
|
||||
+ '.1_4j',
|
||||
+ '(1_2.5+3_3j)',
|
||||
+ '(.5_6j)',
|
||||
+]
|
||||
+INVALID_UNDERSCORE_LITERALS = [
|
||||
+ # Trailing underscores:
|
||||
+ '0_',
|
||||
+ '42_',
|
||||
+ '1.4j_',
|
||||
+ '0x_',
|
||||
+ '0b1_',
|
||||
+ '0xf_',
|
||||
+ '0o5_',
|
||||
+ '0 if 1_Else 1',
|
||||
+ # Underscores in the base selector:
|
||||
+ '0_b0',
|
||||
+ '0_xf',
|
||||
+ '0_o5',
|
||||
+ # Old-style octal, still disallowed:
|
||||
+ '0_7',
|
||||
+ '09_99',
|
||||
+ # Multiple consecutive underscores:
|
||||
+ '4_______2',
|
||||
+ '0.1__4',
|
||||
+ '0.1__4j',
|
||||
+ '0b1001__0100',
|
||||
+ '0xffff__ffff',
|
||||
+ '0x___',
|
||||
+ '0o5__77',
|
||||
+ '1e1__0',
|
||||
+ '1e1__0j',
|
||||
+ # Underscore right before a dot:
|
||||
+ '1_.4',
|
||||
+ '1_.4j',
|
||||
+ # Underscore right after a dot:
|
||||
+ '1._4',
|
||||
+ '1._4j',
|
||||
+ '._5',
|
||||
+ '._5j',
|
||||
+ # Underscore right after a sign:
|
||||
+ '1.0e+_1',
|
||||
+ '1.0e+_1j',
|
||||
+ # Underscore right before j:
|
||||
+ '1.4_j',
|
||||
+ '1.4e5_j',
|
||||
+ # Underscore right before e:
|
||||
+ '1_e1',
|
||||
+ '1.4_e1',
|
||||
+ '1.4_e1j',
|
||||
+ # Underscore right after e:
|
||||
+ '1e_1',
|
||||
+ '1.4e_1',
|
||||
+ '1.4e_1j',
|
||||
+ # Complex cases with parens:
|
||||
+ '(1+1.5_j_)',
|
||||
+ '(1+1.5_j)',
|
||||
+]
|
||||
+
|
||||
INF = float("inf")
|
||||
NAN = float("nan")
|
||||
DBL_MAX = sys.float_info.max
|
||||
@@ -45,7 +172,40 @@ class WithComplex:
|
||||
def __complex__(self):
|
||||
return self.value
|
||||
|
||||
-class ComplexTest(ComplexesAreIdenticalMixin, unittest.TestCase):
|
||||
+class ComplexTest(__TestCase):
|
||||
+
|
||||
+ def assertFloatIdentical(self, x, y):
|
||||
+ """Fail unless floats x and y are identical, in the sense that:
|
||||
+ (1) both x and y are nans, or
|
||||
+ (2) both x and y are infinities, with the same sign, or
|
||||
+ (3) both x and y are zeros, with the same sign, or
|
||||
+ (4) x and y are both finite and nonzero, and x == y
|
||||
+
|
||||
+ """
|
||||
+ msg = 'floats {!r} and {!r} are not identical'
|
||||
+
|
||||
+ if math.isnan(x) or math.isnan(y):
|
||||
+ if math.isnan(x) and math.isnan(y):
|
||||
+ return
|
||||
+ elif x == y:
|
||||
+ if x != 0.0:
|
||||
+ return
|
||||
+ # both zero; check that signs match
|
||||
+ elif math.copysign(1.0, x) == math.copysign(1.0, y):
|
||||
+ return
|
||||
+ else:
|
||||
+ msg += ': zeros have different signs'
|
||||
+ self.fail(msg.format(x, y))
|
||||
+
|
||||
+ def assertComplexesAreIdentical(self, x, y):
|
||||
+ """Fail unless complex numbers x and y have equal values and signs.
|
||||
+
|
||||
+ In particular, if x and y both have real (or imaginary) part
|
||||
+ zero, but the zeros have different signs, this test will fail.
|
||||
+
|
||||
+ """
|
||||
+ self.assertFloatIdentical(x.real, y.real)
|
||||
+ self.assertFloatIdentical(x.imag, y.imag)
|
||||
|
||||
def assertAlmostEqual(self, a, b):
|
||||
if isinstance(a, complex):
|
||||
@@ -74,6 +234,29 @@ class ComplexTest(ComplexesAreIdenticalMixin, unittest.TestCase):
|
||||
# check that relative difference < eps
|
||||
self.assertTrue(abs((x-y)/y) < eps)
|
||||
|
||||
+ def assertFloatsAreIdentical(self, x, y):
|
||||
+ """assert that floats x and y are identical, in the sense that:
|
||||
+ (1) both x and y are nans, or
|
||||
+ (2) both x and y are infinities, with the same sign, or
|
||||
+ (3) both x and y are zeros, with the same sign, or
|
||||
+ (4) x and y are both finite and nonzero, and x == y
|
||||
+
|
||||
+ """
|
||||
+ msg = 'floats {!r} and {!r} are not identical'
|
||||
+
|
||||
+ if isnan(x) or isnan(y):
|
||||
+ if isnan(x) and isnan(y):
|
||||
+ return
|
||||
+ elif x == y:
|
||||
+ if x != 0.0:
|
||||
+ return
|
||||
+ # both zero; check that signs match
|
||||
+ elif copysign(1.0, x) == copysign(1.0, y):
|
||||
+ return
|
||||
+ else:
|
||||
+ msg += ': zeros have different signs'
|
||||
+ self.fail(msg.format(x, y))
|
||||
+
|
||||
def assertClose(self, x, y, eps=1e-9):
|
||||
"""Return true iff complexes x and y "are close"."""
|
||||
self.assertCloseAbs(x.real, y.real, eps)
|
||||
@@ -855,4 +1038,4 @@ class ComplexTest(ComplexesAreIdenticalMixin, unittest.TestCase):
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
- unittest.main()
|
||||
+ run_tests()
|
1041
test/dynamo/cpython/3_13/test_complex.py
Normal file
1041
test/dynamo/cpython/3_13/test_complex.py
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user