Hi there,
First, I’d like to congratulate you all on making an awesome Python package! I recently saw @jmarrazola give a talk on quantum neural networks and I’ve been interested to try PennyLane for some new research I’ve recently started.
I am working on a proposed photonic architecture to prepare arbitrary multi-qubit (discrete, not CV) states, and I am trying to use PennyLane to optimize the trainable parameters to maximize the circuit fidelity <psi_out|psi_target>
. Ideally, what I would like to do is something like this:
dev = qml.device('default.qubit', wires=2)
@qml.qnode(dev)
def circuit(trainable_params):
my_configurable_circuit(trainable_params)
target_state = 1/np.sqrt(2) * np.array([1,0,0,1])
return qml.expval.Overlap(target_state)
circuit()
> 0.92523 (value of <psi|target>)
Since there’s no Overlap()
method available, I tried improvising:
@qml.qnode(dev)
def circuit(trainable_params):
my_configurable_circuit(trainable_params)
target_state = 1/np.sqrt(2) * np.array([1,0,0,1])
target_herm_op = np.outer(target_state.conj(), target_state)
return qml.expval.Hermitian(target_herm_op, [0,1]) # gives <psi|target>^2
This gives the error ValueError: Hermitian: wrong number of wires. 2 wires given, 1 expected.
(As a side note, the documentation is slightly ambiguous to a non-careful reader whether Hermitian()
could be a (M<=N
)-qubit operator which gets “padded” with identity operators. Perhaps change the wires
keyword to wire
for operators and expectations which only act on one qubit?)
Is there a way to do multi-qubit expectations like this in PennyLane? I understand this doesn’t necessarily correspond to a physically observable value that could be implemented on quantum hardware, but it’s easy to implement in TensorFlow and would be a nice feature to have in the default simulated qubit/qumode backend.