Hey @IanDavis! Welcome to the forum
Thank you for your feedback . I think the main source of confusion here is the distinction between
qml.expval
on its own versus when it’s returned from a QNode. Let me explain what’s going on under the hood at a high level.
If I just print out qml.expval(qml.PauliZ(0))
, here’s what I get:
>>> import pennylane as qml
>>> qml.expval(qml.PauliZ(0))
expval(PauliZ(wires=[0]))
>>> type(qml.expval(qml.PauliZ(0)))
<class 'pennylane.measurements.expval.ExpectationMP'>
In that sense, the documentation for expval
is correct: it’s returning a measurement process instance — expval(PauliZ(wires=[0]))
— whose type is ExpectationMP
.
However, a measurement process instance has no meaning / value on its own — it’s simply a process. A value is associated to the process when there’s something to inject into the process: a quantum state generated by a quantum circuit! So, in the context of being returned from a QNode — pennylane’s lingo for a quantum circuit — the measurement is assigned a value whose type is a pennylane.numpy.tensor.tensor
, as you said.
Side note: pennylane.numpy.tensor.tensor
really just means a NumPy array .
Let me know if this helps!