Quantum Development Kit (QDK) simulador de estado completo
Nota:
Los ejemplos de este tema usan Microsoft Quantum Development Kit (QDK clásico) y aún no son compatibles con la versión preliminar de Azure Quantum Development Kit (QDK moderno). Para obtener más información sobre el QDK moderno, consulte la wiki de GitHub de QSharp.
El QDK proporciona un simulador de estado completo que simula una máquina cuántica en el equipo local. Puede usar el simulador de estado completo para ejecutar y depurar algoritmos cuánticos escritos en Q#, utilizando hasta 30 cúbits. La funcionalidad del simulador de estado completo es similar al simulador cuántico usado en la plataforma LIQ$Ui|\rangle$ de Microsoft Research.
Invocación y ejecución del simulador de estado completo
El simulador de estado completo se expone con la clase QuantumSimulator
. Para más información, consulte Formas de ejecutar un programa de Q#.
Invocación del simulador desde C#
Cree una instancia de la clase QuantumSimulator
y pásela al método Run
de una operación cuántica, junto con los parámetros adicionales.
using (var sim = new QuantumSimulator())
{
var res = myOperation.Run(sim).Result;
///...
}
Dado que la clase QuantumSimulator
implementa la interfaz IDisposable, debe llamar al método Dispose
una vez que ya no necesite la instancia del simulador. La mejor manera de hacerlo es encapsular la declaración y las operaciones del simulador dentro de una instrucción using , que llama automáticamente al Dispose
método .
Invocación del simulador desde Python
Use el método simulate() de la biblioteca de Python de Q# con la operación de Q# importada:
qubit_result = myOperation.simulate()
Invocación del simulador desde la línea de comandos
Al ejecutar un Q# programa desde la línea de comandos, el simulador de estado completo es el equipo predeterminado target . Opcionalmente, puede usar el parámetro --simulator (o -s shortcut) para especificar la máquina deseada target . Los dos comandos siguientes ejecutan un programa mediante el simulador de estado completo.
dotnet run
dotnet run -s QuantumSimulator
Invocación del simulador desde Jupyter Notebooks
Use el comando magic %simulate de IQ# para ejecutar la operación de Q#.
%simulate myOperation
Inicialización del simulador
De forma predeterminada, el simulador de estado completo usa un generador de números aleatorios para simular la aleatoriedad cuántica. Con fines de prueba, a veces resulta útil tener resultados deterministas. En un programa de C#, puede hacerlo proporcionando un valor de inicialización al generador de números aleatorios en el constructor QuantumSimulator
con el parámetro randomNumberGeneratorSeed
.
using (var sim = new QuantumSimulator(randomNumberGeneratorSeed: 42))
{
var res = myOperationTest.Run(sim).Result;
///...
}
Opciones del simulador
El comportamiento del simulador de estado completo se puede ajustar al constructor de C# a través de los parámetros siguientes:
Parámetro | Descripción |
---|---|
throwOnReleasingQubitsNotInZeroState |
El simulador puede advertirle si los cúbits no se han devuelto al zero estado antes de liberarse iniciando una excepción. El valor predeterminado es true . |
randomNumberGeneratorSeed |
Obtenga un comportamiento determinista mediante la propagación del simulador. |
disableBorrowing |
Si no desea usar cúbits prestados para esta simulación, puede deshabilitar esta característica estableciendo este parámetro true en . En su lugar, los cúbits prestados se reemplazarán por cúbits limpios normales. El valor predeterminado es false . |
Nota:
Restablecer o medir cúbits antes de que la especificación requiera la Q# versión; no hacerlo puede provocar errores computacionales.
El código siguiente muestra una posible configuración de los parámetros.
var sim = new QuantumSimulator (
throwOnReleasingQubitsNotInZeroState: false,
randomNumberGeneratorSeed: 42,
disableBorrowing: true
)
Configuración de subprocesos
El simulador de estado completo usa OpenMP para paralelizar el álgebra lineal requerida. De forma predeterminada, OpenMP usa todos los subprocesos de hardware disponibles, lo que significa que los programas con pequeños números de cúbits a menudo se ejecutan lentamente porque la coordinación necesaria enana el trabajo real. Puede corregirlo estableciendo la variable de entorno OMP_NUM_THREADS
en un número pequeño. Como regla general, configure un subproceso para hasta cuatro cúbits y, a continuación, un subproceso adicional por cúbit. Es posible que tenga que ajustar la variable en función del algoritmo.