Ladění a testování kvantového kódu

Stejně jako u klasického programování je nezbytné mít možnost zkontrolovat, že kvantové programy fungují podle očekávání, a umět diagnostikovat nesprávné chování. Tento článek popisuje nástroje, které Azure Quantum Development Kit nabízí pro testování a ladění kvantových programů.

Ladění Q# programu

Rozšíření Azure Quantum Development Kit (Modern QDK) Visual Studio Code obsahuje ladicí program pro Q# programy. Můžete nastavit zarážky, procházet kód a do každé funkce nebo operace a sledovat nejen místní proměnné, ale také kvantový stav qubitů.

Poznámka

Ladicí program VS Code funguje jenom se Q# soubory (.qs) a nepracuje s buňkami Q# v Jupyter Notebook. Informace o testování Jupyter Notebook buněk najdete v tématu Testování kódu.

Následující příklad ukazuje základní funkce ladicího programu. Úplné informace o používání ladicích programů VS Code najdete v tématu Ladění.

Ve VS Code vytvořte a uložte nový soubor .qs s následujícím kódem:

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. Nastavte zarážku na řádku H(qubit) kliknutím nalevo od čísla řádku.
  2. Výběrem ikony ladicího programu otevřete podokno ladicího programu a vyberte Spustit a ladit. Ovládací prvky ladicího programu se zobrazují v horní části obrazovky.
  3. Výběrem klávesy F5 spusťte ladění a pokračujte k zarážce. V podokně Proměnné ladicího programu rozbalte kategorii Stav kvanta . Vidíte, že qubit byl inicializován ve stavu |0> .
  4. Krok do (F11) H operace a zdrojového H kódu operace se zobrazí. Při procházení operace si všimněte, že se mění kvantová hodnota, protože H operace převede qubit do superpozice.
  5. Při krokování operace (F10) M se v důsledku měření přeloží kvantová hodnota na hodnotu |0> nebo |1> a zobrazí se hodnota klasické proměnné result .
  6. Při krokování Reset operace se qubit resetuje na |0>.

Testování kódu

I když ladicí program VS Code Q# není dostupný pro Q# buňky v Jupyter Notebook, moderní sada QDK poskytuje některé výrazy a funkce, které vám můžou pomoct s řešením potíží s kódem.

Výraz selhání

Výraz fail zcela ukončí výpočet, což odpovídá závažné chybě, která program zastaví.

Podívejte se na tento jednoduchý příklad, který ověřuje hodnotu parametru:

%%qsharp

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 Výraz v této části brání programu v dalším spuštění s neplatnými daty.

Fact()

Pomocí funkce z oboru názvů můžete implementovat stejné chování jako v předchozím příkladu Fact()Microsoft.Quantum.Diagnostics . Funkce Fact() vyhodnotí danou klasickou podmínku, a pokud je nepravda, vyvolá výjimku.

%%qsharp

    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() – funkce

DumpMachine()Q# je funkce, která umožňuje výpis informací o aktuálním stavu target počítače do konzoly a pokračovat v spouštění programu.

Poznámka

Ve verzi Azure Quantum Development KitDumpMachine() teď funkce pro výstup používá big-endian řazení.

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 je funkce Pythonu, která vrací aktuální přidělený počet qubitů a slovník Pythonu s řídkými amplitudami stavu, které můžete analyzovat. Použití některé z těchto funkcí v Jupyter Notebook vám umožní procházet operace podobně jako ladicí program. Použití předchozího ukázkového programu:

import qsharp
%%qsharp

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)