Share via


Foutopsporing en het testen van uw kwantumcode

Net als bij klassieke programmering is het essentieel om te kunnen controleren of kwantumprogramma's werken zoals bedoeld, en om onjuist gedrag te kunnen diagnosticeren. In dit artikel worden de hulpprogramma's besproken die azure Quantum Development Kit biedt voor het testen en opsporen van fouten in kwantumprogramma's.

Foutopsporing in uw Q# programma

De Visual Studio Code-extensie van Azure Quantum Development Kit (Modern QDK) bevat een foutopsporingsprogramma voor Q# programma's. U kunt onderbrekingspunten instellen, uw code doorlopen en in elke functie of bewerking gaan en niet alleen de lokale variabelen bijhouden, maar ook de kwantumstatus van de qubits.

Notitie

Het VS Code-foutopsporingsprogramma werkt alleen met Q# (.qs)-bestanden en werkt niet met Q# cellen in een Jupyter Notebook. Zie Uw code testen voor het testen van Jupyter Notebook cellen.

In het volgende voorbeeld ziet u de basisfuncties van het foutopsporingsprogramma. Zie Foutopsporing voor volledige informatie over het gebruik van VS Code-foutopsporingsprogramma's.

Maak in VS Code een nieuw .qs-bestand en sla dit op met de volgende code:

namespace Sample {

    open Microsoft.Quantum.Arrays;
    open Microsoft.Quantum.Convert;

    @EntryPoint()
    operation Superposition() : Result {

        use qubit = Qubit();
        H(qubit);
        let result = M(qubit);
        Reset(qubit);
        return result;
    }
}
  1. Stel een onderbrekingspunt op de regel H(qubit) in door links van het regelnummer te klikken.
  2. Selecteer het pictogram van het foutopsporingsprogramma om het foutopsporingsvenster te openen en selecteer Uitvoeren en fouten opsporen. De besturingselementen van het foutopsporingsprogramma worden boven aan het scherm weergegeven.
  3. Selecteer F5 om de foutopsporing te starten en ga door naar het onderbrekingspunt. Vouw in het deelvenster Variabelen voor foutopsporing de categorie Kwantumstatus uit. U kunt zien dat de qubit is geïnitialiseerd met de status |0> .
  4. Stap in (F11) de H bewerking en de broncode voor de H bewerking wordt weergegeven. Terwijl u de bewerking doorloopt, ziet u dat de kwantumwaarde verandert wanneer de H bewerking de qubit in superpositie plaatst.
  5. Wanneer u de M bewerking (F10) overtreedt, wordt de kwantumwaarde als resultaat van de meting omgezet in |0> of |1> en wordt de waarde van de klassieke variabele result weergegeven.
  6. Wanneer u de bewerking overzet Reset , wordt de qubit opnieuw ingesteld op |0>.

Uw code testen

Hoewel het VS Code-foutopsporingsprogramma Q# niet beschikbaar is voor Q# cellen in een Jupyter Notebook, biedt de moderne QDK enkele expressies en functies waarmee u problemen met uw code kunt oplossen.

Fail-expressie

De fail expressie beëindigt de berekening volledig, wat overeenkomt met een fatale fout die het programma stopt.

Bekijk dit eenvoudige voorbeeld waarmee een parameterwaarde wordt gevalideerd:

import qsharp 
# import qsharp package to acccess the %%qsharp magic command
%%qsharp 
// use the %%qsharp magic command to change the cell type from Python to Q#

function PositivityFact(value : Int) : Unit {

    if value <= 0 {

            fail $"{value} isn't a positive number.";
    }   
}
PositivityFact(0);
Error: program failed: 0 isn't a positive number.
Call stack:
    at PositivityFact in line_2
Qsc.Eval.UserFail

  × runtime error
  ╰─▶ program failed: 0 isn't a positive number.
   ╭─[line_2:5:1]
 5 │ 
 6 │             fail $"{value} isn't a positive number.";
   ·             ────────────────────┬───────────────────
   ·                                 ╰── explicit fail
 7 │     }   
   ╰────

Hier voorkomt de fail expressie dat het programma wordt uitgevoerd met ongeldige gegevens.

De functie Fact()

U kunt hetzelfde gedrag implementeren als in het vorige voorbeeld met behulp van de Fact() functie uit de Microsoft.Quantum.Diagnostics naamruimte. De Fact() functie evalueert een bepaalde klassieke voorwaarde en genereert een uitzondering als deze onwaar is.

import qsharp 
# import qsharp package to acccess the %%qsharp magic command
%%qsharp
// use the %%qsharp magic command to change the cell type from Python to Q#

    function PositivityFact(value : Int) : Unit {

    Fact(value > 0, "Expected a positive number."); 

    }
    PositivityFact(4);
Error: program failed: Expected a positive number.
Call stack:
    at Microsoft.Quantum.Diagnostics.Fact in diagnostics.qs
    at PositivityFact in line_4
Qsc.Eval.UserFail

  × runtime error
  ╰─▶ program failed: Expected a positive number.
    ╭─[diagnostics.qs:29:1]
 29 │         if (not actual) {
 30 │             fail message;
    ·             ──────┬─────
    ·                   ╰── explicit fail
 31 │         }
    ╰────

De functie DumpMachine()

DumpMachine() is een Q# functie waarmee u informatie over de huidige status van de computer naar de target console kunt dumpen en uw programma kunt blijven uitvoeren.

Notitie

Met de release van Azure Quantum Development Kitgebruikt de DumpMachine() functie nu big-endian-volgorde voor de uitvoer.

import qsharp
%%qsharp

open Microsoft.Quantum.Diagnostics;

operation MultiQubitDumpMachineDemo() : Unit {
    use qubits = Qubit[2];
    X(qubits[1]);
    H(qubits[1]);
    
    DumpMachine();

    R1Frac(1, 2, qubits[0]);
    R1Frac(1, 3, qubits[1]);
    
    DumpMachine();
    
    ResetAll(qubits);
      }

MultiQubitDumpMachineDemo();
Basis State
(|𝜓ₙ…𝜓₁⟩)	Amplitude	Measurement Probability	Phase
|00⟩	0.7071+0.0000𝑖	 50.0000%	↑	0.0000
|10⟩	−0.7071+0.0000𝑖	 50.0000%	↑	-3.1416

Basis State
(|𝜓ₙ…𝜓₁⟩)	Amplitude	Measurement Probability	Phase
|00⟩	0.5879−0.3928𝑖	 50.0000%	↑	-0.5890
|10⟩	−0.6935+0.1379𝑖	 50.0000%	↑	2.9452

dump_machine() functie

dump_machine is een Python-functie die het huidige aantal toegewezen qubits retourneert en een Python-woordenlijst met sparse statusamplitudes die u kunt parseren. Als u een van deze functies in een Jupyter Notebook gebruikt, kunt u uw bewerkingen doorlopen zoals een foutopsporingsprogramma. Met behulp van het vorige voorbeeldprogramma:

import qsharp 
# import qsharp package to acccess the %%qsharp magic command
%%qsharp
// use the %%qsharp magic command to change the cell type from Python to Q#

use qubits = Qubit[2];
X(qubits[0]);
H(qubits[1]);
dump = qsharp.dump_machine()
dump

Basis State
(|𝜓ₙ…𝜓₁⟩)	Amplitude	Measurement Probability	Phase
|11⟩	0.7071+0.0000𝑖	 50.0000%	↑	0.0000
|01⟩	0.7071+0.0000𝑖	 50.0000%	↑	0.0000
%%qsharp
R1Frac(1, 2, qubits[0]);
R1Frac(1, 3, qubits[1]);
dump = qsharp.dump_machine()
dump
Basis State
(|𝜓ₙ…𝜓₁⟩)	Amplitude	Measurement Probability	Phase
|11⟩	0.5879+0.3928𝑖	 50.0000%	↑	0.5890
|01⟩	0.6935+0.1379𝑖	 50.0000%	↑	0.1963
# you can print an abbreviated version of the values
print(dump)
STATE:
|11⟩: 0.5879+0.3928𝑖
|01⟩: 0.6935+0.1379𝑖
# you can access the current qubit count
dump.qubit_count
2
# you can access individal states by their index
dump[1]
(0.6935199226610738, 0.1379496896414715)
dump[3]
(0.5879378012096794, 0.3928474791935511)