Zum Hauptinhalt springen

Häufig verwendete Parameter für die Transpilation

Paketversionen

Der Code auf dieser Seite wurde mit den folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Diese Seite beschreibt einige der häufiger verwendeten Parameter für die lokale Transpilation. Diese Parameter werden über Argumente für generate_preset_pass_manager oder transpile konfiguriert.

Approximationsgrad

Du kannst den Approximationsgrad verwenden, um anzugeben, wie genau der resultierende Schaltkreis mit dem gewünschten (Eingabe-)Schaltkreis übereinstimmen soll. Dies ist eine Gleitkommazahl im Bereich (0.0 - 1.0), wobei 0.0 maximale Approximation und 1.0 (Standard) keine Approximation bedeutet. Kleinere Werte tauschen Ausgabegenauigkeit gegen einfachere Ausführung (d.h. weniger Gates).

Bei der Zwei-Qubit-Unitär-Synthese (verwendet in den Anfangsstufen aller Level und für die Optimierungsstufe mit Optimierungslevel 3) gibt dieser Wert die Ziel-Fidelity der Ausgabezerlegung an. Das heißt, wie viel Fehler eingeführt wird, wenn eine Matrixdarstellung eines Schaltkreises in diskrete Gates umgewandelt wird. Wenn der Approximationsgrad niedriger ist (mehr Approximation), wird sich der Ausgabeschaltkreis der Synthese stärker von der Eingabematrix unterscheiden, aber wahrscheinlich auch weniger Gates haben (da jede beliebige Zwei-Qubit-Operation perfekt mit höchstens drei CX-Gates zerlegt werden kann) und ist einfacher auszuführen.

Wenn der Approximationsgrad kleiner als 1.0 ist, können Schaltkreise mit einem oder zwei CX-Gates synthetisiert werden, was zu weniger Fehlern von der Hardware, aber mehr von der Approximation führt. Da CX das teuerste Gate in Bezug auf Fehler ist, kann es vorteilhaft sein, deren Anzahl auf Kosten der Fidelity in der Synthese zu verringern (diese Technik wurde verwendet, um das Quantenvolumen auf IBM®-Geräten zu erhöhen: Validating quantum computers using randomized model circuits).

Als Beispiel erzeugen wir ein zufälliges Zwei-Qubit-UnitaryGate, das in der Anfangsstufe synthetisiert wird. Das Setzen von approximation_degree kleiner als 1.0 kann einen approximativen Schaltkreis erzeugen. Wir müssen auch die basis_gates angeben, damit die Synthesemethode weiß, welche Gates sie für die approximative Synthese verwenden kann.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
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"])
2

Dies ergibt eine Ausgabe von 2, da die Approximation weniger CX-Gates erfordert.

Zufallszahlengenerator-Seed

Einige Teile des Transpilers sind stochastisch, sodass wiederholte Transpilationsläufe unterschiedliche Ergebnisse liefern können. Um ein reproduzierbares Ergebnis zu erhalten, kannst du den Seed für den Pseudozufallszahlengenerator mit dem Argument seed_transpiler festlegen. Wiederholte Läufe mit demselben Seed liefern dieselben Ergebnisse.

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 of the previous code cell

Initial Layout

Vor der Transpilation sind die Qubits in deinem Schaltkreis virtuelle Qubits, die nicht notwendigerweise physischen Qubits auf dem Ziel-Backend entsprechen. Du kannst die anfängliche Zuordnung virtueller Qubits zu physischen Qubits mit dem Argument initial_layout angeben. Beachte, dass sich das endgültige Qubit-Layout vom anfänglichen Layout unterscheiden kann, da der Transpiler Qubits durch Swap-Gates oder andere Mittel permutieren kann.

Im folgenden Beispiel konstruieren wir ein Initial Layout für das Mock-Backend FakeSherbrooke, indem wir ein Layout-Objekt erstellen. Unser Layout ordnet das erste Qubit unseres Schaltkreises dem Qubit 5 von Sherbrooke zu, und es ordnet das zweite Qubit unseres Schaltkreises dem Qubit 6 von Sherbrooke zu. Beachte, dass physische Qubits immer durch ganze Zahlen dargestellt werden.

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 of the previous code cell

Zusätzlich zur Angabe eines Layout-Objekts kannst du auch eine Liste von ganzen Zahlen übergeben, wobei das ii-te Element der Liste das physische Qubit enthält, dem das ii-te Qubit zugeordnet werden soll. 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 of the previous code cell

Du kannst die Funktion plot_error_map verwenden, um ein Diagramm des Geräte-Graphen mit Fehlerinformationen und mit den beschrifteten physischen Qubits zu erzeugen. Du kannst auch ähnliche Diagramme auf der Seite Compute resources anzeigen.

from qiskit.visualization import plot_error_map

plot_error_map(backend, figsize=(30, 24))

Output of the previous code cell

Transpiler-Stufen- und Plugin-Optionen

Diese Optionen haben das Suffix _method. Sie beeinflussen die Arbeitsweise des Transpilers und werden verwendet, um bessere, unterschiedliche oder spezifische Ausgaben vom Transpiler zu erhalten.

  • init_method (str) - Das Plugin für die Initialisierungsstufe.

  • layout_method (str) - Der Layout-Auswahlpass (trivial, dense, sabre). Dies kann auch der externe Plugin-Name sein, der für die Layout-Stufe verwendet werden soll.

  • optimization_method (str) - Das Plugin für die Optimierungsstufe.

  • routing_method (str) - Name des Routing-Passes (basic, lookahead, default, sabre, none). Dies kann auch der externe Plugin-Name sein, der für die Routing-Stufe verwendet werden soll.

  • scheduling_method (str) - Name des Scheduling-Passes. Dies kann auch der externe Plugin-Name sein, der für die Scheduling-Stufe verwendet werden soll.

    • as_soon_as_possible: Plane Instruktionen gierig: so früh wie möglich auf einer Qubit-Ressource (Alias: asap).
    • as_late_as_possible: Plane Instruktionen spät. Das heißt, halte Qubits im Grundzustand, wenn möglich (Alias: alap).
  • translation_method (str) - Name des Übersetzungs-Passes (unroller, translator, synthesis). Dies kann auch der externe Plugin-Name sein, der für die Übersetzungsstufe verwendet werden soll.

  • unitary_synthesis_method (str) - Der Name der Unitär-Synthesemethode. Standardmäßig wird default verwendet.

hinweis

Um eine Liste aller installierten Plugins für eine bestimmte Stufe zu sehen, führe list_stage_plugins("stage_name") aus. Wenn du beispielsweise eine Liste aller installierten Plugins für die Routing-Stufe sehen möchtest, führe list_stage_plugins(routing) aus.

Nächste Schritte