動的デカップリングのためのパス管理機能を構築する
このページのコードは、以下の要件に基づいて開発された。 これらのバージョンまたは新しいバージョンの使用をお勧めします。
qiskit[all]~=2.5.1 qiskit-ibm-runtime~=0.47.0
このページでは PadDynamicalDecoupling パスを使用して、 ダイナミック・デカップリングと呼ばれるエラー抑制技術を回路に追加する方法を示します。
ダイナミック・デカップリングは、アイドル量子ビットにパルス・シーケンス( ダイナミック・デカップリング・シーケンスとして知られる)を加えてブロッホ球の周りを反転させることで機能する。 これらのパルスシーケンスは、核磁気共鳴で使用されるリフォーカスパルスに似ている。 詳細については、『 A Quantum Engineer's Guide to Superconducting Qubits 』を参照のこと。
PadDynamicalDecoupling パスはスケジュールされた回路上でのみ動作し、ターゲットの基底ゲートとは限らないゲートを含むため、以下のものが必要となる。 ALAPScheduleAnalysis パスと BasisTranslator パスも必要です。
から target 情報を取得し backend 、操作名をとして保存してください。 basis_gates これは、動的デカップリングで使用されるゲートのタイミング情報を追加するために、を修正する必要がある target ためです。
これらの例では の FakeSherbrooke``qiskit_ibm_runtime モックバックエンドを使用していますが、Qiskitと互換性のある実在のバックエンドや模擬バックエンドであれば、どれでも試すことができます。 実際の結果は異なる場合があります。
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
target = backend.target
basis_gates = list(target.operation_names)例として efficient_su2 。 まず、回路をバックエンドにトランスパイルする。動的デカップリングパルスは、回路がトランスパイルされスケジューリングされた後に追加する必要があるからだ。 ダイナミック・デカップリングは、量子回路にアイドル時間が多い場合、つまり、他の量子ビットがアクティブである間に使われていない量子ビットがある場合に、最もうまく機能することが多い。 この回路では、2量子ビット ecr ゲートが順次適用されるため、このようになる。
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.circuit.library import efficient_su2
qc = efficient_su2(12, entanglement="circular", reps=1)
pm = generate_preset_pass_manager(1, target=target, seed_transpiler=12345)
qc_t = pm.run(qc)
qc_t.draw("mpl", fold=-1, idle_wires=False)Output:
ダイナミカル・デカップリング・シーケンスとは、同一性を構成する一連のゲートのことで、時間的に一定の間隔をおいて配置されている。 例えば、4つのゲートからなる XY4 という単純なシーケンスを作ることから始めよう。
from qiskit.circuit.library import XGate, YGate
X = XGate()
Y = YGate()
dd_sequence = [X, Y, X, Y]動的デカップリングシーケンスの定期的なタイミングのため、は基底ゲートではないが、は XGate``target 基底ゲートであるため、に関する情報をに追加しなければならない YGate 。 我々は、 XGateがと同じ持続時間と誤差 YGate を持つことを事前に知っている。したがって、それらの特性をから取得 target し、オブジェクト YGate に追加すればよい。 これもまた、が別々に basis_gates 保存された理由である。なぜなら、はの実際の基底ゲートではない ibm_fezにもかかわらず、命令 YGate``target をに追加しているからである。
from qiskit.transpiler import InstructionProperties
y_gate_properties = {}
for qubit in range(target.num_qubits):
y_gate_properties.update(
{
(qubit,): InstructionProperties(
duration=target["x"][(qubit,)].duration,
error=target["x"][(qubit,)].error,
)
}
)
target.add_instruction(YGate(), y_gate_properties)efficient_su2 のようなアンサッツ回路はパラメータ化されているため、バックエンドに送信する前に値をバインドしておく必要がある。 ここで、ランダムなパラメーターを割り当てる。
import numpy as np
rng = np.random.default_rng(1234)
qc_t.assign_parameters(
rng.uniform(-np.pi, np.pi, qc_t.num_parameters), inplace=True
)次に、カスタムパスを実行する。 ALAPScheduleAnalysis と PadDynamicalDecoupling で PassManager をインスタンス化する。 ALAPScheduleAnalysis を最初に実行し、量子回路のタイミング情報を追加してから、規則的な間隔の動的デカップリングシーケンスを追加する。 これらのパスは .run() でサーキットを走る。
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes.scheduling import (
ALAPScheduleAnalysis,
PadDynamicalDecoupling,
)
dd_pm = PassManager(
[
ALAPScheduleAnalysis(target=target),
PadDynamicalDecoupling(target=target, dd_sequence=dd_sequence),
]
)
qc_dd = dd_pm.run(qc_t)可視化ツールを使用して回路のタイミングを確認し、回路内に等間隔に配置 YGate``XGate された timeline_drawer オブジェクトとオブジェクトのシーケンスが現れることを確認してください。
from qiskit.visualization import timeline_drawer
timeline_drawer(qc_dd, idle_wires=False, target=target)Output:
最後に、 YGate はバックエンドの実際のベースゲートではないので、 BasisTranslator パスを手動で適用する(これはデフォルトのパスだが、スケジューリングの前に実行されるので、再度適用する必要がある)。 セッション等価ライブラリーは、トランスパイラーが回路を基底ゲートに分解できるようにする回路等価のライブラリーであり、引数としても指定される。
from qiskit.circuit.equivalence_library import (
SessionEquivalenceLibrary as sel,
)
from qiskit.transpiler.passes import BasisTranslator
qc_dd = BasisTranslator(sel, basis_gates)(qc_dd)
qc_dd.draw("mpl", fold=-1, idle_wires=False)Output:
現在、回路から YGate オブジェクトは排除され、明示的なタイミング情報がゲート Delay という形で存在している。 この動的デカップリングを備えたトランスパイル回路は、バックエンドへ送信する準備が整いました。
次のステップ
- 独自のパスを書く代わりに
generate_preset_passmanager関数を使う方法を学ぶには、 Transpilation のデフォルト設定と構成オプションのトピックから始めてください。 - トランスパイラ設定の比較ガイドをお試しください。
- Transpile API ドキュメントを参照してください。