def test_non_clifford_known_matrix(): q0 = cirq.LineQubit(0) circuit = cirq.Circuit.from_ops(cirq.Z(q0)**0.25, ) c_orig = cirq.Circuit(circuit) ConvertToSingleQubitCliffordGates(ignore_failures=True) \ .optimize_circuit(circuit) assert circuit == c_orig circuit2 = cirq.Circuit(c_orig) with pytest.raises(ValueError): ConvertToSingleQubitCliffordGates().optimize_circuit(circuit2)
def test_convert_composite(): class CompositeDummy(cirq.TwoQubitGate): def _decompose_(self, qubits): q0, q1 = qubits yield cirq.X(q0) yield cirq.Y(q1)**0.5 yield cirq.H(q0) q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit.from_ops(CompositeDummy()(q0, q1)) c_orig = cirq.Circuit(circuit) ConvertToSingleQubitCliffordGates().optimize_circuit(circuit) assert all( isinstance(op.gate, cirq.SingleQubitCliffordGate) for op in circuit.all_operations()) cirq.testing.assert_allclose_up_to_global_phase( circuit.to_unitary_matrix(), c_orig.to_unitary_matrix(), atol=1e-7) cirq.testing.assert_has_diagram( circuit, """ 0: ───X───────H─── 1: ───Y^0.5─────── """)
def test_already_converted(): q0 = cirq.LineQubit(0) circuit = cirq.Circuit.from_ops(cirq.SingleQubitCliffordGate.H(q0), ) c_orig = cirq.Circuit(circuit) ConvertToSingleQubitCliffordGates().optimize_circuit(circuit) assert circuit == c_orig
def test_convert(): q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit.from_ops( cirq.X(q0), cirq.Y(q1)**0.5, cirq.Z(q0)**-0.5, cirq.Z(q1)**0, cirq.H(q0), ) c_orig = cirq.Circuit(circuit) ConvertToSingleQubitCliffordGates().optimize_circuit(circuit) assert all( isinstance(op.gate, cirq.SingleQubitCliffordGate) for op in circuit.all_operations()) cirq.testing.assert_allclose_up_to_global_phase( circuit.to_unitary_matrix(), c_orig.to_unitary_matrix(), atol=1e-7) cirq.testing.assert_has_diagram( circuit, """ 0: ───X───────Z^-0.5───H─── 1: ───Y^0.5───I──────────── """)
def test_fail_unsupported_gate(): class UnsupportedDummy(cirq.TwoQubitGate): pass q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit.from_ops(UnsupportedDummy()(q0, q1), ) with pytest.raises(TypeError): ConvertToSingleQubitCliffordGates().optimize_circuit(circuit)
def test_ignore_unsupported_gate(): class UnsupportedDummy(cirq.TwoQubitGate): pass q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit.from_ops(UnsupportedDummy()(q0, q1), ) c_orig = cirq.Circuit(circuit) ConvertToSingleQubitCliffordGates(ignore_failures=True) \ .optimize_circuit(circuit) assert circuit == c_orig
def test_rotation_to_clifford_gate(): conv = ConvertToSingleQubitCliffordGates() assert (conv._rotation_to_clifford_gate( cirq.X, 0.0) == cirq.SingleQubitCliffordGate.I) assert (conv._rotation_to_clifford_gate( cirq.X, 0.5) == cirq.SingleQubitCliffordGate.X_sqrt) assert (conv._rotation_to_clifford_gate( cirq.X, 1.0) == cirq.SingleQubitCliffordGate.X) assert (conv._rotation_to_clifford_gate( cirq.X, -0.5) == cirq.SingleQubitCliffordGate.X_nsqrt)