A kvantumkód hibakeresése és tesztelése

A klasszikus programozáshoz hasonlóan elengedhetetlen annak ellenőrzése, hogy a kvantumprogramok a kívánt módon működnek-e, és hogy képesek legyenek-e diagnosztizálni a helytelen viselkedést. Ez a cikk az Azure Quantum Development Kit által a kvantumprogramok teszteléséhez és hibakereséséhez kínált eszközöket ismerteti.

A program hibakeresése Q#

Az Azure Quantum Development Kit (Modern QDK) Visual Studio Code bővítmény tartalmaz egy program hibakeresőt Q# . Beállíthat töréspontokat, lépegethet a kódon és az egyes függvényeken vagy műveleteken, és nemcsak a helyi változókat, hanem a qubitek kvantumállapotát is nyomon követheti.

Megjegyzés

A VS Code-hibakereső csak (.qs) fájlokkal Q# működik, és nem működik a Jupyter Notebook celláivalQ#. A Jupyter Notebook cellák teszteléséhez lásd: A kód tesztelése.

Az alábbi példa a hibakereső alapvető funkcióit mutatja be. A VS Code hibakeresőinek használatával kapcsolatos teljes információkért lásd: Hibakeresés.

A VS Code-ban hozzon létre és mentsen egy új .qs fájlt a következő kóddal:

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. Állítson be töréspontot a vonalon H(qubit) úgy, hogy a sorszámtól balra kattint.
  2. Válassza a hibakereső ikont a hibakereső panel megnyitásához, majd válassza a Futtatás és hibakeresés lehetőséget. A hibakereső vezérlői a képernyő tetején jelennek meg.
  3. Válassza az F5 lehetőséget a hibakeresés megkezdéséhez, és folytassa a töréspontot. A Változók hibakereső panelen bontsa ki a Quantum State kategóriát. Láthatja, hogy a qubit inicializálása |0> állapotban történt.
  4. Lépjen be (F11) a H műveletbe, és megjelenik a művelet forráskódja H . A művelet során figyelje meg a kvantumérték változásait, mivel a H művelet szuperpozícióba helyezi a qubitet.
  5. A művelet (F10) M fölé lépve a kvantumérték a mérés eredményeként |0> vagy |1> lesz, és megjelenik a klasszikus változó result értéke.
  6. A művelet végrehajtásakor a Reset qubit alaphelyzetbe áll a következőre: |0>.

A kód tesztelése

Bár a VS Code Q# hibakeresője nem érhető el a Jupyter Notebook celláihozQ#, a Modern QDK olyan kifejezéseket és függvényeket biztosít, amelyek segíthetnek a kód hibaelhárításában.

Feladatkifejezés

A fail kifejezés teljes egészében befejezi a számítást, ami egy végzetes hibának felel meg, amely leállítja a programot.

Fontolja meg ezt az egyszerű példát, amely ellenőrzi a paraméter értékét:

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

Itt a fail kifejezés megakadályozza, hogy a program továbbra is érvénytelen adatokkal fusson.

Fact() függvény

Az előző példához hasonló viselkedést valósíthat meg a Fact() névtérből származó Microsoft.Quantum.Diagnostics függvénnyel. A Fact() függvény kiértékel egy adott klasszikus feltételt, és kivételt ad, ha hamis.

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() függvény

DumpMachine() egy Q# olyan függvény, amely lehetővé teszi a gép aktuális állapotára vonatkozó információk memóriaképét target a konzolon, és folytathatja a program futtatását.

Megjegyzés

Az Azure Quantum Development Kitkiadásával a DumpMachine() függvény most big-endian rendezést használ a kimenetéhez.

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() függvény

dump_machine Egy Python-függvény, amely az aktuális lefoglalt qubitszámot és az elemezhető ritka állapotú amplitúdók Python-szótárát adja vissza. Ezen függvények Jupyter Notebook való használata lehetővé teszi, hogy a hibakeresőhöz hasonlóan végiglépkedjen a műveleteken. Az előző példaprogram használata:

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)