共用方式為


偵錯和測試量子程序代碼

如同傳統程式設計,您必須能夠檢查量子程式是否正常運作,並診斷不正確的行為。 本文討論 Azure Quantum Development Kit 所提供的工具來測試和偵錯量子程式。

偵錯程式Q#

Azure Quantum Development Kit (新式 QDK) Visual Studio Code 延伸模組包含程式的Q#調試程式。 您也可以設定斷點、逐步執行程式碼,並進入每個函式或作業,並追蹤局部變數,以及量子位的量子狀態。

注意

VS Code 調試程式只適用於 Q# (.qs) 檔案,而且不適用於 Q# Jupyter Notebook 中的單元格。 如需測試 Jupyter Notebook 儲存格,請參閱測試程式代碼

下列範例示範調試程式的基本功能。 如需使用 VS Code 調試程式的完整資訊,請參閱 偵錯

在 VS Code 中,使用下列程式代碼建立並儲存新的 .qs 檔案:

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. 按兩下行號左側,在行 H(qubit) 上設定斷點。
  2. 選取調試程序圖示以開啟調試程式窗格,然後選取 [ 執行] 和 [偵錯]。 調試程式控制件會顯示在畫面頂端。
  3. 選取 F5 以開始偵錯並繼續到斷點。 在調試程式 [變數] 窗格中,展開 [量子狀態 ] 類別。 您可以看到已以 |0> 狀態初始化量子位。
  4. 逐步執行 (F11) H 作業和作業的 H 原始程式碼會顯示。 當您逐步執行作業時,請注意當作業將量子位放入迭加時 H ,量子值會變更。
  5. 當您 (F10) M 作業時,量子值會解析為 |0> 或 |1> ,因為測量結果,而且會顯示傳統變數 result 的值。
  6. 當您逐步執行作業時 Reset ,量子位會重設為 |0>。

測試您的程式碼

雖然 VS Code Q# 調試程式不適用於 Q# Jupyter Notebook 中的數據格,但新式 QDK 提供一些運算式和函式,可協助您針對程式碼進行疑難解答。

失敗表達式

表達式會 fail 完全結束計算,對應至停止程式的嚴重錯誤。

請考慮這個驗證參數值的簡單範例:

import qsharp 
# import qsharp package to access 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 │     }   
   ╰────

在這裡, fail 表達式會防止程序繼續使用無效的數據執行。

事實 () 函式

您可以使用 命名空間中的 Microsoft.Quantum.Diagnostics 函式,實作與上一個範例Fact()相同的行為。 函 Fact() 式會評估指定的傳統條件,如果例外狀況為 false,則會擲回例外狀況。

import qsharp 
# import qsharp package to access 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 () 函式

DumpMachine() 是一個 Q# 函式,可讓您將計算機目前狀態 target 的相關信息傾印到主控台,並繼續執行程式。

注意

透過 Azure Quantum Development Kit的發行,函 DumpMachine() 式現在會針對其輸出使用大端順序。

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 () 函式

dump_machine 是一個 Python 函式,會傳回目前配置的量子位計數,以及您可以剖析之疏鬆狀態幅度的 Python 字典。 在 Jupyter Notebook 中使用上述任一函式,可讓您逐步執行作業,就像調試程序一樣。 使用先前的範例程式:

import qsharp 
# import qsharp package to access 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)