Beispiel #1
0
ops = {
    "BasisState": qml.BasisState(np.array([0]), wires=[0]),
    "CNOT": qml.CNOT(wires=[0, 1]),
    "CRX": qml.CRX(0, wires=[0, 1]),
    "CRY": qml.CRY(0, wires=[0, 1]),
    "CRZ": qml.CRZ(0, wires=[0, 1]),
    "CRot": qml.CRot(0, 0, 0, wires=[0, 1]),
    "CSWAP": qml.CSWAP(wires=[0, 1, 2]),
    "CZ": qml.CZ(wires=[0, 1]),
    "CY": qml.CY(wires=[0, 1]),
    "DiagonalQubitUnitary": qml.DiagonalQubitUnitary(np.eye(2), wires=[0]),
    "Hadamard": qml.Hadamard(wires=[0]),
    "MultiRZ": qml.MultiRZ(0, wires=[0]),
    "PauliX": qml.PauliX(wires=[0]),
    "PauliY": qml.PauliY(wires=[0]),
    "PauliZ": qml.PauliZ(wires=[0]),
    "PhaseShift": qml.PhaseShift(0, wires=[0]),
    "QubitStateVector": qml.QubitStateVector(np.array([1.0, 0.0]), wires=[0]),
    "QubitUnitary": qml.QubitUnitary(np.eye(2), wires=[0]),
    "RX": qml.RX(0, wires=[0]),
    "RY": qml.RY(0, wires=[0]),
    "RZ": qml.RZ(0, wires=[0]),
    "Rot": qml.Rot(0, 0, 0, wires=[0]),
    "S": qml.S(wires=[0]),
    "SWAP": qml.SWAP(wires=[0, 1]),
    "T": qml.T(wires=[0]),
    "Toffoli": qml.Toffoli(wires=[0, 1, 2]),
}

all_ops = ops.keys()
        def circuit(weights):
            ArbitraryStatePreparation(weights, [0, 1, 2])

            return qml.expval(qml.PauliZ(0))
 def circuit(p):
     qml.RX(3 * p[0], wires=0)
     qml.RY(p[1], wires=0)
     qml.RX(p[2] / 2, wires=0)
     return qml.expval(qml.PauliZ(0))
 def circuit(x):
     qml.RX(x, wires=[0])
     return qml.sample(qml.PauliZ(0)), qml.sample(qml.PauliX(1))
        def circuit():
            BasisStatePreparation(basis_state, wires)

            # Pauli Z gates identify the basis state
            return qml.expval(qml.PauliZ(0)), qml.expval(
                qml.PauliZ(1)), qml.expval(qml.PauliZ(2))
 def circuit(x, y, z):
     qml.Rot(x, y, z, wires=[0])
     return qml.expval(qml.PauliZ(0))
 def circuit(x):
     qml.BasisState(x, wires=[1])
     return qml.expval(qml.PauliZ(0))
Beispiel #8
0
 def circuit_Zmi():
     qml.RX(np.pi, wires=qubit)
     return qml.expval(qml.PauliZ(qubit))
Beispiel #9
0
 def arbitrary_perm():
     qml.Permute(permutation_order, wires=dev.wires)
     return qml.expval(qml.PauliZ(0))
Beispiel #10
0
 def circuit():
     qml.Hadamard(0)
     qml.CNOT(wires=[0, 1])
     return qml.expval(qml.PauliZ(0) @ qml.PauliZ(1))
Beispiel #11
0
 def circuit_Zpl():
     qml.RX(0.0, wires=qubit)
     return qml.expval(qml.PauliZ(qubit))
Beispiel #12
0
 def circuit():
     qml.RY(np.pi/2, wires=[0])
     qml.CNOT(wires=[0, 1])
     return qml.expval(qml.PauliZ(0) @ qml.Identity(1))
Beispiel #13
0
        def decomp_circuit(theta):
            qml.PauliRot.decomposition(theta, "XX", wires=[0, 1])

            return qml.expval(qml.PauliZ(0))
Beispiel #14
0
        def circuit(theta):
            qml.PauliRot(theta, "XX", wires=[0, 1])

            return qml.expval(qml.PauliZ(0))
Beispiel #15
0
 def cost(p1, p2):
     qml.RX(extra_param, wires=[0])
     qml.RY(p1, wires=[0])
     qml.RZ(p2, wires=[0])
     qml.RX(p1, wires=[0])
     return qml.expval(qml.PauliZ(0))
Beispiel #16
0
 def subset_perm():
     qml.Permute(permutation_order, wires=wire_subset)
     return qml.expval(qml.PauliZ(0))
 def circuit(x):
     qml.Rot(0.3, x, -0.2, wires=[0])
     return qml.expval(qml.PauliZ(0))
Beispiel #18
0
 def identity_permutation():
     qml.Permute([0, 1, 2, 3], wires=dev.wires)
     return qml.expval(qml.PauliZ(0))
 def circuit(x, y):
     qml.RX(x, wires=[0])
     return qml.expval(qml.PauliZ(0))
Beispiel #20
0
 def permute_qubits():
     qml.Permute(permutation_order, wires=dev.wires)
     return qml.expval(qml.PauliZ(0))
 def circuit(x, y, z):
     qml.CNOT(wires=[0, 1])
     return qml.expval(qml.PauliZ(0)), qml.expval(qml.PauliY(1))
Beispiel #22
0
 def two_cycle():
     qml.Permute(permutation_order, wires=dev.wires)
     return qml.expval(qml.PauliZ(0))
 def circuit(x):
     qml.BasisState(np.array([x, 0]), wires=[0, 1])  # not differentiable
     qml.RX(x, wires=[0])
     return qml.expval(qml.PauliZ(0))
Beispiel #24
0
 def circuit(weight):
     qml.templates.DoubleExcitationUnitary(weight=weight,
                                           wires1=wires1,
                                           wires2=wires2)
     return qml.expval(qml.PauliZ(0))
        def circuit():
            MottonenStatePreparation(state_vector, wires)

            return qml.expval(qml.PauliZ(0)), qml.expval(
                qml.PauliZ(1)), qml.expval(qml.PauliZ(2))
Beispiel #26
0
def circuit_template(weight):
    qml.templates.DoubleExcitationUnitary(weight, wires1=[0, 1], wires2=[2, 3])
    return qml.expval(qml.PauliZ(0))
Beispiel #27
0
class TestOperations:
    """Tests the logic related to operations"""
    def test_op_queue_accessed_outside_execution_context(
            self, mock_qubit_device):
        """Tests that a call to op_queue outside the execution context raises the correct error"""

        with pytest.raises(
                ValueError,
                match=
                "Cannot access the operation queue outside of the execution context!"
        ):
            dev = mock_qubit_device()
            dev.op_queue

    def test_op_queue_is_filled_during_execution(
            self, mock_qubit_device_with_paulis_and_methods, monkeypatch):
        """Tests that the op_queue is correctly filled when apply is called and that accessing
           op_queue raises no error"""
        queue = [qml.PauliX(wires=0), qml.PauliY(wires=1), qml.PauliZ(wires=2)]

        observables = [
            qml.expval(qml.PauliZ(0)),
            qml.var(qml.PauliZ(1)),
            qml.sample(qml.PauliZ(2))
        ]

        circuit_graph = CircuitGraph(queue + observables, {}, Wires([0, 1, 2]))

        call_history = []

        with monkeypatch.context() as m:
            m.setattr(
                QubitDevice, "apply",
                lambda self, x, **kwargs: call_history.extend(x + kwargs.get(
                    'rotations', [])))
            m.setattr(QubitDevice, "analytic_probability", lambda *args: None)
            dev = mock_qubit_device_with_paulis_and_methods()
            dev.execute(circuit_graph)

        assert call_history == queue

        assert len(call_history) == 3
        assert isinstance(call_history[0], qml.PauliX)
        assert call_history[0].wires == Wires([0])

        assert isinstance(call_history[1], qml.PauliY)
        assert call_history[1].wires == Wires([1])

        assert isinstance(call_history[2], qml.PauliZ)
        assert call_history[2].wires == Wires([2])

    def test_unsupported_operations_raise_error(
            self, mock_qubit_device_with_paulis_and_methods):
        """Tests that the operations are properly applied and queued"""
        queue = [
            qml.PauliX(wires=0),
            qml.PauliY(wires=1),
            qml.Hadamard(wires=2)
        ]

        observables = [
            qml.expval(qml.PauliZ(0)),
            qml.var(qml.PauliZ(1)),
            qml.sample(qml.PauliZ(2))
        ]

        circuit_graph = CircuitGraph(queue + observables, {}, Wires([0, 1, 2]))

        with pytest.raises(DeviceError,
                           match="Gate Hadamard not supported on device"):
            dev = mock_qubit_device_with_paulis_and_methods()
            dev.execute(circuit_graph)

    numeric_queues = [[qml.RX(0.3, wires=[0])],
                      [
                          qml.RX(0.3, wires=[0]),
                          qml.RX(0.4, wires=[1]),
                          qml.RX(0.5, wires=[2]),
                      ]]

    variable = Variable(1)
    symbolic_queue = [
        [qml.RX(variable, wires=[0])],
    ]

    observables = [[qml.PauliZ(0)], [qml.PauliX(0)], [qml.PauliY(0)]]

    @pytest.mark.parametrize("observables", observables)
    @pytest.mark.parametrize("queue", numeric_queues + symbolic_queue)
    def test_passing_keyword_arguments_to_execute(
            self, mock_qubit_device_with_paulis_rotations_and_methods,
            monkeypatch, queue, observables):
        """Tests that passing keyword arguments to execute propagates those kwargs to the apply()
        method"""
        circuit_graph = CircuitGraph(queue + observables, {}, Wires([0, 1, 2]))

        call_history = {}

        with monkeypatch.context() as m:
            m.setattr(QubitDevice, "apply",
                      lambda self, x, **kwargs: call_history.update(kwargs))
            dev = mock_qubit_device_with_paulis_rotations_and_methods()
            dev.execute(circuit_graph, hash=circuit_graph.hash)

        len(call_history.items()) == 1
        call_history["hash"] = circuit_graph.hash
 def circuit(a):
     qml.RX(a, wires=0)
     return qml.expval(qml.PauliZ(wires=0))
 def circuit(x):
     qml.RX(x[1], wires=0)
     qml.Rot(x[0], x[1], x[2], wires=0)
     return qml.expval(qml.PauliZ(0))
Beispiel #30
0
def circuit2(phi1, phi2):
    qml.RX(phi1, wires=0)
    qml.RY(phi2, wires=0)
    return qml.expval(qml.PauliZ(0))