OpenQASM で Microsoft Quantum Development Kit プログラムを開発する

Microsoft Quantum Development Kit (QDK) は、OpenQASM 統合を使用して、Azure Quantum プログラムのさまざまな開発環境を提供します。 この記事では、次のコード OpenQASM 開発して実行する方法について説明します。

  • QDK の Visual Studio Code 拡張子 (VS Code)
  • Jupyter NotebookのQDK Python パッケージ。

CodeLends、IntelliSense、コード補完、ブレークポイント デバッグなどの開発者ツールは、VS Code 拡張機能でのみ使用できます。 その他の機能は、Python パッケージでのみ使用できます。 たとえば、Q# とOpenQASM呼び出し可能オブジェクトを Python オブジェクトとして渡し、QIR への入力を受け取るプログラムOpenQASMコンパイルできます。

[前提条件]

  • 最新バージョンのインストール VS Code

  • OpenQASMファイルを直接操作するには、QDKに最新バージョンのをインストールします。

  • PythonおよびJupyter Notebookで OpenQASM を使用するには、 に最新バージョンの Python 拡張機能 および VS Codeをインストールします。

  • qdk extra を指定して、jupyter Python パッケージの最新バージョンをインストールします。

    pip install --upgrade "qdk[jupyter]"
    

OpenQASM拡張機能を使用してVS CodeでQDKを操作する

OpenQASMでVS Codeコードを記述するには、Q# プロジェクトを開き、OpenQASM拡張子を持つ.qasm ファイルを作成します。 QDKは.qasm ファイルをOpenQASMとして自動的に認識し、コードを記述するときにQDKのOpenQASM機能を使用できます。

QDKのOpenQASMプログラムでは、次のVS Code機能を使用できます。

  • コードの完了
  • コード レンズ (実行ヒストグラム推定デバッグ回線)
  • 構文の強調表示と基本的な構文機能 (中かっこの一致など)
  • OpenQASM ソース ファイルのエラーチェック
  • OpenQASM ソース ファイルのブレークポイントのデバッグとスクリプトの実行
  • ライブ回線生成を使用したデバッグ
  • 量子ジョブの送信のための Azure Quantum との統合

OpenQASM から VS Code プログラムを実行するには、QDK のローカル シミュレーターを使用するか、Azure Quantum にジョブとしてコードを送信できます。

QDK ローカル シミュレーターでコードを実行する

OpenQASMのローカル スパース量子シミュレーターでVS Code コードを実行するには、.qasm ファイルを開き、ファイルの先頭にあるコード レンズから [実行] コマンドを選択します。 プログラムからの出力が VS Code ターミナルに表示されます。

QDKは、プログラムをサポートする QIR target プロファイルの設定を自動的に試行します。 QIR target プロファイルがプログラムでの操作をサポートしていない場合は、 OpenQASM コードの実行時にコンパイラ エラーが発生します。 target プロファイルの詳細については、「target のAzure Quantum プロファイルの種類を参照してください。

組み込みのサンプル プログラム

QDKには、OpenQASM用の組み込みの量子アルゴリズム サンプルがいくつか付属しています。 サンプル アルゴリズムを試すには、空のsample ファイルに「.qasm」と入力します。 サンプル アルゴリズムを含む完了リストが表示されます。 サンプルを選択し、生成されたコードを実行します。

でローカルにデバッグする VS Code

QDKには、OpenQASM用のデバッガーが含まれています。 デバッガーはブレークポイント スタイルのデバッグをサポートし、プログラムの状態をレンダリングできます。

デバッガーを起動するには、コード レンズから Debug コマンドを選択します。

デバッグ モードでは、デバッグに役立つブレークポイントをコードに設定できます。 プログラムの状態は、[ 実行とデバッグ ] ウィンドウに表示されます。 たとえば、ローカル変数の状態と量子ビットの状態を表示できます。

Azure Quantum でコードを実行する

OpenQASM Azure Quantumでtargetsプログラムを実行するには、Azure Quantum ワークスペースが必要です。 Azure Quantum ワークスペースを作成するには、「Azure Quantum ワークスペースを作成する」を参照してください。

OpenQASMからAzure QuantumにVS Code ジョブを送信するには、Azure Quantum ワークスペースに接続する必要があります。 VS Codeからワークスペースに接続するには、「接続文字列を使用して接続する」を参照してください。

OpenQASMからAzure QuantumにVS Code ジョブを送信するには、次の手順に従います。

  1. プログラムを含む qasm ファイルを VS Code で開きます。
  2. Microsoft Quantum アイコンを選択して、Microsoft Quantum パネルを開きます。
  3. QUANTUM WORKSPACES ドロップダウンを展開し、ワークスペースを選択します。
  4. [ プロバイダー ] ドロップダウンを展開し、プロバイダーを選択し、ジョブを実行する target を選択します。 たとえば、ジョブを rigetti.svm.simtarget に送信して、Rigetti のバックエンド シミュレーターでプログラムを実行します。 プロバイダーと target 可用性の詳細については、「 既存のワークスペースでプロバイダーを追加または削除する」を参照してください。
  5. target名の横にある再生アイコンを選択します。
  6. ジョブを送信するには、[ジョブ ] プロンプトと [ ショット数 ] プロンプトの値を入力します。

ジョブの時刻と状態を表示するには、[ ジョブ] ドロップダウン を展開し、ジョブ名をポイントします。 ジョブの結果をダウンロードするには、ジョブ名の横にあるヒストグラムまたはテキスト アイコンを選択します。

Python および Jupyter Notebook で OpenQASM を操作する

QDK Python パッケージを使用すると、OpenQASMコードを直接実行し、OpenQASM回線を操作として Q# プログラムに渡すことができます。 OpenQASM コードをPython文字列として記述し、その文字列を使用して、Python環境で OpenQASM コードを実行、インポート、またはコンパイルします。

Pythonで直接 OpenQASM を実行する

OpenQASMコードを直接実行するには、run モジュールのqdk.openqasm関数を使用します。 たとえば、次のコードは、ノイズのある単純な OpenQASM プログラムのローカル シミュレーターで 10 ショットを実行します。

from qdk import BitFlipNoise
from qdk.openqasm import run

qasm_code = """
    include "stdgates.inc";
    qubit[2] q;
    reset q;
    h q[0];
    cx q[0], q[1];
    bit c = measure q[1];
    """

results = run(qasm_code, shots=10, noise=BitFlipNoise(0.1))
print(results)

Q で OpenQASM プログラムを呼び出す#

import_openqasm 関数を使用して、OpenQASM プログラムをPython オブジェクトとして格納し、そのオブジェクトを後でPython コードで呼び出すことができます。 たとえば、次のセルは、OpenQASM 回線を bell というPython オブジェクトに格納します。

from qdk import qsharp
from qdk.openqasm import import_openqasm

qasm_code = """
    include "stdgates.inc";
    qubit[2] q;
    reset q;
    h q[0];
    cx q[0], q[1];
    bit c = measure q[1];
    """

import_openqasm(qasm_code, name="bell")

bellが環境の一部である場合は、Q# セルから直接実行できます。

%%qsharp

use qs = Qubit[2];
bell(qs)

また、ノイズシミュレーション、回路レンダリング、コード生成などのQDKでbellパッケージ機能を使用することもできます。

パラメーター化された OpenQASM プログラム

次のセルは、角度 OpenQASM を入力として受け取る theta 回路を作成し、それをPython関数として呼び出します。

from qdk.openqasm import import_openqasm, ProgramType

qasm_code = """
    include "stdgates.inc";
    input float theta;
    qubit[2] q;
    rx(theta) q[0];
    rx(-theta) q[1];
    bit[2] c;
    c = measure q;
    """

import_openqasm(qasm_code, name="parameterized_circuit", program_type=ProgramType.File)

from qdk.code.qasm_import import parameterized_circuit

parameterized_circuit(1.57)

OpenQASM プログラムを Q に渡す#

QDK Python パッケージを使用すると、OpenQASM プログラムを Q# プログラムに直接渡すことができます。 たとえば、次のコードは、OpenQASMというEntangle プログラムを作成し、Q# プログラムの操作としてEntangleを使用します。

from qdk.openqasm import import_openqasm
from qdk import qsharp

qasm_code = """
    include "stdgates.inc";
    qubit[2] qs;
    h qs[0];
    cx qs[0], qs[1];
    """

import_openqasm(qasm_code, name="Entangle")

qsharp.eval("{ use qs = Qubit[2]; Entangle(qs); MResetEachZ(qs) }")

Q# をインポートし、OpenQASM と qsharp.eval を使用してPython環境に import_openqasm プログラムをインポートすると、これらのプログラムは Python コードで呼び出すことができるPython オブジェクトになります。 たとえば、次のコードは、 TestAntiCorrelation という Q# プログラムを作成し、 EntangleOpenQASM プログラムを TestAntiCorrelationに渡します。

qsharp.eval("""
    operation TestAntiCorrelation(entangler : Qubit[] => Unit) : Result[] {
        use qs = Qubit[2];
        X(qs[1]);
        entangler(qs);
        MResetEachZ(qs)
    }
    """)

from qdk.code import Entangle, TestAntiCorrelation

TestAntiCorrelation(Entangle)

OpenQASM プログラムを QIR にコンパイルする

OpenQASM関数を使用して、compileコードを Quantum Intermediate Representation (QIR) にコンパイルできます。

たとえば、次のセルは、パラメーター化された回線 OpenQASM コードを QIR にコンパイルします。

from qdk import TargetProfile
from qdk.openqasm import import_openqasm, ProgramType
from qdk import qsharp

qsharp.init(target_profile=TargetProfile.Base)

qasm_code = """
    include "stdgates.inc";
    input float theta;
    qubit[2] q;
    rx(theta) q[0];
    rx(-theta) q[1];
    bit[2] c;
    c = measure q;
    """

import_openqasm(qasm_code, name="parameterized_circuit", program_type=ProgramType.File)

from qdk.code.qasm_import import parameterized_circuit

bound_compilation = qsharp.compile(parameterized_circuit, 1.57)
print(bound_compilation)

入力変数を QIR に取り込むプログラムOpenQASMコンパイルするには、QDK Python パッケージを使用する必要があります。 OpenQASMのQDK拡張機能を使用して、パラメーター化されたVS Code プログラムを QIR にコンパイルすることはできません。

OpenQASMプログラムをAzure Quantumに送信する

OpenQASM Azure Quantumで実行するtarget プログラムを送信するには、OpenQASM コードを QIR にコンパイルしてから、Azure Quantumで実行する QIR を送信します。

たとえば、単純なエンタングルメント回路を QIR にコンパイルします。

from qdk.openqasm import compile

qasm_code = """
    include "stdgates.inc";
    bit[2] c;
    qubit[2] q;
    h q[0];
    cx q[0], q[1];
    c = measure q;
"""

qir_compilation = compile(qasm_code)

QIR ジョブを実行して Azure Quantumするには、量子ワークスペースに接続し、ワークスペース内の使用可能な targets のいずれかにジョブを送信します。 たとえば、IonQ バックエンド シミュレーターで実行するエンタングルメント QIR を送信します。

from qdk.azure import Workspace 

workspace = Workspace(resource_id="") # Add the resource ID of your workspace

target = workspace.get_targets('ionq.simulator')
job = target.submit(qir_compilation, shots=100)

print("Job submitted. Waiting for results...")

results = job.get_results()
print(results)

OpenQASM における継続的な QDK の開発

OpenQASMでのQDKのサポートが進行中です。

OpenQASM で開発中の QDK 機能の一覧については、 GitHub リポジトリ wiki の QDKを参照してください。