Commuting2qGateRouter
class qiskit.transpiler.passes.Commuting2qGateRouter(*args, **kwargs)
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
|
4A 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
SwapStrategyche 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)
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
name
run
run(dag)
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
swap_decompose
swap_decompose(dag, node, current_layout, swap_strategy)
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
Commuting2qBlockche 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
update_status
update_status(state, run_state)
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