SabreSwap
class qiskit.transpiler.passes.SabreSwap(*args, **kwargs)
Basi: TransformationPass
Mappare il circuito di ingresso su una topologia backend mediante l'inserimento di SWAP.
Implementazione della ricerca euristica basata su SWAP del documento SABRE sulla mappatura dei qubit [2] (Algoritmo 1) con le modifiche apportate dal documento [1] di LightSABRE. L'euristica mira a minimizzare il numero di SWAP con perdita inseriti e la profondità del circuito.
Questo algoritmo parte da una disposizione iniziale dei qubit virtuali sui qubit fisici e itera sul DAG del circuito fino a esaurire tutte le porte, inserendo SWAP lungo il percorso. Si considerano solo le porte a 2 qubit, poiché solo quelle sono rilevanti per il problema della mappatura (si presume che le porte a 3+ qubit siano già decomposte).
In ogni iterazione, controlla innanzitutto se nel sito front_layer ci sono porte che possono essere applicate direttamente. In caso affermativo, li applicherà e li rimuoverà da front_layer e, se possibile, reintegrerà lo strato con nuovi cancelli. Altrimenti, cercherà di cercare gli SWAP, di inserirli e di aggiornare la mappatura.
La ricerca degli SWAP è ristretta, nel senso che consideriamo solo i qubit fisici nelle vicinanze dei qubit coinvolti in front_layer. Questi danno origine a un sito swap_candidate_list che viene valutato in base a una funzione di costo euristica. Il miglior SWAP viene implementato e current_layout aggiornato.
Questo passaggio del transpiler integra l'algoritmo SABRE in quanto esegue più iterazioni dell'algoritmo utilizzando semi diversi. Tra le prove casuali verrà selezionato il risultato migliore, determinato dalla prova in cui è stato inserito il minor numero di SWAP.
Riferimenti:
[1] Henry Zou e Matthew Treinish e Kevin Hartman e Alexander Ivrii e Jake Lishman. “LightSABRE: Un algoritmo SABRE leggero e migliorato" arXiv:2409.08368 [2] Li, Gushu, Yufei Ding e Yuan Xie. "Affrontare il problema della mappatura dei qubit per i dispositivi quantistici dell'era NISQ" ASPLOS 2019. arXiv:1809.02573
SabreSwap inizializzatore.
Parametri
- coupling_map (Union[CouplingMap, Target]) – CouplingMap del backend di destinazione.
- heuristic (str) – Il tipo di euristica da utilizzare per decidere la migliore strategia di swap ("basic" o "lookahead" o "decay").
- seed (int) – seme casuale utilizzato per il tie-break tra gli scambi di candidati.
- fake_run (bool) – se vero, fa solo finta di fare il routing, cioè non viene aggiunto alcuno swap.
- trials (int) – Il numero di prove di semina con cui eseguire Sabre. Questi verranno eseguiti in parallelo (a meno che il sito PassManager non sia già in esecuzione in parallelo). Se non viene specificato, il valore predefinito è il numero di CPU fisiche del sistema locale. Per ottenere risultati riproducibili, si consiglia di impostarlo esplicitamente, in quanto l'output sarà deterministico per un numero fisso di prove.
Aumenti
TranspilerError – Se l'euristica specificata non è valida.
Ulteriori informazioni:
Lo spazio di ricerca dei possibili SWAP sui qubit fisici viene esplorato assegnando un punteggio al layout che risulterebbe da ogni SWAP. La bontà di un layout viene valutata in base a quanto rende praticabili le rimanenti porte virtuali che devono essere applicate. Sono supportate alcune funzioni di costo euristiche
- 'base':
Somma delle distanze dei qubit fisici corrispondenti ai qubit virtuali interagenti nello strato anteriore.
- 'lookahead':
Si tratta della somma di due costi: il primo è uguale al costo base. Il secondo è il costo base, ma ora calcolato anche per l'insieme esteso (ovvero un numero e di successori a venire dei gate nel livello anteriore F). Questo valore viene ponderato con un fattore EXTENDED_SET_WEIGHT (W) per indicare che i gate successivi sono meno importanti rispetto allo strato anteriore.
- 'decadimento':
È la stessa cosa del "lookahead", ma l'intero costo viene moltiplicato per un fattore di decadimento. Questo aumenta il costo se lo SWAP che ha generato il layout di prova è stato usato di recente (cioè penalizza l'aumento della profondità).
Attributi
coupling_map
dist_matrix
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 SabreSwap su dag.
Parametri
dag (DAGCircuit) – il grafo aciclico diretto da mappare.
Risultati
Un dag mappato per essere compatibile con la coupling\map.
Tipo di restituzione
Aumenti
- TranspilerError – se la mappa di accoppiamento o il layout non sono
- *compatibile con il DAG***, o ** se la mappa di accoppiamento=None -
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