Skip to main content
IBM Quantum Platform

Commuting2qGateRouter

class qiskit.transpiler.passes.Commuting2qGateRouter(*args, **kwargs)

GitHub

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
     |
     4

Dazu 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)

GitHub

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

Tupel [ DAGCircuit, PassManagerState ]

name

name()

GitHub

Name des Passes.

Rückgabetyp

str

run

run(dag)

GitHub

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

DAGCircuit

swap_decompose

swap_decompose(dag, node, current_layout, swap_strategy)

GitHub

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 Commuting2qBlock enthält, wir routen.
  • node (DAGOpNode) – Ein Knoten, dessen Operation eine Commuting2qBlock ist.
  • 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

DAGCircuit

update_status

update_status(state, run_state)

GitHub

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

PassManagerState

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