Azure Quantum QIR QDK内の対象プロファイル

量子コンピューティングはまだ新しいテクノロジです。 すべての量子ハードウェアですべての量子プログラムを実行できるわけではありません。 たとえば、中間回路の測定を実行できるのは特定のハードウェアだけです。これは、量子ビットの測定結果に基づいて条件付き分岐を持つプログラムを実行するために必要です。

Azure Quantumで実行するプログラムを送信すると、プログラムは量子中間表現 (QIR) 形式に変換されます。 QIR は、プログラムが実行されるプログラミング言語または量子ハードウェアの種類に依存しません。 Microsoft Quantum Development Kit (QDK) では、さまざまなハードウェア機能に対して複数のQIRターゲット プロファイルがサポートされています。

QIRの詳細については、「量子中間表現」を参照してください。

ターゲット プロファイルの概要

Azure Quantum と QDK は、複数の QIR ターゲット プロファイルをサポートします。 選択するターゲット プロファイルの種類によって、プログラムで使用できる次のプログラミング構成体が決まります。

  • 量子ビットの測定結果に基づく if ステートメントを含む条件付き分岐
  • 量子ビットの測定結果から計算された浮動小数点数に対する算術演算
  • 量子ビットの測定結果に基づく固定ループと無制限ループ

次の表に、QIR内のすべてのQDKターゲット プロファイルと、ターゲット プロファイルがサポートするプログラミングコンストラクトを、最も制限の少ないものから順に示します。

QIR ターゲット プロファイル 条件分岐 浮動小数点演算 Loops
Base ❌ ❌ ❌
Adaptive RI ✅ ❌ ❌
Adaptive RIF ✅ ✅ ❌
Adaptive ✅ ✅ ✅
Unrestricted ✅ ✅ ✅

でターゲット プロファイルを設定します。 QDK

QDK シミュレーターまたはAzure Quantumターゲットでプログラムを実行するには、QIRターゲット プロファイルを設定する必要があります。 ターゲット プロファイルを手動で設定しない場合、 QDK は選択したターゲットの適切なプロファイルを自動的に設定しようとします。

Azure Quantum サービスを介して実行するプログラムを送信すると、QDKは選択した実行ターゲットの適切なプロファイルを自動的に選択しようとします。

Base QIR プロフィール

基本 QIR ターゲット プロファイルは、最も制限の厳しいプロファイルです。 ブランチやループなどの古典的なプログラミング構造を使用しないより単純なプログラムには、基本プロファイルを使用します。 量子ハードウェア ターゲットで中間回路の測定を実行できない場合は、おそらく基本プロファイルを使用する必要があります。

次の Azure Quantum ターゲットは、基本 QIR プロファイルを使用するプログラムを実行できます。

プロバイダー シミュレーター QPU
IonQ ionq.simulator ionq.qpu.*
Rigetti rigetti.sim.* rigetti.qpu.*

これらの Azure Quantum プロバイダーの詳細については、 IonQ プロバイダー と Rigetti プロバイダーに関するページを参照してください。

基本プロファイルを設定する

Visual Studio Code (VS Code) のQIR拡張機能で基本QDKターゲット プロファイルを設定するには、次のいずれかのオプションを選択します。

  • Q# プロジェクトを設定した場合は、プロジェクトの qsharp.json ファイルに次のコマンドを追加します。

    {
      "targetProfile": "base"
    }
    
  • Q# プロジェクトの一部ではない .qs ファイルで作業している場合は、Q# コードでターゲット プロファイルを直接設定します。 そのためには、プログラムのエントリポイント操作の前に行に @EntryPoint(Base) を追加します。

    @EntryPoint(Base)
    operation Main() : Unit {
    
    ...
    
    }
    

QDK Python パッケージで基本ターゲット プロファイルを設定するには、次のコードを実行します。

from qdk import init, TargetProfile

init(target_profile=TargetProfile.Base) 

基本プロファイルを使用した Q# プログラムの制限事項

基本ターゲット プロファイルでは、さまざまな Q# プログラムを実行できます。 主な制約は、Q# プログラムが、測定操作から Result 型の値と論理的な比較を実行できないことです。

たとえば、基本ターゲットに対して次の FlipQubitOnZero 操作を実行することはできません。プログラムには、測定結果を使用する if ステートメントが含まれているためです。

    @EntryPoint(Base)
    operation FlipQubitOnZero() : Unit {
        use q = Qubit();
        if M(q) == Zero {
            X(q);
        }
    }

Adaptive RI QIR プロフィール

アダプティブ RI ターゲット プロファイルでは、基本プロファイルよりもさまざまなプログラムを実行できますが、いくつかの制限があります。 Adaptive RI は、条件付き if ステートメントで中間回路測定を使用するプログラムをサポートします。 量子ハードウェアが中間回路の測定を実行でき、プログラムが測定結果に基づいて if ステートメントを使用する場合は、アダプティブ RI プロファイルを使用する必要があります。

たとえば、次の Q# プログラムは、アダプティブ RI ターゲットで実行できます。

@EntryPoint(Adaptive_RI)
operation MeasureQubit(q : Qubit) : Result { 
    return M(q); 
}

operation SetToZero(q : Qubit) : Unit {
     if MeasureQubit(q) == One { X(q); }
}

次の Azure Quantum ターゲットは、アダプティブ RI ターゲット プロファイルを使用するプログラムを実行できます。

プロバイダー シミュレーター QPU
Quantinuum quantinuum.sim.h2-1e quantinuum.qpu.h2-1
Quantinuum quantinuum.sim.h2-2e quantinuum.qpu.h2-2

Azure Quantumの Quantinuum の詳細については、Quantinuum プロバイダーを参照してください。

アダプティブ RI プロファイルを設定する

VS Code のQIR拡張機能でアダプティブ RI QDKターゲット プロファイルを設定するには、次のいずれかのオプションを選択します。

  • Q# プロジェクトを設定した場合は、プロジェクトの qsharp.json ファイルに次のコマンドを追加します。

    {
      "targetProfile": "adaptive_ri"
    }
    
  • Q# プロジェクトの一部ではない .qs ファイルで作業している場合は、Q# コードでターゲット プロファイルを直接設定します。 そのためには、プログラムのエントリポイント操作の前に行に @EntryPoint(Adaptive_RI) を追加します。

    @EntryPoint(Adaptive_RI)
    operation Main() : Unit {
    
    ...
    
    }
    

QDK Python パッケージでアダプティブ RI ターゲット プロファイルを設定するには、次のコードを実行します。

from qdk import init, TargetProfile

init(target_profile=TargetProfile.Adaptive_RI)

Adaptive RIF QIR プロフィール

アダプティブ RIF ターゲット プロファイルは、アダプティブ RI プロファイルと同じ機能を備えていますが、浮動小数点演算を含むプログラムもサポートしています。 量子ハードウェアが中間回路の測定を実行でき、プログラムで if ステートメントと測定結果から計算された浮動小数点数を使用する場合は、アダプティブ RIF プロファイルを使用する必要があります。

たとえば、次の Q# プログラムは、アダプティブ RIF ターゲットで実行できます。

@EntryPoint(Adaptive_RIF)
operation DynamicFloat() : Double {
    use q = Qubit();
    H(q);
    mutable f = 0.0;
    if M(q) == One {
        f = 0.5;
    }
    Reset(q);
    return f;
}

Azure Quantum 現時点ではアダプティブ RIF ターゲットはありませんが、ローカル QDK シミュレーターでアダプティブ RIF ターゲットのプログラムを実行できます。 QDKのシミュレーターの詳細については、「QDKの量子シミュレーターの概要」を参照してください。

アダプティブ RIF プロファイルを設定する

VS Code のQIR拡張機能でアダプティブ RIF QDKターゲット プロファイルを設定するには、次のいずれかのオプションを選択します。

  • Q# プロジェクトを設定した場合は、プロジェクトの qsharp.json ファイルに次のコマンドを追加します。

    {
      "targetProfile": "adaptive_rif"
    }
    
  • Q# プロジェクトの一部ではない .qs ファイルで作業している場合は、Q# コードでターゲット プロファイルを直接設定します。 そのためには、プログラムのエントリポイント操作の前に行に @EntryPoint(Adaptive_RIF) を追加します。

    @EntryPoint(Adaptive_RIF)
    operation Main() : Unit {
    
    ...
    
    }
    

QDK Python パッケージでアダプティブ RIF ターゲット プロファイルを設定するには、次のコードを実行します。

from qdk import init, TargetProfile

init(target_profile=TargetProfile.Adaptive_RIF) 

Adaptive QIR プロフィール

アダプティブ ターゲット プロファイルは、アダプティブ RIF プロファイルと同じ機能を備えますが、測定結果に基づいてループを使用するプログラムもサポートしています。 Adaptive プログラムでは、設定された反復回数のループと、repeat-until-success (RUS) ループを使用できます。

Azure Quantum 現時点ではアダプティブ ターゲットはありませんが、ローカル QDK シミュレーターでアダプティブ ターゲットのプログラムを実行できます。 QDKのシミュレーターの詳細については、「QDKの量子シミュレーターの概要」を参照してください。

アダプティブ プロファイルを設定する

VS Code のQIR拡張機能でアダプティブ QDK ターゲット プロファイルを設定するには、次のいずれかのオプションを選択します。

  • Q# プロジェクトを設定した場合は、プロジェクトの qsharp.json ファイルに次のコマンドを追加します。

    {
      "targetProfile": "adaptive"
    }
    
  • Q# プロジェクトの一部ではない .qs ファイルで作業している場合は、Q# コードでターゲット プロファイルを直接設定します。 そのためには、プログラムのエントリポイント操作の前に行に @EntryPoint(Adaptive) を追加します。

    @EntryPoint(Adaptive)
    operation Main() : Unit {
    
    ...
    
    }
    

QDK Python パッケージでアダプティブ ターゲット プロファイルを設定するには、次のコードを実行します。

from qdk import init, TargetProfile

init(target_profile=TargetProfile.Adaptive) 

Unrestricted QIR プロフィール

無制限のターゲット プロファイルでは、すべての量子プログラムを実行できます。 現在の量子ターゲットは無制限の QIRをサポートしませんが、無制限プロファイルを使用して、量子開発のために QDK シミュレーターで複雑なプログラムを実行できます。

無制限プロファイルを設定する

VS Code のQIR拡張機能で無制限のQDKターゲット プロファイルを設定するには、次のいずれかのオプションを選択します。

  • Q# プロジェクトを設定した場合は、プロジェクトの qsharp.json ファイルに次のコマンドを追加します。

    {
      "targetProfile": "unrestricted"
    }
    
  • Q# プロジェクトの一部ではない .qs ファイルで作業している場合は、Q# コードでターゲット プロファイルを直接設定します。 そのためには、プログラムのエントリポイント操作の前に行に @EntryPoint(Unrestricted) を追加します。

    @EntryPoint(Unrestricted)
    operation Main() : Unit {
    
    ...
    
    }
    

QDK Python パッケージで無制限のターゲット プロファイルを設定するには、次のコードを実行します。

from qdk import init, TargetProfile

init(target_profile=TargetProfile.Unrestricted)