Skip to content

Commit

Permalink
reduce precision
Browse files Browse the repository at this point in the history
  • Loading branch information
Ben-Foxman committed Oct 14, 2024
1 parent 7bb0811 commit f323689
Showing 1 changed file with 98 additions and 65 deletions.
163 changes: 98 additions & 65 deletions simulation/test_evolution.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,152 +28,185 @@
floating-point arithmetic.
"""


class TestQuantumCircuitEvolution(unittest.TestCase):
def setUp(self):
self.no_ops = [qt.tensor(I, I)]
self.atol = 1e-4
self.rtol = 1e-4
self.atol = 5e-4
self.rtol = 5e-4

def assertStateAlmostEqual(self, state1, state2):
np.testing.assert_allclose(state1.full(), state2.full(), atol=self.atol, rtol=self.rtol)
np.testing.assert_allclose(
state1.full(), state2.full(), atol=self.atol, rtol=self.rtol
)

def test_single_qubit_gates(self):
# Test X gate on all basis states
self.assertStateAlmostEqual(
rep_to_evolution([[('X', 0)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops),
qt.ket2dm(qt.tensor(one, zero))
rep_to_evolution(
[[("X", 0)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(one, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('X', 0)]], qt.ket2dm(qt.tensor(one, zero)), self.no_ops),
qt.ket2dm(qt.tensor(zero, zero))
rep_to_evolution(
[[("X", 0)]], qt.ket2dm(qt.tensor(one, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(zero, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('X', 0)]], qt.ket2dm(qt.tensor(plus, zero)), self.no_ops),
qt.ket2dm(qt.tensor(plus, zero))
rep_to_evolution(
[[("X", 0)]], qt.ket2dm(qt.tensor(plus, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(plus, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('X', 0)]], qt.ket2dm(qt.tensor(minus, zero)), self.no_ops),
qt.ket2dm(qt.tensor(-minus, zero))
rep_to_evolution(
[[("X", 0)]], qt.ket2dm(qt.tensor(minus, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(-minus, zero)),
)

# Test Z gate on all basis states
self.assertStateAlmostEqual(
rep_to_evolution([[('Z', 0)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops),
qt.ket2dm(qt.tensor(zero, zero))
rep_to_evolution(
[[("Z", 0)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(zero, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('Z', 0)]], qt.ket2dm(qt.tensor(one, zero)), self.no_ops),
qt.ket2dm(qt.tensor(-one, zero))
rep_to_evolution(
[[("Z", 0)]], qt.ket2dm(qt.tensor(one, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(-one, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('Z', 0)]], qt.ket2dm(qt.tensor(plus, zero)), self.no_ops),
qt.ket2dm(qt.tensor(minus, zero))
rep_to_evolution(
[[("Z", 0)]], qt.ket2dm(qt.tensor(plus, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(minus, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('Z', 0)]], qt.ket2dm(qt.tensor(minus, zero)), self.no_ops),
qt.ket2dm(qt.tensor(plus, zero))
rep_to_evolution(
[[("Z", 0)]], qt.ket2dm(qt.tensor(minus, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(plus, zero)),
)

# Test H gate on all basis states
self.assertStateAlmostEqual(
rep_to_evolution([[('H', 0)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops),
qt.ket2dm(qt.tensor(plus, zero))
rep_to_evolution(
[[("H", 0)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(plus, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('H', 0)]], qt.ket2dm(qt.tensor(one, zero)), self.no_ops),
qt.ket2dm(qt.tensor(minus, zero))
rep_to_evolution(
[[("H", 0)]], qt.ket2dm(qt.tensor(one, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(minus, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('H', 0)]], qt.ket2dm(qt.tensor(plus, zero)), self.no_ops),
qt.ket2dm(qt.tensor(zero, zero))
rep_to_evolution(
[[("H", 0)]], qt.ket2dm(qt.tensor(plus, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(zero, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('H', 0)]], qt.ket2dm(qt.tensor(minus, zero)), self.no_ops),
qt.ket2dm(qt.tensor(one, zero))
rep_to_evolution(
[[("H", 0)]], qt.ket2dm(qt.tensor(minus, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(one, zero)),
)

# Test Y gate on all basis states
self.assertStateAlmostEqual(
rep_to_evolution([[('Y', 0)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops),
qt.ket2dm(qt.tensor(1j * one, zero))
rep_to_evolution(
[[("Y", 0)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(1j * one, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('Y', 0)]], qt.ket2dm(qt.tensor(one, zero)), self.no_ops),
qt.ket2dm(qt.tensor(-1j * zero, zero))
rep_to_evolution(
[[("Y", 0)]], qt.ket2dm(qt.tensor(one, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(-1j * zero, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('Y', 0)]], qt.ket2dm(qt.tensor(plus, zero)), self.no_ops),
qt.ket2dm(qt.tensor(1j * minus, zero))
rep_to_evolution(
[[("Y", 0)]], qt.ket2dm(qt.tensor(plus, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(1j * minus, zero)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('Y', 0)]], qt.ket2dm(qt.tensor(minus, zero)), self.no_ops),
qt.ket2dm(qt.tensor(-1j * plus, zero))
rep_to_evolution(
[[("Y", 0)]], qt.ket2dm(qt.tensor(minus, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(-1j * plus, zero)),
)


# Test gates on second qubit
self.assertStateAlmostEqual(
rep_to_evolution([[('X', 1)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops),
qt.ket2dm(qt.tensor(zero, one))
rep_to_evolution(
[[("X", 1)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(zero, one)),
)
self.assertStateAlmostEqual(
rep_to_evolution([[('H', 1)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops),
qt.ket2dm(qt.tensor(zero, plus))
rep_to_evolution(
[[("H", 1)]], qt.ket2dm(qt.tensor(zero, zero)), self.no_ops
),
qt.ket2dm(qt.tensor(zero, plus)),
)

def test_two_qubit_gates(self):
# Test XZ on |01>
xz_circuit = [[('X', 0), ('Z', 1)]]
xz_circuit = [[("X", 0), ("Z", 1)]]
input_state = qt.ket2dm(qt.tensor(zero, one))
expected_output = qt.ket2dm(qt.tensor(one, -one))
self.assertStateAlmostEqual(
rep_to_evolution(xz_circuit, input_state, self.no_ops),
expected_output
rep_to_evolution(xz_circuit, input_state, self.no_ops), expected_output
)

# Test HH on |00>
hh_circuit = [[('H', 0), ('H', 1)]]
hh_circuit = [[("H", 0), ("H", 1)]]
input_state = qt.ket2dm(qt.tensor(zero, zero))
expected_output = qt.ket2dm(qt.tensor(plus, plus))
self.assertStateAlmostEqual(
rep_to_evolution(hh_circuit, input_state, self.no_ops),
expected_output
rep_to_evolution(hh_circuit, input_state, self.no_ops), expected_output
)

def test_cnot_gate(self):
cnot_circuit = [[('CX', 0, 1)]]
cnot_circuit = [[("CX", 0, 1)]]

# Test CNOT on |00>
input_state = qt.ket2dm(qt.tensor(zero, zero))
expected_output = qt.ket2dm(qt.tensor(zero, zero))
self.assertStateAlmostEqual(
rep_to_evolution(cnot_circuit, input_state, self.no_ops),
expected_output
rep_to_evolution(cnot_circuit, input_state, self.no_ops), expected_output
)

# Test CNOT on |01>
input_state = qt.ket2dm(qt.tensor(zero, one))
expected_output = qt.ket2dm(qt.tensor(zero, one))
self.assertStateAlmostEqual(
rep_to_evolution(cnot_circuit, input_state, self.no_ops),
expected_output
rep_to_evolution(cnot_circuit, input_state, self.no_ops), expected_output
)

# Test CNOT on |10>
input_state = qt.ket2dm(qt.tensor(one, zero))
expected_output = qt.ket2dm(qt.tensor(one, one))
self.assertStateAlmostEqual(
rep_to_evolution(cnot_circuit, input_state, self.no_ops),
expected_output
rep_to_evolution(cnot_circuit, input_state, self.no_ops), expected_output
)

# Test CNOT on |11>
input_state = qt.ket2dm(qt.tensor(one, one))
expected_output = qt.ket2dm(qt.tensor(one, zero))
self.assertStateAlmostEqual(
rep_to_evolution(cnot_circuit, input_state, self.no_ops),
expected_output
rep_to_evolution(cnot_circuit, input_state, self.no_ops), expected_output
)

if __name__ == '__main__':
unittest.main()

if __name__ == "__main__":
unittest.main()

0 comments on commit f323689

Please sign in to comment.