Commuting2qGateRouter
class qiskit.transpiler.passes.Commuting2qGateRouter(*args, **kwargs)
Bases: TransformationPass
Una clase para intercambiar la ruta de una o más puertas de desplazamiento al mapa de acoplamiento.
Este paso encamina bloques de puertas conmutadas de dos qubits encapsuladas como instrucciones Commuting2qBlock . Este pase no se aplicará a otras instrucciones. La asignación al mapa de acoplamiento se realiza mediante estrategias de intercambio, véase SwapStrategy. La estrategia de intercambio debe adaptarse al problema y al mapa de acoplamiento. Lo ideal es ejecutar este paso del transpilador antes de ampliar el circuito cuántico con qubits ancilla ociosos. De lo contrario, podríamos intercambiar qubits fuera de la parte del chip que queremos utilizar. Por lo tanto, la estrategia de intercambio y su mapa de acoplamiento asociado no representan qubits físicos. En su lugar, representan un mapeo intermedio que corresponde a los qubits físicos una vez aplicada la disposición inicial. El siguiente ejemplo muestra cómo asignar un qubit de cuatro PauliEvolutionGate a los qubits 0, 1, 3 y 4 del dispositivo de cinco qubits con el mapa de acoplamiento
0 -- 1 -- 2
|
3
|
4Para ello, utilizamos una estrategia de intercambio de líneas para los qubits 0, 1, 3 y 4, definida en términos de los qubits virtuales 0, 1, 2 y 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")Este gestor de pases se basa en la dirección current_layout que corresponde a la disposición de los qubits a medida que se aplican las puertas de intercambio. El pase atravesará todos los nodos del dag. Si un nodo debe enrutarse utilizando una estrategia de intercambio, entonces se descompondrá en subinstrucciones con capas de intercambio entre ellas y se modificará la current_layout . Los nodos que no deban enrutarse mediante estrategias de intercambio se añadirán de nuevo al dag teniendo en cuenta la current_layout .
Parámetros
- swap_strategy - Una instancia de
SwapStrategyque contiene las capas de intercambio que se utilizan, y el orden en el que aplicarlas, para asignar la instrucción al hardware. Si no se indica este campo, debe estar contenido en el conjunto de propiedades del pase. Esto permite que otras pasadas determinen la estrategia de intercambio más adecuada en tiempo de ejecución. - edge_coloring - Una coloración opcional de los bordes del mapa de acoplamiento ( I.e. no hay dos aristas que compartan un nodo que tengan el mismo color). Si se da la coloración del borde, entonces las puertas conmutantes que pueden aplicarse simultáneamente dada la permutación actual de qubits se agrupan según la coloración del borde y se aplican según esta coloración del borde. Aquí, un color es un int que se utiliza como índice para definir y acceder a los grupos de puertas conmutadas que pueden aplicarse simultáneamente. Si no se indica la coloración de las aristas, los conjuntos se construirán mediante un algoritmo codicioso. La coloración de los bordes es útil para colocar puertas como
RZZGates junto a puertas de intercambio para explotar las cancelaciones CX.
Atributos
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 descomponiendo los nodos sobre los que se aplica.
Parámetros
dag (DAGCircuit) – El dag al que añadiremos swaps.
Devuelve
Un dag en el que se han añadido intercambios para el tipo de puerta previsto.
Eleva
- TranspilerError - Si la estrategia de intercambio no fue dada en el momento de init y no hay ninguna estrategia de intercambio en el conjunto de propiedades.
- TranspilerError - Si el circuito cuántico contiene más de un registro qubit.
- TranspilerError - Si hay qubits que no están contenidos en el registro cuántico.
Tipo de retorno
swap_decompose
swap_decompose(dag, node, current_layout, swap_strategy)
Tomar una instancia de Commuting2qBlock y asignarla al mapa de acoplamiento.
El mapeo se realiza con la estrategia swap.
Parámetros
- dag (DAGCircuit) – El dag que contiene el
Commuting2qBlocknos ruta. - node (DAGOpNode) – Un nodo cuya operación es un
Commuting2qBlock. - current_layout (Layout) – El diseño antes de aplicar los intercambios. Esta función modificará la disposición para que las puertas siguientes puedan componerse correctamente en el dag.
- swap_strategy (SwapStrategy) – La estrategia de intercambio utilizada para descomponer el nodo.
Devuelve
Un dag compatible con el mapa de acoplamiento en el que se han añadido puertas de intercambio para asignar las puertas en el Commuting2qBlock al hardware.
Tipo de retorno
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