Skip to main content
IBM Quantum Platform

Commuting2qGateRouter

class qiskit.transpiler.passes.Commuting2qGateRouter(*args, **kwargs)

GitHub

ベース: TransformationPass

1つ以上の通勤ゲートをカップリング・マップに入れ替えるクラス。

このパスは、 Commuting2qBlock 命令としてカプセル化された2量子ビットゲートのブロックをルーティングする。 このパスは他の指示には適用されない。 カップリング・マップへのマッピングはスワップ・ストラテジーを使って行われる。 SwapStrategy を参照。 スワップ戦略は、問題とカップリング・マップに合ったものでなければならない。 このトランスパイラ・パスは、量子回路がアイドル状態のアンシラ量子ビットで拡張される前に実行されるのが理想的である。 そうでなければ、チップの使いたい部分以外の量子ビットを交換することになるかもしれない。 したがって、スワップ戦略とそれに関連するカップリング・マップは物理的な量子ビットを表すものではない。 その代わりに、初期レイアウトが適用された後の物理量子ビットに対応する中間マッピングを表している。 以下の例では、4量子ビットを5量子ビットのデバイスの0、1、3、4量子ビットにマッピングする方法を示しています。 PauliEvolutionGate を5量子ビット・デバイスの0, 1, 3, 4量子ビットにマッピングする方法を示しています

0 -- 1 -- 2
     |
     3
     |
     4

これを行うために、仮想量子ビット0、1、2、3を用いて定義された量子ビット0、1、3、4に対して、行交換戦略を用いる。

from qiskit import QuantumCircuit
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import Layout, CouplingMap, PassManager
from qiskit.transpiler.passes import FullAncillaAllocation
from qiskit.transpiler.passes import EnlargeWithAncilla
from qiskit.transpiler.passes import ApplyLayout
from qiskit.transpiler.passes import SetLayout

from qiskit.transpiler.passes.routing.commuting_2q_gate_routing import (
    SwapStrategy,
    FindCommutingPauliEvolutions,
    Commuting2qGateRouter,
)

# Define the circuit on virtual qubits
op = SparsePauliOp.from_list([("IZZI", 1), ("ZIIZ", 2), ("ZIZI", 3)])
circ = QuantumCircuit(4)
circ.append(PauliEvolutionGate(op, 1), range(4))

# Define the swap strategy on qubits before the initial_layout is applied.
swap_strat = SwapStrategy.from_line([0, 1, 2, 3])

# Choose qubits 0, 1, 3, and 4 from the backend coupling map shown above.
backend_cmap = CouplingMap(couplinglist=[(0, 1), (1, 2), (1, 3), (3, 4)])
initial_layout = Layout.from_intlist([0, 1, 3, 4], *circ.qregs)

pm_pre = PassManager(
    [
        FindCommutingPauliEvolutions(),
        Commuting2qGateRouter(swap_strat),
        SetLayout(initial_layout),
        FullAncillaAllocation(backend_cmap),
        EnlargeWithAncilla(),
        ApplyLayout(),
    ]
)

# Insert swap gates, map to initial_layout and finally enlarge with ancilla.
pm_pre.run(circ).draw("mpl")

このパス・マネージャーは、スワップ・ゲートが適用される際の量子ビットのレイアウトに対応する current_layout 。 パスはダグ内のすべてのノードを横断する。 もしノードがスワップ戦略を使ってルーティングされるべきなら、そのノードはスワップ・レイヤーを挟んだサブ・インストラクションに分解され、 current_layout 。 スワップ戦略を使ってルーティングされるべきでないノードは、 current_layout を考慮してダグに追加される。

パラメーター

  • swap_strategy - 命令をハードウェアにマップするために使用されるスワップ・レイヤとその適用順序を保持する SwapStrategy のインスタンス。 このフィールドが与えられていない場合は、パスのプロパティセットに含まれていなければならない。 これにより、他のパスが実行時に最も適切なスワップ戦略を決定することができる。
  • edge_coloring - 結合マップのエッジの色付け(オプション) ( I.e. ノードを共有する2つのエッジが同じ色を持つことはない)。 エッジカラーリングが与えられている場合、現在の量子ビットの並べ替えが与えられたときに同時に適用可能なコミューティングゲートは、エッジカラーリングに従ってグループ化され、このエッジカラーリングに従って適用される。 ここで、色とは、同時に適用できる通勤ゲートのグループを定義し、アクセスするためのインデックスとして使用されるintである。 エッジの色付けが与えられない場合は、貪欲なアルゴリズムを使って集合を構築する。 エッジ・カラーリングは、 RZZGateのようなゲートをスワップ・ゲートの隣に配置し、CXのキャンセルを利用するのに役立つ。

属性

is_analysis_pass

パスが分析パスかどうかをチェックする。

パスが AnalysisPass,、パスがDAGを分析し、その分析結果をプロパティセットに書き込むことができることを意味する。 この種のパスでは、DAGの変更は許されない。

is_transformation_pass

パスが変形パスかどうかをチェックする。

パスが TransformationPass, の場合、そのパスはDAGを操作することはできるが、プロパティセットを変更することはできない(ただし、読み取ることはできる)ことを意味する。


方法

execute

execute(passmanager_ir, state, callback=None)

GitHub

入力Qiskit IRに対して最適化タスクを実行する。

パラメーター

  • passmanager_ir (Any) – Qiskit IRを最適化する。
  • state (PassManagerState) – パスマネージャー自身によるワークフロー実行に関連する状態。
  • callback (Callable | None) – 最適化タスクの実行ごとに呼び出されるコールバック関数。

戻り値

Qiskit IRとワークフローの状態を最適化。

戻りの型

タプル [ Any, PassManagerState ]

name

name()

GitHub

パスの名前

戻りの型

str

run

run(dag)

GitHub

適用するノードを分解してパスを実行する。

パラメーター

dag (DAGCircuit) – スワップを追加するダグ。

戻り値

意図したゲートタイプにスワップが追加されたダグ。

レイズ

  • TranspilerError - 開始時にスワップ戦略が与えられておらず、プロパティセットにスワップ戦略がない場合。
  • TranspilerError - 量子回路が複数の量子ビットレジスタを含む場合。
  • TranspilerError - 量子レジスタに含まれない量子ビットがある場合。

戻りの型

DAGサーキット

swap_decompose

swap_decompose(dag, node, current_layout, swap_strategy)

GitHub

Commuting2qBlock 、それをカップリング・マップにマッピングする。

マッピングはスワップ戦略で行われる。

パラメーター

  • dag (DAGCircuit) – Commuting2qBlock を含むダグを私たちはルーティングする。
  • node (DAGOpNode) – 操作が Commuting2qBlock であるノード。
  • current_layout (Layout) – スワップ適用前のレイアウト。 この関数は、後続のゲートがダグ上で適切に構成されるようにレイアウトを修正する。
  • swap_strategy (SwapStrategy) – ノードの分解に使われるスワップ戦略。

戻り値

Commuting2qBlock のゲートをハードウェアにマッピングするためにスワップゲートが追加されたカップリングマップと互換性のあるダグ。

戻りの型

DAGサーキット

update_status

update_status(state, run_state)

GitHub

ワークフローのステータスを更新する。

パラメーター

  • state (PassManagerState) – 更新するマネージャーの状態を渡す。
  • run_state (RunState) – 現在のタスクの完了状況。

戻り値

パスマネージャーの状態を更新。

戻りの型

PassManagerState

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。