Debuggen und Testen Ihres Quantencodes

Wie bei der herkömmlichen Programmierung muss unbedingt überprüft werden können, ob sich Quantenprogramme wie vorgesehen verhalten, und es muss möglich sein, fehlerhaftes Verhalten zu diagnostizieren. In diesem Artikel werden die von Azure Quantum Development Kit angebotenen Tools zum Testen und Debuggen von Quantenprogrammen erläutert.

Debuggen ihres Q# Programms

Die Azure Quantum Development Kit (Modern QDK) Visual Studio Code-Erweiterung enthält einen Debugger für Q# Programme. Sie können Haltepunkte festlegen, den Code schrittweise und in jede Funktion oder jeden Vorgang durchlaufen und nicht nur die lokalen Variablen, sondern auch den Quantenzustand der Qubits nachverfolgen.

Hinweis

Der VS Code-Debugger funktioniert nur mit Q# (QS-Dateien) und nicht mit Q# Zellen in einer Jupyter Notebook. Informationen zum Testen Jupyter Notebook Zellen finden Sie unter Testen ihres Codes.

Im folgenden Beispiel werden die grundlegenden Features des Debuggers veranschaulicht. Vollständige Informationen zur Verwendung von VS Code-Debuggern finden Sie unter Debuggen.

Erstellen und speichern Sie in VS Code eine neue QS-Datei mit dem folgenden 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. Legen Sie einen Haltepunkt für die Zeile H(qubit) fest, indem Sie links neben der Zeilennummer klicken.
  2. Wählen Sie das Debuggersymbol aus, um den Debuggerbereich zu öffnen, und wählen Sie Ausführen und Debuggen aus. Die Debuggersteuerelemente werden oben auf dem Bildschirm angezeigt.
  3. Wählen Sie F5 aus, um mit dem Debuggen zu beginnen, und fahren Sie zum Haltepunkt fort. Erweitern Sie im Bereich Debuggervariablen die Kategorie Quantenzustand . Sie können sehen, dass das Qubit im Zustand |0> initialisiert wurde.
  4. Führen Sie in (F11) den H Vorgang und den Quellcode für den H Vorgang ein. Beachten Sie beim Durchlaufen des Vorgangs, dass sich der Quantenwert ändert, wenn der H Vorgang das Qubit in die Überlagerung versetzt.
  5. Beim Ausführen des M Vorgangs (F10) wird der Quantenwert aufgrund der Messung entweder in |0> oder |1> aufgelöst, und der Wert der klassischen Variablen result wird angezeigt.
  6. Beim Ausführen des Vorgangs Reset wird das Qubit auf |0> zurückgesetzt.

Testen von Code

Obwohl der VS Code-Debugger Q# für Q# Zellen in einer Jupyter Notebook nicht verfügbar ist, stellt das moderne QDK einige Ausdrücke und Funktionen bereit, die bei der Problembehandlung für Ihren Code helfen können.

Fehlerausdruck

Der fail Ausdruck beendet die Berechnung vollständig, was einem schwerwiegenden Fehler entspricht, der das Programm beendet.

Betrachten Sie dieses einfache Beispiel, das einen Parameterwert überprüft:

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 verhindert der fail Ausdruck, dass das Programm weiterhin mit ungültigen Daten ausgeführt wird.

Fact()-Funktion

Sie können dasselbe Verhalten wie im vorherigen Beispiel implementieren, indem Sie die Fact() Funktion aus dem Microsoft.Quantum.Diagnostics Namespace verwenden. Die Fact() Funktion wertet eine bestimmte klassische Bedingung aus und löst eine Ausnahme aus, wenn sie false ist.

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 │         }
    ╰────

DumpMachine()-Funktion

DumpMachine() ist eine Q# Funktion, mit der Sie Informationen über den aktuellen Zustand des Computers in die target Konsole abspeichern und ihr Programm weiterhin ausführen können.

Hinweis

Mit der Veröffentlichung von Azure Quantum Development Kitverwendet die DumpMachine() Funktion jetzt big-endian-Reihenfolge für ihre Ausgabe.

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()-Funktion

dump_machine ist eine Python-Funktion, die die aktuell zugeordnete Qubitanzahl und ein Python-Wörterbuch mit Amplituden des Sparsezustands zurückgibt, die Sie analysieren können. Wenn Sie eine dieser Funktionen in einer Jupyter Notebook verwenden, können Sie Ihre Vorgänge ähnlich wie einen Debugger durchlaufen. Verwenden Des vorherigen Beispielprogramms:

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)