Rychlý start
title: Rychlý start description: Průvodce rychlým startem pro addon Qiskit Shaded lightcones (qiskit-addon-slc)
Tento průvodce ukazuje minimální funkční příklad balíčku qiskit-addon-slc. Vypočítá stínovaný světelný kužel ke snížení vzorkovacích nákladů pravděpodobnostního rušení chyb (PEC).
PEC mitiguje šum hradel vzorkováním z kvazipravděpodobnostního rozkladu inverzního šumového kanálu. Jeho vzorkovací náklady rostou s každým chybovým členem, který musí mitigovat; ne každá chyba však ovlivňuje observable stejně. Chyba mimo kauzální světelný kužel observable nemůže ovlivnit měřenou střední hodnotu a i uvnitř kužele jsou některé chyby škodlivější než jiné. Stínovaný světelný kužel to kvantifikuje tím, že omezuje vliv každého Pauliho chybového členu na observable. Odříznutí chybových členů s nejmenším vlivem zmenší model šumu, který musí PEC mitigovat, a sníží vzorkovací náklady výměnou za malé, omezené vychýlení.
Jak sestavit realistický pracovní postup a spustit ho na kvantovém hardwaru, se dozvíš v tutoriálu Probabilistic error cancellation with shaded lightcones na IBM Quantum Platform.
1. Příprava vstupů pro SLC
Nejprve sestav 10qubitový trotterizovaný obvod Isingova modelu s příčným polem a zvol jednoqubitovou observable na prostředním qubitu.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_addon_slc": "qiskit-addon-slc", "samplomatic": "samplomatic"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import Pauli
def trotter_ising_circuit(num_qubits, num_steps, rx_angle, rzz_angle):
"""Trotterized transverse-field Ising evolution on a 1D chain."""
circuit = QuantumCircuit(num_qubits)
for _ in range(num_steps):
circuit.rx(rx_angle, range(num_qubits))
circuit.barrier()
for start in (0, 1): # even then odd bonds
for i in range(start, num_qubits - 1, 2):
circuit.rzz(rzz_angle, i, i + 1)
circuit.barrier()
return circuit
num_qubits = 10
circuit = trotter_ising_circuit(
num_qubits, num_steps=4, rx_angle=np.pi / 16, rzz_angle=-np.pi / 3
)
# Measure <Z> on the middle qubit
observable = Pauli("I" * num_qubits).compose("Z", [num_qubits // 2])
print(f"Observable: {observable}")
circuit.draw("mpl", fold=-1, scale=0.7)
Observable: IIIIZIIIII

SLC pracuje se zašuměnými vrstvami dvouqubitových hradel obvodu. Zde používáme samplomatic k seskupení hradel do anotovaných boxů a k připojení anotace vstřikování šumu ke každé dvouqubitové vrstvě. SLC vyžaduje, aby každý zašuměný box měl jedinečný modifier_ref, což zajišťuje inject_noise_strategy="individual_modification"; s výchozí strategií samplomatic jsou meze nesprávné nebo se jejich výpočet nikdy nedokončí. generate_noise_model_paulis pak vyjmenuje Pauliho chybové členy každé jedinečné zašuměné vrstvy.
from qiskit_addon_slc.utils import generate_noise_model_paulis
from samplomatic.transpiler import generate_boxing_pass_manager
from samplomatic.utils import find_unique_box_instructions
# Group gates into boxes and annotate each two-qubit layer with a noise-injection point
boxing_pass = generate_boxing_pass_manager(
inject_noise_targets="all",
inject_noise_strategy="individual_modification", # required: one modifier_ref per box
inject_noise_site="after",
twirling_strategy="active",
remove_barriers="never",
)
boxed_circuit = boxing_pass.run(circuit)
# Enumerate the 1- and 2-weight Pauli error terms of each unique noisy layer
noise_model_paulis = generate_noise_model_paulis(
find_unique_box_instructions(boxed_circuit)
)
num_terms = sum(len(paulis) for paulis in noise_model_paulis.values())
print(f"Noisy layers: {len(noise_model_paulis)}")
print(f"Pauli error terms across all layers: {num_terms}")
Noisy layers: 2
Pauli error terms across all layers: 198
2. Výpočet stínovaného světelného kužele
Stínovaný světelný kužel se sestaví přiřazením měřítka každému Pauliho chybovému členu v modelu šumu podle toho, jak moc ovlivňuje střední hodnotu observable. Tato měřítka se odvozují z dopředných a zpětných mezí chyb každého členu (popsaných níže) a z jeho chybovosti:
-
compute_forward_boundsvyvíjí každý chybový člen dopředu na konec obvodu, aby omezil jeho vliv na tam měřenou observable. -
compute_backward_boundsvyvíjí každý chybový člen zpětně na začátek obvodu, aby omezil jeho vliv na počáteční stav.
merge_bounds obě spojí do jediné meze na chybový člen. Každá mez je vynásobena chybovostí členu. Tyto chybovosti obvykle pocházejí z experimentu učení šumu (například NoiseLearnerV3); tento průvodce pro jednoduchost používá náhodné chybovosti.
from qiskit.quantum_info import PauliLindbladMap, QubitSparsePauliList
from qiskit_addon_slc.bounds import (
compute_backward_bounds,
compute_forward_bounds,
merge_bounds,
)
forward_bounds = compute_forward_bounds(
boxed_circuit, noise_model_paulis, observable
)
backward_bounds = compute_backward_bounds(boxed_circuit, noise_model_paulis)
# Stand-in for rates that would be measured by a noise-learning experiment on hardware
rng = np.random.default_rng(42)
noise_rates = {
layer_id: PauliLindbladMap.from_components(
rng.random(len(paulis)) * 5e-3,
QubitSparsePauliList.from_sparse_list(
paulis.to_sparse_list(), paulis.num_qubits
),
)
for layer_id, paulis in noise_model_paulis.items()
}
merged_bounds = merge_bounds(
boxed_circuit, forward_bounds, backward_bounds, noise_rates
)
Optimal spacetime partitioning not implemented!Just partitioning list of noisy boxes.
Ve vizualizaci stínovaného světelného kužele níže je každý box zbarven podle toho, jak silně mohou chyby na daném místě ovlivnit observable. Světlé boxy nesou největší meze, zatímco boxy, které splývají s pozadím, obsahují chybové členy s malým vlivem na výpočet -- tyto chyby jsou přirozenými kandidáty na vyřazení z modelu šumu. Hodnoty ve vizualizaci níže představují součty mezí chyb všech Pauliho chyb na daném místě, což je důvod, proč některé hodnoty přerůstají 2.0, tedy mez pro jedinou Pauliho chybu.
from qiskit_addon_slc.visualization import draw_shaded_lightcone
draw_shaded_lightcone(
boxed_circuit, merged_bounds, noise_model_paulis, fold=-1, scale=0.5
)

3. Snížení vzorkovacích nákladů
compute_local_scales promění stínovaný světelný kužel v konkrétní konfiguraci PEC. Seřadí chybové členy podle jejich omezeného vlivu na observable a odřezává ty nejméně významné, dokud se nedosáhne požadovaného bias_tolerance. Vrací měřítka pro každý chybový člen: 0.0 pro členy, které se mají při mitigaci ignorovat, a -1.0 pro členy, které se mají mitigovat. Funkce také vrací výslednou režii vzorkovacích nákladů () a mez zbytkového vychýlení způsobeného odříznutím.
Nastavení bias_tolerance=0.0 mitiguje každý chybový člen uvnitř kauzálního světelného kužele observable a dává základní vzorkovací náklady. Povolení malého vychýlení umožní SLC vypustit členy s malým vlivem a tyto náklady dále snížit.
from qiskit_addon_slc.bounds import compute_local_scales
_, full_cost, full_bias = compute_local_scales(
boxed_circuit, merged_bounds, noise_rates, bias_tolerance=0.0
)
local_scales, reduced_cost, reduced_bias = compute_local_scales(
boxed_circuit, merged_bounds, noise_rates, bias_tolerance=0.05
)
print(
f"Full PEC (bias_tolerance=0.0) : sampling cost {full_cost:6.3f}, residual bias {full_bias:5.3f}"
)
print(
f"Shaded (bias_tolerance=0.05): sampling cost {reduced_cost:6.3f}, residual bias {reduced_bias:5.3f}"
)
print(
f"\nSampling-cost reduction: {(1 - reduced_cost / full_cost):.0%} for <= 0.05 bias"
)
Full PEC (bias_tolerance=0.0) : sampling cost 21.206, residual bias 0.000
Shaded (bias_tolerance=0.05): sampling cost 5.403, residual bias 0.049
Sampling-cost reduction: 75% for <= 0.05 bias