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

ダイナミカルデカップリング用のパスマネージャーを作成する

Package versions

このページのコードは、以下の要件を使用して開発されました。 これらのバージョン以上を使用することをお勧めします。

qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0

このページでは、PadDynamicalDecoupling パスを使用して、_ダイナミカルデカップリング_と呼ばれるエラー抑制手法をCircuitに追加する方法を説明します。

ダイナミカルデカップリングは、アイドル状態のQubitに対してパルス列(_ダイナミカルデカップリングシーケンス_と呼ばれる)を追加し、Bloch球上でQubitを反転させることで、ノイズチャネルの影響を打ち消し、デコヒーレンスを抑制する手法です。これらのパルス列は、核磁気共鳴で使用されるリフォーカシングパルスと類似しています。詳細については、A Quantum Engineer's Guide to Superconducting Qubits を参照してください。

PadDynamicalDecoupling パスはスケジュール済みのCircuitにのみ動作し、対象のバックエンドの基底Gateとは限らないGateを含むため、ALAPScheduleAnalysis および BasisTranslator パスも必要になります。

backend から target 情報を取得し、操作名を basis_gates として保存してください。ダイナミカルデカップリングで使用するGateにタイミング情報を追加するために target を変更する必要があるためです。

備考

これらの例では qiskit_ibm_runtime の FakeSherbrooke モックBackendを使用していますが、Qiskit互換の実際のBackendまたはフェイクBackendで試すこともできます。結果は異なる場合があります。

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_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")
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke

backend = FakeSherbrooke()

target = backend.target
basis_gates = list(target.operation_names)

例として efficient_su2 Circuitを作成します。まず、ダイナミカルデカップリングのパルスはCircuitがトランスパイルおよびスケジュールされた後に追加する必要があるため、BackendにCircuitをトランスパイルします。ダイナミカルデカップリングは、量子回路にアイドル時間が多い場合、つまり一部のQubitが動作している間に他のQubitが使用されていない場合に最も効果的であることが多いです。このCircuitでは、2QubitのGate ecr がこのansatzにおいて順次適用されるため、そのような状況になっています。

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 of the previous code cell

ダイナミカルデカップリングシーケンスとは、合成すると恒等演算になり、時間的に等間隔に配置されたGateの列です。例えば、4つのGateから構成されるXY4という単純なシーケンスを作成することから始めましょう。

from qiskit.circuit.library import XGate, YGate

X = XGate()
Y = YGate()

dd_sequence = [X, Y, X, Y]

ダイナミカルデカップリングシーケンスは等間隔のタイミングで配置されるため、YGateに関する情報はtargetに追加する必要があります。なぜなら、これは基底ゲートではないのに対し、XGateはそうであるからです。しかし、YGateはXGateと同じ持続時間とエラーを持つことが事前にわかっているため、これらのプロパティをtargetから取得し、YGateオブジェクトのために追加し直すことができます。これは、basis_gatesが別途保存されていた理由でもあります。なぜなら、YGate命令はibm_fezの実際の基底ゲートではないにもかかわらず、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 などのansatz Circuitはパラメータ化されているため、Backendに送信する前に値をバインドする必要があります。ここではランダムなパラメータを割り当てます。

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() でCircuit上で実行されます。

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)

可視化ツール timeline_drawer を使用してCircuitのタイミングを確認し、等間隔の XGate オブジェクトと YGate オブジェクトのシーケンスがCircuit内に現れていることを確認します。

from qiskit.visualization import timeline_drawer

timeline_drawer(qc_dd, idle_wires=False, target=target)

Output of the previous code cell

最後に、YGate はBackendの実際の基底Gateではないため、BasisTranslator パスを手動で適用します(これはデフォルトのパスですが、スケジューリングの前に実行されるため、再度適用する必要があります)。セッション等価ライブラリは、Transpilerが回路を基底Gateに分解できるようにする回路等価性ライブラリで、これも引数として指定します。

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 of the previous code cell

これで、YGate オブジェクトはCircuitから除かれ、Delay Gateの形式で明示的なタイミング情報が含まれています。ダイナミカルデカップリングが適用されたこのトランスパイル済みCircuitは、Backendに送信できる状態になりました。

次のステップ​

推奨事項