catalyst
catalyst copied to clipboard
[linux x86-64] Invalid wire is valid measurement.
Issue description
Test case:
from catalyst import qjit, measure
import pennylane as qml
@qjit
@qml.qnode(qml.device("lightning.qubit", wires=2))
def circuit(x: int):
return measure(x)
circuit(0)
circuit(1)
circuit(2)
-
Expected behavior: An assertion should trigger for
circuit(2) -
Actual behavior: No assertion is triggered.
-
Reproduces how often: Always (on x86 - linux)
@erick-xanadu this applies to operators as well:
dev = qml.device("lightning.qubit", wires=4)
@qjit
@qml.qnode(dev)
def circuit(n):
print("Tracing occurring")
def loop_fn(i):
qml.RX(i, wires=i)
for_loop(0, n, 1)(loop_fn)()
def loop_fn(i):
qml.CNOT(wires=[i, jnp.mod(i+1, n)])
for_loop(0, n, 1)(loop_fn)()
return qml.expval(qml.PauliZ(0))
This works with any wire number as input, even though the device only has 4 wires:
>>> circuit(7)
array(0.22259496)
We also don't appear to check for duplicate wires in the same operation, something that could be fixed alongside this issue:
@qjit
@qml.qnode(qml.device("lightning.qubit", wires=2))
def f(a: int, b: int):
qml.Hadamard(0)
qml.CNOT(wires=[a, b])
return qml.probs()
f(0, 0) # succeeds
This issue is now fixed (I believe by #784) :)
[catalyst/runtime/lib/capi/RuntimeCAPI.cpp][Line:967][Function:__catalyst__rt__array_get_element_ptr_1d] Error in Catalyst Runtime: The qubit register does not contain the requested wire: 2