Source code for qnetti.qnodes
import pennylane as qml
[docs]def qubit_probs_qnode_fn(prep_node, meas_wires=None, dev_kwargs={}, qnode_kwargs={}):
"""Constructs a qnode function that returns the probabilities for local qubit measurements.
The resulting quantum circuit prepares the state described by the ``prep_node`` and then
applies arbitrary qubit unitaries to each wire before measurement.
:param prep_node: An ansatz for the network state preparation.
:type prep_node: qnetvo.PrepareNode
:param meas_wires: The wires to apply arbitrary qubit measurements to. If ``None``, all qubits are measured.
:type meas_wires: list[int]
:param dev_kwargs: Keyword arguments to pass to the PennyLane device constructor. Useful keys are
include ``"name"``, which specifies the device (default: ``"default.qubit"``), and ``"shots"``,
which specifies the integert number of shots to run during circuit execution (default: ``None``).
:type shots: dict
:param qnode_kwargs: Keyword arguments passed through to the PennyLane qnode decorator.
:type qnode_kwargs: dict
:returns: A qnode function that returns the qubit probabilities for the circuit and the device
that evaluates the qnode.
The function is called as ``qnode(settings)`` where ``len(settings) == 3 * num_wires``.
:rtype: tuple(qml.QNode, qml.Device)
"""
meas_wires = meas_wires if meas_wires else prep_node.wires
dev_kwargs_copy = dev_kwargs.copy()
dev_name = dev_kwargs_copy.pop("name", "default.qubit")
dev = qml.device(dev_name, wires=prep_node.wires, **dev_kwargs_copy)
@qml.qnode(dev, **qnode_kwargs)
def qubit_probs_qnode(settings):
prep_node([])
for i, wire in enumerate(meas_wires):
qml.ArbitraryUnitary(settings[3 * i : 3 * i + 3], wires=[wire])
return qml.probs(wires=meas_wires)
return qubit_probs_qnode, dev