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;
}
}
- Legen Sie einen Haltepunkt für die Zeile
H(qubit)
fest, indem Sie links neben der Zeilennummer klicken. - 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.
- 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.
- Führen Sie in (F11) den
H
Vorgang und den Quellcode für denH
Vorgang ein. Beachten Sie beim Durchlaufen des Vorgangs, dass sich der Quantenwert ändert, wenn derH
Vorgang das Qubit in die Überlagerung versetzt. - 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 Variablenresult
wird angezeigt. - 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)
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für