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.
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
BlockBasePadder | La clase base del pase de relleno. |
ALAPScheduleAnalysis | Pase de análisis de programación de circuitos dinámicos "tan tarde como sea posible" (ALAP). |
ASAPScheduleAnalysis | Pase de análisis de programación de circuitos dinámicos tan pronto como sea posible (ASAP). |
DynamicCircuitInstructionDurations | Duración dinámica de las instrucciones de los circuitos. |
PadDelay | Relleno del tiempo de inactividad con instrucciones de retardo. |
PadDynamicalDecoupling | Paso 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")
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")
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.