メインコンテンツへスキップ
このプロジェクトはベータ版です。バグを見つけましたか?GitHub Issueを開く。質問やアイデアがありますか?Discussionsで質問する — フィードバックをお待ちしています!
このページの翻訳品質はいかがですか?

クイックスタート


title: クイックスタート description: Shaded lightcones Qiskitアドオン (qiskit-addon-slc) のクイックスタートガイド​

このガイドでは、qiskit-addon-slcパッケージの最小限の動作例を示します。シェーデッド・ライトコーンを計算して、確率的エラーキャンセレーション(PEC)のサンプリングコストを削減します。

PECは、逆ノイズチャネルの準確率分解からサンプリングすることで、ゲートノイズを緩和します。そのサンプリングコストは、緩和しなければならないエラー項が増えるごとに増加しますが、すべてのエラーがオブザーバブルに等しく影響するわけではありません。オブザーバブルの因果的ライトコーンの外側にあるエラーは、測定される期待値に影響を与えることができず、ライトコーンの内側であっても、他よりも有害なエラーがあります。シェーデッド・ライトコーンは、各パウリエラー項がオブザーバブルに与える影響を上界で評価することで、これを定量化します。影響が最も小さいエラー項を切り捨てると、PECが緩和しなければならないノイズモデルが縮小し、小さく抑えられたバイアスと引き換えにサンプリングコストが削減されます。

現実的なワークフローを構築して量子ハードウェアで実行する方法については、IBM Quantum Platformのシェーデッド・ライトコーンを用いた確率的エラーキャンセレーションチュートリアルをご覧ください。

1. SLCの入力を準備する​

まず、10量子ビットのトロッター化された横磁場イジング回路を構築し、中央の量子ビットに対する単一量子ビットZZオブザーバブルを選択します。

# 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

Output of the previous code cell

SLCは、回路のノイズのある2量子ビットゲートのレイヤーに対して動作します。ここではsamplomaticを使ってゲートを注釈付きボックスにグループ化し、各2量子ビットレイヤーにノイズ注入アノテーションを付加します。SLCでは、すべてのノイズのあるボックスが一意のmodifier_refを持つ必要があり、これはinject_noise_strategy="individual_modification"によって提供されます。samplomaticのデフォルトの戦略では、上界が誤った値になるか、その計算が終了しません。続いて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", # 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. シェーデッド・ライトコーンを計算する​

シェーデッド・ライトコーンは、ノイズモデルの各パウリエラー項に、それがオブザーバブルの期待値に与える影響の大きさに基づくスケールを割り当てることで構築されます。これらのスケールは、各エラー項の順方向と逆方向のエラー上界(後述)およびエラー率から導出されます。

  • 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
)
Optimal spacetime partitioning not implemented!Just partitioning list of noisy boxes.

以下のシェーデッド・ライトコーンの可視化では、各ボックスが、そのサイトのエラーがオブザーバブルにどれだけ強く影響しうるかに応じて色付けされています。明るいボックスは最大の上界を持ち、背景に溶け込むボックスには、計算にほとんど影響しないエラー項が含まれています。これらのエラーは、ノイズモデルから除外する自然な候補です。以下の可視化の値は、そのサイトのすべてのパウリエラーの上界の合計を表しているため、単一のパウリエラーの上界である2.0より大きくなる値もあります。

from qiskit_addon_slc.visualization import draw_shaded_lightcone

draw_shaded_lightcone(
boxed_circuit, merged_bounds, noise_model_paulis, fold=-1, scale=0.5
)

Output of the previous code cell

3. サンプリングコストを削減する​

compute_local_scalesは、シェーデッド・ライトコーンを具体的なPEC設定に変換します。オブザーバブルへの上界で評価した影響に基づいてエラー項に優先順位を付け、要求されたbias_toleranceに達するまで、影響の最も小さい項を切り捨てます。各エラー項のスケールを返します。緩和中に無視する項には0.0、緩和すべき項には-1.0です。この関数は、結果として得られるサンプリングコストのオーバーヘッド(γ2\gamma^2)と、切り捨てによって生じる残留バイアスの上界も返します。

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: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