Skip to content

Commit 575736d

Browse files
committed
Properly deal with measurements for lost qubits
1 parent ddfd79e commit 575736d

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

src/bloqade/pyqrack/squin/qubit.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ def broadcast(
3737
qubits: ilist.IList[PyQrackQubit, Any] = frame.get(stmt.qubits)
3838
operator.broadcast_apply(qubits)
3939

40-
def _measure_qubit(self, qbit: PyQrackQubit):
40+
def _measure_qubit(self, qbit: PyQrackQubit, interp: PyQrackInterpreter):
4141
if qbit.is_active():
4242
return bool(qbit.sim_reg.m(qbit.addr))
43+
else:
44+
return interp.loss_m_result
4345

4446
@interp.impl(qubit.MeasureQubitList)
4547
def measure_qubit_list(
@@ -49,15 +51,15 @@ def measure_qubit_list(
4951
stmt: qubit.MeasureQubitList,
5052
):
5153
qubits: ilist.IList[PyQrackQubit, Any] = frame.get(stmt.qubits)
52-
result = ilist.IList([self._measure_qubit(qbit) for qbit in qubits])
54+
result = ilist.IList([self._measure_qubit(qbit, interp) for qbit in qubits])
5355
return (result,)
5456

5557
@interp.impl(qubit.MeasureQubit)
5658
def measure_qubit(
5759
self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: qubit.MeasureQubit
5860
):
5961
qbit: PyQrackQubit = frame.get(stmt.qubit)
60-
result = self._measure_qubit(qbit)
62+
result = self._measure_qubit(qbit, interp)
6163
return (result,)
6264

6365
@interp.impl(qubit.MeasureAndReset)
@@ -70,10 +72,7 @@ def measure_and_reset(
7072
qubits: ilist.IList[PyQrackQubit, Any] = frame.get(stmt.qubits)
7173
result = []
7274
for qbit in qubits:
73-
if qbit.is_active():
74-
qbit_result = bool(qbit.sim_reg.m(qbit.addr))
75-
else:
76-
qbit_result = None
75+
qbit_result = self._measure_qubit(qbit, interp)
7776

7877
if qbit_result:
7978
qbit.sim_reg.x(qbit.addr)

src/bloqade/pyqrack/squin/wire.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ def measure(
4343
):
4444
w: PyQrackWire = frame.get(stmt.wire)
4545
qbit = w.qubit
46+
47+
if not qbit.is_active():
48+
return (interp.loss_m_result,)
49+
4650
res: bool = bool(qbit.sim_reg.m(qbit.addr))
4751
return (res,)
4852

@@ -55,6 +59,10 @@ def measure_and_reset(
5559
):
5660
w: PyQrackWire = frame.get(stmt.wire)
5761
qbit = w.qubit
62+
63+
if not qbit.is_active():
64+
return (w, interp.loss_m_result)
65+
5866
res: bool = bool(qbit.sim_reg.m(qbit.addr))
5967

6068
if res:
@@ -69,6 +77,9 @@ def reset(self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: wire.Rese
6977
w: PyQrackWire = frame.get(stmt.wire)
7078
qbit = w.qubit
7179

80+
if not qbit.is_active():
81+
return (w,)
82+
7283
if bool(qbit.sim_reg.m(qbit.addr)):
7384
qbit.sim_reg.x(qbit.addr)
7485

0 commit comments

Comments
 (0)