다음을 통해 공유


스파스 양자 시뮬레이터

스파스 시뮬레이터는 Azure Quantum 개발 환경의 기본 로컬 시뮬레이터이며 양자 상태 벡터의 스파스 표현을 활용합니다. 이 기능을 사용하면 스파스 시뮬레이터가 양자 상태를 나타내는 데 사용되는 메모리 공간을 최소화할 수 있으므로 더 많은 수의 큐비트에 대한 시뮬레이션을 사용할 수 있습니다. 스파스 시뮬레이터는 계산 기준으로 스파스인 양자 상태, 즉 대부분의 진폭 계수가 계산 기준으로 0인 양자 상태를 나타내는 데 효율적입니다. 따라서 스파스 시뮬레이터를 사용하면 사용자가 전체 상태 시뮬레이터를 사용하여 나타낼 수 있는 것보다 더 큰 애플리케이션을 탐색할 수 있습니다. 이 시뮬레이터는 메모리와 시간을 기하급수적으로 많은 수의 진폭에서 낭비합니다.

스파스 시뮬레이터에 대한 자세한 정보는 Jaques 및 Häner(arXiv:2105.01533)를 참조하세요.

스파스 시뮬레이터 호출

스파스 시뮬레이터는 Azure Quantum Development Kit 확장이 설치된 Visual Studio Code의 기본 로컬 시뮬레이터입니다.

시나리오 메서드
VS Code의 Q# 프로그램에서 파일 실행 Q# 선택
Python Notebook 셀에서 result=qsharp.eval("Program_Entry_Operation()")
또는
result=qsharp.run("Program_Entry_Operation()", shots=##)
Notebook 셀에서 %%qsharp Program_Entry_Operation()

스파스 시뮬레이터에 Pauli 노이즈 추가

스파스 시뮬레이터는 시뮬레이션에 Pauli 노이즈를 추가하는 것을 지원합니다. 이 기능을 사용하면 양자 작업 및 측정에 대한 노이즈가 미치는 영향을 시뮬레이션할 수 있습니다. 노이즈 모델은 Pauli 노이즈 확률 사전을 사용하여 지정됩니다. 여기서 키는 Pauli 연산XY자이며 Z값은 해당 Pauli 연산자를 적용할 확률입니다. 노이즈 모델은 일반 프로그램이나 Q# Python 프로그램에서 사용하거나 VS Code 설정에서 구성할 수 있습니다.

VS Code 설정을 사용하여 Pauli 노이즈 추가

Pauli 노이즈는 Simulation:Pauli Noise 사용자 설정을 구성Q#>하여 Visual Studio Code에서 전역적으로 구성할 수 있습니다.

시끄러운 시뮬레이터에 대한 Q# 설정을 보여 주는 스크린샷.

이 설정은 VS Code에서 실행되는 모든 Q# 프로그램 및 프로그램에서 참조되는 모든 게이트, 측정 및 큐비트에 대한 히스토그램 결과에 적용됩니다. 설정은 함수를 사용하는 ConfigurePauliNoise() 것과 동일합니다.

노이즈를 구성하지 않은 상태에서 다음 GHz 샘플 프로그램의 히스토그램을 실행하면, 약 절반의 경우 $\ket{00000}$가 나오고 나머지 절반의 경우 $\ket{11111}$가 나옵니다.

import Std.Diagnostics.*;
import Std.Measurement.*;

operation Main() : Result []{
    let num = 5;
    return GHzSample(num);
}
operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    H(qs[0]);
    ApplyCNOTChain(qs);
    let results = MeasureEachZ(qs);
    ResetAll(qs);
    return results;
}

노이즈가 없는 결과를 보여 주는 스크린샷.

그러나 1개의% 비트 플립 노이즈를 추가하면 상태가 확산되고 25개의% 노이즈가 있는 상태에서는 노이즈와 구별할 수 없습니다.

1% 노이즈와 25% 노이즈의 결과를 보여주는 스크린샷.

프로그램에 Pauli 노이즈 Q# 추가

함수를 ConfigurePauliNoise() 사용하여 개별 Q# 프로그램에 대한 노이즈 모델을 설정하거나 수정할 수 있습니다. ConfigurePauliNoise()를 사용하면 Q# 프로그램에서 노이즈가 적용되는 위치를 세밀하게 제어할 수 있습니다.

비고

VS Code 설정에서 노이즈를 구성하면 노이즈가 모든 Q# 프로그램에 적용됩니다. Q#를 사용하여 프로그램에서 노이즈를 ConfigurePauliNoise로 구성하면, 해당 노이즈는 프로그램 실행 중에 VS Code의 노이즈 설정을 재정의합니다.

예를 들어 이전 프로그램에서 큐비트 할당 직후 노이즈를 추가할 수 있습니다.

...
operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    ConfigurePauliNoise(0.05, 0.0, 0.0); // 5% bit-flip noise applies to all operations
    H(qs[0]);
...

큐비트 할당 후 노이즈가 추가된 결과를 보여 주는 스크린샷.

또는 측정 작업 직전에

    ...
    use qs = Qubit[n];
    H(qs[0]);

    ApplyCNOTChain(qs);
    ConfigurePauliNoise(0.05, 0.0, 0.0); // noise applies only to measurement operation 
    let results = MeasureEachZ(qs);
    ...

측정 직전에 노이즈가 추가된 결과를 보여 주는 스크린샷.

노이즈 구성을 다시 설정하거나 지우는 데 사용할 ConfigurePauliNoise() 수도 있습니다. 이 예제에서 노이즈 설정은 큐비트 할당 후에 설정된 다음 Hadamard 연산 직후에 지워지므로 노이즈는 H(); 연산에만 적용됩니다.

...
operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    ConfigurePauliNoise(0.05, 0.0, 0.0); // noise applies to H() operation
    H(qs[0]);
    ConfigurePauliNoise(0.0, 0.0, 0.0); // clear noise settings
...

다음 함수는 Std.Diagnostics 라이브러리에서 Q# 프로그램의 노이즈를 구성하는 데 사용할 수 있습니다.

기능 Description Example
ConfigurePauliNoise() X, Y 및 Z 게이트의 확률을 나타내는 매개 변수를 사용하여 시뮬레이터 실행에 대해 Pauli 노이즈를 구성합니다. 노이즈 구성은 프로그램의 모든 후속 게이트, 측정 및 큐비트에 적용됩니다 Q# . VS Code의 노이즈 설정을 무시하고 후속 ConfigurePauliNoise() 호출을 통해 다시 설정할 수 있습니다. ConfigurePauliNoise(0.1, 0.0, 0.5)
또는
ConfigurePauliNoise(BitFlipNoise(0.1))
BitFlipNoise() 노이즈를 지정된 확률로만 X 게이트로 구성합니다. 노이즈 구성은 프로그램의 모든 후속 게이트, 측정 및 큐비트에 적용됩니다 Q# . 10% 비트 플립 노이즈:
ConfigurePauliNoise(BitFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.1, 0.0, 0.0)
PhaseFlipNoise() 노이즈를 지정된 확률로만 Z 게이트로 구성합니다. 노이즈 구성은 프로그램의 모든 후속 게이트, 측정 및 큐비트에 적용됩니다 Q# . 10% 위상 대칭 이동 노이즈:
ConfigurePauliNoise(PhaseFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.1)
DepolarizingNoise() 노이즈를 확률이 같은 X, Y 또는 Z 게이트로 구성합니다. 6% 노이즈 분해:
ConfigurePauliNoise(DepolarizingNoise(0.06)) $\equiv$ ConfigurePauliNoise(0.2, 0.2, 0.2)
NoNoise() 노이즈가 없는 상태로 노이즈 모델을 구성합니다. ConfigurePauliNoise(NoNoise()) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.0)
ApplyIdleNoise 시뮬레이션 중에 구성된 노이즈를 단일 큐비트에 적용합니다. ...
use q = Qubit[2];
ConfigurePauliNoise(0.1, 0.0, 0.0);
ApplyIdleNoise(q[0]);
...

Python 프로그램 또는 Jupyter Notebook에 Pauli 노이즈 추가

Pauli 노이즈 구성은 qdk.qsharp Python 패키지에서 사용할 수 있으며, 히스토그램 기능은 qdk.widgets 패키지에서 사용할 수 있습니다. 노이즈는 메서드에 매개 변수로 추가됩니다 qsharp.run .

  • qsharp.BitFlipNoise
  • qsharp.PhaseFlipNoise
  • qsharp.DepolarizingNoise

다음 샘플에서는 벨 상태 측정에 10% 탈분극 노이즈가 미치는 영향을 보여줍니다.

from qdk import qsharp
from qdk import widgets
%%qsharp

operation BellPair() : Result[] {
    use q = Qubit[2];
    H(q[0]);
    CNOT(q[0], q[1]);
    MResetEachZ(q)
}
results = qsharp.run("BellPair()", 20, noise=qsharp.DepolarizingNoise(0.1))
results

각 Pauli 연산자의 확률을 지정하여 임의 Pauli 노이즈를 노이즈 모델에 추가할 수 있습니다. 이전 GHz 샘플 프로그램을 사용하겠습니다.

%%qsharp

operation GHzSample() : Result[] {
    use q = Qubit[5];
    H(q[0]);
    ApplyCNOTChain(q);
    MResetEachZ(q)
}

이 프로그램 실행은 20% 확률로 노이즈를 적용합니다 (시간의 절반은 비트 반전, 나머지 절반은 위상 반전).

result = qsharp.run("GHzSample()", 20, noise=(0.1, 0.0, 0.1))
display(widgets.Histogram(result))

이 실행에서는 10% 확률로 Pauli-Y 노이즈를 적용합니다.

result = qsharp.run("GHzSample()", 20, noise=(0.0, 0.1, 0.0))
display(widgets.Histogram(result))