PadDynamicalDecoupling
class PadDynamicalDecoupling(*args, **kwargs)
ベース: BlockBasePadder
IBM 動的回路バックエンドのための動的デカップリング挿入パス。
このパスは、予定された物理的な回路で機能する。 回路をスキャンしてアイドル時間(つまり遅延命令を含む時間)を探し、その場所にゲートのDDシーケンスを挿入する。 これらのゲートはアイデンティティに相当するため、回路の論理的な動作を変えることはないが、アイドル期間中のデコヒーレンスを緩和する効果がある。 特別なケースとして、パスは length-1 シーケンス(例えば [XGate()] )を許可する。この場合、DDの挿入は、ゲート・インバースが回路内の隣のゲートに吸収できる場合にのみ起こります(したがって、Delayをアイデンティティと等価なものに置き換えることになります)。 これは例えば、ハーン・エコーとして使うことができる。 このパスにより、挿入されたシーケンスが回路を正確に保持することが保証される(グローバル位相を含む)。
import numpy as np
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import XGate
from qiskit.transpiler import PassManager, InstructionDurations
from qiskit.visualization import timeline_drawer
from qiskit_ibm_runtime.transpiler.passes.scheduling import ALAPScheduleAnalysis
from qiskit_ibm_runtime.transpiler.passes.scheduling import PadDynamicalDecoupling
circ = QuantumCircuit(4)
circ.h(0)
circ.cx(0, 1)
circ.cx(1, 2)
circ.cx(2, 3)
circ.measure_all()
durations = InstructionDurations(
[("h", 0, 50), ("cx", [0, 1], 700), ("reset", None, 10),
("cx", [1, 2], 200), ("cx", [2, 3], 300),
("x", None, 50), ("measure", None, 1000)]
)
# balanced X-X sequence on all qubits
dd_sequence = [XGate(), XGate()]
pm = PassManager([ALAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence)])
circ_dd = pm.run(circ)
circ_dd.draw('mpl', style="iqp")
# Uhrig sequence on qubit 0
n = 8
dd_sequence = [XGate()] * n
def uhrig_pulse_location(k):
return np.sin(np.pi * (k + 1) / (2 * n + 2)) ** 2
spacings = []
for k in range(n):
spacings.append(uhrig_pulse_location(k) - sum(spacings))
spacings.append(1 - sum(spacings))
pm = PassManager(
[
ALAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence, qubits=[0], spacings=spacings),
]
)
circ_dd = pm.run(circ)
circ_dd.draw('mpl', style="iqp")
動的デカップリングを実行する前に ALAPScheduleAnalysis を呼び出す必要があります。これは、回路が動的回路バックエンドのアクイジション・アラインメント制約を満たすことを保証するためです。
パラメーター
-
durations - スケジューリングに使用される命令の持続時間。
-
dd_sequences - アイドル・スポットで適用するゲートのシーケンス。 あるいは、十分な遅延時間がある場合に優先的に挿入されるゲートシーケンスのリストを供給することもできる。 これは、オプションで提供される
sequence_min_length_ratiosによって調整することができる。 -
qubits - DDを適用する物理量子ビット。 Noneの場合、すべての量子ビットがDDを受ける(可能な場合)。
-
spacings - DDゲート間のスペーシングのリストのリスト。 利用可能なスラックはこれに従って分割される。 リストの長さはdd_sequenceの長さより1つ多く、要素の和は1でなければならない。 None の場合は、バランスの取れた間隔 [d/2、d、d、…、d、d、 d/2 が]使用されます。 この間隔は、
coupling_mapが指定されている場合、最初のサブサーキットにのみ適用される -
skip_reset_qubits - Trueの場合、初期化/リセットされた量子ビットの直後のアイド ル期間にDDを挿入しない(基底状態の量子ビットはデコヒーレンスに影響され にくいため)。
-
pulse_alignment - ゲートタイミング割り当てのハードウェア制約。 これは通常、
backend.configuration().timing_constraintsから提供される。 提供された場合、遅延の長さ、すなわちspacing、 はこの制約を満たすように暗黙のうちに調整される。 -
extra_slack
DDシーケンス生成の動作を制御するオプション。 DDシーケンスの継続時間は、スケジュールされた量子回路のアイドル時間と同一であるべきであるが、シーケンスを構成するゲート間の遅延はdt単位の整数であるべきであり、
pulse_alignmentが指定された場合には、さらに切り捨てられる可能性がある。 この結果、作成されたシーケンスの持続時間が、シーケンスで埋めたいアイドル時間よりも短くなることがある。 このオプションは以下の値をとる。-
"middle":余分なスラックをシーケンスの真ん中のインターバルに置く。
-
「端」:余分なたるみをできるだけ均等に分けて
シーケンスの最初と最後の間隔。
-
-
sequence_min_length_ratios - DDシーケンスを挿入するために満たすべき最小遅延長対DDシーケンス比のリスト。 例えば、X-X動的デカップリングシーケンスが 320dt サンプル長で、利用可能な遅延が 384dt である場合、その比率は 384dt/320dt=1.2 となる。 ダイナミック・デカップリングの観点からは、これはエラー・レートの低減をデカップリングするよりも、制御ノイズを増やす可能性が高い。 デフォルト値は 2.0 です。
-
insert_multiple_cycles - 利用可能な持続時間が 2*sequence_min_length_ratio*duration(dd_sequence を超える場合、その遅延時間内に動的デ カップリング・シーケンスを複数ラウンド挿入できるようにする。
-
coupling_map - デバイスのカップリングマップを表す有向グラフ。 カップリング・マップを指定することで、デバイスをサブ回路に分割し、それぞれに異なるパルス間隔のDDシーケンスを適用することができる。 現在2つのサブサーキットをサポート。
-
alt_spacings - カップリング・マップによって決定される2番目のサブサーキットの DDゲート間のスペーシングのリストのリスト。 Noneの場合、最初のサブサーキットに対してずらされたバランスのとれた間隔が使用される [d, d, d,..., d, d, 0].
-
schedule_idle_qubits - アイドル量子ビットに遅延を挿入したい場合、trueに設定する。 これはタイムラインの視覚化には便利だが、大規模なバックエンドでの実行には問題があるかもしれない。
-
ddd_barrier - ラベルに指定された文字列が含まれるバリアで終了する遅延にのみDDを適用する
-
block_ordering_callable - 必要なブロック数を最小化するノードの順序付けを生成するた めに使用される callable。 提供されない場合は、
block_order_op_nodes()。 -
target – バックエンドのコンパイル対象。
レイズ
- TranspilerError - 無効な DD シーケンスが指定された場合。
- TranspilerError - アライメント制約値の倍数でない持続時間を持つパルスゲートが見つかったとき。
- TranspilerError - カップリング・マップがサポートされていない場合(つまり次数が3以上の場合)
属性
is_analysis_pass
パスが分析パスかどうかをチェックする。
パスが AnalysisPass,、パスがDAGを分析し、その分析結果をプロパティセットに書き込むことができることを意味する。 この種のパスでは、DAGの変更は許されない。
is_transformation_pass
パスが変形パスかどうかをチェックする。
パスが TransformationPass, の場合、そのパスはDAGを操作することはできるが、プロパティセットを変更することはできない(ただし、読み取ることはできる)ことを意味する。
方法
__call__
__call__(circuit, property_set=None)
パスオン回路を作動させる。
パラメーター
- circuit (QuantumCircuit) – 峠を越える日。
- property_set (PropertySet | dict | None) – 入力/出力プロパティセット 解析パスはプロパティセットをインプレース変更する可能性がある。 指定されない場合、パスの既存の
property_set属性(設定されている場合)が使用されます。
戻り値
変換が成功した場合、結果として QuantumCircuit が生成されます。 解析に合格した場合、入力回路へ。
戻りの型
execute
execute(passmanager_ir, state, callback=None)
入力Qiskit IRに対して最適化タスクを実行する。
パラメーター
- passmanager_ir (DAGCircuit) – 最適化対象のQiskit IR。
- state (DAGCircuit) – パスマネージャー自身によるワークフローの実行に関連する状態。
- callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – 最適化タスクの実行ごとに呼び出されるコールバック関数。
戻り値
Qiskit IRとワークフローの状態を最適化。
戻りの型
タプル[ DAGCircuit、 PassManagerState ]
name
name()
パスの名前
戻りの型
str
run
run(dag)
dag でパディングパスを実行する。
パラメーター
dag (DAGCircuit) – チェックするDAG。
戻り値
アイドリングタイムが命令で埋め尽くされたDAG。
レイズ
TranspilerError - 特定のノードがスケジュールされていない場合、おそらくこのノードが呼び出される前に何らかのトランスフォームパスが挿入される。
戻りの型
update_status
update_status(state, run_state)
ワークフローのステータスを更新する。
パラメーター
- state (PassManagerState) – 更新するマネージャーの状態を渡す。
- run_state (RunState) – 現在のタスクの完了状況。
戻り値
パスマネージャーの状態を更新。
戻りの型