Skip to main content
IBM Quantum Platform

ゲートのノイズモデルについて学ぶ

このチュートリアルでは、高レベルプロトコル関数 および prepare_learning_program() を通じて利用可能な標準的な学習プロトコルを用いて、ユニタリゲートのノイズモデルを学習する方法を解説します process_learning_result()。

  1. ゲートを定義する
  2. ローカルシミュレーションの設定
  3. 量子プログラムを準備する
  4. 量子プログラムを実行する
  5. 結果を見る
実機での実行

以下の回路はローカルでシミュレーションされるため、この解説では 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_terms
144
このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。