Delen via


Sparse kwantumsimulator

De sparse-simulator is de standaard lokale simulator voor Azure Quantum-ontwikkelomgevingen en maakt gebruik van een sparse-weergave van kwantumstatusvectoren. Met deze functie kan de sparse simulator de geheugenvoetafdruk minimaliseren die wordt gebruikt om kwantumstatussen weer te geven, waardoor simulaties via een groter aantal qubits worden ingeschakeld. De sparse-simulator is efficiënt voor het weergeven van kwantumtoestanden die in de rekenkundige basis zijn geparseerd, dat wil gezegd kwantumtoestanden waarvoor de meeste amplitudecoëfficiënten nul zijn in de rekenkundige basis. De sparse-simulator stelt gebruikers in staat om grotere toepassingen te verkennen dan wat kan worden weergegeven met behulp van een volledige-statussimulator die zowel geheugen als tijd verspilt aan een exponentieel groot aantal nul-amplitudes.

Zie Jaques en Häner (arXiv:2105.01533) voor meer informatie over de sparse simulator.

De sparse-simulator aanroepen

De sparse-simulator is de standaard lokale simulator in Visual Studio Code waarop de Azure-extensie Quantum Development Kit is geïnstalleerd.

Scenario Wijze
In een Q# programma in VS Code Bestand uitvoeren Q# selecteren
In een Python-notebookcel result=qsharp.eval("Program_Entry_Operation()")
or
result=qsharp.run("Program_Entry_Operation()", shots=##)
In een %%qsharp notebookcel Program_Entry_Operation()

Pauli-ruis toevoegen aan de sparse simulator

De sparse simulator ondersteunt het toevoegen van Pauli-ruis aan de simulatie. Met deze functie kunt u de effecten van ruis op kwantumbewerkingen en metingen simuleren. Het ruismodel wordt opgegeven met behulp van een woordenlijst van Pauli-ruiskansen, waarbij de sleutels de Pauli-operatoren XYzijn, en , en Zde waarden de waarschijnlijkheid zijn van het toepassen van de bijbehorende Pauli-operator. Het ruismodel kan worden gebruikt in Q# programma's, Python-programma's of geconfigureerd in de VS Code-instellingen.

Pauli-ruis toevoegen met behulp van de VS Code-instellingen

Pauli-ruis kan globaal worden geconfigureerd in Visual Studio Code door de Q#> gebruikersinstelling Simulation:Pauli Noise te configureren.

Schermafbeelding met instellingen voor Q# ruissimulator.

De instellingen zijn van toepassing op histogramresultaten voor alle Q# programma's die worden uitgevoerd in VS Code en op alle poorten, metingen en qubits waarnaar in het programma wordt verwezen. De instellingen zijn identiek aan het gebruik van de ConfigurePauliNoise() functie.

Het uitvoeren van een histogram van het volgende GHz-voorbeeldprogramma zonder geconfigureerde ruis retourneert $\ket{00000}$ ongeveer de helft van de tijd en $\ket{11111}$ de andere helft.

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;
}

Schermopname met resultaten zonder ruis.

Als je echter 1% bit-flip-ruis toevoegt, zie je dat de toestand begint te diffunderen, en bij 25% ruis is de toestand niet te onderscheiden van ruis.

Schermopname met resultaten met 1% ruis en 25% ruis.

Pauli-ruis toevoegen aan Q# programma's

U kunt de ConfigurePauliNoise() functie gebruiken om het ruismodel voor afzonderlijke Q# programma's in te stellen of te wijzigen. Met behulp van ConfigurePauliNoise()kunt u nauwkeurig bepalen waar ruis wordt toegepast in uw Q# programma's.

Opmerking

Als u ruis configureert in de VS Code-instellingen, wordt de ruis toegepast op alle Q# programma's. Als u ruis in een Q# programma configureert met behulp van ConfigurePauliNoise, overschrijft die ruis de ruisinstellingen van VS Code tijdens de uitvoering van dat programma.

In het vorige programma kunt u bijvoorbeeld direct na de toewijzing van qubits ruis toevoegen:

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

Schermopname met resultaten met ruis toegevoegd na qubittoewijzing.

of net vóór de meetbewerking.

    ...
    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);
    ...

Schermopname met resultaten met ruis toegevoegd vlak voor meting.

U kunt ook de ConfigurePauliNoise() configuraties voor ruis opnieuw instellen of wissen. In dit voorbeeld worden de ruisinstellingen ingesteld na de qubittoewijzing en vervolgens onmiddellijk na de Hadamard-bewerking gewist, zodat ruis alleen op de H(); bewerking wordt toegepast.

...
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
...

De volgende functies zijn beschikbaar in de Std.Diagnostics bibliotheek voor het configureren van ruis in Q# programma's:

Functie Description Example
ConfigurePauliNoise() Hiermee configureert u Pauli-ruis voor een simulatoruitvoering, met de parameters die de waarschijnlijkheden van de X-, Y- en Z-poorten vertegenwoordigen. De ruisconfiguratie is van toepassing op alle volgende poorten, metingen en qubits in een Q# programma. Slaat alle geluidsinstellingen in VS Code over en kan opnieuw worden ingesteld door daaropvolgende ConfigurePauliNoise() aanroepen. ConfigurePauliNoise(0.1, 0.0, 0.5)
or
ConfigurePauliNoise(BitFlipNoise(0.1))
BitFlipNoise() Configureert ruis zodat deze alleen als de X-poort fungeert met een opgegeven waarschijnlijkheid. De ruisconfiguratie is van toepassing op alle volgende poorten, metingen en qubits in een Q# programma. 10% bitflip fouten:
ConfigurePauliNoise(BitFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.1, 0.0, 0.0)
PhaseFlipNoise() Configureert ruis als de Z-poort alleen met opgegeven waarschijnlijkheid. De ruisconfiguratie is van toepassing op alle volgende poorten, metingen en qubits in een Q# programma. 10% fase-flip ruis
ConfigurePauliNoise(PhaseFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.1)
DepolarizingNoise() Hiermee configureert u ruis als X-, Y- of Z-poort met gelijke waarschijnlijkheden. 6% depolariserende ruis:
ConfigurePauliNoise(DepolarizingNoise(0.06)) $\equiv$ ConfigurePauliNoise(0.2, 0.2, 0.2)
NoNoise() Configureert het ruismodel zodanig dat er geen ruis is. ConfigurePauliNoise(NoNoise()) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.0)
ApplyIdleNoise Hiermee past u geconfigureerde ruis toe op één qubit tijdens simulatie. ...
use q = Qubit[2];
ConfigurePauliNoise(0.1, 0.0, 0.0);
ApplyIdleNoise(q[0]);
...

Pauli-ruis toevoegen aan Python-programma's of Jupyter Notebooks

Pauli-ruisconfiguratie is beschikbaar met het qdk.qsharp Python-pakket en de mogelijkheid voor histogrammen met het qdk.widgets pakket. Ruis wordt toegevoegd als parameter aan de qsharp.run methode.

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

In het volgende voorbeeld ziet u het effect van 10% depolariserende ruis op een belstatusmeting.

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

Willekeurige Pauli-ruis kan worden toegevoegd aan het ruismodel door de waarschijnlijkheden van elke Pauli-operator op te geven. Laten we het vorige GHz-voorbeeldprogramma gebruiken:

%%qsharp

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

Deze uitvoering van het programma past ruis toe met 20% waarschijnlijkheid (bit-flip de helft van de tijd en fase-flip de helft van de tijd),

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

en deze uitvoering past Pauli-Y ruis met 10% waarschijnlijkheid toe.

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