Compartir a través de


Simulador cuántico disperso

El simulador disperso es el simulador local predeterminado para entornos de desarrollo de Azure Quantum y utiliza una representación dispersa de vectores de estado cuántico. Esta característica permite que el simulador disperso minimice la superficie de memoria utilizada para representar estados cuánticos, lo que permite simulaciones en un mayor número de cúbits. El simulador disperso es eficaz para representar estados cuánticos dispersos en la base computacional, es decir, aquellos estados cuánticos para los que la mayoría de los coeficientes de amplitud son cero en la base computacional. Por lo tanto, el simulador disperso permite a los usuarios explorar aplicaciones más grandes que lo que se puede representar mediante un simulador de estado completo que perderá memoria y tiempo en un número exponencialmente grande de amplitudes cero.

Para más información sobre el simulador disperso, consulte Jaques y Häner (arXiv:2105.01533).

Llamada al simulador disperso

El simulador disperso es el simulador local predeterminado en Visual Studio Code con la extensión de Azure Quantum Development Kit instalada.

Escenario Método
En un Q# programa de VS Code Seleccione Ejecutar Q# archivo.
En una celda del cuaderno de Python result=qsharp.eval("Program_Entry_Operation()")
o
result=qsharp.run("Program_Entry_Operation()", shots=##)
En una celda del %%qsharp cuaderno Program_Entry_Operation()

Adición de ruido de Pauli al simulador de matrices dispersas

El simulador disperso admite la adición de ruido de Pauli a la simulación. Esta característica permite simular los efectos del ruido en las operaciones cuánticas y las medidas. El modelo de ruido se especifica mediante un diccionario de probabilidades de ruido de Pauli, donde las claves son los operadores Xde Pauli , Yy , y Zlos valores son las probabilidades de aplicar el operador Pauli correspondiente. El modelo de ruido se puede usar en Q# programas, programas de Python o configurado en la configuración de VS Code.

Adición de ruido de Pauli mediante la configuración de VS Code

El ruido de Pauli se puede configurar globalmente en Visual Studio Code a través de la opción de configuración de usuario "Simulation:Pauli Noise".

Captura de pantalla que muestra la configuración del Q# simulador ruidoso.

La configuración se aplica a los resultados del histograma para todos los Q# programas que se ejecutan en Visual Studio Code, así como a todas las compuertas, medidas y cúbits a los que se hace referencia en el programa. La configuración es idéntica al uso de la ConfigurePauliNoise() función .

Ejecutar un histograma del siguiente programa de ejemplo de GHz sin ruido configurado devolvería $\ket{00000}$ aproximadamente la mitad del tiempo y $\ket{11111}$ la otra mitad.

import Std.Diagnostics.*;
import Std.Measurement.*;

operation Main() : Result []{
    let num = 5;
    return GHzSample(num);
}
operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    H(qs[0]);
    ApplyCNOTChain(qs);
    let results = MeasureEachZ(qs);
    ResetAll(qs);
    return results;
}

Captura de pantalla que muestra los resultados sin ruido.

Sin embargo, agregar un 1% de ruido de volteo de bits muestra el estado empezando a difundirse, y con un 25% de ruido, el estado se vuelve indistinguible del ruido.

Captura de pantalla que muestra los resultados con 1% ruido y 25% ruido.

Adición de ruido de Pauli a Q# programas

Puede usar la ConfigurePauliNoise() función para establecer o modificar el modelo de ruido para programas individuales Q# . Con ConfigurePauliNoise(), puede controlar de forma granular dónde se aplica ruido en sus programas de Q#.

Nota:

Si configura ruido en la configuración de VS Code, el ruido se aplica a todos los Q# programas. Si configura ruido en un Q# programa mediante ConfigurePauliNoise, ese ruido anula la configuración de ruido de VS Code durante la ejecución de dicho programa.

Por ejemplo, en el programa anterior puede agregar ruido inmediatamente después de la asignación de cúbits:

...
operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    ConfigurePauliNoise(0.05, 0.0, 0.0); // 5% bit-flip noise applies to all operations
    H(qs[0]);
...

Captura de pantalla que muestra los resultados con ruido agregado después de la asignación de cúbits.

o justo antes de la operación de medición.

    ...
    use qs = Qubit[n];
    H(qs[0]);

    ApplyCNOTChain(qs);
    ConfigurePauliNoise(0.05, 0.0, 0.0); // noise applies only to measurement operation 
    let results = MeasureEachZ(qs);
    ...

Captura de pantalla que muestra los resultados con ruido agregado justo antes de la medición.

También puede usar ConfigurePauliNoise() para restablecer o borrar configuraciones de ruido. En este ejemplo, la configuración de ruido se establece después de la asignación de cúbits y, a continuación, se borra inmediatamente después de la operación Hadamard, de modo que el ruido solo se aplica a la H(); operación.

...
operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    ConfigurePauliNoise(0.05, 0.0, 0.0); // noise applies to H() operation
    H(qs[0]);
    ConfigurePauliNoise(0.0, 0.0, 0.0); // clear noise settings
...

Las siguientes funciones están disponibles en la Std.Diagnostics biblioteca para configurar el ruido en Q# programas:

Función Description Example
ConfigurePauliNoise() Configura el ruido de Pauli para una ejecución del simulador, con parámetros que representan probabilidades para las puertas X, Y y Z. La configuración de ruido se aplica a todas las puertas, mediciones y qubits posteriores en un programa Q#. Omite cualquier configuración de ruido en VS Code y se puede restablecer mediante llamadas posteriores ConfigurePauliNoise() . ConfigurePauliNoise(0.1, 0.0, 0.5)
o
ConfigurePauliNoise(BitFlipNoise(0.1))
BitFlipNoise() Configura el ruido para que sea la puerta X solo con una probabilidad específica. La configuración de ruido se aplica a todas las puertas, mediciones y qubits posteriores en un programa Q#. 10% ruido de volteo de bits:
ConfigurePauliNoise(BitFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.1, 0.0, 0.0)
PhaseFlipNoise() Configura el ruido para que sea la puerta Z solo con la probabilidad especificada. La configuración de ruido se aplica a todas las puertas, mediciones y qubits posteriores en un programa Q#. 10% ruido de volteo por fase:
ConfigurePauliNoise(PhaseFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.1)
DepolarizingNoise() Configura el ruido para que sea una puerta X, Y o Z con probabilidades iguales. 6% ruido despolarizante
ConfigurePauliNoise(DepolarizingNoise(0.06)) $\equiv$ ConfigurePauliNoise(0.2, 0.2, 0.2)
NoNoise() Configura el modelo de ruido para no incluir ruido. ConfigurePauliNoise(NoNoise()) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.0)
ApplyIdleNoise Aplica el ruido configurado a un solo cúbit durante la simulación. ...
use q = Qubit[2];
ConfigurePauliNoise(0.1, 0.0, 0.0);
ApplyIdleNoise(q[0]);
...

Adición de ruido de Pauli a programas de Python o cuadernos Jupyter

La configuración de ruido de Pauli está disponible con el paquete qdk.qsharp de Python, y la capacidad de histograma con el paquete qdk.widgets. El ruido se agrega como parámetro al qsharp.run método .

  • qsharp.BitFlipNoise
  • qsharp.PhaseFlipNoise
  • qsharp.DepolarizingNoise

En el ejemplo siguiente se muestra el efecto del ruido de despolarización del 10% en una medida de estado de Bell.

from qdk import qsharp
from qdk import widgets
%%qsharp

operation BellPair() : Result[] {
    use q = Qubit[2];
    H(q[0]);
    CNOT(q[0], q[1]);
    MResetEachZ(q)
}
results = qsharp.run("BellPair()", 20, noise=qsharp.DepolarizingNoise(0.1))
results

El ruido arbitrario de Pauli se puede agregar al modelo de ruido especificando las probabilidades de cada operador de Pauli. Vamos a usar el programa de ejemplo de GHz anterior:

%%qsharp

operation GHzSample() : Result[] {
    use q = Qubit[5];
    H(q[0]);
    ApplyCNOTChain(q);
    MResetEachZ(q)
}

Esta ejecución del programa aplica ruido con una probabilidad del 20% (inversión de bits la mitad del tiempo e inversión de fase la mitad del tiempo),

result = qsharp.run("GHzSample()", 20, noise=(0.1, 0.0, 0.1))
display(widgets.Histogram(result))

y esta ejecución aplica Pauli-Y ruido con 10% probabilidad.

result = qsharp.run("GHzSample()", 20, noise=(0.0, 0.1, 0.0))
display(widgets.Histogram(result))