Creación de modelos de ruido para simulaciones cuánticas en QDK

Microsoft Quantum Development Kit(QDK) incluye un conjunto de simuladores cuánticos que modela cómo se ejecuta el programa en un equipo cuántico. Los programas que se ejecutan en un equipo cuántico siempre incluyen algún tipo y grado de ruido. El QDKPython paquete le permite crear modelos de ruido personalizados para usarlos en las simulaciones a través de la NoiseConfig API.

Para obtener instrucciones sobre cómo instalar y usar los QDK simuladores, consulte Instalación y ejecución de QDK los simuladores cuánticos.

Tipos de ruido

Cada operación o instrucción de un programa cuántico puede introducir ruido. En la tabla siguiente se enumeran todas las operaciones e instrucciones para las que puede establecer ruido.

Origen del ruido Parámetro del modelo de ruido Descripción del origen
Puerta $X$ x Puerta de Pauli de un solo qubit, inversión de bit
Puerta $Y$ y Puerta de Pauli de un solo qubit, inversión de bit e inversión de fase
Puerta $Z$ z Puerta Pauli de cúbit único, inversión de fase
Puerta $H$ h Puerta hadamard de un solo cúbit, crea un estado de superposición igual
Puerta $S$ s Puerta de un solo qubit, inversión de fase de medio pi
puerta $S^\dagger$ s_adj Puerta de un solo qubit, adjunta de $S$
puerta $T$ t Puerta de un solo qubit, inversión de fase de un cuarto de pi
puerta $T^\dagger$ t_adj Puerta de un solo qubit, adjunta de $T$
puerta $S_X$ sx Puerta de un solo qubit, inversión de medio bit
Puerta $S_X^\dagger$ sx_adj Puerta de un solo cúbit, adyacente de $S_X$
puerta $R_X$ rx Puerta de un solo cúbit, rotación de fase general sobre el eje $x$
Puerta $R_Y$ ry Puerta de un solo cúbit, rotación de fase general sobre el eje $y$
puerta $R_Z$ rz Puerta de un solo cúbit, rotación de fase general sobre el eje $z$
$CX$ puerta cx Puerta de dos cúbits, puerta controlada-$X$
puerta $CY$ cy Puerta de dos cúbits, puerta controlada-$Y$
Puerta $CZ$ cz Puerta de dos cúbits, puerta controlada-$Z$
puerta $R_{XX}$ rxx Puerta de dos cúbits, análoga a $R_X$
$R_{YY}$ puerta ryy Puerta de dos cúbits, análoga a $R_Y$
puerta $R_{ZZ}$ rzz Puerta de dos cúbits, análoga a $R_Z$
puerta $SWAP$ swap Puerta de dos cúbits, intercambia los estados de los cúbits
puerta $CCX$ ccx Puerta de tres cúbits, puerta controlada de dos cúbits $X$
Movimiento de cúbits mov Movimiento de cúbits entre zonas de dispositivo (para la simulación de dispositivo atom neutro)
Medición de cúbits mz Medida de un solo cúbit en la base pauli-$Z$
Medición y restablecimiento de cúbits mresetz Medición de un solo cúbit y restablecimiento a 0 estado

Con NoiseConfig, puede aplicar cuatro tipos diferentes de ruido a las operaciones anteriores con probabilidades específicas. En la tabla siguiente se enumeran los parámetros de tipo de ruido que puede establecer con NoiseConfig, incluido un parámetro para no ruido.

Tipo de ruido Parámetro del modelo de ruido Descripción del ruido Ejemplo de uso Descripción de ejemplo
Ruido de Pauli $X$ x Volteo de bits noise.z.x = 0.03 Se produce una inversión de bit en el 3 % de las operaciones $Z$
Ruido de Pauli $Y$ y Cambio de bits y cambio de fase noise.sx.y = 0.01 El volteo de bits y cambio de fase se produce en el 1% de las operaciones de $S_X$.
Ruido de Pauli $Z$ z Cambio de fase noise.h.z = 0.02 La inversión de fase se produce en el 2 % de las operaciones $H$
Sin ruido i Operación de identidad, sin efecto noise.cz.ix = 0.02 El cambio de bit solo en el qubit de destino se produce en el 2 % de las operaciones $CZ$
Pérdida de cúbits l El cúbit se pierde del dispositivo noise.mov.l = 0.03 El cúbit se pierde en el 3 % de los movimientos entre las zonas del dispositivo en un ordenador cuántico de átomos neutros

El ruido se produce después de la operación de origen, no en lugar de la operación de origen. Por ejemplo, significa que el programa aplica la puerta de $Z$ prevista al cúbit y, a continuación, noise.z.x aplica una puerta $X$ no deseada al cúbit. Dado que el ruido se aplica después del origen, puede configurar el ruido que tiene el mismo efecto que el origen. Por ejemplo, noise.x.x aplica un cambio de bit no deseado tras el cambio de bit previsto.

Nota:

Las API de simulación de dispositivos de átomos neutros admiten ruido procedente de un número limitado de fuentes. Para obtener más información, consulte Cómo crear modelos de ruido para simulaciones de dispositivos de átomos neutros en el QDK.

Creación de un modelo de ruido

Para crear un modelo de ruido para una simulación y ver los efectos de ese ruido en los resultados del programa cuántico, siga estos pasos.

  1. En VS Code, abra el menú Ver y elija Paleta de comandos.

  2. Escriba Crear: Nuevo Jupyter Notebook. Se abre un archivo vacío Jupyter Notebook en una nueva pestaña.

  3. En la primera celda del cuaderno, importe los objetos necesarios Python .

    from qdk import init, TargetProfile
    from qdk.openqasm import compile
    from qdk.simulation import NoiseConfig, run_qir
    from qdk.widgets import Histogram
    
  4. En una nueva celda, establezca el perfil de destino QIR del dispositivo y compile el circuito OpenQASM en QIR.

    init(target_profile=TargetProfile.Base)
    
    qasm_src = """
    include "stdgates.inc";
    qubit[2] qs;
    bit[2] r;
    
    h qs[0];
    cx qs[0], qs[1];
    r = measure qs;
    """
    
    qir = compile(qasm_src)
    
  5. Cree un objeto NoiseConfig y construya su modelo de ruido.

    noise = NoiseConfig()
    
    noise.h.x = 0.01
    noise.cx.zi = 0.02
    

    Este código genera el siguiente modelo de ruido, donde la tasa de ruido es la probabilidad de que el origen cause el tipo de ruido correspondiente.

    Origen del ruido Tipo de ruido Tasa de ruido
    Puerta $H$ Volteo de bits 1 %
    $CX$ puerta Cambio de fase en el cúbit de control 2%
  6. Ejecute el simulador con el modelo de ruido y vea un histograma de resultados de medición. Por ejemplo, ejecute el código siguiente para simular 1000 tomas del programa en el simulador de Clifford.

    results = run_qir(qir, shots=1000, noise=noise, type="clifford")
    Histogram(results, labels="kets")
    
  7. Para comparar los resultados ruidosos con una simulación sin ruido, vuelva a ejecutar la simulación sin modelo de ruido.

    results = run_qir(qir, shots=1000, type="clifford")
    Histogram(results, labels="kets")
    

Establecimiento de varios tipos de ruido en el mismo origen

Puede modelar diferentes tipos de ruido en el mismo origen, con diferentes probabilidades para cada tipo de ruido. Por ejemplo, el siguiente código establece una probabilidad del 1 % de que se produzca un cambio de bit y una probabilidad del 3 % de que se produzca un cambio de fase tras una puerta de Hadamard.

noise.h.x = 0.01
noise.h.z = 0.03

Al configurar varios tipos de ruido para la misma operación, solo se puede aplicar un tipo de ruido a cada operación del programa. Por ejemplo, cada puerta Hadamard puede tener ruido $X$ o ruido $Z$, pero no ambos a la vez.

Funciones del modelo de ruido

En lugar de los parámetros del modelo de ruido, puede usar el siguiente conjunto de funciones de ruido para crear el modelo de ruido.

Establecer ruido de Pauli

Para incluir el ruido de Pauli en tu modelo, invoca la función set_pauli_noise en una operación de puerta o de movimiento.

Para operaciones de un solo qubit, pasa una cadena de Pauli de un carácter y una tasa de ruido. Por ejemplo, el siguiente código define una probabilidad del 1 % de que se produzca una inversión de bit durante el movimiento de cúbits.

# Equivalent to: noise.mov.x = 0.01
noise.mov.set_pauli_noise('X', 0.01)

Para operaciones de dos qubits, pasa una cadena de Pauli de dos caracteres y una tasa de ruido. El primer carácter de la cadena pauli corresponde al ruido del cúbit de control y el segundo carácter corresponde al ruido del cúbit de destino. Por ejemplo, el siguiente código establece cambios de fase correlacionados tras el 1 % de las operaciones $CX$.

# Equivalent to: noise.cx.zz = 0.01
noise.cx.set_pauli_noise('ZZ', 0.01)

Establecer ruido de despolarización

La set_depolarizing función establece tasas de ruido iguales pero no correlacionadas para los tres tipos de ruido de Pauli. Por ejemplo, el código siguiente establece una probabilidad de 3% de que el ruido de Pauli se produzca después de una operación de $H$, distribuida uniformemente como 1% probabilidad de cada uno de los tres tipos de ruido de Pauli.

# Equivalent to:
#     noise.h.x = 0.01
#     noise.h.y = 0.01
#     noise.h.z = 0.01
noise.h.set_depolarizing(0.03)

Establecer el ruido de inversión de bits

Para establecer la tasa de ruido para los cambios de bit, utiliza la función set_bitflip en una operación de puerta o de movimiento. Por ejemplo, el código siguiente establece una probabilidad de 1% de que se produzca un volteo de fase después de una operación $R_Z$.

# Equivalent to: noise.rz.x = 0.01
noise.rz.set_bitflip(0.01)

Establecer ruido de cambio de fase

Para establecer la tasa de ruido para los cambios de fase en una operación, utiliza la función set_phaseflip en una operación de puerta o de movimiento. Por ejemplo, el código siguiente establece un 1% probabilidad de que se produzca un volteo de fase después de una operación $R_Y$.

# Equivalent to: noise.ry.z = 0.01
noise.ry.set_phaseflip(0.01)