示例#1
0
    def test_load_quil_file_via_entry_point(self):
        """Test that a quil file can be loaded via the load entrypoint."""
        cur_dir = os.path.dirname(os.path.abspath(__file__))

        with OperationRecorder() as rec:
            qml.load(os.path.join(cur_dir, "simple_program.quil"),
                     format="quil_file")(wires=range(5))

        # The wires should be assigned as
        # 0  1  2  3  7
        # 0  1  2  3  4

        expected_queue = [
            qml.Hadamard(0),
            qml.RZ(0.34, wires=[1]),
            qml.CNOT(wires=[0, 3]),
            qml.Hadamard(2),
            qml.Hadamard(4),
            qml.PauliX(4),
            qml.PauliY(1),
            qml.RZ(0.34, wires=[1]),
        ]

        for converted, expected in zip(rec.queue, expected_queue):
            assert converted.name == expected.name
            assert converted.wires == expected.wires
            assert converted.params == expected.params
示例#2
0
    def test_load_quil_via_entry_point(self):
        """Test that a quil string can be loaded via the load entrypoint."""
        quil_str = textwrap.dedent("""
            H 0
            RZ(0.34) 1
            CNOT 0 3
            H 2
            H 7
            X 7
            Y 1
            RZ(0.34) 1
        """)

        with OperationRecorder() as rec:
            qml.load(quil_str, format="quil")(wires=range(5))

        # The wires should be assigned as
        # 0  1  2  3  7
        # 0  1  2  3  4

        expected_queue = [
            qml.Hadamard(0),
            qml.RZ(0.34, wires=[1]),
            qml.CNOT(wires=[0, 3]),
            qml.Hadamard(2),
            qml.Hadamard(4),
            qml.PauliX(4),
            qml.PauliY(1),
            qml.RZ(0.34, wires=[1]),
        ]

        for converted, expected in zip(rec.queue, expected_queue):
            assert converted.name == expected.name
            assert converted.wires == expected.wires
            assert converted.params == expected.params
示例#3
0
    def test_load_program_via_entry_point(self):
        """Test that a pyquil Program instance can be loaded via the load entrypoint."""
        program = pyquil.Program()

        program += g.H(0)
        program += g.RZ(0.34, 1)
        program += g.CNOT(0, 3)
        program += g.H(2)
        program += g.H(7)
        program += g.X(7)
        program += g.Y(1)
        program += g.RZ(0.34, 1)

        with OperationRecorder() as rec:
            qml.load(program, format="pyquil_program")(wires=range(5))

        # The wires should be assigned as
        # 0  1  2  3  7
        # 0  1  2  3  4

        expected_queue = [
            qml.Hadamard(0),
            qml.RZ(0.34, wires=[1]),
            qml.CNOT(wires=[0, 3]),
            qml.Hadamard(2),
            qml.Hadamard(4),
            qml.PauliX(4),
            qml.PauliY(1),
            qml.RZ(0.34, wires=[1]),
        ]

        for converted, expected in zip(rec.queue, expected_queue):
            assert converted.name == expected.name
            assert converted.wires == expected.wires
            assert converted.params == expected.params
示例#4
0
 def test_converter_does_not_exist(self):
     """Test that the proper error is raised if the converter does not exist."""
     with pytest.raises(
             ValueError,
             match=
             "Converter does not exist. Make sure the required plugin is installed"
     ):
         qml.load("Test", format="some_non_existing_format")
示例#5
0
    def test_differentiation_in_qnode(self, angle):
        """Test a quil string used in a QNode can be differentiated."""
        quil_str = textwrap.dedent("""
            DECLARE delta REAL[1]
            RX(delta) 0
            CNOT 0 1
        """)

        loader = qml.load(quil_str, format="quil")
        dev = qml.device("default.qubit", wires=2)

        @qml.qnode(dev)
        def circuit(a):
            loader(wires=[0, 1], parameter_map={"delta": a})

            return qml.expval(qml.PauliZ(0)), qml.expval(qml.PauliZ(1))

        @qml.qnode(dev)
        def circuit_reg(a):
            qml.RX(a, wires=[0])
            qml.CNOT(wires=[0, 1])

            return qml.expval(qml.PauliZ(0)), qml.expval(qml.PauliZ(1))

        assert np.array_equal(circuit.jacobian([angle]),
                              circuit_reg.jacobian([angle]))
示例#6
0
    def test_quil_in_qnode(self, angle):
        """Test how a simple quil string is used inside a QNode."""
        quil_str = textwrap.dedent("""
            DECLARE delta REAL[1]
            RX(delta) 0
            CNOT 0 1
        """)

        loader = qml.load(quil_str, format="quil")
        dev = qml.device("default.qubit", wires=2)

        @qml.qnode(dev)
        def circuit(a):
            loader(wires=[0, 1], parameter_map={"delta": a})

            return qml.expval(qml.PauliZ(0)), qml.expval(qml.PauliZ(1))

        @qml.qnode(dev)
        def circuit_reg(a):
            qml.RX(a, wires=[0])
            qml.CNOT(wires=[0, 1])

            return qml.expval(qml.PauliZ(0)), qml.expval(qml.PauliZ(1))

        assert np.array_equal(circuit(angle), circuit_reg(angle))
示例#7
0
    def test_program_in_qnode(self, angle):
        """Test how a simple program is used inside a QNode."""
        program = pyquil.Program()

        delta = program.declare("delta", "REAL")

        program += g.RX(delta, 0)
        program += g.CNOT(0, 1)

        loader = qml.load(program, format="pyquil_program")
        dev = qml.device("default.qubit", wires=2)

        @qml.qnode(dev)
        def circuit(a):
            loader(wires=[0, 1], parameter_map={delta: a})

            return qml.expval(qml.PauliZ(0)), qml.expval(qml.PauliZ(1))

        @qml.qnode(dev)
        def circuit_reg(a):
            qml.RX(a, wires=[0])
            qml.CNOT(wires=[0, 1])

            return qml.expval(qml.PauliZ(0)), qml.expval(qml.PauliZ(1))

        assert np.array_equal(circuit(angle), circuit_reg(angle))
    def test_load_qiskit_circuit(self):
        """Test that the default load function works correctly."""
        theta = qiskit.circuit.Parameter('θ')

        qc = qiskit.QuantumCircuit(2)
        qc.rx(theta, 0)

        my_template = qml.load(qc, format='qiskit')

        dev = qml.device('default.qubit', wires=2)

        angles = np.array([0.53896774, 0.79503606, 0.27826503, 0.])

        @qml.qnode(dev)
        def loaded_quantum_circuit(angle):
            my_template({theta: angle})
            return qml.expval(qml.PauliZ(0))

        @qml.qnode(dev)
        def quantum_circuit(angle):
            qml.RX(angle, wires=[0])
            return qml.expval(qml.PauliZ(0))

        for x in angles:
            assert np.allclose(loaded_quantum_circuit(x), quantum_circuit(x))
示例#9
0
    def test_gradient(self, theta, phi, varphi, analytic, tol):
        """Test that the gradient works correctly"""
        program = pyquil.Program()

        delta1 = program.declare("delta1", "REAL")
        delta2 = program.declare("delta2", "REAL")
        delta3 = program.declare("delta3", "REAL")

        program += g.RX(delta1, 0)
        program += g.RX(delta2, 1)
        program += g.RX(delta3, 2)
        program += g.CNOT(0, 1)
        program += g.CNOT(1, 2)

        # Convert to a PennyLane circuit
        program_pl = qml.load(program, format="pyquil_program")

        dev = qml.device("default.qubit", wires=3, analytic=analytic)

        @qml.qnode(dev)
        def circuit(params):
            program_pl(parameter_map={
                delta1: params[0],
                delta2: params[1],
                delta3: params[2]
            },
                       wires=range(len(program_pl.defined_qubits)))
            return qml.expval(qml.PauliX(0) @ qml.PauliY(2))

        dcircuit = qml.grad(circuit, 0)
        res = dcircuit([theta, phi, varphi])
        expected = [
            np.cos(theta) * np.sin(phi) * np.sin(varphi),
            np.sin(theta) * np.cos(phi) * np.sin(varphi),
            np.sin(theta) * np.sin(phi) * np.cos(varphi)
        ]

        assert np.allclose(res, expected, tol)