Men-debug dan menguji kode kuantum Anda

Seperti halnya pemrograman klasik, penting untuk dapat memeriksa bahwa program kuantum bertindak sebagaimana dimaksud, dan untuk dapat mendiagnosis perilaku yang salah. Artikel ini membahas alat yang ditawarkan oleh Azure Quantum Development Kit untuk menguji dan men-debug program kuantum.

Men-debug program Anda Q#

Ekstensi Visual Studio Code Azure Quantum Development Kit (Modern QDK) menyertakan debugger untuk Q# program. Anda dapat mengatur titik henti, menelusuri kode Anda dan ke setiap fungsi atau operasi, dan melacak tidak hanya variabel lokal, tetapi juga status kuantum qubit.

Catatan

Debugger Visual Studio Code hanya berfungsi dengan Q# file (.qs), dan tidak berfungsi dengan Q# sel di Jupyter Notebook. Untuk menguji sel Jupyter Notebook, lihat Menguji kode Anda.

Contoh berikut menunjukkan fitur dasar debugger. Untuk informasi lengkap tentang menggunakan debugger Visual Studio Code, lihat Penelusuran kesalahan.

Di Visual Studio Code, buat dan simpan file .qs baru dengan kode berikut:

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. Atur titik henti pada baris H(qubit) dengan mengklik di sebelah kiri nomor baris.
  2. Pilih ikon debugger untuk membuka panel debugger dan pilih Jalankan dan Debug. Kontrol debugger ditampilkan di bagian atas layar.
  3. Pilih F5 untuk memulai penelusuran kesalahan dan lanjutkan ke titik henti. Di panel Variabel debugger, perluas kategori Status Kuantum . Anda dapat melihat bahwa kubit telah diinisialisasi dalam status |0> .
  4. Masuk ke (F11) H operasi dan kode sumber untuk H operasi ditampilkan. Saat Anda menelusuri operasi, perhatikan perubahan nilai kuantum saat H operasi menempatkan qubit ke dalam superposisi.
  5. Saat Anda melangkahi (F10) M operasi, nilai kuantum diselesaikan menjadi |0> atau |1> sebagai hasil pengukuran, dan nilai variabel result klasik ditampilkan.
  6. Saat Anda melangkahi Reset operasi, kubit diatur ulang ke |0>.

Menguji kode Anda

Meskipun debugger Visual Studio Code Q# tidak tersedia untuk Q# sel di Jupyter Notebook, QDK Modern menyediakan beberapa ekspresi dan fungsi yang dapat membantu memecahkan masalah kode Anda.

Ekspresi gagal

fail Ekspresi mengakhiri komputasi sepenuhnya, sesuai dengan kesalahan fatal yang menghentikan program.

Pertimbangkan contoh sederhana ini yang memvalidasi nilai parameter:

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

Di sini, fail ekspresi mencegah program terus berjalan dengan data yang tidak valid.

Fungsi Fact()

Anda dapat menerapkan perilaku yang sama dengan contoh sebelumnya menggunakan Fact() fungsi dari Microsoft.Quantum.Diagnostics namespace. Fungsi ini Fact() mengevaluasi kondisi klasik tertentu dan melemparkan pengecualian jika salah.

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

Fungsi DumpMachine()

DumpMachine() adalah Q# fungsi yang memungkinkan Anda untuk membuang informasi tentang status target komputer saat ini ke konsol dan terus menjalankan program Anda.

Catatan

Dengan rilis Azure Quantum Development Kit, DumpMachine() fungsi sekarang menggunakan pemesanan big-endian untuk outputnya.

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

dump_machine adalah fungsi Python yang mengembalikan jumlah qubit yang dialokasikan saat ini dan kamus Python dari amplitudo status jarang yang dapat Anda uraikan. Menggunakan salah satu fungsi ini dalam Jupyter Notebook memungkinkan Anda menelusuri operasi seperti debugger. Menggunakan contoh program sebelumnya:

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)