title: "Inicio rápido" description: "Guía de inicio rápido para el complemento «Shaded lightcones» de Qiskit (qiskit-addon-slc)"
Inicio rápido
Esta guía muestra un ejemplo mínimo y funcional del paquete qiskit-addon-slc . Calculamos un cono de luz sombreado para reducir el coste de muestreo de la cancelación probabilística de errores (PEC).
El PEC mitiga el ruido de puerta mediante el muestreo a partir de una descomposición en cuasiprobabilidades del canal de ruido inverso. Su coste de muestreo aumenta con cada término de error que debe mitigar; sin embargo, no todos los errores afectan por igual a la variable observable. Un error situado fuera del cono de luz causal del observable no puede influir en absoluto en el valor esperado medido, e incluso dentro del cono de luz hay errores que son más perjudiciales que otros. Un cono de luz sombreado cuantifica esto al delimitar el efecto que cada término de error de Pauli tiene sobre la observable. Al truncar los términos de error con menor efecto, se reduce el modelo de ruido que el PEC debe mitigar, lo que disminuye el coste de muestreo a cambio de un sesgo pequeño y acotado.
Para ver cómo crear un flujo de trabajo realista y ejecutarlo en hardware cuántico, consulta el tutorial «Cancelación probabilística de errores con conos de luz sombreados» en IBM Quantum Platform.
1. Preparar los datos de entrada para SLC
Aquí construimos un circuito de Ising de campo transversal «trotterizado» de 6 qubits y elegimos un observable de « » de un solo qubit para el qubit central.
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 = 6
circuit = trotter_ising_circuit(
num_qubits, num_steps=2, rx_angle=np.pi / 16, rzz_angle=-np.pi / 2
)
# 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)Output:
Observable: IIZIII
SLC opera en las capas ruidosas de puertas de dos qubits del circuito. Aquí utilizamos samplomatic para agrupar las puertas en recuadros anotados y adjuntamos una anotación de inyección de ruido a cada capa de dos qubits. generate_noise_model_paulis A continuación, enumera los términos de error de Pauli de cada una de las capas con ruido.
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",
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}")Output:
Noisy layers: 2
Pauli error terms across all layers: 102
2. Calcular el cono de luz sombreado
El cono de luz sombreado se construye asignando una escala a cada término de error de Pauli del modelo de ruido, en función del efecto que este tenga sobre el valor esperado de la observable. Estas escalas se derivan de los límites de error hacia adelante y hacia atrás de cada término de error (que se describen a continuación), así como de su tasa de error:
compute_forward_boundsprogresa cada término de error hacia el final del circuito para limitar su efecto sobre la magnitud observable medida en ese punto.compute_backward_boundsevoluciona cada término de error hacia atrás hasta el inicio del circuito para limitar su efecto sobre el estado inicial.
merge_bounds combina ambos en un único término de error. La fusión de escalas, cada una de ellas limitada por la tasa de error del término. Estas tasas suelen proceder de un experimento de aprendizaje con ruido (p. ej., NoiseLearnerV3); En este caso, utilizamos tasas aleatorias para simplificar.
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
)En la visualización del cono de luz sombreado que se muestra a continuación, cada recuadro está sombreado en función de la intensidad con la que los errores en ese punto pueden afectar a la magnitud observable: los recuadros más brillantes corresponden a los límites más amplios, mientras que los recuadros que se desvanecen hacia el fondo contienen términos de error que tienen un efecto mínimo en el cálculo; estos errores son candidatos naturales para ser eliminados del modelo de ruido. Los valores que aparecen en la visualización siguiente representan la suma de los límites de error de todos los errores de Pauli en ese punto, razón por la cual algunos de los valores superan —el límite correspondiente a cualquier error de Pauli individual— 2.0 .
from qiskit_addon_slc.visualization import draw_shaded_lightcone
draw_shaded_lightcone(boxed_circuit, merged_bounds, noise_model_paulis)Output:
3. Reducir el coste del muestreo
compute_local_scales convierte el cono de luz sombreado en una configuración PEC concreta. Prioriza los términos de error en función de su efecto acotado sobre la variable observable y elimina los que tienen menor impacto hasta bias_tolerance alcanzar el valor solicitado. Devuelve escalas para cada término de error: 0.0 para los términos que deben ignorarse durante la mitigación y -1.0 para los términos que deben mitigarse. La función también devuelve la sobrecarga del coste de muestreo resultante ( ) y un límite del sesgo residual provocado por el truncamiento.
Este ajuste mitiga bias_tolerance=0.0 todos los términos de error dentro del cono de luz causal de la magnitud observable y proporciona un coste de muestreo de referencia. Al permitir un pequeño sesgo, SLC puede descartar los términos de bajo impacto y reducir aún más ese coste.
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:.3f}, residual bias {full_bias:.3f}"
)
print(
f"Shaded (bias_tolerance=0.05): sampling cost {reduced_cost:.3f}, residual bias {reduced_bias:.3f}"
)
print(
f"\nSampling-cost reduction: {(1 - reduced_cost / full_cost):.0%} for <= 0.05 bias"
)Output:
Full PEC (bias_tolerance=0.0): sampling cost 1.923, residual bias 0.000
Shaded (bias_tolerance=0.05): sampling cost 1.441, residual bias 0.044
Sampling-cost reduction: 25% for <= 0.05 bias