def test_pauli_string_dag_from_circuit(repetition): q0, q1, q2 = cirq.LineQubit.range(3) c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2) c_left, _ = convert_and_separate_circuit(c_orig) c_left_dag = pauli_string_dag_from_circuit(c_left) c_left_reordered = c_left_dag.to_circuit() cirq.testing.assert_allclose_up_to_global_phase(c_left.unitary(), c_left_reordered.unitary(), atol=1e-7)
def test_pauli_string_dag_from_circuit(repetition): q0, q1, q2 = cirq.LineQubit.range(3) c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2) c_left, _ = convert_and_separate_circuit(c_orig) c_left_dag = pauli_string_dag_from_circuit(c_left) c_left_reordered = c_left_dag.to_circuit() cirq.testing.assert_allclose_up_to_global_phase( c_left.to_unitary_matrix(), c_left_reordered.to_unitary_matrix(), atol=1e-7)
def test_toffoli_separate(): q0, q1, q2 = cirq.LineQubit.range(3) circuit = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2) c_left, c_right = convert_and_separate_circuit(circuit) cirq.testing.assert_allclose_up_to_global_phase( circuit.unitary(), (c_left + c_right).unitary(), atol=1e-7) assert all( isinstance(op, cirq.PauliStringPhasor) for op in c_left.all_operations()) assert all( isinstance(op, cirq.GateOperation) and isinstance(op.gate, (cirq.SingleQubitCliffordGate, cirq.CZPowGate)) for op in c_right.all_operations())
def test_toffoli_separate(): circuit = nonoptimal_toffoli_circuit() c_left, c_right = convert_and_separate_circuit(circuit) cirq.testing.assert_allclose_up_to_global_phase( circuit.to_unitary_matrix(), (c_left + c_right).to_unitary_matrix(), atol=1e-7, ) assert all( isinstance(op, PauliStringPhasor) for op in c_left.all_operations()) assert all( isinstance(op, cirq.GateOperation) and isinstance(op.gate, (cirq.CliffordGate, cirq.PauliInteractionGate)) for op in c_right.all_operations())
def test_toffoli_separate(): q0, q1, q2 = cirq.LineQubit.range(3) circuit = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2) c_left, c_right = convert_and_separate_circuit(circuit) cirq.testing.assert_allclose_up_to_global_phase( circuit.to_unitary_matrix(), (c_left + c_right).to_unitary_matrix(), atol=1e-7, ) assert all(isinstance(op, PauliStringPhasor) for op in c_left.all_operations()) assert all(isinstance(op, cirq.GateOperation) and isinstance(op.gate, (cirq.CliffordGate, cirq.PauliInteractionGate)) for op in c_right.all_operations())
def test_move_non_clifford_into_clifford(): q0, q1, q2 = cirq.LineQubit.range(3) c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2) c_left, c_right = convert_and_separate_circuit(c_orig) # Normally, c_left would be optimized here c_left_dag = pauli_string_dag_from_circuit(c_left) c_recombined1 = move_pauli_strings_into_circuit(c_left, c_right) c_recombined2 = move_pauli_strings_into_circuit(c_left_dag, c_right) _assert_no_multi_qubit_pauli_strings(c_recombined1) _assert_no_multi_qubit_pauli_strings(c_recombined2) baseline_len = len(cirq.google.optimized_for_xmon(c_orig)) opt_len1 = len(cirq.google.optimized_for_xmon(c_recombined1)) opt_len2 = len(cirq.google.optimized_for_xmon(c_recombined2)) assert opt_len1 <= baseline_len assert opt_len2 <= baseline_len
def test_move_non_clifford_into_clifford(): q0, q1, q2 = cirq.LineQubit.range(3) c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2) c_left, c_right = convert_and_separate_circuit(c_orig) # Normally, c_left would be optimized here c_left_dag = pauli_string_dag_from_circuit(c_left) c_recombined1 = move_non_clifford_into_clifford(c_left, c_right) c_recombined2 = move_non_clifford_into_clifford(c_left_dag, c_right) _assert_no_multi_qubit_pauli_strings(c_recombined1) _assert_no_multi_qubit_pauli_strings(c_recombined2) baseline_len = len(cirq.google.optimized_for_xmon(c_orig)) opt_len1 = len(cirq.google.optimized_for_xmon(c_recombined1)) opt_len2 = len(cirq.google.optimized_for_xmon(c_recombined2)) assert opt_len1 <= baseline_len assert opt_len2 <= baseline_len
def test_move_non_clifford_into_clifford(): cg = pytest.importorskip("cirq_google") q0, q1, q2 = cirq.LineQubit.range(3) c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2) c_left, c_right = convert_and_separate_circuit(c_orig) # Normally, c_left would be optimized here c_left_dag = pauli_string_dag_from_circuit(c_left) c_recombined1 = move_pauli_strings_into_circuit(c_left, c_right) c_recombined2 = move_pauli_strings_into_circuit(c_left_dag, c_right) _assert_no_multi_qubit_pauli_strings(c_recombined1) _assert_no_multi_qubit_pauli_strings(c_recombined2) with cirq.testing.assert_deprecated('Use cirq.optimize_for_target_gateset', deadline='v0.16', count=None): baseline_len = len(cg.optimized_for_xmon(c_orig)) opt_len1 = len(cg.optimized_for_xmon(c_recombined1)) opt_len2 = len(cg.optimized_for_xmon(c_recombined2)) assert opt_len1 <= baseline_len assert opt_len2 <= baseline_len