Skip to content

Analysis

FidelityAnalysis dataclass

FidelityAnalysis()

Bases: AddressAnalysis

This analysis pass can be used to track the global addresses of qubits and wires.

Usage examples

from bloqade import squin
from bloqade.analysis.fidelity import FidelityAnalysis

@squin.kernel
def main():
    q = squin.qalloc(1)
    squin.x(q[0])
    squin.depolarize(0.1, q[0])
    return q

fid_analysis = FidelityAnalysis(main.dialects)
fid_analysis.run(main)

gate_fidelities = fid_analysis.gate_fidelities
qubit_survival_probs = fid_analysis.qubit_survival_fidelities

gate_fidelities class-attribute instance-attribute

gate_fidelities: list[FidelityRange] = field(
    init=False, default_factory=list
)

Gate fidelities of each qubit as (min, max) pairs to provide a range

qubit_survival_fidelities class-attribute instance-attribute

qubit_survival_fidelities: list[FidelityRange] = field(
    init=False, default_factory=list
)

Qubit survival fidelity given as (min, max) pairs

extend_fidelities

extend_fidelities()

Extend both fidelity lists so their length matches the number of qubits

Source code in .venv/lib/python3.12/site-packages/bloqade/analysis/fidelity/analysis.py
60
61
62
63
64
def extend_fidelities(self):
    """Extend both fidelity lists so their length matches the number of qubits"""

    self.extend_fidelity(self.gate_fidelities)
    self.extend_fidelity(self.qubit_survival_fidelities)

extend_fidelity

extend_fidelity(fidelities: list[FidelityRange])

Extend a list of fidelities so its length matches the number of qubits

Source code in .venv/lib/python3.12/site-packages/bloqade/analysis/fidelity/analysis.py
66
67
68
69
70
def extend_fidelity(self, fidelities: list[FidelityRange]):
    """Extend a list of fidelities so its length matches the number of qubits"""

    n = self.qubit_count
    fidelities.extend([FidelityRange(1.0, 1.0) for _ in range(n - len(fidelities))])

reset_fidelities

reset_fidelities()

Reset fidelities to unity for all qubits

Source code in .venv/lib/python3.12/site-packages/bloqade/analysis/fidelity/analysis.py
72
73
74
75
76
77
78
79
80
def reset_fidelities(self):
    """Reset fidelities to unity for all qubits"""

    self.gate_fidelities = [
        FidelityRange(1.0, 1.0) for _ in range(self.qubit_count)
    ]
    self.qubit_survival_fidelities = [
        FidelityRange(1.0, 1.0) for _ in range(self.qubit_count)
    ]

update_branched_fidelities

update_branched_fidelities(
    fidelities: list[FidelityRange],
    current_fidelities: list[FidelityRange],
    then_fidelities: list[FidelityRange],
    else_fidelities: list[FidelityRange],
)

Update fidelity (min, max) values after evaluating differing branches such as IfElse

Source code in .venv/lib/python3.12/site-packages/bloqade/analysis/fidelity/analysis.py
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
def update_branched_fidelities(
    self,
    fidelities: list[FidelityRange],
    current_fidelities: list[FidelityRange],
    then_fidelities: list[FidelityRange],
    else_fidelities: list[FidelityRange],
):
    """Update fidelity (min, max) values after evaluating differing branches such as IfElse"""
    # NOTE: make sure they are all of the same length
    map(
        self.extend_fidelity,
        (fidelities, current_fidelities, then_fidelities, else_fidelities),
    )

    # NOTE: now we update min / max accordingly
    for fid, current_fid, then_fid, else_fid in zip(
        fidelities, current_fidelities, then_fidelities, else_fidelities
    ):
        fid.min = current_fid.min * min(then_fid.min, else_fid.min)
        fid.max = current_fid.max * max(then_fid.max, else_fid.max)

update_fidelities staticmethod

update_fidelities(
    fidelities: list[FidelityRange],
    fidelity: float,
    addresses: AddressReg,
)

short-hand to update both (min, max) values

Source code in .venv/lib/python3.12/site-packages/bloqade/analysis/fidelity/analysis.py
82
83
84
85
86
87
88
89
90
@staticmethod
def update_fidelities(
    fidelities: list[FidelityRange], fidelity: float, addresses: AddressReg
):
    """short-hand to update both (min, max) values"""

    for idx in addresses.data:
        fidelities[idx].min *= fidelity
        fidelities[idx].max *= fidelity

FidelityRange dataclass

FidelityRange(min: float, max: float)

Range of fidelity for a qubit as pair of (min, max) values