Skip to main content
IBM Quantum Platform

Pasadas de programación del transpilador

qiskit_ibm_runtime.transpiler.passes.scheduling

Una colección de pases de programación para trabajar con los backends de nueva generación de IBM Quantum que admiten funciones avanzadas de "circuito dinámico". Es decir.., con soporte para el flujo de control/retroalimentación clásico basado en los resultados de las mediciones. Para obtener más información sobre los circuitos dinámicos, consulte nuestra guía sobre el feedforward clásico y el flujo de control.

Aviso

No debes mezclar estos pases de programación con los pases de programación incorporados en Qiskit ya que interactuarán negativamente con las rutinas de programación para circuitos dinámicos. Esto incluye la configuración de scheduling_method en transpile() o generate_preset_pass_manager().


Clases

BlockBasePadderLa clase base del pase de relleno.
ALAPScheduleAnalysisPase de análisis de programación de circuitos dinámicos "tan tarde como sea posible" (ALAP).
ASAPScheduleAnalysisPase de análisis de programación de circuitos dinámicos tan pronto como sea posible (ASAP).
DynamicCircuitInstructionDurationsDuración dinámica de las instrucciones de los circuitos.
PadDelayRelleno del tiempo de inactividad con instrucciones de retardo.
PadDynamicalDecouplingPaso de inserción de desacoplamiento dinámico para backends de circuitos dinámicos IBM.

Uso de ejemplo

A continuación demostramos cómo programar y rellenar un circuito de teletransporte con retardos para un modelo de ejecución de backend de circuito dinámico:

from qiskit.circuit import ClassicalRegister, QuantumCircuit, QuantumRegister
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.transpiler.passmanager import PassManager

from qiskit_ibm_runtime.transpiler.passes.scheduling import ALAPScheduleAnalysis
from qiskit_ibm_runtime.transpiler.passes.scheduling import PadDelay
from qiskit_ibm_runtime.fake_provider import FakeJakartaV2

backend = FakeJakartaV2()

# Use this duration class to get appropriate durations for dynamic
# circuit backend scheduling
# Generate the main Qiskit transpile passes.
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
# Configure the as-late-as-possible scheduling pass
pm.scheduling = PassManager([
    ALAPScheduleAnalysis(target=backend.target),
    PadDelay(target=backend.target)]
    )

qr = QuantumRegister(3)
crz = ClassicalRegister(1, name="crz")
crx = ClassicalRegister(1, name="crx")
result = ClassicalRegister(1, name="result")

teleport = QuantumCircuit(qr, crz, crx, result, name="Teleport")

teleport.h(qr[1])
teleport.cx(qr[1], qr[2])
teleport.cx(qr[0], qr[1])
teleport.h(qr[0])
teleport.measure(qr[0], crz)
teleport.measure(qr[1], crx)
with teleport.if_test((crz, 1)):
    teleport.z(qr[2])
with teleport.if_test((crx, 1)):
    teleport.x(qr[2])
teleport.measure(qr[2], result)

# Transpile.
scheduled_teleport = pm.run(teleport)

scheduled_teleport.draw(output="mpl", style="iqp")
Diagrama del circuito generado por el código anterior.

En lugar de rellenar con retrasos, también podemos insertar una secuencia de desacoplamiento dinámico utilizando el PadDynamicalDecoupling «pass», tal y como se muestra a continuación:

from qiskit.circuit.library import XGate

from qiskit_ibm_runtime.transpiler.passes.scheduling import PadDynamicalDecoupling


dd_sequence = [XGate(), XGate()]

pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
pm.scheduling = PassManager(
    [
        ALAPScheduleAnalysis(target=backend.target),
        PadDynamicalDecoupling(target=backend.target, dd_sequences=dd_sequence),
    ]
)

dd_teleport = pm.run(teleport)

dd_teleport.draw(output="mpl", style="iqp")
Diagrama del circuito generado por el código anterior.

Al compilar un circuito con Qiskit, es más eficiente y más robusto realizar todas las transformaciones en una sola transpilación. Esto se ha hecho anteriormente ampliando los gestores de pases predefinidos de Qiskit. Por ejemplo, la función transpile() construye internamente su conjunto de pases utilizando generate_preset_pass_manager(). Esto devuelve instancias de StagedPassManagerque pueden ampliarse.

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