合成プラグイン
qiskit.transpiler.passes.synthesis.plugin
このモジュールはQiskitの合成トランスパイラパスのプラグインインターフェースを定義します。 これらは、外部のpythonパッケージが独自の合成技術を実装するためのフックポイントを提供し、ユーザが以下を実行するときにオプションとしてシームレスに公開されます。 transpile().
プラグインインターフェースは、qiskitの外部パッケージが合成プラグインを含むことを宣伝できるようにするsetuptools エントリポイントを使用して構築されています。
詳細は qiskit.transpiler.preset_passmanagers.plugin トランスパイラ・ステージ用のプラグインの書き方の詳細は、こちらを参照してください。
合成プラグインAPI
ユニタリー合成プラグインAPI
UnitarySynthesisPlugin() | 抽象ユニタリー合成プラグインクラス |
UnitarySynthesisPluginManager() | Unitary Synthesisプラグインマネージャークラス |
unitary_synthesis_plugin_names() | インストールされているユニット合成プラグイン名のリストを返す |
ハイレベル合成プラグインAPI
HighLevelSynthesisPlugin() | 抽象的な高レベル合成プラグインクラス。 |
HighLevelSynthesisPluginManager() | インストールされた高位合成プラグインを追跡するクラス。 |
high_level_synthesis_plugin_names(オペ名) | 与えられた高レベルオブジェクト名にインストールされているプラグイン名のリストを返す |
プラグインの作成
ユニタリー・シンセシス・プラグイン
ユニタリー合成プラグインを書くには、主に2つのステップがある。 最初のステップは、抽象プラグイン・クラスのサブクラスを作成することである: UnitarySynthesisPlugin. プラグイン・クラスは、ユニタリー・シンセシス・プラグインのインターフェースとコントラクトを定義する。 主要なメソッドは run() で、numpy配列としてユニタリー行列を引数に取り、そのユニタリー行列から合成された回路を表す DAGCircuit オブジェクトを返します。 次に、Qiskitトランスパイラにパスに必要な情報を通知するために、プラグインが合成を実行するためにその入力をサポートするか、または必要とするかによって、 supports_basis_gates や supports_coupling_map のように実装する必要があるいくつかの必須プロパティメソッドがあります。 詳細については UnitarySynthesisPlugin ドキュメントを参照してください。 プラグイン・クラスの例は次のようなものだ:
from qiskit.transpiler.passes.synthesis import plugin
from qiskit_plugin_pkg.synthesis import generate_dag_circuit_from_matrix
class SpecialUnitarySynthesis(plugin.UnitarySynthesisPlugin):
@property
def supports_basis_gates(self):
return True
@property
def supports_coupling_map(self):
return False
@property
def supports_natural_direction(self):
return False
@property
def supports_pulse_optimize(self):
return False
@property
def supports_gate_lengths(self):
return False
@property
def supports_gate_errors(self):
return False
@property
def supports_gate_lengths_by_qubit(self):
return False
@property
def supports_gate_errors_by_qubit(self):
return False
@property
def min_qubits(self):
return None
@property
def max_qubits(self):
return None
@property
def supported_bases(self):
return None
def run(self, unitary, **options):
basis_gates = options['basis_gates']
dag_circuit = generate_dag_circuit_from_matrix(unitary, basis_gates)
return dag_circuitもし何らかの理由で run() プラグインのインターフェイスを拡張し、将来のリリースに向けて後方互換性のある方法で新しいオプトイン入力を追加できるようにします。 ただし、このプラグインのインターフェイスは安定しており、破壊的な変更がないことが保証されている。 変更が必要な場合(例えば、利用可能なオプション入力オプションを拡張する)、既存のプラグインからの変更を必要としない方法で行われます。
supports_ というプレフィックスが付いたメソッドはすべて、 UnitarySynthesisPlugin の派生クラスでインターフェイスの一部として予約されている。 サブクラスには、抽象クラスで定義されていないカスタム・メソッド( supports_* )を定義してはならない。
第二のステップは、パッケージのメタデータに UnitarySynthesisPlugin をパッケージメタデータのsetuptoolsエントリポイントとして公開することです。 これは、 qiskit.unitary_synthesis 名前空間の下に必要なエントリー・ポイントを持つプラグイン・パッケージの pyproject.toml に entry-points テーブルを追加するだけで完了する。 例:
[project.entry-points."qiskit.unitary_synthesis"]
"special" = "qiskit_plugin_pkg.module.plugin:SpecialUnitarySynthesis"各プラグインがユニークな名前である限り、1つのパッケージに含めることができるプラグインの数に制限はありません。 そのため、必要に応じて1つのパッケージで複数のプラグインを公開することができる。 default という名前はQiskit自身が使用するもので、プラグインでは使用できません。
ユニタリー合成プラグイン設定
プラグイン・インターフェイスには、ユーザーが自由形式の設定辞書を提供するためのオプションがあります。 これは options kwargとして run() メソッドに渡される。 もしあなたのプラグインにこのような設定オプションがあるのであれば、ユーザーがどのようにこの設定オプションを指定すべきか、またフリーフォームのフィールドであるため、どのように使用されるかを明確に文書化する必要があります。
高レベル合成プラグイン
高位合成プラグインの書き方は、概念的にはユニタリー合成プラグインの書き方に似ている。 最初のステップは、抽象プラグイン・クラスのサブクラスを作成することである: HighLevelSynthesisPluginこのクラスは、高レベル合成プラグインのインターフェースとコントラクトを定義している。 主な方法は run(). 位置引数 high_level_object は、合成される「上位レベルのオブジェクト」を指定する。 Operation (を含む)、 LinearFunction または Clifford). キーワード引数 target はターゲット・バックエンドを指定し、プラグインがカップリング・マップやサポートされるゲート・セットなど、ターゲット固有のすべての情報にアクセスできるようにする。 キーワード引数 coupling_map は、カップリング・マップを指定するだけであり、 target が指定されていない場合にのみ使用される。 キーワード引数 qubits は、合成が物理回路上で行われる場合に、上位レベルのオブジェクトが定義される量子ビットのリストを指定する。 値 None は、レイアウトがまだ選択されておらず、このオペレーションが操作されるターゲットまたはカップリング・マップの物理量子ビットがまだ決定されていないことを示す。 さらに、プラグイン固有のオプションや調整項目は、自由形式の設定辞書である options を使って指定することができます。 もしあなたのプラグインにこのような設定オプションがあるのであれば、ユーザーがどのようにこの設定オプションを指定すべきか、またフリーフォームのフィールドであるため、どのように使用されるかを明確に文書化する必要があります。 メソッド run() メソッドは QuantumCircuit オブジェクトを返すことが期待されます。 また、合成メソッドが与えられた上位レベルオブジェクトを合成できないことを表す None 。 高レベル・オブジェクトの実際の合成は HighLevelSynthesis トランスパイラパスによって行われる。 詳細については HighLevelSynthesisPlugin ドキュメントを参照してください。 プラグイン・クラスの例は次のようなものだ:
from qiskit.transpiler.passes.synthesis.plugin import HighLevelSynthesisPlugin
from qiskit.synthesis.clifford import synth_clifford_bm
class SpecialSynthesisClifford(HighLevelSynthesisPlugin):
def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
if higher_level_object.num_qubits <= 3:
return synth_clifford_bm(high_level_object)
else:
return None型のオブジェクトを合成するプラグインを作成します。 Cliffordsynth_clifford_bm 型のオブジェクトを合成するプラグインを作成します。
第二のステップは、パッケージのメタデータに HighLevelSynthesisPlugin をパッケージメタデータのsetuptoolsエントリポイントとして公開することです。 これは、 qiskit.synthesis 名前空間の下に必要なエントリーポイントを持つプラグインパッケージの pyproject.toml に entry-points テーブルを追加することで行われる。 例:
[project.entry-points."qiskit.synthesis"]
"clifford.special" = "qiskit_plugin_pkg.module.plugin:SpecialSynthesisClifford"name はドット". "で区切られた2つの部分で構成されている: のタイプ名 Operationclifford プラグインの名前 (special)。各プラグインがユニークな名前を持っている限り、1つのパッケージに含めることができるプラグインの数に制限はありません。
プラグインの使用
ユニタリー・シンセシス・プラグイン
プラグインを使用するには、合成プラグインを含むパッケージをインストールするだけです。 するとQiskitはインストールされたプラグインを自動的に検出し、 適切な transpile() の有効なオプションとして公開します。 ロード/インポートできないプラグインがインストールされている場合、 Python ロギングに記録されます。
インストールされているユニット合成プラグインのリストを取得するには qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() 関数を使います。
高レベル合成プラグイン
高位合成プラグインを使用するには、まず、さまざまな高位オブジェクトに使用するプラグインの名前を格納するために HLSConfig をインスタンス化し、さまざまな高レベルオブジェクトに使用するプラグインの名前を格納します。 例:
HLSConfig(permutation=["acg"], clifford=["layers"], linear_function=["pmh"])オブジェクトの合成に acg プラグインを、合成に プラグインを使用する高レベル合成コンフィギュレーションを作成します。 PermutationGate オブジェクトを合成するための layers プラグインと Clifford オブジェクトを合成する pmh プラグインを使用します。 LinearFunction オブジェクトを合成します。 キーワード引数は Operation.name フィールドである。 例えば、すべての Clifford 演算はすべて nameclifford したがって、これがキーワード引数として使われる。 ここには、プラグインがインストールされていれば、カスタム・ユーザー・オブジェクトを含め、処理するプラグインをインストールしたキーワード引数を指定することができる。 各引数内のプラグイン設定の代替フォーマットについては HLSConfig を参照のこと。各引数内のプラグインを設定するための代替フォーマットの詳細については、こちらを参照のこと。
各ハイレベルオブジェクトに対して、与えられたプラグインのリストは、そのうちの1つが成功するまで順番に試される(上の例では、各リストには1つのプラグインしか含まれていない)。 プラグインの名前で指定するだけでなく、 (name, options) タプルを渡すこともできます。タプルの 2 番目の要素は、プラグインのオプションを含む辞書です。
オブジェクトを作成したら、この HLSConfig の hls_config 引数に渡す。 transpile() または generate_preset_pass_manager() の引数にこのオブジェクトを渡すと、指定されたプラグインがより大きなコンパイル・ワークフローの一部として使われる。
インストールされている高位合成プラグインのリストを取得するには Operation.nameに対してインストールされている高位合成プラグインのリストを取得するには high_level_synthesis_plugin_names() 関数を使用し、引数に希望の name を渡します:
high_level_synthesis_plugin_names("clifford")は、インストールされているすべてのClifford合成プラグインのリストを返します。
使用可能なプラグイン
以下はQiskitで利用可能な合成プラグインクラスです。 これらのクラスは直接使うべきでなく、上に書いたプラグイン・インターフェイスを通して使うべきである。 ここでは、各プラグインのドキュメントを見つけやすくするため、また、あるオブジェクトに対して異なる合成方法を比較しやすくするために、クラスをリストアップしている。
ユニタリー・シンセシス・プラグイン
AQC合成プラグイン
AQCSynthesisPlugin() | AQCベースのQiskitユニタリー合成プラグイン。 |
ソロベイ・キタエフ合成プラグイン
SolovayKitaevSynthesis() | Solovay-Kitaev Qiskitユニタリー合成プラグイン。 |
ロス・セリンガー合成プラグイン
RossSelingerSynthesis() | ロス=セリンガー Qiskit ユニタリー合成プラグイン |
クリフォード・ユニタリー合成プラグイン
CliffordUnitarySynthesis() | クリフォードユニタリー合成プラグイン |
デフォルトのユニタリー合成プラグイン
デフォルトのユニタリー合成プラグインは、トランスパイラパス UnitarySynthesis が回路内のユニタリーゲートを合成する際に使用するデフォルトのアルゴリズムを定義します。 その挙動は、対象ユニタリ演算子の量子ビット数と対象基底に依存する。
連続基底
ターゲット基底が連続的(すなわち Clifford+T ではない)場合、プラグインは以下の分解を使用します:
- 1量子ビットゲート:オイラー角分解(参照
OneQubitEulerDecomposer)。 - 2量子ビットゲート:KAK/カルタン分解(参照:
TwoQubitBasisDecomposerTwoQubitControlledUDecomposer,,XXDecomposer)。 - 3量子ビット以上のゲート:量子シャノン分解、参照
qs_decomposition()。
1量子ビットおよび2量子ビットゲートについては、プラグインはターゲットからの基底誤差情報を使用して、期待忠実度を最大化する分解を選択します。
クリフォード+T基底
ターゲット基底がクリフォード+Tである場合、プラグインはソロベイ・キタエフアルゴリズム(参照 SolovayKitaevDecomposition)を用いて1量子ビットユニタリ演算を近似する。 基本的な近似を作成するために使用される設定は, depth=12 および basis_gates=["h", "t", "tdg"] であり recursion_degree=5、近似精度と計算コストのバランスを取るために経験的に選択された。 カスタムパラメータでSolovay-Kitaevを使用する場合、または複数の回路に対して近似値を再計算することを避ける場合、このデフォルトプラグインの代わりにユニタリー合成プラグ SolovayKitaevSynthesis インを呼び出すことができます。
現在、Qiskitはクリフォード+T基底セットにおいて2量子ビット以上のユニタリ演算子を直接近似するアルゴリズムを含んでいません。 したがって、プリセットパス管理者はまずそのようなゲ ["cx", "u"] ートを基底に分解し、得られた1量子ビットユニタリゲートに対してソロベイ・キタエフ法を適用する。
DefaultUnitarySynthesis() | デフォルトのユニタリー合成プラグイン。 |
高レベル合成
Qiskitで直接利用可能な高レベル合成プラグインには、オブジェクトを合成するプラグインがあります。 Clifford オブジェクトを合成するプラグインがあります、 LinearFunction オブジェクト PermutationGate オブジェクトを合成するプラグインがあります。 これらのプラグインの中には、暗黙のうちに全対全接続をターゲットにしているものもある。 これは実用的な制限ではない。 HighLevelSynthesis 通常、レイアウトと配線の前に実行され、最終的な回路が追加のSWAPゲートを挿入することでデバイスの接続性を確実に守るからです。 ACGSynthesisPermutation このプラグインは、最大2層のSWAPゲートであらゆる並べ替えを合成できる。 一方、いくつかのプラグインは、暗黙のうちに線形接続をターゲットにしている。 通常、合成回路は奥行きとゲート数が大きくなるが、次のレイアウトパスでデバイスのトポロジー内で連続する量子ビットを選択すれば、追加のSWAPゲートは挿入されない。 この良い例が、 KMSSynthesisPermutation の順列合成プラグインで、 n の量子ビットの任意の順列を、 n の深さで合成することができる。 一般的に、全対全接続の回路を合成してSWAPゲートを挿入するのと、線形接続の回路を合成してSWAPゲートの挿入数を減らすか、あるいは全く挿入しないのとでは、どちらのアプローチが最終的な回路に良い結果をもたらすかを事前に知ることは難しい。 最後に、いくつかのプラグインは特定のコネクティビティをターゲットにすることができるため、レイアウトが設定された後に実行する必要がある。 この場合、合成された回路は自動的にデバイスのトポロジーに従う。 この良い例が、順列合成プラグイン( TokenSwapperSynthesisPermutation )である。このプラグインは、任意のカップリング・マップに対して任意の順列を合成することができる。 詳しくは各プラグインの説明をご覧ください。
それぞれの高レベルオブジェクトについて、Qiskitで直接利用可能なすべてのプラグインをリストアップした表を示します。 プラグインの名前、プラグインのクラス、対象となるコネクティビティ・マップ、そしてオプションで追加情報も含まれる。 プラグインは先に説明した方法で使用する必要があります。 HLSConfig例えば
HLSConfig(permutation=["kms"])オブジェクトの合成に kms プラグインを使用する高レベル合成コンフィギュレーションを作成します。 PermutationGate すなわち、 name = "permutation" を持つオブジェクトを合成するための高レベル合成コンフィギュレーションを作成します。 この場合、プラグイン名は "kms"、プラグインクラスは KMSSynthesisPermutation. この特殊な合成アルゴリズムは、直線的な最近接結合に忠実な回路を作成した。
高レベル合成プラグイン
クリフォード合成
プラグイン名 | プラグイン・クラス | ターゲット・コネクティビティ | 説明 |
|---|---|---|---|
"ag" | AGSynthesisClifford | オールトゥオール | CX数を貪欲に最適化する |
"bm" | BMSynthesisClifford | オールトゥオール | "default" で使用されている n=2,3; の最適カウント。 n=2,3 |
"greedy" | GreedySynthesisClifford | オールトゥオール | CX-countを貪欲に最適化する。 "default" で使用されている。 n>=4 |
"layers" | LayerSynthesisClifford | オールトゥオール | |
"lnn" | LayerLnnSynthesisClifford | リニア | 多くのCXゲートがあるが、最大でもCXの深さは保証される 7*n+2 |
"default" | DefaultSynthesisClifford | オールトゥオール | 通常、CX回数の最適化には最適である( n=2,3 のCX回数も最適である) |
AGSynthesisClifford() | Aaronson-Gottesman法に基づくクリフォード合成プラグイン。 |
BMSynthesisClifford() | Bravyi-Maslov法に基づくクリフォード合成プラグイン。 |
GreedySynthesisClifford() | 貪欲合成Bravyi-Hu-Maslov-Shaydulin法に基づくクリフォード合成プラグイン。 |
LayerSynthesisClifford() | Bravyi-Maslov法に基づいてクリフォードを層に合成するクリフォード合成プラグイン。 |
LayerLnnSynthesisClifford() | Bravyi-Maslov法に基づいてクリフォードを層に合成するクリフォード合成プラグインで、合成された各層はLNNの接続性に準拠している。 |
DefaultSynthesisClifford() | デフォルトのクリフォード合成プラグイン。 |
線形関数合成
プラグイン名 | プラグイン・クラス | ターゲット・コネクティビティ | 説明 |
|---|---|---|---|
"kms" | KMSSynthesisLinearFunction | リニア | 多くのCXゲートがあるが、最大でもCXの深さは保証される 5*n |
"pmh" | PMHSynthesisLinearFunction | オールトゥオール | で使用される。 "default" |
"default" | DefaultSynthesisLinearFunction | オールトゥオール | CXカウントの最適化 |
KMSSynthesisLinearFunction() | Kutin-Moulton-Smithline法に基づく線形関数合成プラグイン。 |
PMHSynthesisLinearFunction() | Patel-Markov-Hayes法に基づく線形関数合成プラグイン。 |
DefaultSynthesisLinearFunction() | デフォルトの線形関数合成プラグイン。 |
順列合成
プラグイン名 | プラグイン・クラス | ターゲット・コネクティビティ | 説明 |
|---|---|---|---|
"basic" | BasicSynthesisPermutation | オールトゥオール | 最適なSWAPカウント。 "default" |
"acg" | ACGSynthesisPermutation | オールトゥオール | SWAPの深さは最大2 |
"kms" | KMSSynthesisPermutation | リニア | SWAPゲートの数は多いが、SWAPの深さは最大でもnである |
"token_swapper" | TokenSwapperSynthesisPermutation | 任意 | 任意の接続性に対してSWAPカウントを貪欲に最適化する |
"default" | BasicSynthesisPermutation | オールトゥオール | SWAPカウントの最適化 |
BasicSynthesisPermutation() | 並べ替えに基づく並べ替え合成プラグイン。 |
ACGSynthesisPermutation() | アロン、チュン、グラハム法に基づく順列合成プラグイン。 |
KMSSynthesisPermutation() | クチン、モールトン、スミスライン法に基づく順列合成プラグイン。 |
TokenSwapperSynthesisPermutation() | トークンスワッパーアルゴリズムに基づく順列合成プラグイン。 |
量子場理論の統合
プラグイン名 | プラグイン・クラス | ターゲット・コネクティビティ |
|---|---|---|
"full" | QFTSynthesisFull | オールトゥオール |
"line" | QFTSynthesisLine | リニア |
"default" | QFTSynthesisFull | オールトゥオール |
QFTSynthesisFull() | 全対全接続を使用するQFTゲートの合成プラグイン。 |
QFTSynthesisLine() | 線形接続性を利用したQFTゲートの合成プラグイン。 |
MCX合成
以下の表は、k個の制御量子ビットを持つゲートで利用可能な合成プラグインの一覧です。 MCXGate ゲートで使用可能な合成プラグインの一覧です。 利用可能なクリーン/ダーティ補助量子ビットの数が十分でない場合、対応する合成メソッドは None を返します。
プラグイン名 | プラグイン・クラス | クリーンな付帯設備の数 | 汚れたアンシラの数 | 説明 |
|---|---|---|---|---|
"gray_code" | MCXSynthesisGrayCode | 0 | 0 | 指数関数的に多くのCXゲート |
"noaux_v24" | MCXSynthesisNoAuxV24 | 0 | 0 | CXゲートの二次数 |
"noaux_hp24" | MCXSynthesisNoAuxHP24 | 0 | 0 | CXゲートの直線数。 "noaux_v24" または "gray_code" の代わりに使用する。 k>5 |
"n_clean_m15" | MCXSynthesisNCleanM15 | k-2 | 0 | 最大 6*k-6 CXゲート |
"n_dirty_i15" | MCXSynthesisNDirtyI15 | 0 | k-2 | 最大 8*k-6 CXゲート |
"2_clean_kg24" | MCXSynthesis2CleanKG24 | 2 | 0 | 最大 6*k-6 CXゲート |
"2_dirty_kg24" | MCXSynthesis2DirtyKG24 | 0 | 2 | 最大 12*k-18 CXゲート |
"1_clean_kg24" | MCXSynthesis1CleanKG24 | 1 | 0 | 最大 6*k-6 CXゲート |
"1_dirty_kg24" | MCXSynthesis1DirtyKG24 | 0 | 1 | 最大 12*k-18 CXゲート |
"1_clean_b95" | MCXSynthesis1CleanB95 | 1 | 0 | 最大 16*k-8 CXゲート |
"default" | MCXSynthesisDefault | 任意 | 任意 | 利用可能なアンシラに基づいて最適なアルゴリズムを選択する |
MCXSynthesisGrayCode() | グレーコードに基づくマルチ制御Xゲートの合成プラグイン。 |
MCXSynthesisNoAuxV24() | マルチ制御Xゲートの合成プラグインは、Valeら(2024)の論文に基づく MCPhaseGate,。 |
MCXSynthesisNoAuxHP24() | HuangとPalsbergの論文に基づくマルチ制御Xゲートの合成プラグイン。 |
MCXSynthesisNCleanM15() | Maslov(2016)の論文に基づくマルチ制御Xゲートの合成プラグイン。 |
MCXSynthesisNDirtyI15() | Itenら(2016)の論文に基づくマルチ制御Xゲートの合成プラグイン。 |
MCXSynthesis2CleanKG24() | KhattarとGidneyの論文(2024年)に基づくマルチ制御Xゲートの合成プラグイン。 |
MCXSynthesis2DirtyKG24() | KhattarとGidneyの論文(2024年)に基づくマルチ制御Xゲートの合成プラグイン。 |
MCXSynthesis1CleanKG24() | KhattarとGidneyの論文(2024年)に基づくマルチ制御Xゲートの合成プラグイン。 |
MCXSynthesis1DirtyKG24() | KhattarとGidneyの論文(2024年)に基づくマルチ制御Xゲートの合成プラグイン。 |
MCXSynthesis1CleanB95() | Barencoら(1995)の論文に基づくマルチ制御Xゲートの合成プラグイン。 |
MCXSynthesisDefault() | マルチコントロールXゲート用のデフォルトの合成プラグイン。 |
MCMT合成
プラグイン名 | プラグイン・クラス | クリーンな付帯設備の数 | 汚れたアンシラの数 | 説明 |
|---|---|---|---|---|
"vchain" | MCMTSynthesisVChain | k-1 | 0 | は、線形数のトッフォリ・ゲートを使用する |
"noaux" | MCMTSynthesisNoAux | 0 | 0 | Qiskitの標準制御機構を使用 |
"xgate" | MCMTSynthesisXGate | 0 | 0 | は、線形数のトッフォリ・ゲートを使用する |
"default" | MCMTSynthesisDefault | 任意 | 任意 | 利用可能なアンシラに基づいて最適なアルゴリズムを選択する |
MCMTSynthesisVChain() | MCMTGate のためのV鎖ベースの合成。 |
MCMTSynthesisNoAux() | MCMTGate のためのV鎖ベースの合成。 |
MCMTSynthesisXGate() | Xゲートをベースゲートとする MCMTGate 。 |
MCMTSynthesisDefault() | MCMTゲートのデフォルト分解。 |
整数比較器
プラグイン名 | プラグイン・クラス | 説明 | 補助量子ビット |
|---|---|---|---|
"twos" | IntComparatorSynthesis2s | 2の補数による加算を使う | n - 1 clean |
"noaux" | IntComparatorSynthesisNoAux | 許容されるすべての整数値で制御されるターゲットを反転させる | なし |
"default" | IntComparatorSynthesisDefault | 利用可能な補助量子ビットに応じて最適なアルゴリズムを使用する | 任意 |
IntComparatorSynthesis2s() | 2s の補数に基づく整数比較。 |
IntComparatorSynthesisNoAux() | 補助量子ビットを使用しない場合、指数関数的に高価な比較になる可能性がある。 |
IntComparatorSynthesisDefault() | IntegerComparatorGate のデフォルト合成。 |
合計
プラグイン名 | プラグイン・クラス | 説明 | 補助量子ビット |
|---|---|---|---|
"default" | WeightedSumSynthesisDefault | Vチェーンベースの合成を使用 | 与えられた s 合計量子ビット、使用 s - 1 + int(s > 2) クリーンな補助量子ビット |
WeightedSumSynthesisDefault() | を合成する。 WeightedSumGate をデフォルトの合成アルゴリズムを使って合成する。 |
パウリ進化合成
プラグイン名 | プラグイン・クラス | 説明 | ターゲット・コネクティビティ |
|---|---|---|---|
"rustiq" | PauliEvolutionSynthesisRustiq | Rustiq回路合成ライブラリの合成メソッドを使用する | オールトゥオール |
"default" | PauliEvolutionSynthesisDefault | 対角化Clifford per Pauli項を使用する | オールトゥオール |
PauliEvolutionSynthesisDefault() | を合成する。 PauliEvolutionGate をデフォルトの合成アルゴリズムを使って合成する。 |
PauliEvolutionSynthesisRustiq() | を合成する。 PauliEvolutionGate Rustiqを使って。 |
モジュラー加算器の合成
プラグイン名 | プラグイン・クラス | クリーンな付帯設備の数 | 説明 |
|---|---|---|---|
"modular_v17" | ModularAdderSynthesisV17 | 0 | 補助量子ビットを持たないモジュラー加算器 |
"ripple_cdkm" | ModularAdderSynthesisC04 | 1 | リップルキャリー加算器 |
"ripple_vbe" | ModularAdderSynthesisV95 | -ビット数 | リップルキャリー加算器 |
"qft" | ModularAdderSynthesisD00 | 0 | QFTベースの加算器 |
"default" | ModularAdderSynthesisDefault | 任意 | 利用可能なアンシラに基づいて最適なアルゴリズムを選択する |
ModularAdderSynthesisV17() | 補助量子ビットのないモジュラー加算器(modulo )。 |
ModularAdderSynthesisC04() | リップルキャリー加算器、モジュロ 。 |
ModularAdderSynthesisD00() | QFTベースの加算器、モジュロ 。 |
ModularAdderSynthesisV95() | リップルキャリー加算器、モジュロ 。 |
ModularAdderSynthesisDefault() | デフォルトのモジュラー加算器(キャリー・インなし、キャリー・アウトなし)の合成。 |
ハーフアダーの合成
プラグイン名 | プラグイン・クラス | クリーンな付帯設備の数 | 説明 |
|---|---|---|---|
"ripple_cdkm" | HalfAdderSynthesisC04 | 1 | リップルキャリー加算器 |
"ripple_r25" | HalfAdderSynthesisR25 | 0 | アンシラなしのリップルキャリー加算器 |
"ripple_vbe" | HalfAdderSynthesisV95 | -ビット数 | リップルキャリー加算器 |
"qft" | HalfAdderSynthesisD00 | 0 | QFTベースの加算器 |
"default" | HalfAdderSynthesisDefault | 任意 | 利用可能なアンシラに基づいて最適なアルゴリズムを選択する |
HalfAdderSynthesisC04() | キャリーアウトビットを持つリップルキャリー加算器。 |
HalfAdderSynthesisD00() | キャリーインビットとキャリーアウトビットを持つQFTベースの加算器。 |
HalfAdderSynthesisV95() | キャリーアウトビットを持つリップルキャリー加算器。 |
HalfAdderSynthesisR25() | 補助量子ビットを持たないキャリーアウトビットを持つリップルキャリー加算器。 |
HalfAdderSynthesisDefault() | デフォルトのハーフ・アダー(キャリー・インはないが、キャリー・アウトはある)合成。 |
フルアダー合成
プラグイン名 | プラグイン・クラス | クリーンな付帯設備の数 | 説明 |
|---|---|---|---|
"ripple_cdkm" | FullAdderSynthesisC04 | 0 | リップルキャリー加算器 |
"ripple_vbe" | FullAdderSynthesisV95 | -ビット数 | リップルキャリー加算器 |
"default" | FullAdderSynthesisDefault | 任意 | 利用可能なアンシラに基づいて最適なアルゴリズムを選択する |
FullAdderSynthesisC04() | キャリーインビットとキャリーアウトビットを持つリップルキャリー加算器。 |
FullAdderSynthesisV95() | キャリーインビットとキャリーアウトビットを持つリップルキャリー加算器。 |
FullAdderSynthesisDefault() | キャリーインビットとキャリーアウトビットを持つリップルキャリー加算器。 |
乗数合成
プラグイン名 | プラグイン・クラス | クリーンな付帯設備の数 | 説明 |
|---|---|---|---|
"cumulative" | MultiplierSynthesisH18 | 使用する AdderGate による | 制御加算器に基づく累積加算器 |
"qft" | MultiplierSynthesisR17 | 0 | QFTベースの乗算器 |
"default" | MultiplierSynthesisDefault | 任意 | 利用可能なアンシラに基づいて最適なアルゴリズムを選択する |
MultiplierSynthesisH18() | 制御加算器に基づく累積乗算器。 |
MultiplierSynthesisR17() | QFTベースの乗算器。 |
MultiplierSynthesisDefault() | デフォルトの乗数プラグイン。 |