title: "クイック・スタート" description: "Shaded Lightcones Qiskit アドオン(qiskit-addon-slc)のクイックスタートガイド"
クイック・スタート
このガイドでは、この qiskit-addon-slc パッケージの最小限の動作例を紹介します。 確率的誤差相殺(PEC)のサンプリングコストを低減するため、陰影付きの光錐を計算する。
PECは、逆ノイズチャネルの準確率分解からサンプリングを行うことで、ゲートノイズを低減する。 そのサンプリングコストは、軽減しなければならない誤差項が増えるごとに増加する。しかし、すべての誤差が観測量に等しく影響を与えるわけではない。 オブザーバブルの因果光錐の外側にある誤差は、測定された期待値にまったく影響を及ぼすことはなく、また、因果光錐の内側であっても、誤差によっては他のものよりも悪影響が大きいものがある。 陰影付きの光錐は、各パウリ誤差項が観測量に及ぼす影響を境界で囲むことで、これを定量的に表します。 影響が最も小さい誤差項を切り捨てることで、PECが軽減すべきノイズモデルが縮小され、わずかでかつ有限なバイアスを許容する代わりに、サンプリングコストが削減される。
現実的なワークフローを構築し、量子ハードウェア上で実行する方法については、 IBM Quantum Platform の「 シェーディングされたライトコーンを用いた確率的エラーキャンセル 」チュートリアルをご覧ください。
1. SLC用の入力データを準備する
ここでは、6量子ビットのトロッター化された横磁場イジング回路を構築し、中央の量子ビットに対して単一量子ビットの 観測量を選択する。
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は、回路内のノイズの多い2量子ビットゲート層上で動作する。 ここでは、ゲートをアノテーション付きボックスにグループ samplomatic 化し、各2量子ビット層にノイズ注入のアノテーションを付与する。 generate_noise_model_paulis その後、ノイズを含む各層について、パウリ誤差項を列挙する。
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. 網掛けされた光錐を計算する
陰影で示された光錐は、ノイズモデルにおける各パウリ誤差項が観測量の期待値に及ぼす影響の大きさに基づいて、各誤差項にスケールを割り当てることで構築される。 これらのスケールは、各誤差項の前方誤差限界および後方誤差限界(後述)に加え、その誤差率から導出される:
compute_forward_bounds各誤差項を回路の末端まで順方向に展開し、そこで測定される観測量に対するその影響を制限する。compute_backward_bounds各誤差項を回路の始点まで遡って展開し、初期状態への影響を制限する。
merge_bounds これら2つを組み合わせて、エラー項ごとに1つのバインドとする。 各項の誤差率に応じて、各スケールを統合する。 これらの率は通常、ノイズ学習実験(例: NoiseLearnerV3)から得られる; ここでは、簡便のため、ランダムなレートを用いる。
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
)以下の陰影付きライトコーンの可視化図において、各ボックスは、その地点での誤差が観測量に与える影響の大きさに応じて陰影が付けられています。明るいボックスは許容範囲が最も広いことを示し、背景に溶け込むように薄くなっているボックスは、計算にほとんど影響を与えない誤差項を含んでいます。これらの誤差は、ノイズモデルから除外する候補として自然です。 以下の可視化図に示されている値は、その地点におけるすべてのパウリ誤差の誤差範囲の合計を表しています。そのため、一部の値が――単一のパウリ誤差に対する上限値―― 2.0 よりも大きくなっているのです。
from qiskit_addon_slc.visualization import draw_shaded_lightcone
draw_shaded_lightcone(boxed_circuit, merged_bounds, noise_model_paulis)Output:
3. サンプリングコストを削減する
compute_local_scales 陰影のついた光錐を具体的なPEC構成に変換します。 この手法は、観測量に対する影響が有限である誤差項を優先順位付けし、要求された値 bias_tolerance に達するまで、影響が最も小さいものを順次切り捨てていきます。 各エラー項について、緩和措置の際に無視すべき項 0.0 と、緩和措置を講じるべき項の -1.0 重みをそれぞれ返します。 また、この関数は、結果として生じるサンプリングコストのオーバーヘッド( )と、切り捨てによって生じる残留バイアスの上限値も返します。
この設定により、観測量の因果光錐内のすべての誤差項が緩和 bias_tolerance=0.0 され、ベースラインとなるサンプリングコストが得られる。 わずかなバイアスを許容することで、SLCは影響の小さい項を省略し、そのコストをさらに削減できるようになります。
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