統合ハイブリッド コンピューティング

統合ハイブリッド コンピューティングでは、古典的なプロセスと量子プロセスが組み合わせられ、物理量子ビットが存続している間に、古典的なコードで中間回路の測定に基づいて量子演算の実行を制御できます。 入れ子になった条件、ループ、関数呼び出しなどの一般的なプログラミング手法を使用すると、1 つの量子プログラムで複雑な問題が発生し、必要なショットの数が減る可能性があります。 量子ビットの再利用手法を使用すると、より小さな数の量子ビットを使用して、大規模なプログラムをマシン上で実行できます。

詳細については、以下を参照してください。

前提条件

targets をサポートするようになりました

現在、Azure Quantum の統合ハイブリッド コンピューティング モデルは、 Quantinuumtargets でサポートされています。

統合ハイブリッド ジョブの送信

統合ハイブリッド ジョブを送信するときは、QIR Adaptive RIとしてtarget プロファイルを構成する必要があります。 QIR Adaptive RItargetプロファイルは、中間回路測定、測定ベースの制御フロー、量子ビットリセット、および古典的な整数計算をサポートします。

統合ハイブリッド Q# スタンドアロン プログラムまたは Python + Q# プログラムを Azure Quantum に送信できます。 統合ハイブリッド ジョブの target プロファイルを構成するには、次の手順に従います。

Visual Studio Code で統合ハイブリッド ジョブの target プロファイルを構成するには、次の手順に従います。

  1. Visual Studio Code で Q# プログラムを開きます。
  2. [表示] -> [コマンド パレット] を選択し、「Q#: Azure Quantum QIR target プロファイルを設定する」と入力します。 Enter キーを押します。
  3. [QIR Adaptive RI] を選択します。

QIR Adaptive RItargetプロファイルとして設定したら、Q# プログラムを統合ハイブリッド ジョブとして Quantinuum に送信できます。

  1. View -> コマンド パレットを選択しQ#: Azure Quantum ワークスペースに接続する」と入力します。 Enter キーを押します。
  2. Azure アカウントを選択し、プロンプトに従って、優先するディレクトリ、サブスクリプション、ワークスペースに接続します。
  3. 接続したら、 Explorer ウィンドウで [Quantum ワークスペース 展開
  4. ワークスペースを展開し、 Quantinuum プロバイダーを展開します。
  5. 使用可能な quantinuum targetを選択します (例: quantinuum.sim.h1-1e
  6. target名の右側にある再生アイコンを選択して、現在のQ# プログラムの送信を開始します。
  7. ジョブを識別する名前とショットの数を追加します。
  8. Enter キーを押してジョブを送信します。 ジョブの状態が画面の下部に表示されます。
  9. [ジョブ] を展開し、ジョブの上にカーソルを合わせると、ジョブの時刻と状態が表示されます。

サポートされている機能

次の表に、Azure Quantum の Quantinuum を使用した統合ハイブリッド コンピューティングでサポートされる機能を示します。

サポートされる機能 メモ
Dynamics 値 測定値に依存する値を持つブール値と整数
ループ 従来の境界付きループのみ
任意の制御フロー if/else 分岐の使用
中間回路測定 従来のレジスタ リソースを利用する
量子ビットの再利用 サポートされています
リアルタイムのクラシック コンピューティング 64 ビット符号付き整数演算
従来のレジスタ リソースを利用する

QDK は、選択したtargetQ#言語機能がサポートされていない場合に、target固有のフィードバックを提供します。 統合ハイブリッド ジョブの実行時に、 Q# プログラムにサポートされていない機能が含まれている場合は、デザイン時にエラー メッセージが表示されます。 詳細については、 QIR wiki ページを参照してください。

Note

targetがサポートしていないQ#機能を使用する場合は、適切なQIR Adaptive RItarget プロファイルを選択して適切なフィードバックを取得する必要があります。

次のコードを Q# ファイルにコピーし、後続のコード スニペットを追加して、サポートされている機能の動作を確認します。

namespace HybridIntegrated {
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Convert;

    @EntryPoint()
    operation Main() : Result {
        use (q0, q1) = (Qubit(), Qubit());
        H(q0);
        let r0 = MResetZ(q0);

        // Copy here the code snippets below to see the supported features 
        // in action.
        // Supported features include dynamic values, classically-bounded loops, 
        // arbitrary control flow, and mid-circuit measurement.

        r0
    }

}

Quantinuum は動的ブール値と整数をサポートしています。これは、測定結果に依存するブール値と整数を意味します。 r0は、動的ブール値と整数値を生成するために使用できるResult型であることに注意してください。

        let dynamicBool = r0 != Zero; 
        let dynamicBool = ResultAsBool(r0); 
        let dynamicInt = dynamicBool ? 0 | 1; 

Quantinuum では動的ブール値と整数がサポートされていますが、double などの他のデータ型の動的値はサポートされていません。 次のコードをコピーして、動的な値の制限に関するフィードバックを確認します。

        let dynamicDouble = r0 == One ? 1. | 0.; // cannot use a dynamic double value
        let dynamicInt = r0 == One ? 1 | 0;
        let dynamicDouble = IntAsDouble(dynamicInt); // cannot use a dynamic double value
        let dynamicRoot = Sqrt(dynamicDouble); // cannot use a dynamic double value

一部のデータ型では動的な値はサポートされていませんが、これらのデータ型は静的な値で引き続き使用できます。

    let staticRoot = Sqrt(4.0);
    let staticBigInt = IntAsBigInt(2);

サポートされている型指定された動的な値であっても、特定の状況では使用できません。 たとえば、Quantinuum は動的配列、つまりサイズが測定結果に依存する配列をサポートしていません。 Quantinuum では、動的に境界付けられたループもサポートされていません。 次のコードをコピーして、動的な値の制限を確認します。

        let dynamicInt = r0 == Zero ? 2 | 4;
        let dynamicallySizedArray = [0, size = dynamicInt]; // cannot use a dynamically-sized array
        let staticallySizedArray = [0, size = 10];
        // Loops with a dynamic condition are not supported by Quantinuum.
        for _ in 0..dynamicInt {
            Rx(PI(), q1);
        }
        
        // Loops with a static condition are supported.
        let staticInt = 3;
        for _ in 0..staticInt {  
            Rx(PI(), q1);  
        }

Quantinuum は、静的条件と動的条件の両方を使用して、 if/else 分岐を含む制御フローをサポートします。 動的条件での分岐は、測定結果に基づく分岐とも呼ばれます。

        let dynamicInt = r0 == Zero ? 0 | 1; 
        if dynamicInt > 0 {
            X(q1);
        }
        let staticInt = 1;
        if staticInt > 5 {
            Y(q1);
        } else {
            Z(q1);
        }

Quantinuum は、古典的な条件を持ち、 if 式を含むループをサポートします。

        for idx in 0..3 {
            if idx % 2 == 0 {
                Rx(ArcSin(1.), q0);
                Rz(IntAsDouble(idx) * PI(), q1)
            } else {
                Ry(ArcCos(-1.), q1);
                Rz(IntAsDouble(idx) * PI(), q1)
            }
        }

Quantinuum は、中間回路の測定、つまり測定結果に基づく分岐をサポートします。

        if r0 == One {
            X(q1);
        }
        let r1 = MResetZ(q1);
        if r0 != r1 {
            let angle = PI() + PI() + PI()* Sin(PI()/2.0);
            Rxx(angle, q0, q1);
        } else {
            Rxx(PI() + PI() + 2.0 * PI() * Sin(PI()/2.0), q1, q0);
        }

統合ハイブリッド ジョブのコストの見積もり

最初にエミュレーターで実行することで、Quantinuum ハードウェアで統合ハイブリッド ジョブを実行するコストを見積もることができます。

エミュレーターで正常に実行された後:

  1. Azure Quantum ワークスペースで、 ジョブ管理を選択します。
  2. 送信したジョブを選択します。
  3. ジョブの詳細ポップアップでコスト見積もりを選択して、使用された eHQC (Quantinuum エミュレーター クレジット) の数を表示します。 この数は、Quantinuum ハードウェアでジョブを実行するために必要な HQC (Quantinuum 量子クレジット) の数に直接変換されます。

原価見積もり

Note

Quantinuum は、条件付きで実行されるかどうかにかかわらず、回線全体の登録を解除し、すべてのコード パスのコストを計算します。

統合ハイブリッド サンプル

次のサンプルは、 Q# コード サンプル リポジトリにあります。 統合ハイブリッド コンピューティングの現在の機能セットを示します。

3 量子ビット繰り返しコード

このサンプルでは、ビット フリップ エラーの検出と修正に使用できる 3 番目の量子ビット繰り返しコード を作成する方法を示します。

統合ハイブリッド コンピューティング機能を利用して、論理量子ビット レジスタの状態がコヒーレントである間にエラー修正が実行された回数をカウントします。

コード サンプル こちらにあります

反復的な位相推定

このサンプル* プログラムは、 Q#内の反復的な位相推定を示しています。 反復位相推定を使用して、 target 量子ビットとアンシラ量子ビットでエンコードされた 2 つの 2 次元ベクトル間の内部積を計算します。 また、測定に使用される唯一の量子ビットである追加の制御量子ビットも初期化されます。

回路は、まず、 target 量子ビットとアンシヤ量子ビット上のベクトルのペアをエンコードします。 次に、Oracle 演算子をレジスタ全体に適用し、$\ket +$ 状態で設定される制御量子ビットを制御します。 制御された Oracle 演算子は、制御量子ビットの $\ket 1$ 状態でフェーズを生成します。 これを制御量子ビットに H ゲートを適用して読み取り、測定時に位相を観測できるようにします。

コード サンプル こちらにあります

*このサンプル コードは、オーストラリア Quantum チームKPMG のメンバーによって記述され、MIT ライセンスに該当します。これは、QIR Adaptive RItargetsの拡張された機能を示し、境界ループ、実行時の古典的な関数呼び出し、入れ子になった条件 if ステートメント、中間回路測定、量子ビットの再利用を利用することを目的としています。