Skip to content

Commit 3937433

Browse files
committed
Add test (marked with xfail for now)
1 parent 41e1d6b commit 3937433

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

test/pyqrack/runtime/noise/native/test_loss.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1+
import textwrap
12
from unittest.mock import Mock
23

4+
import pytest
35
from kirin import ir
46

57
from bloqade import qasm2
68
from bloqade.noise import native
79
from bloqade.pyqrack import PyQrackInterpreter, reg
810
from bloqade.pyqrack.base import MockMemory
11+
from bloqade.qasm2.passes import QASM2Py, NoisePass, QASM2Fold
12+
from bloqade.qasm2.parse.lowering import QASM2
913

1014
simulation = qasm2.extended.add(native)
1115

@@ -43,3 +47,97 @@ def test_atom_loss(c: qasm2.CReg):
4347
assert result.qubit_state[0] is reg.QubitState.Lost
4448
assert result.qubit_state[1] is reg.QubitState.Active
4549
assert input[0] is reg.Measurement.One
50+
51+
52+
@pytest.mark.xfail
53+
def test_noise_probs():
54+
test_qasm = textwrap.dedent(
55+
"""
56+
OPENQASM 2.0;
57+
include "qelib1.inc";
58+
59+
// Qubits: [q_0, q_1, q_2, q_3, q_4, q_5]
60+
qreg q[6];
61+
62+
63+
u3(pi*0.9999896015,pi*1.8867094803,pi*0.1132905197) q[2];
64+
u3(pi*1.499959526,pi*1.2634437582,pi*0.7365562418) q[3];
65+
u3(pi*1.4998447568,pi*1.8205928898,pi*0.1794071102) q[4];
66+
u3(pi*1.4998052589,pi*1.5780611154,pi*0.4219388846) q[5];
67+
u3(pi*0.4920440401,pi*1.287644074,pi*0.712355926) q[0];
68+
u3(pi*1.0012473155,pi*1.3019213156,pi*0.6980786844) q[1];
69+
cz q[1],q[2];
70+
cz q[1],q[2];
71+
cz q[2],q[3];
72+
cz q[4],q[5];
73+
cz q[2],q[3];
74+
cz q[4],q[5];
75+
cz q[2],q[3];
76+
cz q[4],q[5];
77+
cz q[2],q[3];
78+
cz q[4],q[5];
79+
cz q[2],q[3];
80+
cz q[4],q[5];
81+
u3(pi*1.0,pi*1.5687764466,pi*0.4312235534) q[2];
82+
u3(pi*0.5,0,pi*1.7365086077) q[3];
83+
u3(pi*0.5,pi*1.0,pi*0.6112880576) q[4];
84+
u3(pi*0.1388474164,pi*1.7687898606,pi*1.2425564668) q[5];
85+
"""
86+
)
87+
88+
entry = QASM2(qasm2.main.add(qasm2.inline_)).loads(test_qasm, "entry", returns="q")
89+
QASM2Py(entry.dialects)(entry)
90+
entry = entry.similar(qasm2.extended.add(native))
91+
QASM2Fold(entry.dialects).fixpoint(entry)
92+
93+
# Noise parameters
94+
gate_noise_value = 1e-3
95+
move_noise_value = 0.5
96+
97+
gate_noise_params = native.GateNoiseParams(
98+
local_px=gate_noise_value,
99+
local_py=gate_noise_value,
100+
local_pz=gate_noise_value,
101+
local_loss_prob=gate_noise_value,
102+
#
103+
global_px=gate_noise_value,
104+
global_py=gate_noise_value,
105+
global_pz=gate_noise_value,
106+
global_loss_prob=gate_noise_value,
107+
#
108+
cz_paired_gate_px=gate_noise_value,
109+
cz_paired_gate_py=gate_noise_value,
110+
cz_paired_gate_pz=gate_noise_value,
111+
cz_gate_loss_prob=gate_noise_value,
112+
#
113+
cz_unpaired_gate_px=gate_noise_value,
114+
cz_unpaired_gate_py=gate_noise_value,
115+
cz_unpaired_gate_pz=gate_noise_value,
116+
cz_unpaired_loss_prob=gate_noise_value,
117+
)
118+
119+
move_noise_params = native.model.MoveNoiseParams(
120+
idle_px_rate=move_noise_value,
121+
idle_py_rate=move_noise_value,
122+
idle_pz_rate=move_noise_value,
123+
idle_loss_rate=move_noise_value,
124+
move_px_rate=move_noise_value,
125+
move_py_rate=move_noise_value,
126+
move_pz_rate=move_noise_value,
127+
move_loss_rate=move_noise_value,
128+
#
129+
pick_px=move_noise_value,
130+
pick_py=move_noise_value,
131+
pick_pz=move_noise_value,
132+
pick_loss_prob=move_noise_value,
133+
#
134+
move_speed=5e-1, # default 5e-1
135+
storage_spacing=4.0, # default 4.0
136+
)
137+
138+
with pytest.raises(ir.ValidationError):
139+
NoisePass(
140+
entry.dialects,
141+
gate_noise_params=gate_noise_params,
142+
noise_model=native.TwoRowZoneModel(params=move_noise_params),
143+
)(entry)

0 commit comments

Comments
 (0)