トランスパイラープラグインのインストールと使用
このページのコードは、以下の要件に基づいて開発された。 これらのバージョンまたは新しいバージョンの使用をお勧めします。
qiskit[all]~=2.5.1 qiskit-ibm-runtime~=0.47.0
Qiskitユーザーの幅広いコミュニティによるカスタムトランスパイルコードの開発と再利用を促進するため、Qiskit SDKは、サードパーティの Python パッケージがQiskit経由でアクセス可能な拡張トランスパイルファンクションを提供することを宣言できるプラグインインターフェースをサポートしています。
現在、サードパーティのプラグインは、3つの方法で拡張トランスピレーション機能を提供することができます:
- トランスパイラ・ステージ・プラグインは、プリセット・ステージド・パスマネージャーの 6つのステージのうちの1つの代わりに使用できるパスマネージャーを提供します:
initlayout、routing、translation、optimization、scheduling。 - ユニタリー合成プラグインは、ユニタリーゲート合成のための拡張機能を提供します。
- 高位合成プラグインは、線形関数やクリフォード演算子などの「高位オブジェクト」を合成するための拡張機能を提供する。 高レベルのオブジェクトは、 Operation クラスのサブクラスで表される。
残りのページでは、利用可能なプラグインをリストアップし、新しいプラグインをインストールし、それらを使用する方法について説明します。
利用可能なプラグインの一覧を表示し、新しいプラグインをインストールする
Qiskitにはすでにいくつかのトランスピレーション用プラグインが組み込まれています。 さらにインストールするには、 Python パッケージマネージャを使用できます。 例えば、 Qiskit TOQM ルーティングステージプラグインをインストールするために pip install qiskit-toqm 。 数多くのサードパーティ製プラグインが Qiskitエコシステムの一部となっています。
利用可能なトランスパイラーステージプラグインの一覧
list_stage_plugins 関数を使用して、プラグインをリストしたいステージ名を渡す。
from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins
list_stage_plugins("layout")Output:
['default', 'dense', 'sabre', 'trivial']
list_stage_plugins("routing")Output:
['basic', 'default', 'lookahead', 'none', 'sabre']
qiskit-toqm がインストールされていれば、 routing のプラグインリストに toqm が表示される。
利用可能なユニタリー合成プラグインの一覧
unitary_synthesis 関数を使用する。
from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names
unitary_synthesis_plugin_names()Output:
['aqc', 'clifford', 'default', 'gridsynth', 'sk']
利用可能なハイレベル合成プラグインの一覧
high_level_synthesis 関数を使用し、合成する "高レベルオブジェクト "のタイプ名を渡す。 この名前は、合成されるオブジェクトのタイプを表すOperationクラスの name 属性に対応します。
from qiskit.transpiler.passes.synthesis import (
high_level_synthesis_plugin_names,
)
high_level_synthesis_plugin_names("clifford")Output:
['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']
この HighLevelSynthesisPluginManager クラスを使って、すべての高位合成プラグインの名前をリストすることができます:
from qiskit.transpiler.passes.synthesis.plugin import (
HighLevelSynthesisPluginManager,
)
HighLevelSynthesisPluginManager().plugins.names()Output:
['FullAdder.default',
'FullAdder.ripple_c04',
'FullAdder.ripple_v95',
'HalfAdder.default',
'HalfAdder.qft_d00',
'HalfAdder.ripple_c04',
'HalfAdder.ripple_r25',
'HalfAdder.ripple_v95',
'IntComp.default',
'IntComp.noaux',
'IntComp.twos',
'ModularAdder.default',
'ModularAdder.modular_v17',
'ModularAdder.qft_d00',
'ModularAdder.ripple_c04',
'ModularAdder.ripple_v95',
'Multiplier.cumulative_h18',
'Multiplier.default',
'Multiplier.qft_r17',
'PauliEvolution.default',
'PauliEvolution.rustiq',
'WeightedSum.default',
'annotated.default',
'clifford.ag',
'clifford.bm',
'clifford.default',
'clifford.greedy',
'clifford.layers',
'clifford.lnn',
'linear_function.default',
'linear_function.kms',
'linear_function.pmh',
'mcmt.default',
'mcmt.noaux',
'mcmt.vchain',
'mcmt.xgate',
'mcx.1_clean_b95',
'mcx.1_clean_kg24',
'mcx.1_dirty_kg24',
'mcx.2_clean_kg24',
'mcx.2_dirty_kg24',
'mcx.default',
'mcx.gray_code',
'mcx.n_clean_m15',
'mcx.n_dirty_i15',
'mcx.noaux_hp24',
'mcx.noaux_v24',
'permutation.acg',
'permutation.basic',
'permutation.default',
'permutation.kms',
'permutation.token_swapper',
'qft.default',
'qft.full',
'qft.line',
'clifford.rb_default']
プラグインを使用する
このセクションでは、トランスパイラ・プラグインの使い方を紹介します。 コード例ではQiskit付属のプラグインを使用していますが、サードパーティパッケージからインストールしたプラグインも同様に使用できます。
トランスパイラーステージプラグインを使用する
トランスパイラ・ステージ・プラグインを使用するには、適切な引数とともにその名前を または generate_preset_pass_manager に指定してください transpile。 引数は、トランスパイル段階の名前の末尾に を _method 付加することで構成されます。 たとえば、 lookahead ルーティングプラグインを使用するには、引数として routing_method を lookahead 指定します。
これらの例では の 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, routing_method="lookahead"
)ユニタリー合成プラグインを使用する
ユニタリー合成プラグインを使用するには、 unitary_synthesis_method の引数にその名前を指定します。 generate_preset_pass_manager または transpile:
pass_manager = generate_preset_pass_manager(
optimization_level=3,
backend=backend,
unitary_synthesis_method="sk",
unitary_synthesis_plugin_config=dict(
basis_gates=["cz", "id", "rz", "sx", "x"]
),
)によって返されるステージドパスマネージャーの init、 translation、 optimization の各ステージでユニタリー合成が使用される。 generate_preset_pass_manager で使用される。 transpile. これらのステージの説明については、 トランスパイラのステージを参照のこと。
引数 unitary_synthesis_plugin_config (自由形式の辞書)を使って、ユニタリー合成法のオプションを渡す。 合成法のドキュメントは、それがサポートするオプションを説明すべきである。 組み込みのユニタリー合成プラグインのドキュメントへのリンクは、 このリストを参照してください。
高レベル合成プラグインを使用する
まず、 HLSConfigを作成する。 を作成し、さまざまな高レベルオブジェクトに使用するプラグインの名前を格納する。 例:
from qiskit.transpiler.passes import HLSConfig
hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])このコード・セルは、 layers オブジェクトを合成する プラグインと、 オブジェクトを合成する プラグインを使用する高レベル合成コンフィギュレーションを作成します。 クリフォード オブジェクトの合成には pmh プラグインを使用します。 LinearFunction オブジェクトを合成する キーワード引数の名前は name 属性に対応する。
各ハイレベルオブジェクトに対して、与えられたプラグインのリストが、そのうちの1つが成功するまで順番に試される。 が成功するまで順番に試される(上の例では、各リストには1つのプラグインしか含まれていない)。
プラグインの名前で を指定する代わりに、 (name, options) のタプルを渡すことができます。タプルの2番目の要素は、プラグインのオプションを含む辞書です。 合成法のドキュメントは、それがサポートするオプションを説明すべきである。 組み込みの高位合成プラグインのドキュメントへのリンクは、 このリストを参照のこと。
HLSConfig オブジェクトを作成したら、それを hls_config への引数として渡す。 generate_preset_pass_manager または transpile:
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, hls_config=hls_config
)によって返されるステージド・パスマネージャーの init、 translation、 optimization の各ステージで高位合成が使われる。 generate_preset_pass_manager で使用される。 transpile. これらのステージの説明については、 トランスパイラのステージを参照のこと。
次のステップ
- トランスパイラプラグインを作成する。
- 量子回路のトランスパイルと実行の例については、 チュートリアルをチェックしてほしい。