88from bloqade .qasm2 .passes .noise import NoisePass
99
1010
11- class NoiseTestModel (native .MoveNoiseModelABC ):
12- def parallel_cz_errors (self , ctrls , qargs , rest ):
13- return {(0.01 , 0.01 , 0.01 , 0.01 ): ctrls + qargs + rest }
14-
11+ def test_atom_loss_analysis ():
1512
16- def test_basic_noise ():
13+ p_loss = 0.01
1714
1815 @qasm2 .extended
1916 def main ():
2017 q = qasm2 .qreg (2 )
21- qasm2 . x ( q [0 ])
18+ native . atom_loss_channel ([ q [0 ]], prob = p_loss )
2219 return q
2320
24- main .print ()
25-
2621 fid_analysis = FidelityAnalysis (main .dialects )
2722 fid_analysis .run_analysis (main , no_raise = False )
2823
2924 assert fid_analysis .gate_fidelity == fid_analysis ._current_gate_fidelity == 1
30-
31- px = 0.01
32- py = 0.01
33- pz = 0.01
34- p_loss = 0.01
35-
36- noise_params = native .GateNoiseParams (
37- global_loss_prob = p_loss ,
38- global_px = px ,
39- global_py = py ,
40- global_pz = pz ,
41- local_px = 0.002 ,
42- )
43-
44- model = NoiseTestModel ()
45-
46- NoisePass (main .dialects , noise_model = model , gate_noise_params = noise_params )(main )
47-
48- main .print ()
49-
50- fid_analysis = FidelityAnalysis (main .dialects )
51- fid_analysis .run_analysis (main , no_raise = False )
52-
53- p_noise = noise_params .local_px + noise_params .local_py + noise_params .local_pz
54- assert (
55- fid_analysis .gate_fidelity
56- == fid_analysis ._current_gate_fidelity
57- == (1 - p_noise )
58- )
59-
60- assert 0.9 < fid_analysis .atom_survival_probability [0 ] < 1
61- assert fid_analysis .atom_survival_probability [0 ] == 1 - noise_params .local_loss_prob
25+ assert fid_analysis .atom_survival_probability [0 ] == 1 - p_loss
6226 assert fid_analysis .atom_survival_probability [1 ] == 1
6327
6428
65- def test_c_noise ():
29+ def test_cz_noise ():
30+ p_ch = 0.01 / 3.0
31+
6632 @qasm2 .extended
6733 def main ():
6834 q = qasm2 .qreg (2 )
35+ native .cz_pauli_channel (
36+ [q [0 ]],
37+ [q [1 ]],
38+ px_ctrl = p_ch ,
39+ py_ctrl = p_ch ,
40+ pz_ctrl = p_ch ,
41+ px_qarg = p_ch ,
42+ py_qarg = p_ch ,
43+ pz_qarg = p_ch ,
44+ paired = True ,
45+ )
6946 qasm2 .cz (q [0 ], q [1 ])
7047 return q
7148
@@ -74,43 +51,35 @@ def main():
7451 fid_analysis = FidelityAnalysis (main .dialects )
7552 fid_analysis .run_analysis (main , no_raise = False )
7653
77- assert fid_analysis . gate_fidelity == fid_analysis . _current_gate_fidelity == 1
54+ expected_fidelity = ( 1 - 3 * p_ch ) ** 2
7855
79- px = 0.01
80- py = 0.01
81- pz = 0.01
82- p_loss = 0.01
56+ assert fid_analysis .gate_fidelity == fid_analysis ._current_gate_fidelity
57+ assert math .isclose (fid_analysis .gate_fidelity , expected_fidelity )
8358
84- noise_params = native .GateNoiseParams (
85- global_loss_prob = p_loss ,
86- global_px = px ,
87- global_py = py ,
88- global_pz = pz ,
89- local_px = 0.002 ,
90- )
9159
92- model = NoiseTestModel ()
60+ def test_single_qubit_noise ():
61+ p_ch = 0.01 / 3.0
9362
94- NoisePass (main .dialects , noise_model = model , gate_noise_params = noise_params )(main )
63+ @qasm2 .extended
64+ def main ():
65+ q = qasm2 .qreg (2 )
66+ native .pauli_channel ([q [0 ]], px = p_ch , py = p_ch , pz = p_ch )
67+ return q
9568
9669 main .print ()
9770
9871 fid_analysis = FidelityAnalysis (main .dialects )
9972 fid_analysis .run_analysis (main , no_raise = False )
10073
101- # two cz channels (**2 for each one since we look at both control & target)
102- fid_cz = (1 - 3 * noise_params .cz_paired_gate_px ) ** 4
103-
104- # one pauli channel
105- fid_cz *= 1 - noise_params .global_px * 3
74+ expected_fidelity = 1 - 3 * p_ch
10675
10776 assert fid_analysis .gate_fidelity == fid_analysis ._current_gate_fidelity
108- assert math .isclose (fid_cz , fid_analysis .gate_fidelity , abs_tol = 1e-14 )
77+ assert math .isclose (fid_analysis .gate_fidelity , expected_fidelity )
10978
110- assert 0.9 < fid_analysis . atom_survival_probability [ 0 ] < 1
111- assert fid_analysis . atom_survival_probability [ 0 ] == (
112- 1 - noise_params . cz_gate_loss_prob
113- ) * ( 1 - p_loss )
79+
80+ class NoiseTestModel ( native . MoveNoiseModelABC ):
81+ def parallel_cz_errors ( self , ctrls , qargs , rest ):
82+ return {( 0.01 , 0.01 , 0.01 , 0.01 ): ctrls + qargs + rest }
11483
11584
11685@pytest .mark .xfail
@@ -145,23 +114,19 @@ def main_if():
145114 pz = 0.01
146115 p_loss = 0.01
147116
148- noise_params = native . GateNoiseParams (
117+ model = NoiseTestModel (
149118 global_loss_prob = p_loss ,
150119 global_px = px ,
151120 global_py = py ,
152121 global_pz = pz ,
153122 local_px = 0.002 ,
154123 )
155-
156- model = NoiseTestModel ()
157- NoisePass (main .dialects , noise_model = model , gate_noise_params = noise_params )(main )
124+ NoisePass (main .dialects , noise_model = model )(main )
158125 fid_analysis = FidelityAnalysis (main .dialects )
159126 fid_analysis .run_analysis (main , no_raise = False )
160127
161128 model = NoiseTestModel ()
162- NoisePass (main_if .dialects , noise_model = model , gate_noise_params = noise_params )(
163- main_if
164- )
129+ NoisePass (main_if .dialects , noise_model = model )(main_if )
165130 fid_if_analysis = FidelityAnalysis (main_if .dialects )
166131 fid_if_analysis .run_analysis (main_if , no_raise = False )
167132
@@ -211,24 +176,20 @@ def main_for():
211176 pz = 0.01
212177 p_loss = 0.01
213178
214- noise_params = native . GateNoiseParams (
179+ model = NoiseTestModel (
215180 global_loss_prob = p_loss ,
216181 global_px = px ,
217182 global_py = py ,
218183 global_pz = pz ,
219184 local_px = 0.002 ,
220185 local_loss_prob = 0.03 ,
221186 )
222-
223- model = NoiseTestModel ()
224- NoisePass (main .dialects , noise_model = model , gate_noise_params = noise_params )(main )
187+ NoisePass (main .dialects , noise_model = model )(main )
225188 fid_analysis = FidelityAnalysis (main .dialects )
226189 fid_analysis .run_analysis (main , no_raise = False )
227190
228191 model = NoiseTestModel ()
229- NoisePass (main_for .dialects , noise_model = model , gate_noise_params = noise_params )(
230- main_for
231- )
192+ NoisePass (main_for .dialects , noise_model = model )(main_for )
232193
233194 main_for .print ()
234195
0 commit comments