SabreSwap
class qiskit.transpiler.passes.SabreSwap(*args, **kwargs)
Bases: TransformationPass
Mapear el circuito de entrada en una topología backend mediante la inserción de SWAPs.
Implementación de la búsqueda heurística basada en SWAP del documento SABRE qubit mapping [2] (Algoritmo 1) con las modificaciones del documento LightSABRE [1]. La heurística pretende minimizar el número de SWAPs con pérdidas insertados y la profundidad del circuito.
Este algoritmo parte de una disposición inicial de qubits virtuales en qubits físicos, e itera sobre el DAG del circuito hasta que se agotan todas las puertas, insertando SWAPs por el camino. Sólo se consideran las puertas de 2 qubits, ya que sólo éstas son pertinentes para el problema de la asignación (se supone que las puertas de más de 3 qubits ya están descompuestas).
En cada iteración, comprobará primero si hay alguna puerta en la front_layer que pueda aplicarse directamente. Si es así, las aplicará y eliminará de front_layer, y repondrá esa capa con nuevas puertas si es posible. De lo contrario, intentará buscar SWAPs, insertar los SWAPs y actualizar la asignación.
La búsqueda de SWAPs está restringida, en el sentido de que sólo consideramos qubits físicos en la vecindad de los qubits implicados en front_layer. Éstas dan lugar a un swap_candidate_list que se puntúa según alguna función heurística de costes. Se aplica el mejor SWAP y se actualiza current_layout .
Esta pasada del transpilador amplía el algoritmo SABRE, ya que ejecutará múltiples iteraciones del algoritmo con diferentes semillas. De entre los ensayos aleatorios, se seleccionará el mejor resultado, determinado por el ensayo en el que se hayan insertado menos SWAP.
Referencias:
[1] Henry Zou y Matthew Treinish y Kevin Hartman y Alexander Ivrii y Jake Lishman. “LightSABRE: Un algoritmo SABRE ligero y mejorado" arXiv:2409.08368 [2] Li, Gushu, Yufei Ding y Yuan Xie. "Abordar el problema del mapeo de qubits para dispositivos cuánticos de la era NISQ" ASPLOS 2019. arXiv:1809.02573
SabreSwap inicializador.
Parámetros
- coupling_map (Union[CouplingMap, Target]) – CouplingMap del backend de destino.
- heuristic (str) – El tipo de heurística que se utilizará para decidir la mejor estrategia de canje ("básica", "anticipada" o "decaída").
- seed (int) – semilla aleatoria utilizada para desempatar entre los canjes candidatos.
- fake_run (bool) – si es true, sólo pretende hacer enrutamiento, es decir, no se añade efectivamente ningún swap.
- trials (int) – El número de pruebas de semillas con las que ejecutar el sable. Se ejecutarán en paralelo (a menos que PassManager ya esté funcionando en paralelo). Si no se especifica, el valor predeterminado es el número de CPU físicas del sistema local. Para obtener resultados reproducibles, se recomienda establecerlo explícitamente, ya que la salida será determinista para un número fijo de ensayos.
Eleva
TranspilerError - Si la heurística especificada no es válida.
Información adicional:
El espacio de búsqueda de posibles SWAPs en qubits físicos se explora asignando una puntuación a la disposición que resultaría de cada SWAP. La bondad de un trazado se evalúa en función de la viabilidad del resto de puertas virtuales que deben aplicarse. Se admiten algunas funciones de coste heurísticas
- "básico":
La suma de las distancias de los qubits físicos correspondientes de los qubits virtuales que interactúan en la capa_frontal.
- 'lookahead':
Es la suma de dos costes: el primero es igual al coste básico. En segundo lugar está el coste básico, pero ahora evaluado también para el conjunto ampliado (es decir, un número e e al de los sucesores que se avecinan de las puertas de la capa anterior F). Esto se pondera con un valor EXTENDED_SET_WEIGHT (W) para indicar que las puertas siguientes son menos importantes que la capa frontal.
- 'decadencia':
Es lo mismo que el "lookahead", pero el coste total se multiplica por un factor de decaimiento. Esto aumenta el coste si el SWAP que generó el trazado de prueba se utilizó recientemente (es decir, penaliza el aumento de profundidad).
Atributos
coupling_map
dist_matrix
is_analysis_pass
Comprueba si el pase es un pase de análisis.
Si el pase es un AnalysisPass, significa que el pase puede analizar el DAG y escribir los resultados de ese análisis en el conjunto de propiedades. Este tipo de paso no permite realizar modificaciones en el DAG.
is_transformation_pass
Comprueba si el pase es un pase de transformación.
Si el pase es un TransformationPass, significa que el pase puede manipular el DAG, pero no puede modificar el conjunto de propiedades (pero se puede leer).
Métodos
execute
execute(passmanager_ir, state, callback=None)
Ejecutar la tarea de optimización para la entrada Qiskit IR.
Parámetros
- passmanager_ir (Any) – Qiskit IR para optimizar.
- state (PassManagerState) – Estado asociado a la ejecución del flujo de trabajo por el propio gestor de pases.
- callback (Callable | None) – Una función de devolución de llamada que se invoca cada vez que se ejecuta una tarea de optimización.
Devuelve
Qiskit IR optimizado y estado del flujo de trabajo.
Tipo de retorno
tupla [ Any, PassManagerState ]
name
run
run(dag)
Ejecuta el pase SabreSwap en dag.
Parámetros
dag (DAGCircuit) – el grafo acíclico dirigido a mapear.
Devuelve
Un dag mapeado para ser compatible con el coupling_map.
Tipo de retorno
Eleva
- TranspilerError - si el mapa de acoplamiento o el diseño no son
- compatible con el DAG**, o **si el coupling_map=None -
update_status
update_status(state, run_state)
Actualizar el estado del flujo de trabajo.
Parámetros
- state (PassManagerState) – Pasar estado de gestor a actualizar.
- run_state (RunState) – Estado de finalización de la tarea actual.
Devuelve
Estado del gestor de pases actualizado.
Tipo de retorno