양자 코드 디버깅 및 테스트

클래식 프로그래밍과 마찬가지로 양자 프로그램이 의도한 대로 작동하는지 확인하고 잘못된 동작을 진단할 수 있어야 합니다. 이 문서에서는 양자 프로그램을 테스트하고 디버깅하기 위해 Azure Quantum Development Kit 에서 제공하는 도구에 대해 설명합니다.

프로그램 디버깅 Q#

Azure Quantum Development Kit (최신 QDK) Visual Studio Code 확장에는 프로그램에 대한 Q# 디버거가 포함되어 있습니다. 중단점을 설정하고, 코드를 단계별로 실행하여 각 함수 또는 연산으로 이동하고, 지역 변수뿐만 아니라 큐비트의 양자 상태도 추적할 수 있습니다.

참고

VS Code 디버거는 (.qs) 파일에서 Q# 만 작동하며 Jupyter Notebook 셀에서 작동하지 Q# 않습니다. Jupyter Notebook 셀을 테스트하려면 코드 테스트를 참조하세요.

다음 예제에서는 디버거의 기본 기능을 보여 줍니다. VS Code 디버거 사용에 대한 자세한 내용은 디버깅을 참조하세요.

VS Code에서 다음 코드를 사용하여 새 .qs 파일을 만들고 저장합니다.

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. 줄 번호 왼쪽을 클릭하여 줄 H(qubit) 에 중단점을 설정합니다.
  2. 디버거 아이콘을 선택하여 디버거 창을 열고 실행 및 디버그를 선택합니다. 디버거 컨트롤이 화면 맨 위에 표시됩니다.
  3. F5를 선택하여 디버깅을 시작하고 중단점으로 계속 진행합니다. 디버거 변수 창에서 Quantum 상태 범주를 확장합니다. 큐비트가 |0> 상태에서 초기화된 것을 볼 수 있습니다.
  4. 작업 및 작업의 소스 코드 HH 표시되는 단계별(F11) 작업을 단계별로 진행하면서 연산이 큐비트를 중첩으로 전환함에 따라 H 양자 값이 변경됩니다.
  5. 연산을 단계별로 M 실행하면 측정 결과로 양자 값이 |0> 또는 |1> 로 확인되고 클래식 변수 result 의 값이 표시됩니다.
  6. 작업을 단계별로 Reset 실행하면 큐비트가 |0>으로 다시 설정됩니다.

코드 테스트

VS Code Q# 디버거는 Jupyter Notebook 셀에 사용할 수 Q# 없지만 최신 QDK는 코드 문제를 해결하는 데 도움이 되는 몇 가지 식과 함수를 제공합니다.

식 실패

식은 fail 프로그램을 중지하는 심각한 오류에 해당하는 계산을 완전히 종료합니다.

매개 변수 값의 유효성을 검사하는 간단한 예제를 살펴보겠습니다.

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

여기서 식은 fail 프로그램이 잘못된 데이터로 계속 실행되지 않도록 방지합니다.

Fact() 함수

네임스페이스의 함수를 사용하여 이전 예제와 Fact() 동일한 동작을 구현할 Microsoft.Quantum.Diagnostics 수 있습니다. 함수는 Fact() 지정된 클래식 조건을 평가하고 false이면 예외를 throw합니다.

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() 함수

DumpMachine() 는 Q# 컴퓨터의 target 현재 상태에 대한 정보를 콘솔에 덤프하고 프로그램을 계속 실행할 수 있는 함수입니다.

참고

Azure Quantum Development Kit릴리스에서 함수는 DumpMachine() 이제 해당 출력에 big-endian 순서를 사용합니다.

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 는 현재 할당된 큐비트 수와 구문 분석할 수 있는 스파스 상태 진폭의 Python 사전을 반환하는 Python 함수입니다. Jupyter Notebook 이러한 함수 중 하나를 사용하면 디버거처럼 작업을 단계별로 실행할 수 있습니다. 이전 예제 프로그램 사용:

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)