トランスパイルでよく使われるパラメーター
Package versions
このページのコードは、以下の要件を使って開発されました。 これらのバージョン以降の使用を推奨します。
qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
このページでは、ローカルトランスパイルでよく使われるパラメーターのいくつかを説明します。これらのパラメーターは、generate_preset_pass_manager または transpile への引数を使って設定します。
近似度
近似度(approximation degree)を使用して、出力回路を目的の(入力)回路にどれだけ近づけたいかを指定できます。これは (0.0 ~ 1.0) の範囲の浮動小数点数で、0.0 が最大近似、1.0(デフォルト)が近似なしを意味します。値を小さくすると、出力精度を犠牲にして実行しやすくなります(つまり、ゲート数が少なくなります)。デフォルト値は 1.0 です。
2量子ビットユニタリー合成(全レベルの初期ステージおよび最適化レベル 3 での最適化ステージで使用)では、この値が出力分解の目標忠実度を指定します。つまり、回路の行列表現が離散ゲートに変換される際にどれだけの誤差が生じるかを示します。近似度の値が小さい(近似が大きい)場合、合成から得られる出力回路は入力行列との差が大きくなりますが、ゲート数も少なくなります(任意の 2 量子ビット演算は最大 3 つの CX ゲートで完全に分解できるため)、実行しやすくなります。
近似度が 1.0 未満の場合、1 つまたは 2 つの CX ゲートで回路が合成される可能性があり、ハードウェアからの誤差は少なくなりますが、近似による誤差が増えます。CX は誤差の観点で最もコストの高いゲートなので、合成の忠実度を犠牲にしてでも CX の数を減らすことが有益な場合があります(この手法は IBM® デバイスでの量子ボリューム向上に使用されました: Validating quantum computers using randomized model circuits)。
例として、初期ステージで合成されるランダムな 2 量子ビット UnitaryGate を生成します。approximation_degree を 1.0 未満に設定すると、近似回路が生成される場合があります。また、合成メソッドが近似合成に使用できるゲートを認識できるよう、basis_gates も指定する必要があります。
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import random_unitary
from qiskit.transpiler import generate_preset_pass_manager
UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)
qubits = QuantumRegister(2, name="q")
qc = QuantumCircuit(qubits)
qc.append(rand_U, qubits)
pass_manager = generate_preset_pass_manager(
optimization_level=1,
approximation_degree=0.85,
basis_gates=["sx", "rz", "cx"],
)
approx_qc = pass_manager.run(qc)
print(approx_qc.count_ops()["cx"])
2
近似により CX ゲートの数が少なくて済むため、出力は 2 になります。
乱数ジェネレーターのシード
Transpilerの一部は確率的に動作するため、トランスパイルを繰り返し実行すると異なる結果が返ることがあります。再現可能な結果を得るには、seed_transpiler 引数を使って疑似乱数ジェネレーターのシードを設定できます。同じシードを使って繰り返し実行すると、同じ結果が返ります。
例:
pass_manager = generate_preset_pass_manager(
optimization_level=1, seed_transpiler=11, basis_gates=["sx", "rz", "cx"]
)
optimized_1 = pass_manager.run(qc)
optimized_1.draw("mpl")
初期レイアウト
トランスパイル前、回路に含まれる qubit は仮想 qubit であり、ターゲット Backend の物理 qubit に必ずしも対応していません。initial_layout 引数を使って、仮想 qubit から物理 qubit への初期マッピングを指定できます。ただし、Transpilerがスワップゲートやその他の手段で qubit を並べ替えることがあるため、最終的な qubit レイアウトは初期レイアウトと異なる場合があります。
以下の例では、Layout オブジェクトを作成して、FakeSherbrooke モック Backend の初期レイアウトを構築します。このレイアウトでは、回路の最初の qubit を Sherbrooke の qubit 5 に、回路の 2 番目の qubit を Sherbrooke の qubit 6 にマッピングします。物理 qubit は常に整数で表されることに注意してください。
qiskit_ibm_runtime の FakeSherbrooke モック Backend はこれらの例で使用されていますが、Qiskit 互換の実際のまたは偽の Backend であれば何でも試すことができます。結果は異なる場合があります。
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit.transpiler import Layout
backend = FakeSherbrooke()
a, b = qubits
initial_layout = Layout({a: 5, b: 6})
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)
Layout オブジェクトを指定する方法に加えて、整数のリストを渡すこともできます。リストの 番目の要素に、 番目の qubit がマッピングされるべき物理 qubit を指定します。例:
initial_layout = [5, 6]
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)
plot_error_map 関数を使って、誤差情報と物理 qubit のラベルが付いたデバイスグラフの図を生成できます。また、Compute resources ページで同様の図を確認することもできます。
from qiskit.visualization import plot_error_map
plot_error_map(backend, figsize=(30, 24))
Transpilerのステージとプラグインオプション
これらのオプションは _method というサフィックスが付いています。Transpilerの動作に影響を与え、より良い結果、異なる結果、または特定の出力をTranspilerから得るために使用されます。
-
init_method(str) - 初期化ステージに使用するプラグイン。 -
layout_method(str) - レイアウト選択パス(trivial、dense、sabre)。レイアウトステージに使用する外部プラグイン名も指定できます。 -
optimization_method(str) - 最適化ステージに使用するプラグイン。 -
routing_method(str) - ルーティングパスの名前(basic、lookahead、default、sabre、none)。ルーティングステージに使用する外部プラグイン名も指定できます。 -
scheduling_method(str) - スケジューリングパスの名前。スケジューリングステージに使用する外部プラグイン名も指定できます。as_soon_as_possible:qubit リソース上でできるだけ早く命令を貪欲にスケジュールします(エイリアス:asap)。as_late_as_possible:命令を遅くスケジュールします。つまり、可能な限り qubit を基底状態に保ちます(エイリアス:alap)。
-
translation_method(str) - 変換パスの名前(unroller、translator、synthesis)。変換ステージに使用する外部プラグイン名も指定できます。 -
unitary_synthesis_method(str) - 使用するユニタリー合成メソッドの名前。デフォルトではdefaultが使用されます。
指定したステージにインストールされているすべてのプラグインの一覧を表示するには、list_stage_plugins("stage_name") を実行してください。例えば、ルーティングステージのすべてのインストール済みプラグインを確認するには、list_stage_plugins(routing) を実行します。
次のステップ
- デフォルトのオプションと設定 のトピックを確認してください。
- 最適化レベルの設定方法 を学んでください。
- トランスパイル設定の比較 ガイドを試してみてください。
- Transpiler API ドキュメント を確認してください。