Skip to main content
IBM Quantum Platform

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_circuit

Sollten 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.

Anmerkung

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 None

synth_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:

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"AGSynthesisCliffordalles-zu-allesoptimiert gierig die CX-Zahl
"bm"BMSynthesisCliffordalles-zu-allesOptimale Anzahl für n∈{2,3}n \in \{2,3\}; verwendet in "default" für n∈{2,3}n \in \{2,3\}
"greedy"GreedySynthesisCliffordalles-zu-allesOptimiert die CX-Anzahl auf aggressive Weise; wird in „ n≥4n\geq 4"default" “ verwendet
"layers"LayerSynthesisCliffordalles-zu-alles
"lnn"LayerLnnSynthesisCliffordlinearviele CX-Gates, garantiert jedoch eine CX-Tiefe von höchstens 7n+27n+2
"default"DefaultSynthesisCliffordalles-zu-allesin der Regel am besten geeignet zur Optimierung der CX-Zahl (und optimale CX-Zahl für n∈{2,3}n \in \{2,3\} )
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"KMSSynthesisLinearFunctionlinearviele CX-Gates, garantiert jedoch eine CX-Tiefe von höchstens 5n5n
"pmh"PMHSynthesisLinearFunctionalles-zu-allesoptimiert gierig die CX-Zahl; verwendet in "default"
"default"DefaultSynthesisLinearFunctionalles-zu-allesam 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"BasicSynthesisPermutationalles-zu-allesoptimale SWAP-Zahl; verwendet in "default"
"acg"ACGSynthesisPermutationalles-zu-allesgarantiert eine SWAP-Tiefe von höchstens 22
"kms"KMSSynthesisPermutationlinearviele SWAP-Gates, garantiert jedoch eine SWAP-Tiefe von höchstens nn
"token_swapper"TokenSwapperSynthesisPermutationbeliebigoptimiert gierig die SWAP-Anzahl für beliebige Konnektivität
"default"BasicSynthesisPermutationalles-zu-allesam 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"QFTSynthesisFullalles-zu-alles
"line"QFTSynthesisLinelinear
"default"QFTSynthesisFullalles-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"MCXSynthesisGrayCode00exponentiell viele CX-Gatter; nur für kleine Werte von kk verwenden
"noaux_v24"MCXSynthesisNoAuxV240000quadratische Anzahl von CX-Gattern
"noaux_hp24"MCXSynthesisNoAuxHP240000lineare Anzahl von CX-Gattern; wird anstelle von oder "noaux_v24" für "gray_code" „ k>5k>5 “ verwendet
"n_clean_m15"MCXSynthesisNCleanM15k−2k-200höchstens 6k−66k-6 CX-Gates
"n_dirty_i15"MCXSynthesisNDirtyI1500k−2k-2höchstens 8k−68k-6 CX-Gates
"2_clean_kg24"MCXSynthesis2CleanKG242200höchstens 6k−66k-6 CX-Gates
"2_dirty_kg24"MCXSynthesis2DirtyKG2402höchstens 12k−1812k-18 CX-Gates
"1_clean_kg24"MCXSynthesis1CleanKG2410höchstens 6k−66k-6 CX-Gates
"1_dirty_kg24"MCXSynthesis1DirtyKG240011höchstens 12k−1812k-18 CX-Gates
"1_clean_b95"MCXSynthesis1CleanB951100höchstens 16k−816k-8 CX-Gates
"default"MCXSynthesisDefaultbeliebigbeliebigwä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"MCMTSynthesisVChaink−1k-100verwendet eine lineare Anzahl von Toffoli-Gattern
"noaux"MCMTSynthesisNoAux0000verwendet den Standard-Kontrollmechanismus von Qiskit
"xgate"MCMTSynthesisXGate0000verwendet eine lineare Anzahl von Toffoli-Gattern
"default"MCMTSynthesisDefaultbeliebigbeliebigwä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"IntComparatorSynthesis2saddition mit Zweierkomplement verwendenn−1n - 1 sauber
"noaux"IntComparatorSynthesisNoAuxspiegeln Sie das Ziel kontrolliert auf allen O(2l)O(2^l) erlaubten ganzzahligen Wertenkeine
"default"IntComparatorSynthesisDefaultden besten Algorithmus in Abhängigkeit von den verfügbaren Hilfsqubits verwendenbeliebig
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"WeightedSumSynthesisDefaulteine auf V-Ketten basierende Synthese verwendenss n summen-Qubits, davon s−1s≤2s - 1_{s \leq 2} 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"PauliEvolutionSynthesisRustiqdie Synthesemethode der Rustiq-Schaltungssynthesebibliothek verwendenalles-zu-alles
"default"PauliEvolutionSynthesisDefaulteinen diagonalisierenden Clifford-Pauli-Term verwendenalles-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"ModularAdderSynthesisV1700ein modularer Addierer ohne zusätzliche Qubits
"ripple_cdkm"ModularAdderSynthesisC0411einen Ripple-Carry-Addierer
"ripple_vbe"ModularAdderSynthesisV95n−1n-1 für nn -bit Zahleneinen Ripple-Carry-Addierer
"qft"ModularAdderSynthesisD0000ein QFT-basierter Addierer
"default"ModularAdderSynthesisDefaultbeliebigwählt den besten Algorithmus auf der Grundlage der verfügbaren Hilfsmittel aus
Kolumne „ 1 “
Kolumne „ 2 “
ModularAdderSynthesisV17()Ein modularer Addierer (modulo 2n2^n ) ohne zusätzliche Qubits.
ModularAdderSynthesisC04()Ein Ripple-Carry-Addierer, modulo 2n2^n.
ModularAdderSynthesisD00()Ein QFT-basierter Addierer, modulo 2n2^n.
ModularAdderSynthesisV95()Ein Ripple-Carry-Addierer, modulo 2n2^n.
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"HalfAdderSynthesisC0411einen Ripple-Carry-Addierer
"ripple_r25"HalfAdderSynthesisR2500ein Ripple-Carry-Addierer ohne Hilfsmittel
"ripple_vbe"HalfAdderSynthesisV95n−1n-1 für nn -bit Zahleneinen Ripple-Carry-Addierer
"qft"HalfAdderSynthesisD0000ein QFT-basierter Addierer
"default"HalfAdderSynthesisDefaultbeliebigwä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"FullAdderSynthesisC0400einen Ripple-Carry-Addierer
"ripple_vbe"FullAdderSynthesisV95n−1n-1 für nn -bit Zahleneinen Ripple-Carry-Addierer
"default"FullAdderSynthesisDefaultbeliebigwä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"MultiplierSynthesisH18abhängig von der verwendeten AdderGateein kumulativer Addierer auf der Grundlage von gesteuerten Addierern
"qft"MultiplierSynthesisR1700ein QFT-basierter Multiplikator
"default"MultiplierSynthesisDefaultbeliebigwä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.
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.