Skip to main content
IBM Quantum Platform

パス・マネージャーを使用したトランスパイル

  • このページのコードは、以下の要件に基づいて開発された。 これらのバージョンまたは新しいバージョンの使用をお勧めします。

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

回路をトランスパイルする推奨の方法は、ステージド・パス・マネージャーを作成し、回路を入力としてその run メソッドを実行することです。 このページでは、この方法で量子回路をトランスパイルする方法を説明する。


(段階的な)パスマネージャーとは何ですか?

Qiskit SDKの文脈では、トランスパイルとは、入力回路を量子デバイスでの実行に適した形に変換するプロセスを指します。 トランスパレーションは通常、トランスパイラー・パスと呼ばれる一連のステップで行われる。 回路はトランスパイラの各パスによって順番に処理され、あるパスの出力が次のパスの入力となる。 例えば、1つのパスで回路を通過させ、シングル量子ビット・ゲートの連続するシーケンスをすべてマージし、次のパスでこれらのゲートをターゲット・デバイスの基底セットに合成することができる。 Qiskitに含まれるトランスパイラパスは qiskit.transpiler.passes モジュールにあります。

パス・マネージャーは、トランスパイラー・パスのリストを保存し、回路上で実行できるオブジェクトです。 を初期化してパス・マネージャーを作成する。 PassManager をトランスパイラ・パスのリストで初期化することでパス・マネージャを作成します。 回路上でトランスパレーションを実行するには、回路を入力として run メソッドを呼び出す。

ステージド・パス・マネージャーは、通常のパス・マネージャーよりも抽象度が高い特別なパス・マネージャーです。 通常のパス・マネージャーが複数のトランスパイラー・パスを組み合わせて構成されるのに対し、ステージド・パス・マネージャーは複数のパス・マネージャーで構成される。 トランスパイラのステージで説明されているように、トランスパイルは通常、個別のステージで行われ、各ステージはパスマネージャで表されるため、これは有用な抽象化である。 ステージド・パスマネージャーは StagedPassManager クラスで表されます。 このページの残りの部分では、(段階的な)パス・マネージャーの作成とカスタマイズの方法について説明します。


プリセットステージドパスマネージャを生成する

適切なデフォルト値が設定されたプリセットのステージド・パス・マネージャーを作成するには、関数を使用 generate_preset_pass_manager します。

Note

これらの例では の FakeSherbrooke``qiskit_ibm_runtime モックバックエンドを使用していますが、Qiskitと互換性のある実在のバックエンドや模擬バックエンドであれば、どれでも試すことができます。 実際の結果は異なる場合があります。

from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke

backend = FakeSherbrooke()
pass_manager = generate_preset_pass_manager(
    optimization_level=3, backend=backend
)

パス・マネージャで回路または回路のリストをトランスパイルするには、回路または回路のリストを run メソッドに渡す。 ハダマードの後に2つの隣接するCXゲートが続く2量子ビット回路でこれをやってみよう:

from qiskit import QuantumRegister, QuantumCircuit

# Create a circuit
qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)
a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)

# Transpile it by calling the run method of the pass manager
transpiled = pass_manager.run(circuit)

# Draw it, excluding idle qubits from the diagram
transpiled.draw("mpl", idle_wires=False)

Output:

Output of the previous code cell

generate_preset_pass_manager 関数に指定できる引数については、 Transpilation defaults and configuration options を参照のこと。 generate_preset_pass_managertranspile 関数の引数と一致します。

もしプリセットのパス・マネージャーがあなたのニーズを満たさない場合は、(ステージングされた)パス・マネージャーやトランスピレーション・パスを作成してトランスピレーションをカスタマイズしてください。 このページの残りの部分では、パス・マネージャーの作成方法について説明します。 トランスパイルパスの作成方法については、 Write your own transpiler passを参照してください。


独自のパス管理ツールを作成する

この qiskit.transpiler.passes モジュールには、パス・マネージャーを作成するのに使えるトランスパイラー・パスが多数含まれている。 パス・マネージャーを作成するには、パスのリストで PassManager を初期化する。 例えば、次のコードは、隣接する2量子ビットのゲートをマージするトランスパイラー・パスを作成し、それらを以下の基底に合成する。 RyR_y, RzR_zRxxR_{xx} ゲートの基底に合成する。

from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import (
    Collect2qBlocks,
    ConsolidateBlocks,
    UnitarySynthesis,
)

basis_gates = ["rx", "ry", "rxx"]
translate = PassManager(
    [
        Collect2qBlocks(),
        ConsolidateBlocks(basis_gates=basis_gates),
        UnitarySynthesis(basis_gates),
    ]
)

このパス・マネージャーを実際に動作させるために、ハダマードの後に2つの隣接するCXゲートが続く2量子ビット回路でテストしてみよう:

from qiskit import QuantumRegister, QuantumCircuit

qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)

a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)

circuit.draw("mpl")

Output:

Output of the previous code cell

回路上でパス・マネージャーを実行するには、 run メソッドを呼び出す。

translated = translate.run(circuit)
translated.draw("mpl")

Output:

Output of the previous code cell

ダイナミック・デカップリングとして知られるエラー抑制テクニックを実装するためにパス・マネージャーを作成する方法を示す、より高度な例については、 ダイナミック・デカップリングのためのパス・マネージャーの作成を参照してください。


段階的なパス管理者の作成

StagedPassManager は、個々のステージで構成されるパス・マネージャーであり、各ステージは PassManager インスタンスによって定義される。 希望するステージを指定して、 StagedPassManager 。 例えば、以下のコードは、 inittranslation の2つのステージを持つステージド・パスマネージャーを作成します。 translation ステージは、以前に作成されたパス・マネージャーによって定義される。

from qiskit.transpiler import PassManager, StagedPassManager
from qiskit.transpiler.passes import UnitarySynthesis, Unroll3qOrMore

basis_gates = ["rx", "ry", "rxx"]
init = PassManager(
    [UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]
)
staged_pm = StagedPassManager(
    stages=["init", "translation"], init=init, translation=translate
)

ステージ・パス・マネージャーに入れるステージ数に制限はない。

ステージド・パス・マネージャーを作るもう一つの便利な方法は、プリセットのステージド・パス・マネージャーから始めて、ステージの一部を入れ替えることだ。 例えば、次のコードは最適化レベル3のプリセット・パス・マネージャーを生成し、カスタム pre_layout ステージを指定する。

import numpy as np
from qiskit.circuit.library import HGate, PhaseGate, RXGate, TdgGate, TGate
from qiskit.transpiler.passes import InverseCancellation

pass_manager = generate_preset_pass_manager(3, backend)
inverse_gate_list = [
    HGate(),
    (RXGate(np.pi / 4), RXGate(-np.pi / 4)),
    (PhaseGate(np.pi / 4), PhaseGate(-np.pi / 4)),
    (TGate(), TdgGate()),
]
logical_opt = PassManager(
    [
        InverseCancellation(inverse_gate_list),
    ]
)

# Add pre-layout stage to run extra logical optimization
pass_manager.pre_layout = logical_opt

ステージ・ジェネレーター関数は、カスタム・パス・マネージャーを構築するのに便利かもしれない。 多くのパス・マネージャーで使用される共通機能を提供するステージを生成する。 例えば generate_embed_passmanager を使用してステージ を使用して、レイアウトパスから選択された初期 Layout を指定されたターゲットデバイスに「埋め込む」ことができます。


次のステップ

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