Kuantum kodunuzun hatalarını ayıklama ve test etme

Klasik programlamada olduğu gibi kuantum programlarının amaçlanan şekilde davranıp davranmadığını denetleyebilmek ve yanlış davranışları tanılayabilmek çok önemlidir. Bu makalede, Azure Quantum Development Kit tarafından kuantum programlarını test etme ve hatalarını ayıklama için sunulan araçlar ele alınmaktadır.

Programınızda Q# hata ayıklama

Azure Quantum Development Kit (Modern QDK) Visual Studio Code uzantısı programlar için Q# bir hata ayıklayıcı içerir. Kesme noktaları ayarlayabilir, kodunuzda ilerleyip her işleve veya işleme gidebilir ve yalnızca yerel değişkenleri değil, kubitlerin kuantum durumunu da izleyebilirsiniz.

Not

VS Code hata ayıklayıcısı yalnızca (.qs) dosyalarıyla Q# çalışır ve Jupyter Notebook hücrelerle Q# çalışmaz. Jupyter Notebook hücreleri test etme için bkz. Kodunuzu test etme.

Aşağıdaki örnekte hata ayıklayıcının temel özellikleri gösterilmektedir. VS Code hata ayıklayıcılarını kullanma hakkında tam bilgi için bkz. Hata ayıklama.

VS Code'da aşağıdaki kodla yeni bir .qs dosyası oluşturun ve kaydedin:

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. Satır numarasının soluna tıklayarak satırda H(qubit) bir kesme noktası ayarlayın.
  2. Hata ayıklayıcı simgesini seçerek hata ayıklayıcı bölmesini açın ve Çalıştır ve Hata Ayıkla'ya tıklayın. Hata ayıklayıcı denetimleri ekranın en üstünde görüntülenir.
  3. Hata ayıklamayı başlatmak ve kesme noktasına devam etmek için F5'i seçin. Hata ayıklayıcısı Değişkenleri bölmesinde Kuantum Durumu kategorisini genişletin. Kubitin |0> durumunda başlatıldığını görebilirsiniz.
  4. İşlemin H içine adımlayın (F11) ve işlemin kaynak kodu H görüntülenir. İşlemde adım adım ilerlerken, işlem kubiti süper konuma yerleştirdiği için kuantum değerinin H değiştiğine dikkat edin.
  5. İşlemin üzerine (F10) M geçtikçe, ölçüm sonucunda kuantum değeri |0> veya |1> olarak çözümlenir ve klasik değişkenin result değeri görüntülenir.
  6. İşlemin Reset üzerinden geçtikçe kubit |0> olarak sıfırlanır.

Kodunuzu test etme

VS Code Q# hata ayıklayıcısı Jupyter Notebook hücrelerde kullanılamasa Q# da, Modern QDK kodunuzun sorunlarını gidermenize yardımcı olabilecek bazı ifadeler ve işlevler sağlar.

Başarısız ifadesi

İfade fail , programı durduran önemli bir hataya karşılık gelen hesaplamayı tamamen sonlandırır.

Bir parametre değerini doğrulayan şu basit örneği göz önünde bulundurun:

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

Burada ifade, fail programın geçersiz verilerle çalışmaya devam etmesini engeller.

Fact() işlevi

Ad alanından işlevini Microsoft.Quantum.Diagnostics kullanarak önceki örnekle Fact() aynı davranışı uygulayabilirsiniz. İşlev, Fact() belirli bir klasik koşulu değerlendirir ve false ise bir özel durum oluşturur.

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() işlevi

DumpMachine(), makinenin geçerli durumu target hakkındaki bilgileri konsola dökümleyip programınızı çalıştırmaya devam etmenizi sağlayan bir Q# işlevdir.

Not

Azure Quantum Development KitDumpMachine() sürümü ile işlev artık çıkışı için big-endian sıralamasını kullanır.

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() işlevi

dump_machine , geçerli ayrılmış kubit sayısını ve ayrıştırabileceğiniz seyrek durum genliklerinden oluşan bir Python sözlüğü döndüren bir Python işlevidir. Bu işlevlerden birini bir Jupyter Notebook kullanarak işlemlerinizde hata ayıklayıcıya çok benzer bir adım atabilirsiniz. Önceki örnek programı kullanarak:

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)