Skip to content

Commit 26240d2

Browse files
committed
Introduce FidelityRange data class to store values
1 parent 3cb2808 commit 26240d2

File tree

3 files changed

+63
-33
lines changed

3 files changed

+63
-33
lines changed
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
from . import impls as impls
2-
from .analysis import FidelityAnalysis as FidelityAnalysis
2+
from .analysis import (
3+
FidelityRange as FidelityRange,
4+
FidelityAnalysis as FidelityAnalysis,
5+
)

src/bloqade/analysis/fidelity/analysis.py

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33
from ..address import Address, AddressReg, AddressAnalysis
44

55

6+
@dataclass
7+
class FidelityRange:
8+
"""Range of fidelity for a qubit as pair of (min, max) values"""
9+
10+
min: float
11+
max: float
12+
13+
614
@dataclass
715
class FidelityAnalysis(AddressAnalysis):
816
"""
@@ -37,10 +45,10 @@ def main():
3745
keys = ("circuit.fidelity", "qubit.address")
3846
lattice = Address
3947

40-
gate_fidelities: list[list[float]] = field(init=False, default_factory=list)
48+
gate_fidelities: list[FidelityRange] = field(init=False, default_factory=list)
4149
"""Gate fidelities of each qubit as (min, max) pairs to provide a range"""
4250

43-
qubit_survival_fidelities: list[list[float]] = field(
51+
qubit_survival_fidelities: list[FidelityRange] = field(
4452
init=False, default_factory=list
4553
)
4654
"""Qubit survival fidelity given as (min, max) pairs"""
@@ -59,30 +67,34 @@ def extend_fidelities(self):
5967
self.extend_fidelity(self.gate_fidelities)
6068
self.extend_fidelity(self.qubit_survival_fidelities)
6169

62-
def extend_fidelity(self, fidelities: list[list[float]]):
70+
def extend_fidelity(self, fidelities: list[FidelityRange]):
6371
n = self.qubit_count
64-
fidelities.extend([[1.0, 1.0] for _ in range(n - len(fidelities))])
72+
fidelities.extend([FidelityRange(1.0, 1.0) for _ in range(n - len(fidelities))])
6573

6674
def reset_fidelities(self):
67-
self.gate_fidelities = [[1.0, 1.0] for _ in range(self.qubit_count)]
68-
self.qubit_survival_fidelities = [[1.0, 1.0] for _ in range(self.qubit_count)]
75+
self.gate_fidelities = [
76+
FidelityRange(1.0, 1.0) for _ in range(self.qubit_count)
77+
]
78+
self.qubit_survival_fidelities = [
79+
FidelityRange(1.0, 1.0) for _ in range(self.qubit_count)
80+
]
6981

7082
@staticmethod
7183
def update_fidelities(
72-
fidelities: list[list[float]], fidelity: float, addresses: AddressReg
84+
fidelities: list[FidelityRange], fidelity: float, addresses: AddressReg
7385
):
7486
"""short-hand to update both (min, max) values"""
7587

7688
for idx in addresses.data:
77-
fidelities[idx][0] *= fidelity
78-
fidelities[idx][1] *= fidelity
89+
fidelities[idx].min *= fidelity
90+
fidelities[idx].max *= fidelity
7991

8092
def update_branched_fidelities(
8193
self,
82-
fidelities: list[list[float]],
83-
current_fidelities: list[list[float]],
84-
then_fidelities: list[list[float]],
85-
else_fidelities: list[list[float]],
94+
fidelities: list[FidelityRange],
95+
current_fidelities: list[FidelityRange],
96+
then_fidelities: list[FidelityRange],
97+
else_fidelities: list[FidelityRange],
8698
):
8799
# NOTE: make sure they are all of the same length
88100
map(
@@ -94,8 +106,8 @@ def update_branched_fidelities(
94106
for fid, current_fid, then_fid, else_fid in zip(
95107
fidelities, current_fidelities, then_fidelities, else_fidelities
96108
):
97-
fid[0] = current_fid[0] * min(then_fid[0], else_fid[0])
98-
fid[1] = current_fid[1] * max(then_fid[1], else_fid[1])
109+
fid.min = current_fid.min * min(then_fid.min, else_fid.min)
110+
fid.max = current_fid.max * max(then_fid.max, else_fid.max)
99111

100112
def initialize(self):
101113
super().initialize()

test/analysis/fidelity/test_fidelity.py

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from bloqade import qasm2, squin
66
from bloqade.qasm2 import noise
7-
from bloqade.analysis.fidelity import FidelityAnalysis
7+
from bloqade.analysis.fidelity import FidelityRange, FidelityAnalysis
88
from bloqade.qasm2.passes.noise import NoisePass
99

1010

@@ -216,11 +216,14 @@ def main():
216216
print(fid_analysis.gate_fidelities)
217217

218218
assert len(fid_analysis.gate_fidelities) == 2
219-
assert math.isclose(fid_analysis.gate_fidelities[0][0], 0.4)
220-
assert math.isclose(fid_analysis.gate_fidelities[0][1], 0.4)
221-
assert fid_analysis.gate_fidelities[1] == [1.0, 1.0]
219+
assert math.isclose(fid_analysis.gate_fidelities[0].max, 0.4)
220+
assert math.isclose(fid_analysis.gate_fidelities[0].min, 0.4)
221+
assert fid_analysis.gate_fidelities[1] == FidelityRange(1.0, 1.0)
222222

223-
assert fid_analysis.qubit_survival_fidelities == [[1.0, 1.0], [0.9, 0.9]]
223+
assert fid_analysis.qubit_survival_fidelities == [
224+
FidelityRange(1.0, 1.0),
225+
FidelityRange(0.9, 0.9),
226+
]
224227

225228

226229
def test_squin_if():
@@ -242,8 +245,14 @@ def main():
242245
fidelity_analysis = FidelityAnalysis(main.dialects)
243246
frame, _ = fidelity_analysis.run(main)
244247

245-
assert fidelity_analysis.gate_fidelities == [[0.9, 1.0], [0.8, 1.0]]
246-
assert fidelity_analysis.qubit_survival_fidelities == [[0.85, 1.0], [0.75, 1.0]]
248+
assert fidelity_analysis.gate_fidelities == [
249+
FidelityRange(0.9, 1.0),
250+
FidelityRange(0.8, 1.0),
251+
]
252+
assert fidelity_analysis.qubit_survival_fidelities == [
253+
FidelityRange(0.85, 1.0),
254+
FidelityRange(0.75, 1.0),
255+
]
247256

248257

249258
def test_squin_for():
@@ -258,7 +267,7 @@ def main():
258267
frame, _ = fidelity_analysis.run(main)
259268

260269
assert fidelity_analysis.gate_fidelities == [
261-
[1.0 - i * 0.01, 1.0 - i * 0.01] for i in range(4)
270+
FidelityRange(1.0 - i * 0.01, 1.0 - i * 0.01) for i in range(4)
262271
]
263272

264273

@@ -302,19 +311,25 @@ def main():
302311
frame, _ = fidelity_analysis.run(main)
303312

304313
assert fidelity_analysis.gate_fidelities == [
305-
[0.4, 0.4], # squin.single_qubit_pauli_channel(0.15, 0.2, 0.25, q[0])
306-
[0.8, 0.8], # squin.depolarize(0.2, q[1])
307-
[1 - 12 * 0.01, 1 - 12 * 0.01], # squin.two_qubit_pauli_channel(..., q[2])
308-
[1 - 12 * 0.01, 1 - 12 * 0.01], # squin.two_qubit_pauli_channel(..., q[3])
309-
[0.88, 0.88], # squin.depolarize2(0.15, q[4])
310-
[0.88, 0.88], # squin.depolarize2(0.15, q[5])
314+
FidelityRange(
315+
0.4, 0.4
316+
), # squin.single_qubit_pauli_channel(0.15, 0.2, 0.25, q[0])
317+
FidelityRange(0.8, 0.8), # squin.depolarize(0.2, q[1])
318+
FidelityRange(
319+
1 - 12 * 0.01, 1 - 12 * 0.01
320+
), # squin.two_qubit_pauli_channel(..., q[2])
321+
FidelityRange(
322+
1 - 12 * 0.01, 1 - 12 * 0.01
323+
), # squin.two_qubit_pauli_channel(..., q[3])
324+
FidelityRange(0.88, 0.88), # squin.depolarize2(0.15, q[4])
325+
FidelityRange(0.88, 0.88), # squin.depolarize2(0.15, q[5])
311326
]
312327

313328
assert (
314329
fidelity_analysis.qubit_survival_fidelities
315330
== [
316-
[0.9, 0.9], # squin.qubit_loss(0.1, q[0])
317-
[1.0, 1.0],
331+
FidelityRange(0.9, 0.9), # squin.qubit_loss(0.1, q[0])
332+
FidelityRange(1.0, 1.0),
318333
]
319-
+ [[0.87, 0.87]] * 4
334+
+ [FidelityRange(0.87, 0.87)] * 4
320335
) # squin.correlated_qubit_loss

0 commit comments

Comments
 (0)