アダプティブ target プロファイルを使用してハイブリッド量子コンピューティング ジョブを実行する
ハイブリッド コンピューティングは、従来のコンピューティング プロセスと量子コンピューティング プロセスを組み合わせて複雑な問題を解決します。
ハイブリッド コンピューティングでは、従来のコードは、物理量子ビットがアクティブなまま、中間回路の測定に基づいて量子操作の実行を制御します。 入れ子になった条件、ループ、関数呼び出しなどの一般的なプログラミング手法を 1 つの量子プログラムで使用して複雑な問題を実行し、必要なショットの数を減らすことができます。 量子ビットの再利用手法を使用すると、より大きなプログラムを、より少ない数の量子ビットを使用してマシン上で実行できます。
この記事では、 QIR Adaptive RItarget プロファイルを使用してハイブリッド ジョブを Azure Quantum に送信する方法について説明します。 アダプティブ RI target プロファイルは、中間回路測定、測定ベースの制御フロー、量子ビット リセット、および古典的な整数計算をサポートします。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントをお持ちでない場合は、無料で登録し、 従って支払うサブスクリプションにサインアップしてください。
- Azure Quantum ワークスペース。 詳細については、「Azure Quantum ワークスペースを作成する」を参照してください。
- スタンドアロン プログラム Q# 提出する場合は、次の前提条件が必要です。
- Python + Q# プログラムを提出する場合は、次の前提条件が必要です。
Python と Pip がインストールされた Python 環境。
Azure Quantum
azure-quantum
パッケージとqsharp
パッケージ。pip install --upgrade azure-quantum qsharp
targets をサポートするようになりました
ハイブリッド量子コンピューティング ジョブを実行するには、 Adaptive RI target プロファイルをサポートする量子プロバイダーを選択する必要があります。
現在、Azure Quantum のアダプティブ target プロファイルは、 Quantinuumtargets でサポートされています。
アダプティブ RI ジョブの送信
ハイブリッド量子コンピューティング ジョブを送信するには、target プロファイルを QIR Adaptive RI として構成する必要があります。RI は "qubit ResetとInteger computations" を表します。
QIR Adaptive RItargetプロファイルは、中間回路測定、測定ベースの制御フロー、量子ビットリセット、および古典的な整数計算をサポートします。
ハイブリッド量子ジョブは、スタンドアロン プログラムまたは Python + Q# プログラムQ# Azure Quantum に送信できます。 ハイブリッド量子ジョブの target プロファイルを構成するには、次のセクションを参照してください。
Visual Studio Code でハイブリッド ジョブの target プロファイルを構成するには、次の手順に従います。
- Visual Studio Code で Q# プログラムを開きます。
- [表示] -> [コマンド パレット] を選択し、「Q#: Azure Quantum QIR target プロファイルを設定する」と入力します。 Enter キーを押します。
- [QIR Adaptive RI] を選択します。
QIR Adaptive RItargetプロファイルとして設定したら、Q# プログラムをハイブリッド量子ジョブとして Quantinuum に送信できます。
- View -> コマンド パレットを選択し「Q#: Azure Quantum ワークスペースに接続する」と入力します。 Enter キーを押します。
- Azure アカウントを選択し、プロンプトに従って、優先するディレクトリ、サブスクリプション、ワークスペースに接続します。
- 接続したら、 Explorer ウィンドウで [Quantum ワークスペース 展開。
- ワークスペースを展開し、 Quantinuum プロバイダーを展開します。
- 使用可能な quantinuum targetを選択します (例: quantinuum.sim.h1-1e。
- target名の右側にある再生アイコンを選択して、現在のQ# プログラムの送信を開始します。
- ジョブを識別する名前とショットの数を追加します。
- Enter キーを押してジョブを送信します。 ジョブの状態が画面の下部に表示されます。
- [ジョブ] を展開し、ジョブの上にカーソルを合わせると、ジョブの時刻と状態が表示されます。
サポートされている機能
次の表に、Azure Quantum の Quantinuum を使用したハイブリッド量子コンピューティングでサポートされる機能を示します。
サポートされる機能 | メモ |
---|---|
Dynamics 値 | 測定値に依存する値を持つブール値と整数 |
ループ | 従来の境界付きループのみ |
任意の制御フロー | if/else 分岐の使用 |
中間回路測定 | 従来のレジスタ リソースを利用する |
量子ビットの再利用 | サポートされています |
リアルタイムのクラシック コンピューティング | 64 ビット符号付き整数演算 従来のレジスタ リソースを利用する |
QDK は、選択したtargetQ#言語機能がサポートされていない場合に、target固有のフィードバックを提供します。 ハイブリッド量子ジョブの実行時に、 Q# プログラムにサポートされていない機能が含まれている場合は、デザイン時にエラー メッセージが表示されます。 詳細については、 QIR wiki ページを参照してください。
Note
targetがサポートしていないQ#機能を使用する場合は、適切なQIR Adaptive RItarget プロファイルを選択して適切なフィードバックを取得する必要があります。
サポートされている機能の動作を確認するには、次のコードを Q# ファイルにコピーし、後続のコード スニペットを追加します。
import Microsoft.Quantum.Measurement.*;
import Microsoft.Quantum.Math.*;
import Microsoft.Quantum.Convert.*;
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 ハードウェアでハイブリッド量子コンピューティング ジョブを実行するコストを見積もることができます。
エミュレーターで正常に実行された後:
- Azure Quantum ワークスペースで、 ジョブ管理を選択します。
- 送信したジョブを選択します。
- ジョブの詳細ポップアップでコスト見積もりを選択して、使用された eHQC (Quantinuum エミュレーター クレジット) の数を表示します。 この数は、Quantinuum ハードウェアでジョブを実行するために必要な HQC (Quantinuum 量子クレジット) の数に直接変換されます。
Note
Quantinuum は、条件付きで実行されているかどうかに関係なく、回線全体の登録を解除し、すべてのコード パスのコストを計算します。
ハイブリッド量子コンピューティングのサンプル
次のサンプルは、 Q# コード サンプル リポジトリにあります。 ハイブリッド量子コンピューティングの現在の機能セットを示します。
3 量子ビット繰り返しコード
このサンプルでは、ビット フリップ エラーの検出と修正に使用できる 3 番目の量子ビット繰り返しコード を作成する方法を示します。
統合ハイブリッド コンピューティング機能を利用して、論理量子ビット レジスタの状態がコヒーレントである間にエラー修正が実行された回数をカウントします。
コード サンプル こちらにあります。
反復的な位相推定
このサンプル プログラムでは、 Q#内の反復的な位相推定を示します。 反復位相推定を使用して、 target 量子ビットとアンシラ量子ビットでエンコードされた 2 つの 2 次元ベクトル間の内部積を計算します。 また、測定に使用される唯一の量子ビットである追加の制御量子ビットも初期化されます。
回路は、まず、 target 量子ビットとアンシヤ量子ビット上のベクトルのペアをエンコードします。 次に、Oracle 演算子をレジスタ全体に適用し、$\ket +$ 状態で設定される制御量子ビットを制御します。 制御された Oracle 演算子は、制御量子ビットの $\ket 1$ 状態でフェーズを生成します。 これを制御量子ビットに H ゲートを適用して読み取り、測定時に位相を観測できるようにします。
コード サンプル こちらにあります。
Note
このサンプル コードは、オーストラリアの KPMG Quantum チームのメンバーによって記述され、MIT ライセンスに該当します。 QIR Adaptive RItargetsの拡張された機能を示し、境界付きループ、実行時の古典的な関数呼び出し、入れ子になった条件 if ステートメント、中間回路測定、量子ビットの再利用を利用します。