Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Test ve hata ayıklama, kuantum programlamada klasik programlamada olduğu kadar önemlidir. Bu makalede, Visual Studio Code (VS Code) ve Jupyter Notebook'ta (QDK) kuantum programlarınızın Microsoft Quantum Development Kit hatalarını ayıklama ve test etme adımları anlatılmaktadır.
Kuantum kodunuzda hata ayıklama
QDK, kodunuzun hatalarını ayıklamak için çeşitli araçlar sağlar. VS Code'da OpenQASM veya Q# programları yazıyorsanız, programlarınızda kesme noktaları ayarlamak ve kodunuzu analiz etmek için VS Code hata ayıklayıcısını kullanabilirsiniz. QDK, programınızdaki farklı noktalarda bilgi almak için kullanabileceğiniz bir dizi döküm işlevi de sağlar.
VS Code hata ayıklayıcısını kullanma
VS Code'daki QDK uzantısıyla, hata ayıklayıcısını kullanarak kodunuzda adım adım ilerleyebilir ve her işleve veya işleme gidebilir, yerel değişkenlerin değerlerini izleyebilir ve kubitlerin kuantum durumlarını izleyebilirsiniz.
Aşağıdaki örnekte hata ayıklayıcının bir Q# programla nasıl kullanılacağı gösterilmektedir. VS Code hata ayıklayıcıları hakkında tam bilgi için VS Code web sitesindeki Hata Ayıklama bölümüne bakın.
VS Code'da aşağıdaki kodla yeni
.qsbir dosya oluşturun ve kaydedin:import Std.Arrays.*; import Std.Convert.*; operation Main() : Result { use qubit = Qubit(); H(qubit); let result = M(qubit); Reset(qubit); return result; }6. satırda,
H(qubit)kesme noktası ayarlamak için satır numarasının soluna tıklayın. Kırmızı bir daire gösterilir.Birincil Yan Çubuk'ta hata ayıklayıcı simgesini seçerek hata ayıklayıcı bölmesini açın ve ardından Çalıştır ve Hata Ayıkla'yı seçin. Hata ayıklayıcı denetim çubuğu açılır.
Hata ayıklayıcıyı başlatmak ve kesme noktasına devam etmek için F5 tuşuna basın. Hata ayıklayıcı bölmesinin Değişkenler menüsünde, Kuantum Durumu açılır listesini genişletin ve kubitin $\ket{0}$ durumunda başlatıldığını görebilirsiniz.
İşlemin içine girmek için F11 tuşuna
Hbasın. İşleminHkaynak kodu görüntülenir. İşlem boyunca ilerlediğinizde Kuantum Durumunun bir süper pozisyona değiştiğineHdikkat edin.İşlemin üzerine gitmek için F10 tuşuna
Mbasın. Kuantum Durumunun ölçümden sonra $\ket{0}$ veya $\ket{1}$ olarak çözümlendiğini fark edin.resultdeğişkeni Locals altında listelenir.İşlemin üzerine gitmek için F10 tuşuna
Resetyeniden basın. Kuantum Durumunun $\ket{0}$ olarak sıfırlandığını fark edin.
Hata ayıklayıcıyı keşfetmeyi bitirdiğinizde, hata ayıklayıcıdan çıkmak için Shift + F5 tuşlarına basın.
Not
VS Code hata ayıklayıcısı yalnızca (Q#) ve OpenQASM (.qs) dosyalarıyla .qasm çalışır. Jupyter Not Defteri'ndeki hücrelerde Q# VS Code hata ayıklayıcısını kullanamazsınız.
QDK döküm işlevleriyle hata ayıklama
QDK, bu işlevleri çağırdığınızda programınızın geçerli durumu hakkında bilgi dökümü oluşturan çeşitli Q# ve Python işlevleri sağlar. Programınızın beklediğiniz gibi davranıp davranmadığını denetlemek için bu döküm işlevlerindeki bilgileri kullanın.
Q#
DumpMachine İşlev
DumpMachine , programınız çalışırken kubit sisteminin geçerli durumu hakkındaki bilgileri konsola döküm etmenizi sağlayan bir Q# işlevdir.
DumpMachine çalışma zamanı sırasında programınızı durdurmaz veya kesintiye uğratmaz.
Aşağıdaki örnek, bir DumpMachine programının iki noktasında Q# çağırır ve çıkışı inceler.
VS Code'da aşağıdaki kodla yeni
.qsbir dosya oluşturun ve kaydedin:import Std.Diagnostics.*; operation Main() : 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); }Hata Ayıklama Konsolunu açmak için Ctrl + Shift + Y tuşlarına basın.
Programınızı çalıştırmak için Ctrl + F5 tuşlarına basın. Aşağıda
DumpMachine'den gelen çıkış, Hata Ayıklama Konsolu'nda görüntülenir.Basis | Amplitude | Probability | Phase ----------------------------------------------- |00⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000 |01⟩ | −0.7071+0.0000𝑖 | 50.0000% | -3.1416 Basis | Amplitude | Probability | Phase ----------------------------------------------- |00⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000 |01⟩ | −0.6533−0.2706𝑖 | 50.0000% | -2.7489
çıkışı DumpMachine , her geçit kümesinden sonra kubit sistemlerinin durumunun nasıl değiştiğini gösterir.
Not
çıktısı DumpMachine büyük endian sıralamasını kullanır.
Python dump_machine işlevi
dump_machine İşlev, Python paketindeki qsharp bir işlevdir. Bu işlev, geçerli ayrılmış kubit sayısını ve kubit sisteminin seyrek durum genliklerini içeren bir sözlüğü döndürür.
Aşağıdaki örnek, önceki DumpMachine örnekle aynı programı çalıştırır, ancak dosya yerine .qs Jupyter not defterinde çalışır.
VS Code'da, Komut Paleti'ni açmak için Ctrl + Shift + P tuşlarına basın.
Oluştur: Yeni Jupyter Not Defteri yazın ve Enter tuşuna basın. Yeni bir Jupyter Not Defteri sekmesi açılır.
İlk hücrede aşağıdaki kodu kopyalayıp çalıştırın:
from qdk import qsharpYeni bir kod hücresi oluşturun, ardından aşağıdaki Q# kodu kopyalayıp çalıştırın:
%%qsharp use qubits = Qubit[2]; X(qubits[0]); H(qubits[1]);Yeni bir kod hücresi oluşturun. Programın bu noktasında kubit durumunu görüntülemek için aşağıdaki Python kodunu kopyalayın ve çalıştırın:
dump = qsharp.dump_machine() dumpdump_machineİşlev aşağıdaki çıkışı görüntüler:Basis State (|𝜓₁…𝜓ₙ⟩) Amplitude Measurement Probability Phase |10⟩ 0.7071+0.0000𝑖 50.0000% ↑ 0.0000 |11⟩ 0.7071+0.0000𝑖 50.0000% ↑ 0.0000Yeni bir kod hücresi oluşturun, ardından aşağıdaki Q# kodu kopyalayıp çalıştırın:
%%qsharp R1Frac(1, 2, qubits[0]); R1Frac(1, 3, qubits[1]);Yeni bir kod hücresi oluşturun. Programın bu noktasında kubit durumunu görüntülemek için aşağıdaki Python kodunu kopyalayın ve çalıştırın:
dump = qsharp.dump_machine() dumpdump_machineİşlev aşağıdaki çıkışı görüntüler:Basis State (|𝜓₁…𝜓ₙ⟩) Amplitude Measurement Probability Phase |10⟩ 0.5000+0.5000𝑖 50.0000% ↗ 0.7854 |11⟩ 0.2706+0.6533𝑖 50.0000% ↗ 1.1781Çıkışın kısaltılmış bir sürümünü
dump_machineyazdırmak için yeni bir hücre oluşturun ve aşağıdaki Python kodunu çalıştırın:print(dump)Sistemdeki toplam kubit sayısını almak için yeni bir kod hücresi oluşturun ve aşağıdaki Python kodunu çalıştırın:
dump.qubit_countSıfır olmayan genliklere sahip tek tek kubit durumlarının genliklerine erişebilirsiniz. Örneğin, yeni bir kod hücresi oluşturun ve $\ket$ ve $\{10}ket{11}$ durumlarının tek tek genliklerini almak için aşağıdaki Python kodunu çalıştırın:
print(dump[2]) print(dump[3])
dump_operation işlevi
dump_operation İşlev, Python paketindeki qsharp.utils bir işlevdir. Bu işlev iki giriş alır: bir dize biçiminde Q# bir işlem veya işlem tanımını ve işlem için kullanılan kubit sayısını. çıkışı dump_operation , verilen kuantum işlemine karşılık gelen karmaşık sayıların kare matrisini temsil eden iç içe yerleştirilmiş bir listedir. Matris değerleri hesaplama temelindedir ve her alt liste matrisin bir satırını temsil eder.
Aşağıdaki örnek, 1 kubitli ve 2 kubitli bir sistemin bilgilerini görüntülemek için kullanır dump_operation .
VS Code'da, Komut Paleti'ni açmak için Ctrl + Shift + P tuşlarına basın.
Oluştur: Yeni Jupyter Not Defteri yazın ve Enter tuşuna basın. Yeni bir Jupyter Not Defteri sekmesi açılır.
İlk hücrede aşağıdaki kodu kopyalayıp çalıştırın:
from qdk import qsharp from qsharp.utils import dump_operationTek kubitli bir geçidin matris öğelerini görüntülemek için çağırın
dump_operationve kubit sayısı için 1'i geçirin. Örneğin, bir kimlik kapısı ve Hadamard kapısı için matris öğelerini almak için aşağıdaki Python kodunu kopyalayıp yeni bir kod hücresinde çalıştırın:res = dump_operation("qs => ()", 1) print("Single-qubit identity gate:\n", res) print() res = dump_operation("qs => H(qs[0])", 1) print("Single-qubit Hadamard gate:\n", res)qsharp.evalişlevini çağırabilir ve ardından Q# içindedump_operationişlemi başvurarak aynı sonucu elde edebilirsiniz. Örneğin, yeni bir kod hücresi oluşturun, ardından aşağıdaki Python kodunu kopyalayıp çalıştırarak tek kubitli hadamard geçidinin matris öğelerini yazdırın:qsharp.eval("operation SingleH(qs : Qubit[]) : Unit { H(qs[0]) }") res = dump_operation("SingleH", 1) print("Single-qubit Hadamard gate:\n", res)İki kubitli bir geçidin matris öğelerini görüntülemek için çağırın
dump_operationve kubit sayısı için 2'yi geçirin. Örneğin, ikinci kubitin target kubit olduğu Kontrol Edilen Ry işleminin matris öğelerini almak için aşağıdaki Python kodunu kopyalayıp yeni bir kod hücresinde çalıştırın.qsharp.eval ("operation ControlRy(qs : Qubit[]) : Unit { Controlled Ry([qs[0]], (0.5, qs[1])); }") res = dump_operation("ControlRy", 2) print("Controlled Ry rotation gate:\n", res)
ile dump_operationkodunuzu test etme ve hatalarını ayıklama hakkında daha fazla örnek için bkz. QDK örneklerinden test işlemleri .
Kuantum kodunuzu test edin
QDK, kodunuzu çalışırken test etmek için kullanabileceğiniz çeşitli Q# işlevler ve işlemler sağlar. Programlar için Q# birim testleri de yazabilirsiniz.
İfade fail
İfade, fail programınızı hemen sonlandırır. Testleri kodunuzla birleştirmek için koşullu deyimlerin içindeki ifadeleri kullanın fail .
Aşağıdaki örnek, bir kubit dizisinin tam olarak 3 kubit içerdiğini test etmek için bir fail deyimini kullanır. Test geçmezse program bir hata iletisiyle sona erer.
VS Code'da aşağıdaki kodla yeni
.qsbir dosya oluşturun ve kaydedin:operation Main() : Unit { use qs = Qubit[6]; let n_qubits = Length(qs); if n_qubits != 3 { fail $"The system should have 3 qubits, not {n_qubits}."; } }Programı çalıştırmak için Ctrl + F5 tuşlarına basın. Programınız başarısız olur ve Hata Ayıklama Konsolu'nda aşağıdaki çıkış görüntülenir:
Error: program failed: The system should have 3 qubits, not 6.Kodunuzu
Qubit[6]'denQubit[3]'e olarak düzenleyin, dosyanızı kaydedin ve ardından programı yeniden çalıştırmak için Ctrl + F5 tuşlarına basın. Test geçtiğinden program hatasız çalışır.
Fact işlevi
Kodunuzu test etmek için ad alanından Q# işlevini de kullanabilirsiniz.FactStd.Diagnostics
Fact İşlev bir Boole ifadesi alır ve hata iletisi dizesini alır. Boole ifadesi true ise, test geçer ve programınız çalışmaya devam eder. Boole ifadesi false ise, Fact programınızı sonlandırır ve hata iletisini görüntüler.
Önceki kodunuzda aynı dizi uzunluğu testini gerçekleştirmek için işleviyle Fact birlikte şu adımları izleyin:
VS Code'da aşağıdaki kodla yeni
.qsbir dosya oluşturun ve kaydedin:import Std.Diagnostics.Fact; operation Main() : Unit { use qs = Qubit[6]; let n_qubits = Length(qs); Fact(n_qubits == 3, $"The system should have 3 qubits, not {n_qubits}.") }Programı çalıştırmak için Ctrl + F5 tuşlarına basın. içindeki
Facttest koşulu geçirilmez ve hata iletisi Hata Ayıklama Konsolu'nda görüntülenir.Kodunuzu
Qubit[6]'denQubit[3]'e olarak düzenleyin, dosyanızı kaydedin ve ardından programı yeniden çalıştırmak için Ctrl + F5 tuşlarına basın. içindekiFacttest koşulu geçer ve programınız hatasız çalışır.
Q# birim testlerini @Test() açıklamasıyla yazın
Q# programlarında, bir (işlev veya işlem) çağrılabilenini birim testine dönüştürmek için @Test() anotasyonunu uygulayabilirsiniz. Bu birim testleri, bu VS Code özelliğinden yararlanabilmeniz için VS Code'daki Test menüsünde görünür. Giriş parametresi almayan bir çağrılabiliri ancak bu koşulda birim testine dönüştürebilirsiniz.
Aşağıdaki örnek, dizi uzunluğu test kodunu bir işlemde sarmalar ve bu işlemi birim testine dönüştürür:
VS Code'da aşağıdaki kodla yeni
.qsbir dosya oluşturun ve kaydedin:import Std.Diagnostics.Fact; @Test() operation TestCase() : Unit { use qs = Qubit[3]; let n_qubits = Length(qs); Fact(n_qubits == 3, $"The system should have 3 qubits, not {n_qubits}."); }İşlem
@Test()tanımından öncekiTestCasesatırdaki ek açıklama, işlemi bir VS Code birim testine dönüştürür. İşlem tanımı satırında yeşil bir ok görünür.Yeşil ok'u seçin ve
TestCaseçalıştırarak test sonuçlarını rapor edin.VS Code Test Gezgini'nde birim testlerinizle etkileşime geçmek için Birincil Yan Çubuk'ta Test flask simgesini seçin.
Kodunuzu
Qubit[3]öğesindenQubit[6]öğesine düzenleyin ve test bilgilerinin nasıl değiştiğini görmek için birim testini tekrar çalıştırın.
Programınızda giriş noktası işlemi olmadan VS Code'da birim testleri yazabilir ve çalıştırabilirsiniz Q# .
Not
Ad alanından Std.Diagnostics çağrılabilen öğeler QIR oluşturma ile uyumlu olmadığından, yalnızca simülatörlerde çalıştırdığınız koda Q# birim testlerini ekleyin. Kodunuzdan Q# QIR oluşturmak istiyorsanız, kodunuza birim testleri eklemeyin.
CheckZero ve CheckAllZero işlemleri
CheckZero ve CheckAllZeroQ# işlemleri, kubit veya kubit dizisinin geçerli durumunun $\ket{0}$ olup olmadığını denetler. İşlem CheckZero tek bir kubit alır ve yalnızca kubit $\kettrue$ durumunda olduğunda döndürür{0}. İşlemler CheckAllZero bir kubit dizisi alır ve yalnızca dizideki tüm kubitler $\kettrue$ durumunda olduğunda döndürür{0}.
CheckZero ve CheckAllZero öğelerini kullanmak için, bunları Std.Diagnostics ad alanından içeri aktarın.
Aşağıdaki örnek her iki işlemi de kullanır. İşlemin CheckZeroX ilk kubiti $\ket$ durumundan $\ket{0}{1}$ durumuna çevirdiğini test eder ve CheckAllZero işlem her iki kubitin de $\ket{0}$ durumuna sıfırlandığını test eder.
VS Code'da aşağıdaki kodla yeni .qs bir dosya oluşturup kaydedin, ardından programı çalıştırın ve Hata Ayıklama Konsolu'nda çıkışı inceleyin.
import Std.Diagnostics.*;
operation Main() : Unit {
use qs = Qubit[2];
X(qs[0]);
if CheckZero(qs[0]) {
Message("X operation failed");
}
else {
Message("X operation succeeded");
}
ResetAll(qs);
if CheckAllZero(qs) {
Message("Reset operation succeeded");
}
else {
Message("Reset operation failed");
}
}