Skip to main content
IBM Quantum Platform

Commuting2qGateRouter

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

GitHub

Basi: TransformationPass

Una classe per scambiare il percorso di uno o più cancelli di pendolarismo con la mappa di accoppiamento.

Questo passaggio instrada blocchi di porte commutative a due qubit incapsulate come istruzioni Commuting2qBlock . Questo pass non si applica ad altre istruzioni. La mappatura alla mappa di accoppiamento viene effettuata utilizzando strategie di swap, vedi SwapStrategy. La strategia di scambio deve essere adatta al problema e alla mappa di accoppiamento. Questo passaggio di transpiler dovrebbe idealmente essere eseguito prima che il circuito quantistico sia ampliato con qualsiasi qubit ancilla inattivo. Altrimenti, potremmo scambiare i qubit al di fuori della porzione di chip che vogliamo utilizzare. Pertanto, la strategia di scambio e la mappa di accoppiamento associata non rappresentano qubit fisici. Rappresentano invece una mappatura intermedia che corrisponde ai qubit fisici una volta applicata la disposizione iniziale. L'esempio seguente mostra come mappare un qubit a quattro qubit PauliEvolutionGate ai qubit 0, 1, 3 e 4 del dispositivo a cinque qubit con la mappa di accoppiamento

0 -- 1 -- 2
     |
     3
     |
     4

A tal fine utilizziamo una strategia di scambio di linee per i qubit 0, 1, 3 e 4, definita in termini di qubit virtuali 0, 1, 2 e 3.

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

Questo gestore di passaggi si basa su current_layout che corrisponde alla disposizione dei qubit mentre vengono applicate le porte di scambio. Il passaggio attraverserà tutti i nodi del dag. Se un nodo deve essere instradato utilizzando una strategia di swap, verrà scomposto in sottoistruzioni con livelli di swap intermedi e il sito current_layout verrà modificato. I nodi che non dovrebbero essere instradati usando le strategie di swap saranno aggiunti nuovamente al dag tenendo conto di current_layout .

Parametri

  • swap_strategy - Un'istanza di SwapStrategy che contiene i livelli di swap utilizzati, e l'ordine in cui applicarli, per mappare l'istruzione nell'hardware. Se questo campo non viene fornito, deve essere contenuto nell'insieme di proprietà del passaggio. Ciò consente agli altri passaggi di determinare la strategia di swap più appropriata in fase di esecuzione.
  • edge_coloring - Una colorazione opzionale dei bordi della mappa di accoppiamento ( I.e. due spigoli che condividono un nodo non hanno lo stesso colore). Se la colorazione dei bordi è data, le porte di commutazione che possono essere applicate simultaneamente data la permutazione corrente dei qubit sono raggruppate in base alla colorazione dei bordi e applicate in base a questa colorazione dei bordi. In questo caso, un colore è un int che viene utilizzato come indice per definire e accedere ai gruppi di porte di commutazione che possono essere applicate simultaneamente. Se la colorazione dei bordi non viene fornita, gli insiemi vengono costruiti con un algoritmo di tipo greedy. La colorazione dei bordi è utile per posizionare porte come RZZGates accanto a porte di scambio per sfruttare le cancellazioni CX.

Attributi

is_analysis_pass

Controlla se il passaggio è un passaggio di analisi.

Se il passo è un AnalysisPass,, significa che il passo può analizzare il DAG e scrivere i risultati di tale analisi nel set di proprietà. Questo tipo di passaggio non consente di modificare il DAG.

is_transformation_pass

Controlla se il passaggio è un passaggio di trasformazione.

Se il passaggio è un TransformationPass,, significa che il passaggio può manipolare il DAG, ma non può modificare il set di proprietà (ma può essere letto).


Metodi

execute

execute(passmanager_ir, state, callback=None)

GitHub

Eseguire l'attività di ottimizzazione per l'IR Qiskit in ingresso.

Parametri

  • passmanager_ir (DAGCircuit) – Qiskit IR da ottimizzare.
  • state (DAGCircuit) – Stato associato all'esecuzione del flusso di lavoro da parte dello stesso gestore dei passaggi.
  • callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – Una funzione di callback che viene chiamata ad ogni esecuzione di un'attività di ottimizzazione.

Risultati

Qiskit IR ottimizzato e stato del flusso di lavoro.

Tipo di restituzione

tuple [ DAGCircuit, PassManagerState ]

name

name()

GitHub

Nome del passo.

Tipo di restituzione

STR

run

run(dag)

GitHub

Eseguire il passaggio scomponendo i nodi su cui si applica.

Parametri

dag (DAGCircuit) – Il dag a cui aggiungere gli swap.

Risultati

Un dag in cui sono stati aggiunti degli swap per il tipo di cancello previsto.

Aumenti

  • TranspilerError – Se la strategia di swap non è stata specificata al momento dell'inizializzazione e non è presente alcuna strategia di swap nel set di proprietà.
  • TranspilerError – Se il circuito quantistico contiene più di un registro di qubit.
  • TranspilerError – Se vi sono qubit che non sono contenuti nel registro quantistico.

Tipo di restituzione

DAGCircuito

swap_decompose

swap_decompose(dag, node, current_layout, swap_strategy)

GitHub

Prendere un'istanza di Commuting2qBlock e mapparla sulla mappa di accoppiamento.

La mappatura viene effettuata con la strategia swap.

Parametri

  • dag (DAGCircuit) – Il dag che contiene il Commuting2qBlock che noi instradiamo.
  • node (DAGOpNode) – Un nodo la cui operazione è un Commuting2qBlock.
  • current_layout (Layout) – Il layout prima dell'applicazione degli scambi. Questa funzione modifica il layout in modo che le porte successive possano essere composte correttamente sul dag.
  • swap_strategy (SwapStrategy) – La strategia di swap utilizzata per scomporre il nodo.

Risultati

Un dag compatibile con la mappa di accoppiamento in cui sono state aggiunte porte di scambio per mappare le porte di Commuting2qBlock all'hardware.

Tipo di restituzione

DAGCircuito

update_status

update_status(state, run_state)

GitHub

Aggiornare lo stato del flusso di lavoro.

Parametri

  • state (PassManagerState) – Passare lo stato del gestore da aggiornare.
  • run_state (RunState) – Stato di completamento dell'attività corrente.

Risultati

Stato aggiornato del gestore dei passaggi.

Tipo di restituzione

PassManagerState

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.