Commuting2qGateRouter
class qiskit.transpiler.passes.Commuting2qGateRouter(*args, **kwargs)
Basen: TransformationPass
Eine Klasse, um eine oder mehrere Pendelrouten in die Kopplungskarte zu tauschen.
Dieser Durchgang leitet Blöcke von pendelnden Zwei-Qubit-Gattern weiter, die als Commuting2qBlock Anweisungen gekapselt sind. Dieser Pass gilt nicht für andere Anweisungen. Die Abbildung auf die Kopplungskarte erfolgt über Tauschstrategien, siehe SwapStrategy. Die Swap-Strategie sollte dem Problem und der Kopplungskarte entsprechen. Dieser Transpiler-Durchgang sollte idealerweise durchgeführt werden, bevor der Quantenschaltkreis um ungenutzte Ancilla-Qubits erweitert wird. Andernfalls können wir die Qubits außerhalb des Teils des Chips, den wir verwenden wollen, austauschen. Daher stellen die Swap-Strategie und die zugehörige Kopplungskarte keine physischen Qubits dar. Stattdessen stellen sie eine Zwischenabbildung dar, die den physischen Qubits entspricht, sobald das ursprüngliche Layout angewendet wurde. Das folgende Beispiel zeigt, wie man ein Vier-Qubit PauliEvolutionGate auf die Qubits 0, 1, 3 und 4 des Fünf-Qubit-Geräts mit der Kopplungskarte
0 -- 1 -- 2
|
3
|
4Dazu verwenden wir eine Zeilenvertauschungsstrategie für die Qubits 0, 1, 3 und 4, die anhand der virtuellen Qubits 0, 1, 2 und 3 definiert sind.
from qiskit import QuantumCircuit
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import Layout, CouplingMap, PassManager
from qiskit.transpiler.passes import FullAncillaAllocation
from qiskit.transpiler.passes import EnlargeWithAncilla
from qiskit.transpiler.passes import ApplyLayout
from qiskit.transpiler.passes import SetLayout
from qiskit.transpiler.passes.routing.commuting_2q_gate_routing import (
SwapStrategy,
FindCommutingPauliEvolutions,
Commuting2qGateRouter,
)
# Define the circuit on virtual qubits
op = SparsePauliOp.from_list([("IZZI", 1), ("ZIIZ", 2), ("ZIZI", 3)])
circ = QuantumCircuit(4)
circ.append(PauliEvolutionGate(op, 1), range(4))
# Define the swap strategy on qubits before the initial_layout is applied.
swap_strat = SwapStrategy.from_line([0, 1, 2, 3])
# Choose qubits 0, 1, 3, and 4 from the backend coupling map shown above.
backend_cmap = CouplingMap(couplinglist=[(0, 1), (1, 2), (1, 3), (3, 4)])
initial_layout = Layout.from_intlist([0, 1, 3, 4], *circ.qregs)
pm_pre = PassManager(
[
FindCommutingPauliEvolutions(),
Commuting2qGateRouter(swap_strat),
SetLayout(initial_layout),
FullAncillaAllocation(backend_cmap),
EnlargeWithAncilla(),
ApplyLayout(),
]
)
# Insert swap gates, map to initial_layout and finally enlarge with ancilla.
pm_pre.run(circ).draw("mpl")Dieser Passmanager stützt sich auf die current_layout , die dem Qubit-Layout entspricht, wenn Swap-Gates angewendet werden. Der Durchlauf durchläuft alle Knoten im dag. Wenn ein Knoten mit einer Swap-Strategie geroutet werden soll, wird er in Unterbefehle mit dazwischen liegenden Swap-Layern zerlegt und die current_layout wird geändert. Knoten, die nicht mit Hilfe von Swap-Strategien geroutet werden sollten, werden unter Berücksichtigung von current_layout wieder in den dag aufgenommen.
Parameter
- swap_strategy - Eine Instanz von
SwapStrategy, die die Swap-Ebenen enthält, die verwendet werden, und die Reihenfolge, in der sie angewendet werden, um die Anweisung der Hardware zuzuordnen. Wenn dieses Feld nicht angegeben wird, sollte es im Eigenschaftssatz des Passes enthalten sein. Dies ermöglicht es anderen Durchläufen, die am besten geeignete Auslagerungsstrategie zur Laufzeit zu bestimmen. - edge_coloring - Eine optionale Kantenfärbung der Kopplungskarte ( I.e. keine zwei Kanten, die sich einen Knoten teilen, haben die gleiche Farbe). Wenn die Kantenfärbung gegeben ist, werden die kommutierenden Gatter, die bei der aktuellen Qubit-Permutation gleichzeitig angewendet werden können, gemäß der Kantenfärbung gruppiert und entsprechend dieser Kantenfärbung angewendet. Hier ist eine Farbe ein int, der als Index für die Definition und den Zugriff auf die Gruppen von Pendelgattern, die gleichzeitig angewendet werden können, verwendet wird. Wenn die Kantenfärbung nicht gegeben ist, werden die Mengen mit einem Greedy-Algorithmus aufgebaut. Die Kantenfärbung ist nützlich, um Gatter wie
RZZGates neben Tauschgattern zu positionieren, um CX-Auslöschungen auszunutzen.
Attribute
is_analysis_pass
Prüfen Sie, ob der Pass ein Analysepass ist.
Wenn der Pass ein AnalysisPass, ist, bedeutet dies, dass der Pass die DAG analysieren und die Ergebnisse dieser Analyse in den Eigenschaftssatz schreiben kann. Änderungen an der DAG sind bei dieser Art von Pass nicht zulässig.
is_transformation_pass
Prüfen Sie, ob der Pass ein Transformationspass ist.
Wenn es sich bei dem Pass um TransformationPass, handelt, bedeutet dies, dass der Pass die DAG manipulieren kann, aber den Eigenschaftssatz nicht ändern kann (aber er kann gelesen werden).
Methoden
execute
execute(passmanager_ir, state, callback=None)
Ausführen der Optimierungsaufgabe für die Eingabe Qiskit IR.
Parameter
- passmanager_ir (DAGCircuit) – Qiskit IR zur Optimierung.
- state (DAGCircuit) – Zustand, der mit der Ausführung des Workflows durch den Pass-Manager selbst verbunden ist.
- callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – Eine Callback-Funktion, die bei jeder Ausführung einer Optimierungsaufgabe aufgerufen wird.
Rückgabe
Optimierte Qiskit IR und Stand des Workflows.
Rückgabetyp
name
run
run(dag)
Führen Sie den Durchgang aus, indem Sie die Knoten, auf die er angewendet wird, zerlegen.
Parameter
dag (DAGCircuit) – Der Tag, an dem wir Swaps hinzufügen werden.
Rückgabe
Ein Tag, an dem Swaps für den vorgesehenen Tortyp hinzugefügt wurden.
Erhöht
- TranspilerError – Wenn die Swap-Strategie bei der Initialisierung nicht angegeben wurde und im Eigenschaftssatz keine Swap-Strategie vorhanden ist.
- TranspilerError – Wenn der Quantenschaltkreis mehr als ein Qubit-Register enthält.
- TranspilerError – Falls es Qubits gibt, die nicht im Quantenregister enthalten sind.
Rückgabetyp
swap_decompose
swap_decompose(dag, node, current_layout, swap_strategy)
Nehmen Sie eine Instanz von Commuting2qBlock und ordnen Sie sie der Kopplungskarte zu.
Das Mapping erfolgt mit der Swap-Strategie.
Parameter
- dag (DAGCircuit) – Die dag, die die
Commuting2qBlockenthält, wir routen. - node (DAGOpNode) – Ein Knoten, dessen Operation eine
Commuting2qBlockist. - current_layout (Layout) – Das Layout, bevor die Vertauschungen vorgenommen werden. Mit dieser Funktion wird das Layout so verändert, dass die nachfolgenden Gates auf dem dag richtig zusammengesetzt werden können.
- swap_strategy (SwapStrategy) – Die für die Zerlegung des Knotens verwendete Swap-Strategie.
Rückgabe
Ein mit dem Kopplungsplan kompatibler dag, bei dem Swap-Gates hinzugefügt wurden, um die Gates in Commuting2qBlock auf die Hardware abzubilden.
Rückgabetyp
update_status
update_status(state, run_state)
Aktualisieren Sie den Workflow-Status.
Parameter
- state (PassManagerState) – Übergeben Sie den Status des Managers zur Aktualisierung.
- run_state (RunState) – Erledigungsstatus der aktuellen Aufgabe.
Rückgabe
Aktualisierter Status des Passmanagers.
Rückgabetyp