Synthese-Plugins
qiskit.transpiler.passes.synthesis.plugin
Dieses Modul definiert die Plugin-Schnittstellen für die Synthese-Transpiler-Pässe in Qiskit. Diese bieten einen Hook-Point für externe Python-Pakete, um ihre eigenen Synthesetechniken zu implementieren und sie nahtlos als Opt-In-Optionen für Benutzer anzuzeigen, wenn sie die transpile().
Die Plugin-Schnittstellen werden mit Hilfe von setuptools-Einstiegspunkten erstellt, die es Paketen außerhalb von qiskit ermöglichen, anzuzeigen, dass sie ein Synthese-Plugin enthalten.
Siehe qiskit.transpiler.preset_passmanagers.plugin für Details, wie man Plugins für Transpiler-Stufen schreibt.
Synthesis-Plugin-API
Unitary Synthesis Plugin API
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
UnitarySynthesisPlugin() | Abstrakte unitäre Synthese-Plugin-Klasse |
UnitarySynthesisPluginManager() | Unitäre Synthese-Plugin-Manager-Klasse |
unitary_synthesis_plugin_names() | Gibt eine Liste der installierten unitären Synthese-Plugin-Namen zurück |
Plugin-API für High-Level-Synthese
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
HighLevelSynthesisPlugin() | Abstrakte High-Level-Synthese-Plugin-Klasse. |
HighLevelSynthesisPluginManager() | Klasse, die die installierten High-Level-Synthese-Plugins verfolgt. |
high_level_synthesis_plugin_names(op_name) | Gibt eine Liste von Plugin-Namen zurück, die für einen gegebenen High-Level-Objektnamen installiert wurden |
Plugins schreiben
Unitary Synthesis Plugins
Um ein Unitary-Synthese-Plugin zu schreiben, sind zwei Hauptschritte erforderlich. Der erste Schritt besteht darin, eine Unterklasse der abstrakten Plugin-Klasse zu erstellen: UnitarySynthesisPlugin. Die Plugin-Klasse definiert die Schnittstelle und den Vertrag für Plugins zur unitären Synthese. Die primäre Methode ist run() , die ein einzelnes Positionsargument sowie eine unitäre Matrix als NumPy-Array entgegennimmt und ein DAGCircuit Objekt zurückgeben soll, das die aus dieser unitären Matrix synthetisierte Schaltung darstellt. Um dem Qiskit-Transpiler mitzuteilen, welche Informationen für den Durchlauf erforderlich sind, müssen mehrere obligatorische Eigenschaftsmethoden implementiert werden, wie beispielsweise supports_basis_gates und supports_coupling_map , je nachdem, ob das Plugin diese Eingabe zur Durchführung der Synthese unterstützt und/oder benötigt. Ausführliche Informationen zu allen Pflichtfeldern finden Sie in der UnitarySynthesisPlugin Dokumentation. Eine Beispielklasse für ein Plugin könnte etwa so aussehen:
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_circuitSollten die verfügbaren Eingaben für die run() Methode aus irgendeinem Grund nicht ausreichen, eröffnen Sie bitte ein Ticket, damit wir die Erweiterung der Plugin-Schnittstelle um neue, optional hinzuzufügende Eingaben besprechen können, die in zukünftigen Versionen rückwärtskompatibel hinzugefügt werden können. Beachten Sie jedoch, dass diese Plugin-Schnittstelle als stabil gilt und garantiert keine Änderungen erfolgt, die zu Kompatibilitätsproblemen führen würden. Sollten Änderungen erforderlich sein (beispielsweise zur Erweiterung der verfügbaren optionalen Eingabeoptionen), werden diese so vorgenommen, dass keine Anpassungen an bestehenden Plugins erforderlich sind.
Alle Methoden mit dem Präfix supports_ sind auf einer UnitarySynthesisPlugin abgeleiteten Klasse für einen Teil der Schnittstelle reserviert. Sie sollten keine benutzerdefinierten supports_* Methoden in einer Unterklasse definieren, die nicht in der abstrakten Klasse definiert sind.
Der zweite Schritt besteht darin, das UnitarySynthesisPlugin als Setuptools-Einstiegspunkt in den Paketmetadaten bereitzustellen. Dazu wird einfach eine entry-points Tabelle im pyproject.toml Plugin-Paket mit den erforderlichen Einstiegspunkten unter dem qiskit.unitary_synthesis Namespace hinzugefügt. Zum Beispiel:
[project.entry-points."qiskit.unitary_synthesis"]
"special" = "qiskit_plugin_pkg.module.plugin:SpecialUnitarySynthesis"Es gibt keine Begrenzung für die Anzahl der Plugins, die ein einzelnes Paket enthalten kann, solange jedes Plugin einen eindeutigen Namen hat. So kann ein einzelnes Paket bei Bedarf mehrere Plugins bereitstellen. Der Name default wird von Qiskit selbst verwendet und kann nicht in einem Plugin verwendet werden.
Konfiguration des Unitary Synthesis Plugins
Bei einigen unitären Synthese-Plugins, die mehrere Optionen und Einstellmöglichkeiten bieten, hat die Plugin-Schnittstelle eine Option, mit der der Benutzer ein freies Konfigurationswörterbuch erstellen kann. Dieser wird als options kwarg an die Methode run() weitergegeben. Wenn Ihr Plugin über diese Konfigurationsoptionen verfügt, sollten Sie klar dokumentieren, wie ein Benutzer diese Konfigurationsoptionen angeben sollte und wie sie verwendet werden, da es sich um ein Freiformfeld handelt.
Plugins für die High-Level-Synthese
Das Erstellen eines Plugins für die High-Level-Synthese ähnelt konzeptionell dem Erstellen eines Plugins für die unitäre Synthese. Der erste Schritt besteht darin, eine Unterklasse der abstrakten Plugin-Klasse zu erstellen: HighLevelSynthesisPlugin, die die Schnittstelle und den Vertrag für Plugins zur High-Level-Synthese definiert. Die wichtigste Methode ist run(). Das Positionsargument high_level_object gibt das zu synthetisierende „übergeordnete Objekt“ an, bei dem es sich um ein beliebiges Objekt vom Typ Operation handelt (einschließlich beispielsweise LinearFunction oder Clifford). Das Schlüsselwort-Argument target gibt das Ziel-Backend an und ermöglicht es dem Plugin, auf alle zielspezifischen Informationen zuzugreifen, wie beispielsweise die Kopplungskarte, den unterstützten Gate-Satz und so weiter. Das Schlüsselwort-Argument coupling_map gibt lediglich die Kopplungsabbildung an und wird nur verwendet, wenn target nicht angegeben ist. Das Schlüsselwort-Argument qubits gibt die Liste der Qubits an, über die das übergeordnete Objekt definiert ist, falls die Synthese auf der physikalischen Schaltung erfolgt. Der Wert von None bedeutet, dass das Layout noch nicht ausgewählt wurde und die physikalischen Qubits in der Ziel- oder Kopplungskarte, auf die diese Operation angewendet wird, noch nicht festgelegt wurden. optionsDarüber hinaus können plugin-spezifische Optionen und Einstellparameter über angegeben werden, bei dem es sich um ein frei formatierbares Konfigurationswörterbuch handelt. Falls Ihr Plugin über diese Konfigurationsoptionen verfügt, sollten Sie klar dokumentieren, wie ein Benutzer diese Konfigurationsoptionen festlegen soll und wie sie verwendet werden, da es sich um ein Freitextfeld handelt. Es wird erwartet, dass die Methode run() ein QuantumCircuit Objekt zurückgibt, das die aus diesem übergeordneten Objekt synthetisierte Schaltung darstellt. Es ist auch zulässig, einen Wert zurückzugeben None , der angibt, dass die Synthesemethode das angegebene übergeordnete Objekt nicht synthetisieren kann. Die eigentliche Synthese von Objekten höherer Ebene erfolgt im HighLevelSynthesis Transpiler-Durchlauf. Ausführliche Informationen zu allen Pflichtfeldern finden Sie in der HighLevelSynthesisPlugin Dokumentation. Eine Beispielklasse für ein Plugin könnte etwa so aussehen:
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 Nonesynth_clifford_bmIm obigen Beispiel wird ein Plugin erstellt, das Objekte vom Typ Clifford mit höchstens 3 Qubits mithilfe der Methode synthetisiert.
Der zweite Schritt besteht darin, das HighLevelSynthesisPlugin als Setuptools-Einstiegspunkt in den Paketmetadaten bereitzustellen. Dazu wird im pyproject.toml Plugin-Paket eine entry-points Tabelle mit den erforderlichen Einstiegspunkten unter dem qiskit.synthesis Namespace hinzugefügt. Zum Beispiel:
[project.entry-points."qiskit.synthesis"]
"clifford.special" = "qiskit_plugin_pkg.module.plugin:SpecialSynthesisClifford"Die name besteht aus zwei Teilen, die durch einen Punkt „.“ voneinander getrennt sind: den Namen des Typs, Operation auf den das Synthese-Plugin angewendet wird (clifford), und den Namen des Plugins (special). Es gibt keine Begrenzung hinsichtlich der Anzahl der Plugins, die ein einzelnes Paket enthalten kann, solange jedes Plugin einen eindeutigen Namen hat.
Verwendung von Plugins
Unitary Synthesis Plugins
Um ein Plugin zu verwenden, müssen Sie nur das Paket installieren, das ein Synthese-Plugin enthält. Dann erkennt Qiskit automatisch die installierten Plugins und stellt sie als gültige Optionen für die entsprechenden transpile() kwargs und übergeben Konstruktoren. Wenn es installierte Plugins gibt, die nicht geladen/importiert werden können, wird dies unter Python logging protokolliert.
Um eine Liste der installierten Unitary-Synthese-Plugins abzurufen, können Sie die qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() Funktion verwenden.
Plugins für die hochrangige Synthese
Um ein Plugin für die High-Level-Synthese zu verwenden, instanziieren Sie zunächst ein HLSConfig , um die Namen der Plugins zu speichern, die für verschiedene High-Level-Objekte verwendet werden sollen. Zum Beispiel:
HLSConfig(permutation=["acg"], clifford=["layers"], linear_function=["pmh"])Erstellt eine High-Level-Synthese-Konfiguration, die das acg Plugin zur Synthese PermutationGate von Objekten, das layers Plugin zur Synthese Clifford von Objekten und das pmh Plugin zur Synthese LinearFunction von Objekten verwendet. Die Schlüsselwortargumente sind die Operation.name Felder der entsprechenden Objekte. Beispielsweise verfügen alle Clifford Operationen über das nameclifford , weshalb dies als Schlüsselwortargument verwendet wird. Sie können hier jedes Schlüsselwortargument angeben, für dessen Verarbeitung Sie Plugins installiert haben, einschließlich benutzerdefinierter Objekte, sofern Sie dafür Plugins installiert haben. Weitere Informationen zu alternativen Formaten für die Konfiguration der Plugins innerhalb der einzelnen Argumente finden HLSConfig Sie hier.
Für jedes High-Level-Objekt wird die Liste der angegebenen Plugins nacheinander ausprobiert, bis eines davon erfolgreich ist (im obigen Beispiel enthält jede Liste nur ein einziges Plugin). Zusätzlich zur Angabe eines Plugins durch seinen Namen können Sie stattdessen auch ein (name, options) Tupel übergeben, wobei das zweite Element des Tupels ein Wörterbuch ist, das Optionen für das Plugin enthält.
Sobald das HLSConfig Objekt erstellt ist, übergeben Sie es als Argument hls_config an transpile() oder generate_preset_pass_manager() , wodurch die angegebenen Plugins im Rahmen des übergeordneten Kompilierungsworkflows verwendet werden.
Um eine Liste der installierten Plugins für die High-Level-Synthese für ein beliebiges Operation.nameProjekt zu erhalten, können Sie die high_level_synthesis_plugin_names() Funktion verwenden und dabei das gewünschte name Projekt als Argument übergeben:
high_level_synthesis_plugin_names("clifford")gibt eine Liste aller installierten Clifford-Synthese-Plugins zurück.
Verfügbare Plug-ins
Nachfolgend finden Sie die in Qiskit verfügbaren Synthese-Plugin-Klassen. Diese Klassen sollten nicht direkt verwendet werden, sondern über die oben dokumentierte Plugin-Schnittstelle. Die Klassen sind hier aufgelistet, um das Auffinden der Dokumentation für jedes der enthaltenen Plugins zu erleichtern und um den Vergleich zwischen verschiedenen Synthesemethoden für ein bestimmtes Objekt zu erleichtern.
Unitary Synthesis Plugins
AQC-Synthese-Plugin
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
AQCSynthesisPlugin() | Ein AQC-basiertes Qiskit-Einheitssynthese-Plugin. |
Solovay-Kitaev-Synthese-Plugin
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
SolovayKitaevSynthesis() | Ein Solovay-Kitaev-Qiskit-Unitar-Synthese-Plugin. |
Ross-Selinger-Synthese-Plugin
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
RossSelingerSynthesis() | Ein Plugin zur unitären Synthese von Ross-Selinger-Qiskits. |
Clifford Unitary Synthesis Plugin
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
CliffordUnitarySynthesis() | Ein Clifford-Plugin für die unitäre Synthese. |
Standardmäßiges einheitliches Synthese-Plugin
Das Standard-Plugin für die unitäre Synthese definiert den Standardalgorithmus, der vom UnitarySynthesis Transpiler-Durchlauf zur Synthese der unitären Gatter in der Schaltung verwendet wird. Sein Verhalten hängt von der Anzahl der Qubits in der Ziel-Unitarität und der Zielbasis ab.
Kontinuierliche Basissätze
Wenn die Zielbasis kontinuierlich ist (d. h. nicht Clifford+T), verwendet das Plugin die folgenden Zerlegungen:
- 1-Qubit-Gatter: Eulerwinkel-Zerlegungen (siehe
OneQubitEulerDecomposer). - 2-Qubit-Gatter: KAK-/Cartan-Zerlegungen (siehe
TwoQubitBasisDecomposer,TwoQubitControlledUDecomposer,XXDecomposer). - 3+ Qubit-Gatter: Quanten-Shannon-Zerlegung, siehe
qs_decomposition().
Bei 1- und 2-Qubit-Gates verwendet das Plugin die Basisfehlerinformationen vom Ziel, um die Zerlegung auszuwählen, die die erwartete Genauigkeit maximiert.
Clifford+T-Basissätze
Wenn die Zielbasis Clifford+T ist, verwendet das Plugin den Solovay-Kitaev-Algorithmus (siehe SolovayKitaevDecomposition), um 1-Qubit-Unitarien zu approximieren. Die zur Erstellung grundlegender Näherungswerte verwendeten Parameter sind basis_gates=["h", "t", "tdg"], depth=12 und recursion_degree=5; sie wurden empirisch ausgewählt, um ein Gleichgewicht zwischen der Qualität der Näherung und dem Rechenaufwand herzustellen. Um Solovay-Kitaev mit benutzerdefinierten Parametern zu verwenden oder um eine erneute Berechnung der Näherungswerte für mehrere Schaltungen zu vermeiden, können Sie anstelle dieses Standard-Plugins das Plugin „Unitary Synthesis“ aufrufen SolovayKitaevSynthesis .
Derzeit enthält Qiskit keine Algorithmen zur direkten Approximation von 2+-Qubit-Unitaritäten im Clifford+T-Basissatz. Daher zerlegt der voreingestellte Pass-Manager solche Gates zunächst in ["cx", "u"] Basis und wendet dann Solovay-Kitaev auf die resultierenden 1-Qubit-Unitary-Gates an.
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
DefaultUnitarySynthesis() | Das standardmäßige Plugin für die einheitliche Synthese. |
Hochrangige Synthese
Zu den Plugins für die High-Level-Synthese, die direkt in Qiskit verfügbar sind, gehören Plugins zur Synthese von Clifford Objekten, LinearFunction Objekten und PermutationGate Objekten. Einige dieser Plugins zielen implizit auf eine „All-to-All“-Konnektivität ab. Dies stellt keine praktische Einschränkung dar, da HighLevelSynthesis in der Regel vor dem Layout und dem Routing ausgeführt wird, wodurch durch das Einfügen zusätzlicher SWAP-Gates sichergestellt wird, dass die endgültige Schaltung den Anschlussanforderungen des Bausteins entspricht. Ein gutes Beispiel ist das Permutationssynthese-Plugin ACGSynthesisPermutation , das jede beliebige Permutation mit höchstens zwei Ebenen von SWAP-Gattern synthetisieren kann. Andererseits zielen einige Plugins implizit auf lineare Konnektivität ab. In der Regel weisen die Syntheseschaltungen eine größere Tiefe und eine höhere Anzahl an Gatter auf; es würden jedoch keine zusätzlichen SWAP-Gatter eingefügt, wenn beim folgenden Layout-Durchlauf eine zusammenhängende Reihe von Qubits innerhalb der Topologie des Bausteins ausgewählt würde. nEin gutes Beispiel hierfür ist das Permutationssynthese-Plugin KMSSynthesisPermutation , das jede beliebige Permutation von n Qubits in der Tiefe synthetisieren kann. In der Regel lässt sich im Voraus nur schwer sagen, welcher der beiden Ansätze – die Synthese von Schaltungen für eine All-zu-All-Konnektivität und das Einfügen von SWAP-Gattern oder die Synthese von Schaltungen für lineare Konnektivität und das Einfügen von weniger oder gar keinen SWAP-Gattern – zu einer besseren Endschaltung führt. Daher ist es wahrscheinlich sinnvoll, beide Ansätze auszuprobieren und zu prüfen, welcher die besseren Ergebnisse liefert. Schließlich können einige Plugins auf eine bestimmte Verbindung ausgerichtet sein und sollten daher erst ausgeführt werden, nachdem das Layout festgelegt wurde. In diesem Fall passt sich die synthetisierte Schaltung automatisch an die Topologie des Bausteins an. Ein gutes Beispiel hierfür ist das Permutationssynthese-Plugin TokenSwapperSynthesisPermutation , das in der Lage ist, beliebige Permutationen in Bezug auf beliebige Kopplungsabbildungen zu synthetisieren. Weitere Informationen finden Sie in der Beschreibung der einzelnen Plugins.
Für jedes High-Level-Objekt stellen wir eine Tabelle bereit, in der alle Plugins aufgelistet sind, die direkt in Qiskit verfügbar sind. Wir geben den Namen des Plugins, die Klasse des Plugins, die betreffende Konnektivitätszuordnung und optional weitere Informationen an. HLSConfigDenken Sie daran, dass die Plugins über die zuvor beschriebene Methode verwendet werden sollten, zum Beispiel:
HLSConfig(permutation=["kms"])erstellt eine High-Level-Synthese-Konfiguration, die das kms Plugin zur Synthese PermutationGate von Objekten verwendet – d. h. solche mit name = "permutation". In diesem Fall lautet der Plugin-Name „kms“, die Plugin-Klasse ist KMSSynthesisPermutation. Dieser spezielle Synthesealgorithmus erzeugte eine Schaltung, die der linearen „Nearest-Neighbor“-Konnektivität entspricht.
Plugins für die High-Level-Synthese
Clifford-Synthese
Plug-in-Name | Plug-in-Klasse | Gezielte Konnektivität | Beschreibung |
|---|---|---|---|
"ag" | AGSynthesisClifford | alles-zu-alles | optimiert gierig die CX-Zahl |
"bm" | BMSynthesisClifford | alles-zu-alles | Optimale Anzahl für ; verwendet in "default" für |
"greedy" | GreedySynthesisClifford | alles-zu-alles | Optimiert die CX-Anzahl auf aggressive Weise; wird in „ "default" “ verwendet |
"layers" | LayerSynthesisClifford | alles-zu-alles | |
"lnn" | LayerLnnSynthesisClifford | linear | viele CX-Gates, garantiert jedoch eine CX-Tiefe von höchstens |
"default" | DefaultSynthesisClifford | alles-zu-alles | in der Regel am besten geeignet zur Optimierung der CX-Zahl (und optimale CX-Zahl für ) |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
AGSynthesisClifford() | Clifford-Synthese-Plugin auf der Grundlage der Aaronson-Gottesman-Methode. |
BMSynthesisClifford() | Clifford-Synthese-Plugin auf der Grundlage der Bravyi-Maslov-Methode. |
GreedySynthesisClifford() | Clifford-Synthese-Plugin auf der Grundlage der gierigen Synthesemethode Bravyi-Hu-Maslov-Shaydulin. |
LayerSynthesisClifford() | Clifford-Synthese-Plugin auf der Grundlage der Bravyi-Maslov-Methode zur Synthese von Cliffords in Schichten. |
LayerLnnSynthesisClifford() | Das Clifford-Synthese-Plugin basiert auf der Bravyi-Maslov-Methode zur Synthese von Cliffords in Schichten, wobei jede synthetisierte Schicht die LNN-Konnektivität beachtet. |
DefaultSynthesisClifford() | Das Standard-Plugin für die Clifford-Synthese. |
Lineare Funktionssynthese
Plug-in-Name | Plug-in-Klasse | Gezielte Konnektivität | Beschreibung |
|---|---|---|---|
"kms" | KMSSynthesisLinearFunction | linear | viele CX-Gates, garantiert jedoch eine CX-Tiefe von höchstens |
"pmh" | PMHSynthesisLinearFunction | alles-zu-alles | optimiert gierig die CX-Zahl; verwendet in "default" |
"default" | DefaultSynthesisLinearFunction | alles-zu-alles | am besten für die Optimierung der CX-Zahl |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
KMSSynthesisLinearFunction() | Plugin zur Synthese linearer Funktionen auf der Grundlage der Kutin-Moulton-Smithline-Methode. |
PMHSynthesisLinearFunction() | Plugin für die Synthese linearer Funktionen auf der Grundlage der Patel-Markov-Hayes-Methode. |
DefaultSynthesisLinearFunction() | Das Standard-Plugin für die Synthese linearer Funktionen. |
Permutationssynthese
Plug-in-Name | Plug-in-Klasse | Gezielte Konnektivität | Beschreibung |
|---|---|---|---|
"basic" | BasicSynthesisPermutation | alles-zu-alles | optimale SWAP-Zahl; verwendet in "default" |
"acg" | ACGSynthesisPermutation | alles-zu-alles | garantiert eine SWAP-Tiefe von höchstens |
"kms" | KMSSynthesisPermutation | linear | viele SWAP-Gates, garantiert jedoch eine SWAP-Tiefe von höchstens |
"token_swapper" | TokenSwapperSynthesisPermutation | beliebig | optimiert gierig die SWAP-Anzahl für beliebige Konnektivität |
"default" | BasicSynthesisPermutation | alles-zu-alles | am besten für die Optimierung der SWAP-Zahl |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
BasicSynthesisPermutation() | Das Permutationssynthese-Plugin basiert auf einer Sortierung. |
ACGSynthesisPermutation() | Das Permutationssynthese-Plugin basiert auf der Methode von Alon, Chung und Graham. |
KMSSynthesisPermutation() | Das Permutationssynthese-Plugin basiert auf der Methode von Kutin, Moulton und Smithline. |
TokenSwapperSynthesisPermutation() | Das Permutationssynthese-Plugin basiert auf dem Token-Swapper-Algorithmus. |
QFT-Synthese
Plug-in-Name | Plug-in-Klasse | Gezielte Konnektivität |
|---|---|---|
"full" | QFTSynthesisFull | alles-zu-alles |
"line" | QFTSynthesisLine | linear |
"default" | QFTSynthesisFull | alles-zu-alles |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
QFTSynthesisFull() | Synthese-Plugin für QFT-Gatter mit All-to-All-Verbindungen. |
QFTSynthesisLine() | Synthese-Plugin für QFT-Gatter mit linearer Konnektivität. |
MCX-Synthese
In der folgenden Tabelle sind die für ein MCXGate Gate mit k Steuerqubits verfügbaren Synthese-Plugins aufgeführt. Wenn die Anzahl der verfügbaren „sauberen“ bzw. „verschmutzten“ Hilfsqubits nicht ausreicht, gibt die entsprechende Synthesemethode „None“ zurück.
Plug-in-Name | Plug-in-Klasse | Anzahl der sauberen Hilfsmittel | Anzahl der verschmutzten Ancillas | Beschreibung |
|---|---|---|---|---|
"gray_code" | MCXSynthesisGrayCode | 0 | 0 | exponentiell viele CX-Gatter; nur für kleine Werte von verwenden |
"noaux_v24" | MCXSynthesisNoAuxV24 | quadratische Anzahl von CX-Gattern | ||
"noaux_hp24" | MCXSynthesisNoAuxHP24 | lineare Anzahl von CX-Gattern; wird anstelle von oder "noaux_v24" für "gray_code" „ “ verwendet | ||
"n_clean_m15" | MCXSynthesisNCleanM15 | höchstens CX-Gates | ||
"n_dirty_i15" | MCXSynthesisNDirtyI15 | höchstens CX-Gates | ||
"2_clean_kg24" | MCXSynthesis2CleanKG24 | höchstens CX-Gates | ||
"2_dirty_kg24" | MCXSynthesis2DirtyKG24 | 0 | 2 | höchstens CX-Gates |
"1_clean_kg24" | MCXSynthesis1CleanKG24 | 1 | 0 | höchstens CX-Gates |
"1_dirty_kg24" | MCXSynthesis1DirtyKG24 | höchstens CX-Gates | ||
"1_clean_b95" | MCXSynthesis1CleanB95 | höchstens CX-Gates | ||
"default" | MCXSynthesisDefault | beliebig | beliebig | wählt den besten Algorithmus auf der Grundlage der verfügbaren Hilfsmittel aus |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
MCXSynthesisGrayCode() | Synthese-Plugin für ein mehrfach gesteuertes X-Gatter auf der Grundlage des Gray-Codes. |
MCXSynthesisNoAuxV24() | Synthese-Plugin für ein mehrfach gesteuertes X-Gatter auf der Grundlage der Implementierung für MCPhaseGate,, die wiederum auf der Arbeit von Vale et al. (2024) basiert. |
MCXSynthesisNoAuxHP24() | Synthese-Plugin für ein mehrfach kontrolliertes X-Gatter auf der Grundlage der Arbeit von Huang und Palsberg. |
MCXSynthesisNCleanM15() | Synthese-Plugin für ein mehrfach gesteuertes X-Gatter auf der Grundlage des Papiers von Maslov (2016). |
MCXSynthesisNDirtyI15() | Synthese-Plugin für ein mehrfach gesteuertes X-Gatter auf der Grundlage der Arbeit von Iten et al. (2016). |
MCXSynthesis2CleanKG24() | Synthese-Plugin für ein mehrfach kontrolliertes X-Gatter auf der Grundlage der Arbeit von Khattar und Gidney (2024). |
MCXSynthesis2DirtyKG24() | Synthese-Plugin für ein mehrfach kontrolliertes X-Gatter auf der Grundlage der Arbeit von Khattar und Gidney (2024). |
MCXSynthesis1CleanKG24() | Synthese-Plugin für ein mehrfach kontrolliertes X-Gatter auf der Grundlage der Arbeit von Khattar und Gidney (2024). |
MCXSynthesis1DirtyKG24() | Synthese-Plugin für ein mehrfach kontrolliertes X-Gatter auf der Grundlage der Arbeit von Khattar und Gidney (2024). |
MCXSynthesis1CleanB95() | Synthese-Plugin für ein mehrfach kontrolliertes X-Gatter auf der Grundlage der Arbeit von Barenco et al. (1995). |
MCXSynthesisDefault() | Das Standard-Synthese-Plugin für ein mehrfach kontrolliertes X-Gate. |
MCMT-Synthese
Plug-in-Name | Plug-in-Klasse | Anzahl der sauberen Hilfsmittel | Anzahl der verschmutzten Ancillas | Beschreibung |
|---|---|---|---|---|
"vchain" | MCMTSynthesisVChain | verwendet eine lineare Anzahl von Toffoli-Gattern | ||
"noaux" | MCMTSynthesisNoAux | verwendet den Standard-Kontrollmechanismus von Qiskit | ||
"xgate" | MCMTSynthesisXGate | verwendet eine lineare Anzahl von Toffoli-Gattern | ||
"default" | MCMTSynthesisDefault | beliebig | beliebig | wählt den besten Algorithmus auf der Grundlage der verfügbaren Hilfsmittel aus |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
MCMTSynthesisVChain() | Eine V-Ketten-basierte Synthese für MCMTGate. |
MCMTSynthesisNoAux() | Eine V-Ketten-basierte Synthese für MCMTGate. |
MCMTSynthesisXGate() | Eine Synthese für MCMTGate mit X-Gate als Basis-Gate. |
MCMTSynthesisDefault() | Eine Standard-Zerlegung für MCMT-Gatter. |
Ganzzahlige Komparatoren
Plug-in-Name | Plug-in-Klasse | Beschreibung | Hilfsqubits |
|---|---|---|---|
"twos" | IntComparatorSynthesis2s | addition mit Zweierkomplement verwenden | sauber |
"noaux" | IntComparatorSynthesisNoAux | spiegeln Sie das Ziel kontrolliert auf allen erlaubten ganzzahligen Werten | keine |
"default" | IntComparatorSynthesisDefault | den besten Algorithmus in Abhängigkeit von den verfügbaren Hilfsqubits verwenden | beliebig |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
IntComparatorSynthesis2s() | Ein ganzzahliger Vergleich auf der Grundlage des 2s -Komplements. |
IntComparatorSynthesisNoAux() | Ein potenziell exponentiell teurer Vergleich ohne Hilfsqubits. |
IntComparatorSynthesisDefault() | Die Standardsynthese für IntegerComparatorGate. |
Summen
Plug-in-Name | Plug-in-Klasse | Beschreibung | Hilfsqubits |
|---|---|---|---|
"default" | WeightedSumSynthesisDefault | eine auf V-Ketten basierende Synthese verwenden | n summen-Qubits, davon saubere Hilfsqubits |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
WeightedSumSynthesisDefault() | Synthetisiere ein WeightedSumGate unter Verwendung des Standard-Synthesealgorithmus. |
Pauli-Evolution-Synthese
Plug-in-Name | Plug-in-Klasse | Beschreibung | Gezielte Konnektivität |
|---|---|---|---|
"rustiq" | PauliEvolutionSynthesisRustiq | die Synthesemethode der Rustiq-Schaltungssynthesebibliothek verwenden | alles-zu-alles |
"default" | PauliEvolutionSynthesisDefault | einen diagonalisierenden Clifford-Pauli-Term verwenden | alles-zu-alles |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
PauliEvolutionSynthesisDefault() | Synthetisiere ein PauliEvolutionGate unter Verwendung des Standard-Synthesealgorithmus. |
PauliEvolutionSynthesisRustiq() | Erstellen Sie ein PauliEvolutionGate mit Rustiq. |
Modulare Addierer-Synthese
Plug-in-Name | Plug-in-Klasse | Anzahl der sauberen Hilfsmittel | Beschreibung |
|---|---|---|---|
"modular_v17" | ModularAdderSynthesisV17 | ein modularer Addierer ohne zusätzliche Qubits | |
"ripple_cdkm" | ModularAdderSynthesisC04 | einen Ripple-Carry-Addierer | |
"ripple_vbe" | ModularAdderSynthesisV95 | für -bit Zahlen | einen Ripple-Carry-Addierer |
"qft" | ModularAdderSynthesisD00 | ein QFT-basierter Addierer | |
"default" | ModularAdderSynthesisDefault | beliebig | wählt den besten Algorithmus auf der Grundlage der verfügbaren Hilfsmittel aus |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
ModularAdderSynthesisV17() | Ein modularer Addierer (modulo ) ohne zusätzliche Qubits. |
ModularAdderSynthesisC04() | Ein Ripple-Carry-Addierer, modulo . |
ModularAdderSynthesisD00() | Ein QFT-basierter Addierer, modulo . |
ModularAdderSynthesisV95() | Ein Ripple-Carry-Addierer, modulo . |
ModularAdderSynthesisDefault() | Die Standardsynthese des modularen Addierers (kein Carry-in, kein Carry-out-Qubit). |
Halbaddierer-Synthese
Plug-in-Name | Plug-in-Klasse | Anzahl der sauberen Hilfsmittel | Beschreibung |
|---|---|---|---|
"ripple_cdkm" | HalfAdderSynthesisC04 | einen Ripple-Carry-Addierer | |
"ripple_r25" | HalfAdderSynthesisR25 | ein Ripple-Carry-Addierer ohne Hilfsmittel | |
"ripple_vbe" | HalfAdderSynthesisV95 | für -bit Zahlen | einen Ripple-Carry-Addierer |
"qft" | HalfAdderSynthesisD00 | ein QFT-basierter Addierer | |
"default" | HalfAdderSynthesisDefault | beliebig | wählt den besten Algorithmus auf der Grundlage der verfügbaren Hilfsmittel aus |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
HalfAdderSynthesisC04() | Ein Ripple-Carry-Addierer mit einem Carry-Out-Bit. |
HalfAdderSynthesisD00() | Ein QFT-basierter Addierer mit einem Carry-In- und einem Carry-Out-Bit. |
HalfAdderSynthesisV95() | Ein Ripple-Carry-Addierer mit einem Carry-Out-Bit. |
HalfAdderSynthesisR25() | Ein Ripple-Carry-Addierer mit einem Carry-Out-Bit ohne Hilfsqubits. |
HalfAdderSynthesisDefault() | Die standardmäßige Halbaddierer-Synthese (kein Carry-in, aber ein Carry-out-Qubit). |
Volladder-Synthese
Plug-in-Name | Plug-in-Klasse | Anzahl der sauberen Hilfsmittel | Beschreibung |
|---|---|---|---|
"ripple_cdkm" | FullAdderSynthesisC04 | einen Ripple-Carry-Addierer | |
"ripple_vbe" | FullAdderSynthesisV95 | für -bit Zahlen | einen Ripple-Carry-Addierer |
"default" | FullAdderSynthesisDefault | beliebig | wählt den besten Algorithmus auf der Grundlage der verfügbaren Hilfsmittel aus |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
FullAdderSynthesisC04() | Ein Ripple-Carry-Addierer mit einem Carry-In- und einem Carry-Out-Bit. |
FullAdderSynthesisV95() | Ein Ripple-Carry-Addierer mit einem Carry-In- und einem Carry-Out-Bit. |
FullAdderSynthesisDefault() | Ein Ripple-Carry-Addierer mit einem Carry-In- und einem Carry-Out-Bit. |
Multiplikator-Synthese
Plug-in-Name | Plug-in-Klasse | Anzahl der sauberen Hilfsmittel | Beschreibung |
|---|---|---|---|
"cumulative" | MultiplierSynthesisH18 | abhängig von der verwendeten AdderGate | ein kumulativer Addierer auf der Grundlage von gesteuerten Addierern |
"qft" | MultiplierSynthesisR17 | ein QFT-basierter Multiplikator | |
"default" | MultiplierSynthesisDefault | beliebig | wählt den besten Algorithmus auf der Grundlage der verfügbaren Hilfsmittel aus |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
MultiplierSynthesisH18() | Ein kumulativer Multiplizierer, der auf gesteuerten Addierern basiert. |
MultiplierSynthesisR17() | Ein QFT-basierter Multiplikator. |
MultiplierSynthesisDefault() | Das Standard-Multiplikator-Plugin. |