ゲートのノイズモデルについて学ぶ
このチュートリアルでは、高レベルプロトコル関数 および prepare_learning_program() を通じて利用可能な標準的な学習プロトコルを用いて、ユニタリゲートのノイズモデルを学習する方法を解説します process_learning_result()。
- ゲートを定義する
- ローカルシミュレーションの設定
- 量子プログラムを準備する
- 量子プログラムを実行する
- 結果を見る
以下の回路はローカルでシミュレーションされるため、この解説では IBM Quantum® の認証情報は必要ありません。 2つの変更により、これが実際のデバイスに対応するようになりました。それぞれの変更箇所には、該当する箇所に再度フラグが付けられています:
- 手順 1 : を実際のバックエンド
FakeMarrakeshに置き換えます。 - 手順 2 :この手順はスキップし、手順 4 で
Executorを通じて送信してください。
1. ゲートの定義
これからその動作について学ぶゲートは、6つの互いに交わらないゲート CZ からなる層を保持 BoxOp しており、2つのSamplomatic注釈が付いています。はパウリ・ツイリング用のボックス Twirl() を示し、はそれに名前 InjectNoise("cz_gate") を付けています。 この名前は、学習済みのノイズマップが報告される際のキーであり、また、このガイドではゲートをシミュレートしているため、ノイズが注入される際のキーでもあります。
from qiskit.circuit import QuantumCircuit
from qiskit_ibm_runtime.fake_provider import FakeMarrakesh
from samplomatic import InjectNoise, Twirl
backend = FakeMarrakesh()
cz_pairs = [(91, 92), (93, 94), (95, 99), (98, 111), (112, 113), (114, 115)]
circuit = QuantumCircuit(backend.num_qubits)
with circuit.box([Twirl(), InjectNoise("cz_gate")]):
for pair in cz_pairs:
circuit.cz(*pair)from qiskit_ibm_runtime import QiskitRuntimeService
backend = QiskitRuntimeService().backend("ibm_marrakesh")2. ローカルシミュレーションの設定
An は、ローカルの Aer シミュレータ上でプログラムを実行 AerExecutor し、Samplomatic が各ツイールゲートの周囲に配置した障壁にパウリ・リンドブラッドノイズを注入する。
各マップ内のパウリ指数は、ゲートごとに局所的であり、物理クビットの昇順で並んでいます:
cz_qubits = sorted({qubit for pair in cz_pairs for qubit in pair})
local = {qubit: index for index, qubit in enumerate(cz_qubits)}
local{91: 0,
92: 1,
93: 2,
94: 3,
95: 4,
98: 5,
99: 6,
111: 7,
112: 8,
113: 9,
114: 10,
115: 11}
ゲートには、各ペア CZ ごとに相関 ZZ 項と弱い項 XX が割り当てられ、さらにすべての箇所に単一クビット項 Z が追加される。また、準備と測定には、クビットごとにビット反転項が割り当てられる。
from qiskit.quantum_info import PauliLindbladMap
num_qubits = len(cz_qubits)
cz_noise = PauliLindbladMap.from_sparse_list(
[("ZZ", [local[a], local[b]], 8e-4) for a, b in cz_pairs]
+ [("XX", [local[a], local[b]], 4e-4) for a, b in cz_pairs]
+ [("Z", [index], 3e-4) for index in range(num_qubits)],
num_qubits=num_qubits,
)
spam_noise = PauliLindbladMap.from_sparse_list(
[("X", [index], 5e-3) for index in range(num_qubits)], num_qubits=num_qubits
)
noise_dict = {"cz_gate": cz_noise, "P": spam_noise, "M": spam_noise}スタビライザーメソッド AerExecutor を使用してインスタンス化します。 シミュレーションデータを再現可能にする root_seed よう設定してください。
from qiskit_aer import AerSimulator
from qiskit_noise_learning.aer_executor import AerExecutor
executor = AerExecutor(
AerSimulator(method="stabilizer"), noise_dict=noise_dict, root_seed=1234
)この手順は完全にスキップしてください。
3. 量子プログラムを準備する
を使用して、学習実験を含む量子プログラムを構築 prepare_learning_program() します。
from qiskit_noise_learning.protocols import prepare_learning_program
program = prepare_learning_program(
backend,
[circuit[0]],
fragment_depths=[2, 16, 64, 128],
num_randomizations=50,
shots_per_randomization=20,
)
print(f"Number of template circuits: {len(program.items)}")Number of template circuits: 5
4. 量子プログラムを実行する
選択したバックエンドに量子プログラムを送信してください。 ここでは、シミュレートされたエグゼキュータを使用しています。実機に対してシミュレーションを行うには、. を使用してください Executor。
result = executor.run(program).result()from qiskit_ibm_runtime import Executor
result = Executor(mode=backend).run(program).result()5. 結果を確認する
結果を で処理し process_learning_result()、 オブジェクト Fit を取得します。
from qiskit_noise_learning.protocols import process_learning_result
fit = process_learning_result(result)このフィット結果を用いて、クビットペアごとのフィデリティの減衰をプロットしてください。データと指数関数によるフィットの両方をプロットしてください。
fit.plot_qubit_pair_decays(
pairs=cz_pairs,
observable_type="means",
exponential_fit=True,
)アノテーション InjectNoise の名前をキーとして、学習済みのノイズを読み出します。
from qiskit_noise_learning.models import split_pauli_lindblad_model
pauli_lindblad_model = split_pauli_lindblad_model(fit.model).model
learned = pauli_lindblad_model.to_pauli_lindblad_maps(fit.model_data)["cz_gate"]
learned.num_terms144