Skip to main content
IBM Quantum Platform

PadDynamicalDecoupling

class PadDynamicalDecoupling(*args, **kwargs)

GitHub

Bases: BlockBasePadder

Paso de inserción de desacoplamiento dinámico para backends de circuitos dinámicos IBM.

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 absorberse en una puerta vecina del circuito (por lo que seguiríamos sustituyendo Delay 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
from qiskit.visualization import timeline_drawer

from qiskit_ibm_runtime.transpiler.passes.scheduling import ALAPScheduleAnalysis
from qiskit_ibm_runtime.transpiler.passes.scheduling import PadDynamicalDecoupling

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)]
)

# balanced X-X sequence on all qubits
dd_sequence = [XGate(), XGate()]
pm = PassManager([ALAPScheduleAnalysis(durations),
                  PadDynamicalDecoupling(durations, dd_sequence)])
circ_dd = pm.run(circ)
circ_dd.draw('mpl', style="iqp")
Diagrama del circuito generado por el código anterior.
# 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
spacings = []
for k in range(n):
    spacings.append(uhrig_pulse_location(k) - sum(spacings))
spacings.append(1 - sum(spacings))
pm = PassManager(
    [
        ALAPScheduleAnalysis(durations),
        PadDynamicalDecoupling(durations, dd_sequence, qubits=[0], spacings=spacings),
    ]
)
circ_dd = pm.run(circ)
circ_dd.draw('mpl', style="iqp")
Diagrama del circuito generado por el código anterior.
Nota

Debe llamar a ALAPScheduleAnalysis antes de ejecutar el desacoplamiento dinámico para garantizar que su circuito satisface las restricciones de alineación de adquisición para backends de circuitos dinámicos.

Parámetros

  • duraciones - Duraciones de las instrucciones que se utilizarán en la programación.

  • dd_sequences - Secuencia de puertas a aplicar en puntos muertos. Alternativamente, se puede suministrar una lista de secuencias de puertas que se insertarán preferentemente si hay un retraso de duración suficiente. Puede ajustarse mediante la opción sequence_min_length_ratios.

  • qubits - Qubits físicos sobre los que aplicar DD. Si es Ninguno, todos los qubits se someterán a DD (cuando sea posible).

  • distancias - Una lista de distancias 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]. Este espaciado sólo se aplica al primer subcircuito, si se especifica un coupling_map

  • 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»: Reparte el exceso de holgura de la forma más uniforme posible en

      intervalos al principio y al final de la secuencia.

  • sequence_min_length_ratios - Lista de la relación mínima entre longitud de retardo y secuencia DD que debe satisfacerse para insertar la secuencia DD. Por ejemplo, si la secuencia de desacoplamiento dinámico X-X tiene una longitud de 320dt muestras y el retardo disponible es 384dt, tiene una relación de 384dt/320dt=1.2. Desde la perspectiva del desacoplamiento dinámico, es probable que esto añada más ruido de control que las reducciones de la tasa de error de desacoplamiento. El valor por defecto es 2.0.

  • insert\multiple_cycles - Si la duración disponible supera 2*sequence_min_length_ratio*duration(dd_sequence ) habilite la inserción de múltiples rondas de la secuencia de desacoplamiento dinámico en ese retardo.

  • coupling_map - grafo dirigido que representa el mapa de acoplamiento del dispositivo. La especificación de un mapa de acoplamiento divide el dispositivo en subcircuitos, con el fin de aplicar secuencias DD con diferentes espaciamientos de impulsos dentro de cada uno. Actualmente admite 2 subcircuitos.

  • alt_spacings - Una lista de espaciamientos entre las compuertas DD, para el segundo subcircuito, según lo determinado por el mapa de acoplamiento. Si es Ninguno, se utilizará un espaciado equilibrado escalonado con respecto al primer subcircuito [d, d, d,..., d, d, 0].

  • schedule_idle_qubits - Poner a true si quieres que se inserte un retardo en los qubits inactivos. Esto es útil para las visualizaciones de líneas de tiempo, pero puede causar problemas para la ejecución en grandes backends.

  • dd_barrier - aplicar DD sólo a los retardos que terminan con una barrera cuya etiqueta contiene la cadena especificada

  • block_ordering_callable - Llamador utilizado para producir un ordenamiento de los nodos para minimizar el número de bloques necesarios. Si no se indica, se utilizará block_order_op_nodes() .

  • destino : el destino de compilación del backend.

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.
  • TranspilerError - Cuando no se admite el mapa de acoplamiento (es decir, si el grado > 3)

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

__call__

__call__(circuit, property_set=None)

Ejecuta el circuito de paso.

Parámetros

  • circuit (QuantumCircuit) – El día en que se realiza el paso.
  • property_set (PropertySet | dict | None) – Conjunto de propiedades de entrada/salida. Una pasada de análisis puede cambiar la propiedad establecida en su lugar. Si no se proporciona, se utilizará el atributo property_set existente del pase (si está configurado).

Devuelve

Si una transformación se realiza correctamente, el resultado es QuantumCircuit. Si el análisis es satisfactorio, el circuito de entrada.

Tipo de retorno

QuantumCircuit

execute

execute(passmanager_ir, state, callback=None)

Ejecutar la tarea de optimización para la entrada Qiskit IR.

Parámetros

  • passmanager_ir (DAGCircuit) – Qiskit IR para optimizar.
  • state (DAGCircuit) – Estado relacionado con la ejecución del flujo de trabajo por parte del propio gestor de pasadas.
  • callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | 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[ DAGCircuit, PassManagerState ]

name

name()

Nombre del pase.

Tipo de retorno

str

run

run(dag)

GitHub

Ejecute el pase de relleno en dag.

Parámetros

dag (DAGCircuit) – DAG que debe comprobarse.

Devuelve

DAG con tiempos muertos lleno de instrucciones.

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.

Tipo de retorno

DAGCircuit

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

PassManagerState

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