Häufig verwendete Parameter für die Transpilierung
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
Auf dieser Seite werden einige der am häufigsten verwendeten Parameter für die lokale Transpilation beschrieben. Diese Parameter werden mit Argumenten für generate_preset_pass_manager oder transpile.
Näherungsgrad
Mit dem Näherungsgrad können Sie angeben, wie genau die resultierende Schaltung der gewünschten (Eingangs-)Schaltung entsprechen soll. Hierbei handelt es sich um eine Fließkommazahl im Bereich ( 0.0 - 1.0 ), wobei 0.0 für die maximale Annäherung und 1.0 (Standard) für keine Annäherung steht. Bei kleineren Werten wird die Genauigkeit der Ausgabe gegen die Einfachheit der Ausführung (d. h. weniger Gatter) eingetauscht. Der Standardwert ist 1,0.
Bei der unitären Zweibit-Synthese (die in den Anfangsphasen aller Stufen und in der Optimierungsphase mit Optimierungsstufe 3 verwendet wird) gibt dieser Wert die angestrebte Treue der Ausgangszerlegung an. Das heißt, wie viel Fehler wird eingeführt, wenn eine Matrixdarstellung einer Schaltung in diskrete Gatter umgewandelt wird. Ist der Approximationsgrad niedriger (mehr Approximation), weicht die Ausgangsschaltung der Synthese stärker von der Eingabematrix ab, hat aber wahrscheinlich auch weniger Gatter (weil jede beliebige Zwei-Qubit-Operation mit höchstens drei CX-Gattern perfekt zerlegt werden kann) und ist einfacher zu betreiben.
Wenn der Approximationsgrad kleiner als 1.0 ist, können Schaltungen mit einem oder zwei CX-Gattern synthetisiert werden, was zu weniger Fehlern in der Hardware, aber zu mehr Fehlern in der Approximation führt. Da CX das teuerste Gatter in Bezug auf Fehler ist, könnte es von Vorteil sein, die Anzahl der Gatter auf Kosten der Genauigkeit der Synthese zu verringern (diese Technik wurde zur Erhöhung des Quantenvolumens auf IBM® verwendet): Validierung von Quantencomputern mit randomisierten Modellschaltungen ).
Als Beispiel generieren wir ein zufälliges Zwei-Qubit UnitaryGate , das in der Anfangsphase synthetisiert wird. Wenn Sie approximation_degree kleiner als 1.0 einstellen, können Sie eine ungefähre Schaltung erzeugen. Wir müssen auch die basis_gates angeben, damit die Synthesemethode weiß, welche Gatter sie für die approximative Synthese verwenden kann.
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
Dies führt zu einer Ausgabe von 2 , da die Annäherung weniger CX-Gatter erfordert.
Startwert für Zufallszahlengenerator
Einige Teile des Transpilers sind stochastisch, so dass wiederholte Transpilierungsläufe unterschiedliche Ergebnisse liefern können. Um ein reproduzierbares Ergebnis zu erhalten, können Sie den Seed für den Pseudozufallszahlengenerator mit dem Argument seed_transpiler festlegen. Wiederholte Durchläufe mit demselben Seed führen zu denselben Ergebnissen.
Beispiel:
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:
Anfängliches Layout
Vor der Transpilierung sind die in Ihrem Schaltkreis enthaltenen Qubits virtuelle Qubits, die nicht notwendigerweise den physischen Qubits auf dem Ziel-Backend entsprechen. Sie können die anfängliche Zuordnung von virtuellen Qubits zu physischen Qubits mit dem Argument initial_layout angeben. Beachten Sie, dass das endgültige Qubit-Layout vom anfänglichen Layout abweichen kann, da der Transpiler Qubits mit Hilfe von Swap-Gates oder anderen Mitteln vertauschen kann.
Im folgenden Beispiel konstruieren wir ein erstes Layout für das FakeSherbrooke mock-Backend durch Erstellen eines Layout objekt. Unser Layout ordnet das erste Qubit unserer Schaltung dem Qubit 5 von Sherbrooke zu, und es ordnet das zweite Qubit unserer Schaltung dem Qubit 6 von Sherbrooke zu. Beachten Sie, dass physikalische Qubits immer durch ganze Zahlen dargestellt werden.
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_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:
Zusätzlich zur Angabe eines Layout-Objekts können Sie auch eine Liste von Ganzzahlen übergeben, wobei das -te Element der Liste das physikalische Qubit enthält, auf das das -te Qubit abgebildet werden soll. Zum Beispiel:
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:
Sie können mit der Funktion plot_error_map funktion können Sie ein Diagramm des Gerätegraphen mit Fehlerinformationen und der Beschriftung der physikalischen Qubits erstellen. Ähnliche Diagramme können Sie auch auf der Seite Compute-Ressourcen einsehen.
from qiskit.visualization import plot_error_map
plot_error_map(backend, figsize=(30, 24))Output:
Transpiler-Stufe und Plugin-Optionen
Diese Optionen sind mit dem Suffix _method versehen. Sie beeinflussen die Arbeitsweise des Transpilers und werden verwendet, um eine bessere, andere oder spezifische Ausgabe des Transpilers zu erhalten.
-
init_method(str) - Das Plugin, das für die Initialisierungsphase verwendet werden soll. -
layout_method(str) - Der Layout-Auswahldurchgang (trivial,dense,sabre). Dies kann auch der Name des externen Plugins sein, das für die Layoutphase verwendet werden soll. -
optimization_method(str) - Das Plugin, das für die Optimierungsphase verwendet werden soll. -
routing_method(str) - Name des Routing-Durchgangs (basic,lookahead,default,sabre,none). Dies kann auch der Name des externen Plugins sein, das für die Weiterleitungsstufe verwendet werden soll. -
scheduling_method(str) - Name des Zeitplanungsdurchlaufs. Dies kann auch der Name des externen Plugins sein, das für die Planungsphase verwendet wird.as_soon_as_possible: Anweisungen gierig einplanen: so früh wie möglich auf einer Qubit-Ressource (alias:asap).as_late_as_possible: Anweisungen zu spät einplanen. Das heißt, die Qubits sollten möglichst im Grundzustand bleiben (alias:alap).
-
translation_method(str) - Name der Übersetzungsstufe (unroller,translator,synthesis). Dies kann auch der Name des externen Plugins sein, das für die Übersetzungsphase verwendet wird. -
unitary_synthesis_method(str) - Der Name der zu verwendenden unitären Synthesemethode. Standardmäßig wirddefaultverwendet.
Um eine Liste aller installierten Plugins für eine bestimmte Stufe anzuzeigen, führen Sie list_stage_plugins("stage_name"). Wenn Sie zum Beispiel eine Liste aller installierten Plugins für die Routing-Stufe sehen möchten, führen Sie list_stage_plugins(routing) aus.
Nächste Schritte
- Lesen Sie das Thema Standardoptionen und Konfigurationseinstellungen.
- Erfahren Sie, wie Sie den Optimierungsgrad einstellen.
- Probieren Sie die Anleitung zum Vergleichen der Transpiler-Einstellungen aus.
- Lesen Sie die Dokumentation zur Transpiler-API.