Visual Studio Code 向けの QDK 拡張機能で量子シミュレーションを実行する

Visual Studio Code VS Code (Microsoft) の Quantum Development Kit (QDK) 向け拡張機能は、ローカル スパース シミュレーターで Q# および OpenQASM プログラムを自動的に実行します。

この記事では、ローカル シミュレーターでプログラムを実行する方法と、Pauli シミュレーションに Q# ノイズを追加する方法について説明します。 Pythonの他のQDK シミュレーターを使用するには、「QDKPython パッケージを使用して量子シミュレーションを実行する」を参照してください。

ローカル シミュレーターのしくみ

スパース シミュレーターは、量子状態の 0 以外の振幅のみを格納します。 ほとんどの計算基準振幅が 0 の場合、この表現では使用するメモリが少なくなり、すべての振幅を格納するフルステート シミュレーターよりも多くの量子ビットを持つ一部のプログラムをシミュレートできます。

パフォーマンス上の利点は、量子状態が計算基準でスパースなままかどうかによって異なります。 詳細については、 Jaques と Häner (arXiv:2105.01533) を参照してください。

VS Code で量子プログラムを実行する

  1. QDK用のVS Code拡張機能をインストールします。
  2. Q# (.qs) ファイルまたはOpenQASM (.qasm) ファイルを開きます。
  3. ファイルの先頭、または Main 操作の上にあるコード レンズから Q# を選択します。

シミュレーション出力が VS Code ターミナルに表示されます。 Q# プログラムの場合は、プログラムの実行時の量子状態を調べるには、[デバッグ] を選択します。

Q#ノイズをPauliシミュレーションに追加する

スパース シミュレーターは、Pauli 拡張機能の Q# プログラムに対する QDK ノイズをサポートします。 ConfigurePauliNoiseを使用して、プログラムのPauli $X$、$Y$、および$Z$ エラーの確率を設定します。 QDK拡張設定では、グローバルなPauli ノイズ モデルもサポートされます。

Note

OpenQASM拡張機能のQDK シミュレーションにノイズ モデルを追加することはできません。 Q#またはOpenQASM プログラムの操作固有のノイズ モデルを構築するには、QDKPython パッケージと NoiseConfig API を使用します。

設定でVS CodeノイズPauliを追加する

  • VS Codeで、QDK拡張機能の Pauli プログラムに対するグローバル Q# ノイズを、Q# ユーザー設定で設定します。

Pauli の Q# 拡張機能におけるグローバル VS CodeQDK ノイズ設定のスクリーンショット。

ノイズ設定は、Q#のすべてのVS Codeプログラムのすべてのゲート、測定、および量子ビットのヒストグラム結果に適用されます。

ノイズがない場合、この 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;
}

ノイズがなく、すべての量子ビットが 0 である場合またはすべての量子ビットが 1 である場合にピークがあるヒストグラムのスクリーンショット。

1% ビットフリップノイズレートで、結果が広がり始めます。 25%では、ヒストグラムは純粋なノイズと区別できません。

1% と 25% ビット フリップ ノイズ レートを持つ Q# プログラムのヒストグラムのスクリーンショット。

個々のPauli プログラムにQ#ノイズを追加する

ConfigurePauliNoiseを使用して、Q# プログラムのノイズ モデルを設定または変更し、ノイズが発生するタイミングと場所を制御します。

Note

VS Code設定は、すべてのQ#プログラムにノイズを適用しますが、ConfigurePauliNoiseは、それを呼び出すプログラムに対してそれらの設定をオーバーライドします。

前のプログラムでは、量子ビットの割り当ての直後にノイズを追加します。

operation GHZSample(n: Int) : Result[] {
    use qs = Qubit[n];

    // 5% bit-flip noise applies to all subsequent operations.
    ConfigurePauliNoise(0.05, 0.0, 0.0);

    H(qs[0]);
    ApplyCNOTChain(qs);
    let results = MeasureEachZ(qs);
    ResetAll(qs);
    return results;
}

量子ビットの割り当て後に 5% ビット フリップ ノイズが開始されたときのヒストグラム結果のスクリーンショット。

測定操作にのみノイズを適用するには、測定の直前にノイズ モデルを設定し、その後でクリアします。

operation GHZSample(n: Int) : Result[] {
    use qs = Qubit[n];
    H(qs[0]);
    ApplyCNOTChain(qs);

    // Noise applies only to the measurement operation.
    ConfigurePauliNoise(0.05, 0.0, 0.0);

    let results = MeasureEachZ(qs);
    ResetAll(qs);
    return results;
}

測定直前に 5% ビット フリップ ノイズが開始されたときのヒストグラム結果のスクリーンショット。

プログラム内のさまざまなポイントでノイズ構成を変更またはクリアするには、 ConfigurePauliNoise を複数回呼び出します。 たとえば、5% ビット フリップ ノイズを Hadamard ゲートに適用し、プログラムの残りの部分に対するノイズ構成をクリアします。

operation GHZSample(n: Int) : Result[] {
    use qs = Qubit[n];

    // Noise applies to the H operation.
    ConfigurePauliNoise(0.05, 0.0, 0.0);
    
    H(qs[0]);

    // Clear the noise settings.
    ConfigurePauliNoise(0.0, 0.0, 0.0);
    
    ApplyCNOTChain(qs);
    let results = MeasureEachZ(qs);
    ResetAll(qs);
    return results;
}

その他の Q# ノイズ機能

ConfigurePauliNoise は、任意の Pauli ノイズ モデルをサポートします。 ノイズを構成または適用するには、 Std.Diagnostics 名前空間の次の関数と操作を使用します。

Function Description 例
ConfigurePauliNoise シミュレーション Pauli ノイズを設定します。 Pauli $X$、$Y$、$Z$ 誤差の確率、または Pauli ノイズ モデルのいずれかを渡します。 この構成は、 Q# プログラム内のすべての後続のゲート、測定、および量子ビットに適用され、 VS Code 拡張ノイズ設定をオーバーライドします。 後続の呼び出しは、以前の構成をオーバーライドします。 ConfigurePauliNoise(0.1, 0.0, 0.5)
または
ConfigurePauliNoise(BitFlipNoise(0.1))
BitFlipNoise 指定した確率で Pauli $X$ エラーのみを含むノイズ モデルを返します。 10% ビット フリップ ノイズ:
ConfigurePauliNoise(BitFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.1, 0.0, 0.0)
PhaseFlipNoise 指定した確率で Pauli $Z$ エラーのみのノイズ モデルを返します。 10% 位相反転ノイズ:
ConfigurePauliNoise(PhaseFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.1)
DepolarizingNoise Pauli $X$、$Y$、および$Z$ エラーの確率が等しいノイズ モデルを返します。 6% 脱分極ノイズ:
ConfigurePauliNoise(DepolarizingNoise(0.06)) $\equiv$ ConfigurePauliNoise(0.02, 0.02, 0.02)
NoNoise エラー確率が 0 のモデルを返します。 それを ConfigurePauliNoise に渡して現在のノイズ構成をクリアします。 ConfigurePauliNoise(NoNoise()) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.0)
ApplyIdleNoise シミュレーション中に構成済みのノイズを 1 つの量子ビットに適用します。 ...
use q = Qubit[2];
ConfigurePauliNoise(0.1, 0.0, 0.0);
ApplyIdleNoise(q[0]);
...