Skip to main content
IBM Quantum Platform

Transpilar con gestores de pasos

  • El código de esta página se ha desarrollado teniendo en cuenta los siguientes requisitos. Recomendamos utilizar estas versiones o versiones más recientes.

    qiskit[all]~=2.5.0
    qiskit-ibm-runtime~=0.47.0
    

La forma recomendada de transpilar un circuito es crear un gestor de pasadas por etapas y luego ejecutar su método run con el circuito como entrada. Esta página explica cómo transpilar circuitos cuánticos de esta forma.


¿Qué es un gestor de pases (por etapas)?

En el contexto del SDK de Qiskit, la transpilación se refiere al proceso de transformar un circuito de entrada en una forma que sea adecuada para su ejecución en un dispositivo cuántico. La transpilación suele producirse en una secuencia de pasos denominados pases de transpilador. El circuito es procesado por cada paso del transpilador en secuencia, y la salida de un paso se convierte en la entrada del siguiente. Por ejemplo, una pasada podría recorrer el circuito y fusionar todas las secuencias consecutivas de puertas de un solo qubit y, a continuación, la siguiente pasada podría sintetizar estas puertas en el conjunto de bases del dispositivo objetivo. Los pases del transpilador incluidos con Qiskit se encuentran en el módulo qiskit.transpiler.passes módulo.

Un gestor de pases es un objeto que almacena una lista de pases del transpilador y puede ejecutarlos en un circuito. Crea un gestor de pases inicializando un PassManager con una lista de pases de transpilador. Para ejecutar la transpilación en un circuito, llame al método run con un circuito como entrada.

Un gestor de pases por etapas es un tipo especial de gestor de pases que representa un nivel de abstracción superior al de un gestor de pases normal. Mientras que un gestor de pases normal se compone de varios pases de transpilador, un gestor de pases por etapas se compone de varios gestores de pases. Se trata de una abstracción útil porque la transpilación suele producirse en etapas discretas, como se describe en Etapas del transpilador, y cada etapa está representada por un gestor de pases. Los gestores de pases por etapas están representados por la clase StagedPassManager clase. El resto de esta página describe cómo crear y personalizar gestores de pases (por etapas).


Generar un gestor de pases por etapas preestablecido

Para crear un gestor de pasadas por etapas preconfigurado con valores predeterminados razonables, utiliza la generate_preset_pass_manager función.

Note

En estos ejemplos se utiliza el backend FakeSherbrooke``qiskit_ibm_runtime simulado de, pero puedes probarlo con cualquier backend real o simulado compatible con Qiskit. Tus resultados pueden ser diferentes.

from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke

backend = FakeSherbrooke()
pass_manager = generate_preset_pass_manager(
    optimization_level=3, backend=backend
)

Para transpilar un circuito o una lista de circuitos con un gestor de pases, pase el circuito o la lista de circuitos al método run . Hagámoslo en un circuito de dos qubits consistente en un Hadamard seguido de dos puertas CX adyacentes:

from qiskit import QuantumRegister, QuantumCircuit

# Create a circuit
qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)
a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)

# Transpile it by calling the run method of the pass manager
transpiled = pass_manager.run(circuit)

# Draw it, excluding idle qubits from the diagram
transpiled.draw("mpl", idle_wires=False)

Output:

Output of the previous code cell

Consulte Valores predeterminados de transpilación y opciones de configuración para obtener una descripción de los posibles argumentos de la función generate_preset_pass_manager . Los argumentos de generate_preset_pass_manager coinciden con los argumentos de la función transpile función.

Si los gestores de pases predefinidos no satisfacen sus necesidades, personalice la transpilación creando gestores de pases (por etapas) o incluso pases de transpilación. El resto de esta página describe cómo crear gestores de acceso. Para obtener instrucciones sobre cómo crear pases de transpilación, consulte Escriba su propio pase de transpilación.


Crea tu propio gestor de pases

El módulo qiskit.transpiler.passes incluye muchos pases de transpilador que pueden utilizarse para crear gestores de pases. Para crear un gestor de pases, inicialice un PassManager con una lista de pases. Por ejemplo, el siguiente código crea un pase de transpilador que fusiona puertas adyacentes de dos qubits y luego las sintetiza en una base de RyR_y, RzR_z y RxxR_{xx}.

from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import (
    Collect2qBlocks,
    ConsolidateBlocks,
    UnitarySynthesis,
)

basis_gates = ["rx", "ry", "rxx"]
translate = PassManager(
    [
        Collect2qBlocks(),
        ConsolidateBlocks(basis_gates=basis_gates),
        UnitarySynthesis(basis_gates),
    ]
)

Para demostrar este gestor de pases en acción, pruébalo en un circuito de dos qubits formado por un Hadamard seguido de dos puertas CX adyacentes:

from qiskit import QuantumRegister, QuantumCircuit

qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)

a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)

circuit.draw("mpl")

Output:

Output of the previous code cell

Para ejecutar el gestor de pases en el circuito, llame al método run .

translated = translate.run(circuit)
translated.draw("mpl")

Output:

Output of the previous code cell

Para obtener un ejemplo más avanzado que muestra cómo crear un administrador de pases para implementar la técnica de supresión de errores conocida como desacoplamiento dinámico, consulte Crear un administrador de pases para desacoplamiento dinámico.


Crear un gestor de pases por etapas

Un StagedPassManager es un gestor de pases que se compone de etapas individuales, donde cada etapa está definida por una instancia PassManager . Puede crear una StagedPassManager especificando las etapas deseadas. Por ejemplo, el siguiente código crea un gestor de pases por etapas con dos etapas, init y translation. La etapa translation está definida por el gestor de pases creado anteriormente.

from qiskit.transpiler import PassManager, StagedPassManager
from qiskit.transpiler.passes import UnitarySynthesis, Unroll3qOrMore

basis_gates = ["rx", "ry", "rxx"]
init = PassManager(
    [UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]
)
staged_pm = StagedPassManager(
    stages=["init", "translation"], init=init, translation=translate
)

No hay límite en el número de etapas que puedes poner en un gestor de pases por etapas.

Otra forma útil de crear un gestor de pases por etapas es comenzar con un gestor de pases por etapas preestablecido y luego intercambiar algunas de las etapas. Por ejemplo, el siguiente código genera un gestor de pases preestablecido con un nivel de optimización 3 y, a continuación, especifica una etapa personalizada pre_layout .

import numpy as np
from qiskit.circuit.library import HGate, PhaseGate, RXGate, TdgGate, TGate
from qiskit.transpiler.passes import InverseCancellation

pass_manager = generate_preset_pass_manager(3, backend)
inverse_gate_list = [
    HGate(),
    (RXGate(np.pi / 4), RXGate(-np.pi / 4)),
    (PhaseGate(np.pi / 4), PhaseGate(-np.pi / 4)),
    (TGate(), TdgGate()),
]
logical_opt = PassManager(
    [
        InverseCancellation(inverse_gate_list),
    ]
)

# Add pre-layout stage to run extra logical optimization
pass_manager.pre_layout = logical_opt

Las funciones del generador de etapas pueden ser útiles para construir gestores de pases personalizados. Generan etapas que proporcionan funcionalidades comunes utilizadas en muchos gestores de pases. Por ejemplo, generate_embed_passmanager puede utilizarse para generar una etapa para "incrustar" un Layout inicial seleccionado de un pase de diseño en el dispositivo de destino especificado.


Próximos pasos

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