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