トランスパイラースケジューリングパス
qiskit_ibm_runtime.transpiler.passes.scheduling
高度な「ダイナミックサーキット」機能をサポートする IBM Quantum の次世代バックエンドと連携するためのスケジューリングパスのコレクション。 つまり...、 測定結果に基づく古典的な制御フロー/フィードバックをサポートする回路。 ダイナミック回路の詳細については、 クラシック・フィードフォワードとコントロール・フロー ・ガイドをご覧ください。
これらのスケジューリングパスをQiskitの組み込みスケジューリングパスと混ぜてはいけません。ダイナミック回路のスケジューリングルーチンと悪影響を及ぼします。 これには、 scheduling_method の設定も含まれる。 transpile() または generate_preset_pass_manager()。
クラス
BlockBasePadder | パディング・パスの基本クラス。 |
ALAPScheduleAnalysis | 動的回路のas-late-as-possible(ALAP)スケジューリング解析パス。 |
ASAPScheduleAnalysis | 動的回路のASAP(as-soon-as-possible)スケジューリング分析パス。 |
DynamicCircuitInstructionDurations | 動的な回路命令の持続時間。 |
PadDelay | Delay命令によるアイドル時間の水増し。 |
PadDynamicalDecoupling | IBM 動的回路バックエンドのための動的デカップリング挿入パス。 |
使用例
以下では、動的回路バックエンドの実行モデルに対して、遅延を伴うテレポーテーション回路をスケジューリングし、パッド化する方法を示す:
from qiskit.circuit import ClassicalRegister, QuantumCircuit, QuantumRegister
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.transpiler.passmanager import PassManager
from qiskit_ibm_runtime.transpiler.passes.scheduling import ALAPScheduleAnalysis
from qiskit_ibm_runtime.transpiler.passes.scheduling import PadDelay
from qiskit_ibm_runtime.fake_provider import FakeJakartaV2
backend = FakeJakartaV2()
# Use this duration class to get appropriate durations for dynamic
# circuit backend scheduling
# Generate the main Qiskit transpile passes.
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
# Configure the as-late-as-possible scheduling pass
pm.scheduling = PassManager([
ALAPScheduleAnalysis(target=backend.target),
PadDelay(target=backend.target)]
)
qr = QuantumRegister(3)
crz = ClassicalRegister(1, name="crz")
crx = ClassicalRegister(1, name="crx")
result = ClassicalRegister(1, name="result")
teleport = QuantumCircuit(qr, crz, crx, result, name="Teleport")
teleport.h(qr[1])
teleport.cx(qr[1], qr[2])
teleport.cx(qr[0], qr[1])
teleport.h(qr[0])
teleport.measure(qr[0], crz)
teleport.measure(qr[1], crx)
with teleport.if_test((crz, 1)):
teleport.z(qr[2])
with teleport.if_test((crx, 1)):
teleport.x(qr[2])
teleport.measure(qr[2], result)
# Transpile.
scheduled_teleport = pm.run(teleport)
scheduled_teleport.draw(output="mpl", style="iqp")
遅延で埋め合わせる代わりに、以下に示すように pass PadDynamicalDecoupling を使用して動的なデカップリングシーケンスを挿入することもできます:
from qiskit.circuit.library import XGate
from qiskit_ibm_runtime.transpiler.passes.scheduling import PadDynamicalDecoupling
dd_sequence = [XGate(), XGate()]
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
pm.scheduling = PassManager(
[
ALAPScheduleAnalysis(target=backend.target),
PadDynamicalDecoupling(target=backend.target, dd_sequences=dd_sequence),
]
)
dd_teleport = pm.run(teleport)
dd_teleport.draw(output="mpl", style="iqp")
Qiskitで回路をコンパイルする場合、1回のトランスパイルですべての変換を行う方が効率的で、よりロバストです。 これはQiskitのプリセットパスマネージャーを拡張することで実現しました。 例えば、Qiskitの transpile() 関数は内部的に generate_preset_pass_manager() を使ってパスセットを構築します。 のインスタンスを返す。 StagedPassManagerのインスタンスを返す。