Skip to main content
IBM Quantum Platform

Transpiler-Plugins installieren und verwenden

  • Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.

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

Um die Entwicklung und Wiederverwendung von benutzerdefiniertem Transpilationscode durch die breitere Gemeinschaft der Qiskit-Benutzer zu erleichtern, unterstützt das Qiskit-SDK eine Plugin-Schnittstelle, die es Paketen von Drittanbietern ( Python ) ermöglicht, zu erklären, dass sie erweiterte Transpilationsfunktionen bereitstellen, die über Qiskit zugänglich sind.

Derzeit können Plugins von Drittanbietern erweiterte Transpilationsfunktionen auf drei Arten bereitstellen:

  • Ein Transpiler-Stage-Plugin bietet einen Passmanager, der anstelle einer der 6 Stufen eines voreingestellten gestuften Passmanagers verwendet werden kann: init, layout, routing, translation, optimization, und scheduling.
  • Ein unitäres Synthese-Plugin bietet erweiterte Funktionen für die Synthese unitärer Gatter.
  • Ein High-Level-Synthese-Plugin bietet erweiterte Funktionen zur Synthese von "High-Level-Objekten" wie linearen Funktionen oder Clifford-Operatoren. Objekte der höheren Ebene werden durch Unterklassen der Klasse Operation dargestellt.

Der Rest der Seite beschreibt, wie man verfügbare Plugins auflistet, neue Plugins installiert und sie verwendet.


Verfügbare Plugins auflisten und neue installieren

Qiskit enthält bereits einige integrierte Plugins für die Transpilierung. Um mehr zu installieren, können Sie Ihren Python Paketmanager verwenden. Sie könnten zum Beispiel pip install qiskit-toqm ausführen, um das Qiskit TOQM Routing Stage Plugin zu installieren. Eine Reihe von Plugins von Drittanbietern sind Teil des Qiskit-Ökosystems.

Liste der verfügbaren Transpiler-Stage-Plugins

Verwenden Sie die Funktion list_stage_plugins und übergeben Sie den Namen der Bühne, deren Plugins Sie auflisten möchten.

from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins

list_stage_plugins("layout")

Output:

['default', 'dense', 'sabre', 'trivial']
list_stage_plugins("routing")

Output:

['basic', 'default', 'lookahead', 'none', 'sabre']

Wenn qiskit-toqm installiert wäre, würde toqm in der Liste der routing Plugins erscheinen.

Liste der verfügbaren einheitlichen Synthese-Plugins

Verwenden Sie die Funktion unitary_synthesis_plugin_names.

from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names

unitary_synthesis_plugin_names()

Output:

['aqc', 'clifford', 'default', 'gridsynth', 'sk']

Liste der verfügbaren Plugins für die High-Level-Synthese

Verwenden Sie die Funktion high_level_synthesis_plugin_names und übergeben Sie den Namen des Typs des zu synthetisierenden "High-Level-Objekts". Der Name entspricht dem name attribut der Klasse Operation, die den Typ des zu synthetisierenden Objekts darstellt.

from qiskit.transpiler.passes.synthesis import (
    high_level_synthesis_plugin_names,
)

high_level_synthesis_plugin_names("clifford")

Output:

['rb_default', 'ag', 'bm', 'default', 'greedy', 'layers', 'lnn']

Sie können die HighLevelSynthesisPluginManager klasse können Sie die Namen aller High-Level-Synthese-Plugins auflisten:

from qiskit.transpiler.passes.synthesis.plugin import (
    HighLevelSynthesisPluginManager,
)

HighLevelSynthesisPluginManager().plugins.names()

Output:

['clifford.rb_default',
 'FullAdder.default',
 'FullAdder.ripple_c04',
 'FullAdder.ripple_v95',
 'HalfAdder.default',
 'HalfAdder.qft_d00',
 'HalfAdder.ripple_c04',
 'HalfAdder.ripple_r25',
 'HalfAdder.ripple_v95',
 'IntComp.default',
 'IntComp.noaux',
 'IntComp.twos',
 'ModularAdder.default',
 'ModularAdder.modular_v17',
 'ModularAdder.qft_d00',
 'ModularAdder.ripple_c04',
 'ModularAdder.ripple_v95',
 'Multiplier.cumulative_h18',
 'Multiplier.default',
 'Multiplier.qft_r17',
 'PauliEvolution.default',
 'PauliEvolution.rustiq',
 'WeightedSum.default',
 'annotated.default',
 'clifford.ag',
 'clifford.bm',
 'clifford.default',
 'clifford.greedy',
 'clifford.layers',
 'clifford.lnn',
 'linear_function.default',
 'linear_function.kms',
 'linear_function.pmh',
 'mcmt.default',
 'mcmt.noaux',
 'mcmt.vchain',
 'mcmt.xgate',
 'mcx.1_clean_b95',
 'mcx.1_clean_kg24',
 'mcx.1_dirty_kg24',
 'mcx.2_clean_kg24',
 'mcx.2_dirty_kg24',
 'mcx.default',
 'mcx.gray_code',
 'mcx.n_clean_m15',
 'mcx.n_dirty_i15',
 'mcx.noaux_hp24',
 'mcx.noaux_v24',
 'permutation.acg',
 'permutation.basic',
 'permutation.default',
 'permutation.kms',
 'permutation.token_swapper',
 'qft.default',
 'qft.full',
 'qft.line']

Verwenden Sie ein Plugin

In diesem Abschnitt zeigen wir, wie man Transpiler-Plugins verwendet. In den Codebeispielen verwenden wir Plugins, die mit Qiskit geliefert werden, aber Plugins, die aus Paketen von Drittanbietern installiert werden, werden auf die gleiche Weise verwendet.

Verwenden Sie ein Transpiler-Stage-Plugin

Um ein Transpiler-Stufen-Plugin zu verwenden, geben Sie dessen Namen mit dem entsprechenden Argument für generate_preset_pass_manager oder an transpile. Das Argument wird gebildet, indem an den Namen der _method Transpilationsstufe angehängt wird. Um beispielsweise das lookahead Routing-Plugin zu verwenden, würden wir für das routing_method Argument lookahead angeben.

Note

In diesen Beispielen wird das FakeSherbrooke``qiskit_ibm_runtime Mock-Backend von verwendet, Sie können es jedoch mit jedem Qiskit-kompatiblen echten oder simulierten Backend ausprobieren. Ihre Ergebnisse können davon abweichen.

from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke

backend = FakeSherbrooke()

pass_manager = generate_preset_pass_manager(
    optimization_level=3, backend=backend, routing_method="lookahead"
)

Verwenden Sie ein einheitliches Synthese-Plugin

Um ein unitäres Synthese-Plugin zu verwenden, geben Sie dessen Namen als Argument unitary_synthesis_method an generate_preset_pass_manager oder transpile:

pass_manager = generate_preset_pass_manager(
    optimization_level=3,
    backend=backend,
    unitary_synthesis_method="sk",
    unitary_synthesis_plugin_config=dict(
        basis_gates=["cz", "id", "rz", "sx", "x"]
    ),
)

Die unitäre Synthese wird in den Stufen init, translation und optimization des staged pass manager verwendet, der von generate_preset_pass_manager zurückgegeben oder in transpile. Eine Beschreibung dieser Phasen finden Sie unter Transpiler-Stufen.

Verwenden Sie das Argument unitary_synthesis_plugin_config , ein frei formuliertes Wörterbuch, um Optionen für die unitäre Synthesemethode zu übergeben. Die Dokumentation der Synthesemethode sollte erklären, welche Optionen sie unterstützt. In dieser Liste finden Sie Links zur Dokumentation der eingebauten unitären Synthese-Plugins.

Verwenden Sie ein Plugin für die High-Level-Synthese

Erstellen Sie zunächst eine HLSConfig, um um die Namen der Plugins zu speichern, die für verschiedene High-Level-Objekte verwendet werden sollen. Zum Beispiel:

from qiskit.transpiler.passes import HLSConfig

hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])

Diese Codezelle erstellt eine High-Level-Synthesekonfiguration, die das layers -Plugin für die Synthese von Clifford-Objekten und das pmh -Plugin für die Synthese von LinearFunction objekte verwendet. Die Namen der Schlüsselwortargumente entsprechen den name attribut der Klasse Operation, die den Typ des zu synthetisierenden Objekts darstellt. 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 von können Sie stattdessen auch ein (name, options) Tupel übergeben, wobei das zweite Element des Tupels ein Wörterbuch mit Optionen für das Plugin ist. Die Dokumentation der Synthesemethode sollte erklären, welche Optionen sie unterstützt. In dieser Liste finden Sie Links zu den Dokumentationen der eingebauten High-Level-Synthese-Plugins.

Sobald Sie das Objekt HLSConfig erstellt haben, übergeben Sie es als hls_config argument an generate_preset_pass_manager oder transpile:

pass_manager = generate_preset_pass_manager(
    optimization_level=3, backend=backend, hls_config=hls_config
)

Die High-Level-Synthese wird in den Phasen init, translation und optimization des gestuften Pass-Managers verwendet, der von generate_preset_pass_manager zurückgegeben oder in transpile. Eine Beschreibung dieser Phasen finden Sie unter Transpiler-Stufen.


Nächste Schritte

Empfehlung
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.