Skip to main content
IBM Quantum Platform

トランスパイラで一般的に使用されるパラメータ

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

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

このページでは、ローカルトランスピレーションによく使われるパラメータについて説明します。 これらのパラメータは generate_preset_pass_manager または transpile.


近似度

近似度を使用して、結果の回路を目的の(入力)回路にどれだけ近づけたいかを指定できます。 これは範囲 ( 0.0 - 1.0 ) の浮動小数点数で、 0.0 は最大近似、 1.0 (デフォルト) は近似なし。 小さい値は、出力の正確さと実行のしやすさ(つまりゲート数の少なさ)を引き換えにする。 デフォルト値は 1.0 です。

2量子ビット・ユニタリー合成(全レベルの初期段階と最適化レベル3の最適化段階で使用)では、この値は出力分解の目標忠実度を指定する。 つまり、回路の行列表現を離散ゲートに変換したときに、どれだけの誤差が生じるかということである。 近似度が低い(近似度が高い)場合、合成から得られる出力回路は入力行列との違いが大きくなるが、ゲート数は少なくなり(任意の2量子ビット演算は最大でも3つのCXゲートで完全に分解できるため)、実行が容易になる。

近似度が 1.0 より小さい場合、1つまたは2つのCXゲートを持つ回路が合成される可能性があり、ハードウェアによる誤差は小さくなるが、近似度による誤差は大きくなる。 CXは誤差の点で最も高価なゲートであるため、合成の忠実度を犠牲にしてでもゲート数を減らすことが有益かもしれない(この手法は、 IBM® デバイスの量子体積を増やすために使用された): ランダム化モデル回路を用いた量子コンピュータの検証 )。

例として、初期段階で合成されるランダムな2量子ビット UnitaryGateapproximation_degree を 1.0 より小さく設定すると、近似回路が生成される可能性がある。 また、近似合成に使用できるゲートを合成手法に知らせるために、 basis_gates

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

Output:

2

近似に必要なCXゲートの数が少ないため、 2


乱数生成器のシード

トランスパイラの一部は確率的であるため、トランスパイラを繰り返し実行すると異なる結果を返すことがある。 再現可能な結果を得るには、 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")

Output:

Output of the previous code cell

初期レイアウト

トランスパイレーション前の回路に含まれる量子ビットは仮想的な量子ビットであり、必ずしもターゲット・バックエンド上の物理的な量子ビットに対応するわけではない。 仮想量子ビットの物理量子ビットへの初期マッピングは、 initial_layout 引数を使用して指定できます。 最終的な量子ビットのレイアウトは、トランスパイラがスワップゲートなどを使って量子ビットを並べ替える可能性があるため、最初のレイアウトとは異なる可能性があることに注意してください。

以下の例では FakeSherbrooke モックバックエンド用の Layout オブジェクトを作成します。 私たちのレイアウトは、私たちの回路の最初の量子ビットをシャーブルックの量子ビット5にマッピングし、私たちの回路の2番目の量子ビットをシャーブルックの量子ビット6にマッピングしている。 物理的な量子ビットは常に整数で表されることに注意。

Note

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

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)

Output:

Output of the previous code cell

Layoutオブジェクトを指定するだけでなく、整数のリストを渡すこともできます。リストの ii -番目の要素には、 ii -番目の量子ビットがマッピングされるべき物理量子ビットが含まれます。 例:

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)

Output:

Output of the previous code cell

を使用することができます。 plot_error_map 関数を使用すると、エラー情報と物理量子ビットのラベルが付いたデバイス・グラフの図を生成できます。 また、 コンピュート・リソースのページでも同様の図を見ることができる。

from qiskit.visualization import plot_error_map

plot_error_map(backend, figsize=(30, 24))

Output:

Output of the previous code cell

トランスパイラ段階とプラグインオプション

これらのオプションのサフィックスは _method。 これらはトランスパイラの動作に影響を与え、トランスパイラからより良い、異なる、あるいは特定の出力を得ようとするために使用されます。

  • 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:貪欲に命令をスケジューリングする:量子ビットリソース上で可能な限り早期に(別名: asap )。
    • as_late_as_possible:スケジュールの指示が遅い。 つまり、可能な限り量子ビットを基底状態に保つ(別名: alap )。
  • translation_method (str) - 翻訳パスの名前 (unroller, translator, synthesis)。これは、翻訳段階で使用する外部プラグインの名前にもなります。

  • unitary_synthesis_method (str) - 使用するユニタリー合成法の名前。 デフォルトでは default

指定したステージにインストールされているすべてのプラグインのリストを見るには、以下を実行する。 list_stage_plugins("stage_name"). 例えば、ルーティングステージにインストールされているすべてのプラグインのリストを見たい場合は、 list_stage_plugins(routing).


次のステップ

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