PadDynamicalDecoupling
class qiskit.transpiler.passes.PadDynamicalDecoupling(*args, **kwargs)
Bases: BasePadding
Paso de inserción de desacoplamiento dinámico.
Este pase funciona en un circuito físico programado. Explora el circuito en busca de periodos de tiempo inactivos (es decir, aquellos que contienen instrucciones de retardo) e inserta una secuencia DD de puertas en esos puntos. Estas puertas equivalen a la identidad, por lo que no alteran la acción lógica del circuito, pero tienen el efecto de mitigar la decoherencia en esos periodos de inactividad.
Como caso especial, el pase permite una secuencia length-1 (por ejemplo, [XGate()]). En este caso, la inserción de DD sólo se produce cuando la puerta inversa puede ser absorbida en una puerta vecina del circuito (por lo que seguiríamos sustituyendo Retardo por algo equivalente a la identidad). Puede utilizarse, por ejemplo, como eco Hahn.
Este paso garantiza que la secuencia insertada conserve exactamente el circuito (incluida la fase global).
import numpy as np
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import XGate
from qiskit.transpiler import PassManager, InstructionDurations, Target, CouplingMap
from qiskit.transpiler.passes import ALAPScheduleAnalysis, PadDynamicalDecoupling
from qiskit.visualization import timeline_drawer
circ = QuantumCircuit(4)
circ.h(0)
circ.cx(0, 1)
circ.cx(1, 2)
circ.cx(2, 3)
circ.measure_all()
durations = InstructionDurations(
[("h", 0, 50), ("cx", [0, 1], 700), ("reset", None, 10),
("cx", [1, 2], 200), ("cx", [2, 3], 300),
("x", None, 50), ("measure", None, 1000)],
dt=1e-7
)
target = Target.from_configuration(
["h", "cx", "reset", "x", "measure"],
num_qubits=4,
coupling_map=CouplingMap.from_line(4, bidirectional=False),
instruction_durations=durations,
dt=1e-7,
)
# balanced X-X sequence on all qubits
dd_sequence = [XGate(), XGate()]
pm = PassManager([ALAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence)])
circ_dd = pm.run(circ)
timeline_drawer(circ_dd, target=target)
# Uhrig sequence on qubit 0
n = 8
dd_sequence = [XGate()] * n
def uhrig_pulse_location(k):
return np.sin(np.pi * (k + 1) / (2 * n + 2)) ** 2
spacing = []
for k in range(n):
spacing.append(uhrig_pulse_location(k) - sum(spacing))
spacing.append(1 - sum(spacing))
pm = PassManager(
[
ALAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence, qubits=[0], spacing=spacing),
]
)
circ_dd = pm.run(circ)
timeline_drawer(circ_dd, target=target)

Es posible que tenga que llamar al pase de alineación antes de ejecutar el desacoplamiento dinámico para garantizar que su circuito satisface las restricciones de alineación de adquisición.
Inicializador de desacoplamiento dinámico.
Parámetros
-
duraciones - Duraciones de las instrucciones que se utilizarán en la programación.
-
dd_sequence - Secuencia de puertas a aplicar en puntos muertos.
-
qubits - Qubits físicos sobre los que aplicar DD. Si es Ninguno, todos los qubits se someterán a DD (cuando sea posible).
-
espaciado - Una lista de espaciados entre las puertas DD. La holgura disponible se dividirá en función de esto. La longitud de la lista debe ser uno más que la longitud de dd_sequence, y los elementos deben sumar 1. Si no hay ninguno, se utilizará un espaciado equilibrado [d/2, d, d, …, d, d, d/2].
-
skip_reset_qubits - Si es True, no inserta DD en periodos de inactividad que siguen inmediatamente a qubits inicializados/reinicializados (ya que los qubits en estado de tierra son menos susceptibles a la decoherencia).
-
pulse_alignment - Las restricciones de hardware para la asignación de temporización de puertas. Suele facilitarse desde
backend.configuration().timing_constraints. Si se proporciona, la longitud del retardo, es decir,spacing, se ajusta implícitamente para satisfacer esta restricción. -
extra_slack_distribution -
La opción para controlar el comportamiento de la generación de secuencias DD. La duración de la secuencia DD debe ser idéntica a un tiempo de inactividad en el circuito cuántico programado, sin embargo, el retardo entre puertas que comprende la secuencia debe ser un número entero en unidades de dt, y podría truncarse aún más cuando se especifica
pulse_alignment. Esto hace que, en ocasiones, la duración de la secuencia creada sea inferior al tiempo de inactividad que se desea rellenar con la secuencia, es decir, sobra holgura. Esta opción toma los siguientes valores.- "medio": Pon la holgura extra al intervalo en el medio de la secuencia.
- "bordes": Divide la holgura extra lo más uniformemente posible en intervalos al principio y al final de la secuencia.
-
objetivo - El
Targetque representa el backend de destino. El objetivo tiene prioridad sobre otros argumentos cuando pueden deducirse del objetivo. Por lo tanto, si se especifica el objetivo y otros argumentos comodurationsopulse_alignment, se ignorarán esos otros argumentos.
Eleva
- TranspilerError - Cuando se especifica una secuencia DD no válida.
- TranspilerError - Cuando se encuentra una puerta de impulsos cuya duración no es múltiplo del valor de la restricción de alineación.
- TypeError - Si no se especifica
dd_sequence
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 ]
get_duration
name
run
run(dag)
Ejecute el pase de relleno en dag.
Parámetros
dag (DAGCircuit) – DAG que debe comprobarse.
Devuelve
DAG con tiempos muertos lleno de instrucciones.
Tipo de retorno
Eleva
TranspilerError - Cuando un nodo en particular no está programado, es probable que se inserte algún pase de transformación antes de que se llame a este nodo.
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