|
13 | 13 | """Tests symbolic_operator.py.""" |
14 | 14 |
|
15 | 15 | import copy |
16 | | -import unittest |
17 | | -import warnings |
18 | | - |
19 | 16 | import numpy |
20 | 17 | import sympy |
| 18 | +import unittest |
| 19 | +import warnings |
21 | 20 |
|
22 | 21 | from openfermion.config import EQ_TOLERANCE |
| 22 | +from openfermion.testing.testing_utils import EqualsTester |
| 23 | + |
23 | 24 | from openfermion.ops.operators.fermion_operator import FermionOperator |
24 | 25 | from openfermion.ops.operators.symbolic_operator import SymbolicOperator |
25 | | -from openfermion.testing.testing_utils import EqualsTester |
26 | 26 |
|
27 | 27 |
|
28 | 28 | class DummyOperator1(SymbolicOperator): |
@@ -868,7 +868,76 @@ def test_pow_high_term(self): |
868 | 868 | term = DummyOperator1(ops, coeff) |
869 | 869 | high = term**10 |
870 | 870 | expected = DummyOperator1(ops * 10, coeff**10) |
871 | | - self.assertTrue(expected == high) |
| 871 | + self.assertTrue(high.isclose(expected, rtol=1e-12, atol=1e-12)) |
| 872 | + |
| 873 | + def test_isclose_parameter_deprecation(self): |
| 874 | + op1 = DummyOperator1('0^ 1', 1.0) |
| 875 | + op2 = DummyOperator1('0^ 1', 1.001) |
| 876 | + |
| 877 | + with self.assertWarns(DeprecationWarning): |
| 878 | + op1.isclose(op2, tol=0.01) |
| 879 | + |
| 880 | + with warnings.catch_warnings(): |
| 881 | + warnings.simplefilter("ignore", category=DeprecationWarning) |
| 882 | + self.assertTrue(op1.isclose(op2, tol=0.001)) |
| 883 | + self.assertFalse(op1.isclose(op2, tol=0.0001)) |
| 884 | + |
| 885 | + def test_isclose_parameter_combos(self): |
| 886 | + op1 = DummyOperator1('0^ 1', 1.0) |
| 887 | + op2 = DummyOperator1('0^ 1', 1.001) |
| 888 | + |
| 889 | + with self.assertRaises(ValueError): |
| 890 | + op1.isclose(op2, tol=0.01, rtol=1e-5) |
| 891 | + |
| 892 | + with self.assertRaises(ValueError): |
| 893 | + op1.isclose(op2, tol=0.01, atol=1e-5) |
| 894 | + |
| 895 | + def test_isclose_atol_rtol(self): |
| 896 | + op1 = DummyOperator1('0^ 1', 1.0) |
| 897 | + op2 = DummyOperator1('0^ 1', 1.001) |
| 898 | + |
| 899 | + op_a = DummyOperator1('0^ 1', 1.0) |
| 900 | + op_b = DummyOperator1('0^ 1', 1.001) |
| 901 | + self.assertTrue(op_a.isclose(op_b, atol=0.001)) |
| 902 | + self.assertFalse(op_a.isclose(op_b, atol=0.0001)) |
| 903 | + |
| 904 | + op_c = DummyOperator1('0^ 1', 1000) |
| 905 | + op_d = DummyOperator1('0^ 1', 1001) |
| 906 | + self.assertTrue(op_c.isclose(op_d, rtol=0.001)) |
| 907 | + self.assertFalse(op_c.isclose(op_d, rtol=0.0001)) |
| 908 | + |
| 909 | + op_e = DummyOperator1('0^ 1', 1.0) |
| 910 | + op_f = DummyOperator1('0^ 1', 1.001) |
| 911 | + self.assertTrue(op_e.isclose(op_f, rtol=1e-4, atol=1e-3)) |
| 912 | + self.assertFalse(op_e.isclose(op_f, rtol=1e-4, atol=1e-5)) |
| 913 | + |
| 914 | + def test_isclose(self): |
| 915 | + op1 = DummyOperator1() |
| 916 | + op2 = DummyOperator1() |
| 917 | + op1 += DummyOperator1('0^ 1', 1000000) |
| 918 | + op1 += DummyOperator1('2^ 3', 1) |
| 919 | + op2 += DummyOperator1('0^ 1', 1000000) |
| 920 | + op2 += DummyOperator1('2^ 3', 1.001) |
| 921 | + self.assertFalse(op1.isclose(op2, atol=1e-4)) |
| 922 | + self.assertTrue(op1.isclose(op2, atol=1e-2)) |
| 923 | + |
| 924 | + # Case from https://github.com/quantumlib/OpenFermion/issues/764 |
| 925 | + x = FermionOperator("0^ 0") |
| 926 | + y = FermionOperator("0^ 0") |
| 927 | + |
| 928 | + # construct two identical operators up to some number of terms |
| 929 | + num_terms_before_ineq = 30 |
| 930 | + for i in range(num_terms_before_ineq): |
| 931 | + x += FermionOperator(f" (10+0j) [0^ {i}]") |
| 932 | + y += FermionOperator(f" (10+0j) [0^ {i}]") |
| 933 | + |
| 934 | + xfinal = FermionOperator(f" (1+0j) [0^ {num_terms_before_ineq + 1}]") |
| 935 | + yfinal = FermionOperator(f" (2+0j) [0^ {num_terms_before_ineq + 1}]") |
| 936 | + assert xfinal != yfinal |
| 937 | + |
| 938 | + x += xfinal |
| 939 | + y += yfinal |
| 940 | + assert x != y |
872 | 941 |
|
873 | 942 | def test_pow_neg_error(self): |
874 | 943 | with self.assertRaises(ValueError): |
|
0 commit comments