量子コードのデバッグとテスト

従来のプログラミングと同様に、量子プログラムが意図したとおりに動作することの確認が可能で、正しくない動作の診断が可能であることが非常に重要です。 この記事では、量子プログラムのテストとデバッグのために Azure Quantum Development Kit によって提供されるツールについて説明します。

プログラムの Q# デバッグ

Azure Quantum Development Kit (モダン QDK) Visual Studio Code 拡張機能には、プログラム用 Q# のデバッガーが含まれています。 ブレークポイントを設定し、コードをステップ実行し、各関数または操作にステップインし、ローカル変数だけでなく量子ビットの量子状態も追跡できます。

注意

VS Code デバッガーは (.qs) ファイルでのみ動作Q#し、Jupyter Notebook内のセルでは機能Q#しません。 セル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 キーを押してデバッグを開始し、ブレークポイントに進みます。 デバッガーの [変数 ] ウィンドウで、 Quantum State カテゴリを展開します。 量子ビットが |0> 状態で初期化されていることがわかります。
  4. ステップ イン (F11) 操作 H と操作のソース コードが H 表示されます。 操作をステップ実行するときに、演算によって量子ビットが重ね合わせに設定されると H 、量子値が変化します。
  5. 操作をステップ オーバー (F10) M すると、測定の結果として量子値が |0> または |1> に解決され、従来の変数 result の値が表示されます。
  6. 操作を Reset ステップ オーバーすると、量子ビットは |0> にリセットされます。

コードのテスト

VS Code Q# デバッガーはJupyter Notebook内のQ#セルでは使用できませんが、Modern QDK には、コードのトラブルシューティングに役立ついくつかの式と関数が用意されています。

Fail 式

式は fail 、プログラムを停止する致命的なエラーに対応して、計算を完全に終了します。

パラメーター値を検証する次の簡単な例を考えてみましょう。

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

ここで、 式を fail 使用すると、プログラムが無効なデータで実行され続けなくなります。

Fact() 関数

名前空間の 関数を使用して Fact() 、前の例と同じ動作を Microsoft.Quantum.Diagnostics 実装できます。 関数は Fact() 、指定された従来の条件を評価し、false の場合は例外をスローします。

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() 関数

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