Skip to main content
IBM Quantum Platform

Commuting2qGateRouter

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

GitHub

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
     |
     4

Para 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 SwapStrategy que 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)

GitHub

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

name()

GitHub

Nombre del pase.

Tipo de retorno

str

run

run(dag)

GitHub

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

Circuito DAG

swap_decompose

swap_decompose(dag, node, current_layout, swap_strategy)

GitHub

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 Commuting2qBlock nos 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

Circuito DAG

update_status

update_status(state, run_state)

GitHub

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

PassManagerState

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.