def test_undefined_quil_gate(): """There are no such things as FREDKIN & TOFFOLI in Quil. The standard names for those gates in Quil are CSWAP and CCNOT. Of course, they can be defined via DEFGATE / DEFCIRCUIT.""" with pytest.raises(UndefinedQuilGate): circuit_from_quil("FREDKIN 0 1 2") with pytest.raises(UndefinedQuilGate): circuit_from_quil("TOFFOLI 0 1 2")
def test_unsupported_quil_instruction(): with pytest.raises(UnsupportedQuilInstruction): circuit_from_quil("NOP") with pytest.raises(UnsupportedQuilInstruction): circuit_from_quil("PRAGMA ADD-KRAUS X 0 \"(0.0 1.0 1.0 0.0)\"") with pytest.raises(UnsupportedQuilInstruction): circuit_from_quil("RESET") with pytest.raises(UnsupportedQuilInstruction): circuit_from_quil(QUIL_PROGRAM_WITH_PARAMETERIZED_DEFGATE)
def test_circuit_from_quil(): q0, q1, q2 = LineQubit.range(3) cirq_circuit = Circuit([ I(q0), I(q1), I(q2), X(q0), Y(q1), Z(q2), H(q0), S(q1), T(q2), Z(q0)**(1 / 8), Z(q1)**(1 / 8), Z(q2)**(1 / 8), rx(np.pi / 2)(q0), ry(np.pi / 2)(q1), rz(np.pi / 2)(q2), CZ(q0, q1), CNOT(q1, q2), cphase(np.pi / 2)(q0, q1), cphase00(np.pi / 2)(q1, q2), cphase01(np.pi / 2)(q0, q1), cphase10(np.pi / 2)(q1, q2), ISWAP(q0, q1), pswap(np.pi / 2)(q1, q2), SWAP(q0, q1), xy(np.pi / 2)(q1, q2), CCNOT(q0, q1, q2), CSWAP(q0, q1, q2), MeasurementGate(1, key="ro[0]")(q0), MeasurementGate(1, key="ro[1]")(q1), MeasurementGate(1, key="ro[2]")(q2), ]) # build the same Circuit, using Quil quil_circuit = circuit_from_quil(QUIL_PROGRAM) # test Circuit equivalence assert cirq_circuit == quil_circuit pyquil_circuit = Program(QUIL_PROGRAM) # drop declare and measures, get Program unitary pyquil_unitary = program_unitary(pyquil_circuit[1:-3], n_qubits=3) # fix qubit order convention cirq_circuit_swapped = Circuit(SWAP(q0, q2), cirq_circuit[:-1], SWAP(q0, q2)) # get Circuit unitary cirq_unitary = cirq_circuit_swapped.unitary() # test unitary equivalence assert np.isclose(pyquil_unitary, cirq_unitary).all()
def test_measurement_without_classical_reg(): """Measure operations must declare a classical register.""" with pytest.raises(UnsupportedQuilInstruction): circuit_from_quil("MEASURE 0")
def test_quil_with_defgate(): q0 = LineQubit(0) cirq_circuit = Circuit([X(q0), Z(q0)]) quil_circuit = circuit_from_quil(QUIL_PROGRAM_WITH_DEFGATE) assert np.isclose(quil_circuit.unitary(), cirq_circuit.unitary()).all()