メインコンテンツへスキップ
このプロジェクトはベータ版です。バグを見つけましたか?GitHub Issueを開く。質問やアイデアがありますか?Discussionsで質問する — フィードバックをお待ちしています!
このページの翻訳品質はいかがですか?

トランスパイラープラグインのインストールと使用

Package versions

このページのコードは、以下の要件を使用して開発されました。 これらのバージョン以上を使用することを推奨します。

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

より広いQiskitユーザーコミュニティによるカスタムトランスパイルコードの開発と再利用を容易にするため、Qiskit SDKは、サードパーティのPythonパッケージがQiskit経由でアクセス可能な拡張トランスパイル機能を提供することを宣言できるプラグインインターフェースをサポートしています。

現在、サードパーティプラグインは以下の3つの方法で拡張トランスパイル機能を提供できます。

このページの残りの部分では、利用可能なプラグインの一覧表示、新しいプラグインのインストール、およびその使用方法について説明します。

利用可能なプラグインの一覧と新規インストール​

Qiskitにはすでにトランスパイル用の組み込みプラグインがいくつか含まれています。さらにインストールするには、Pythonのパッケージマネージャーを使用します。たとえば、pip install qiskit-toqmを実行してQiskit TOQMルーティングステージプラグインをインストールできます。多数のサードパーティプラグインがQiskitエコシステムの一部となっています。

利用可能なトランスパイラーステージプラグインの一覧​

list_stage_plugins関数を使用し、一覧表示したいステージの名前を引数として渡します。

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins

list_stage_plugins("layout")
['default', 'dense', 'sabre', 'trivial']
list_stage_plugins("routing")
['basic', 'default', 'lookahead', 'none', 'sabre']

qiskit-toqmがインストールされている場合、toqmがroutingプラグインの一覧に表示されます。

利用可能なユニタリー合成プラグインの一覧​

unitary_synthesis_plugin_names関数を使用します。

from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names

unitary_synthesis_plugin_names()
['aqc', 'clifford', 'default', 'gridsynth', 'sk']

利用可能な高レベル合成プラグインの一覧​

high_level_synthesis_plugin_names関数を使用し、合成する「高レベルオブジェクト」の型名を引数として渡します。この名前は、合成対象のオブジェクト型を表すOperationクラスのname属性に対応します。

from qiskit.transpiler.passes.synthesis import (
high_level_synthesis_plugin_names,
)

high_level_synthesis_plugin_names("clifford")
['rb_default', 'ag', 'bm', 'default', 'greedy', 'layers', 'lnn']

すべての高レベル合成プラグインの名前を一覧表示するには、HighLevelSynthesisPluginManagerクラスを使用できます。

from qiskit.transpiler.passes.synthesis.plugin import (
HighLevelSynthesisPluginManager,
)

HighLevelSynthesisPluginManager().plugins.names()
['clifford.rb_default',
'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']

プラグインの使用​

このセクションでは、トランスパイラープラグインの使用方法を説明します。コード例ではQiskitに付属のプラグインを使用していますが、サードパーティパッケージからインストールしたプラグインも同じ方法で使用できます。

トランスパイラーステージプラグインの使用​

トランスパイラーステージプラグインを使用するには、generate_preset_pass_managerまたはtranspileの適切な引数にプラグイン名を指定します。引数名はトランスパイルステージ名に_methodを付加した形式になります。たとえば、lookaheadルーティングプラグインを使用するには、routing_method引数にlookaheadを指定します。

備考

これらの例ではqiskit_ibm_runtimeのFakeSherbrookeモックバックエンドを使用していますが、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"
)

ユニタリー合成プラグインの使用​

ユニタリー合成プラグインを使用するには、generate_preset_pass_managerまたはtranspileのunitary_synthesis_method引数にプラグイン名を指定します。

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"]
),
)

ユニタリー合成は、generate_preset_pass_managerが返す、またはtranspileで使用されるステージドパスマネージャーのinit、translation、optimizationステージで使用されます。これらのステージの説明については、トランスパイラーステージを参照してください。

ユニタリー合成メソッドのオプションを渡すには、自由形式の辞書であるunitary_synthesis_plugin_config引数を使用します。合成メソッドのドキュメントに、サポートされるオプションが記載されています。組み込みユニタリー合成プラグインのドキュメントへのリンクはこちらのリストを参照してください。

高レベル合成プラグインの使用​

まず、さまざまな高レベルオブジェクトに使用するプラグイン名を格納するためにHLSConfigを作成します。たとえば次のようにします。

from qiskit.transpiler.passes import HLSConfig

hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])

このコードセルは、Cliffordオブジェクトの合成にlayersプラグインを使用し、LinearFunctionオブジェクトの合成にpmhプラグインを使用する高レベル合成設定を作成します。キーワード引数の名前は、合成対象のオブジェクト型を表すOperationクラスのname属性に対応します。各高レベルオブジェクトについて、指定されたリスト内のプラグインを、いずれかが成功するまで順番に試行します(上記の例では、各リストにプラグインが1つだけ含まれています)。

プラグインを名前で指定する代わりに、(name, options)タプルを渡すこともできます。タプルの2番目の要素はプラグインのオプションを含む辞書です。合成メソッドのドキュメントに、サポートされるオプションが記載されています。組み込み高レベル合成プラグインのドキュメントへのリンクはこちらのリストを参照してください。

HLSConfigオブジェクトを作成したら、generate_preset_pass_managerまたはtranspileのhls_config引数として渡します。

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

高レベル合成は、generate_preset_pass_managerが返す、またはtranspileで使用されるステージドパスマネージャーのinit、translation、optimizationステージで使用されます。これらのステージの説明については、トランスパイラーステージを参照してください。

次のステップ​

Recommendation