Q# プログラムと Visual Studio Code の概要

この記事では、VC Code を使用して、VS Code を使用して Q#、Jupyter Notebook、または Python 量子コンピューティング ジョブを作成して Azure Quantum に送信する手順について説明します。

Azure Quantum への Q# ジョブの送信

VS Code を使用して、Q# プログラムを実行、デバッグ、および Azure Quantum に送信する方法について説明します。

前提条件

インストールの詳細については、「 VS Code へのモダン QDK のインストール」を参照してください。

Q# サンプル プログラムを読み込む

  1. VS Code で、[ ファイル > ] [新しいテキスト ファイル ] の順に選択し、 RandomNum.qs としてファイルを保存します。

  2. RandomNum.qs を開き、「」と入力sampleし、オプションの一覧から [Random Bit sample]\(ランダム ビット サンプル\) を選択し、ファイルを保存します。

    Visual Studio Code の Q# ファイルのスクリーンショット。ファイルにサンプルという単語を記述するときのコード サンプルの一覧が示されています。

注意

独自の Q# ファイルを開くこともできます。 古い Q# プログラムを実行してエラーが発生した場合は、「 テストとデバッグ 」または「 プログラムをモダン QDK に移行する」を参照してください。

Q# プログラムを実行する

  1. 組み込みのシミュレーターでプログラムをローカルで実行することをテストするには、下@EntryPoint()のコマンドの一覧から [実行] をクリックするか、Ctrl キーを押しながら F5 キーを押します。 出力がデバッグ コンソールに表示されます。

  2. Azure Quantum に送信する前にプログラムをデバッグするには、下@EntryPoint()のコマンドの一覧から [デバッグ] をクリックするか、F5 キーを押します。 上部にあるデバッグ コントロールを使用して、コードのステップ オーバー、ステップ イン、ステップ アウトを行います。 Q# プログラムのデバッグの詳細については、「 テストとデバッグ」を参照してください。

    実行コマンドとデバッグ コマンドを使用してコード レンズを見つける場所を示す、Visual Studio Code の Q# ファイルのスクリーンショット。

頻度ヒストグラムを視覚化する

頻度ヒストグラムは、量子プログラムを複数回実行した結果 ("ショット" ) の分布を表します。 ヒストグラムの各バーは考えられる結果に対応し、その高さは結果が観察される回数を表します。 頻度ヒストグラムは、これらの結果の確率分布を視覚化するのに役立ちます。

  1. [ 表示 -> コマンド パレット] を 選択し、「ヒストグラム」と入力します。 これにより、Q#: ファイルを実行してヒストグラムを表示 するオプションが表示されます。 下@EntryPoint()のコマンドの一覧から [ヒストグラム] をクリックすることもできます。 Q# ヒストグラム ウィンドウを開くには、このオプションを選択します。

    ヒストグラム コマンドを使用してコード レンズを見つける場所を示す、Visual Studio Code の Q# ファイルのスクリーンショット。

  2. 100 ショット など、プログラムを実行するショットの数を入力し、 Enter キーを押します。 ヒストグラムが Q# ヒストグラム ウィンドウに表示されます。

  3. 左上の 設定アイコン をクリックすると、オプションが表示されます。

    設定を表示する方法を示す Visual Studio Code の Q# ヒストグラム ウィンドウのスクリーンショット。

  4. バーをクリックすると、その結果の 割合 が表示されます。 この場合、可能な結果は 0 と 1 の 2 つあり、各結果の割合は 50% に近い値です。

    Visual Studio Code の Q# ヒストグラム ウィンドウのスクリーンショット。

ヒント

ヒストグラムは、マウス スクロール ホイールまたはトラックパッド ジェスチャを使用してズームできます。 拡大すると、スクロール中に 'Alt' キーを押してグラフをパンできます。

量子回路を視覚化する

量子回路図は、量子演算を視覚的に表現したものです。 量子プログラムを通る量子ビットの流れを示します。これには、ゲートと、それらに適用される測定値が含まれます。 詳細については、「 Visual Studio Code の量子回路図」を参照してください。

  1. [ 表示 ] -> [コマンド パレット] を選択し、「circuit」と入力します。これにより 、Q#: Show circuit オプションが表示されます。 下のコマンド@EntryPoint()の一覧から [回線] をクリックすることもできます。

    コード レンズ回線コマンドの場所を示す Visual Studio Code の Q# ファイルのスクリーンショット。

  2. Q# 回線ウィンドウに回線が表示されます。 この回路図は、|0⟩ 状態に初期化された 1 つの量子ビット レジスタを示しています。 次に、Hadamard ゲート H が量子ビットに適用され、測定 演算が続き、測定記号で表されます。 詳細については、「 Quantum 回線の規則」を参照してください。

    ランダム ビット操作の結果の回路図を示す Q# 回線ウィンドウのスクリーンショット。

Azure Quantum に接続してジョブを送信する

VS Code からジョブを直接接続して送信できます。 この例では、Rigetti シミュレーターにジョブを送信します。

  1. [ 表示 -> コマンド パレット] を 選択し、「 Q#: Azure Quantum ワークスペースに接続する」と入力します。 Enter キーを押します。

  2. [Azure アカウント] を選択し、プロンプトに従って、優先するディレクトリ、サブスクリプション、ワークスペースに接続します。

    注意

    接続文字列がある場合は、[接続文字列] を選択し、Azure Quantum ワークスペースに対応する接続文字列を貼り付けることができます。 詳細については、「接続文字列を使用して Quantum ワークスペースに接続する」を参照してください。

  3. 接続したら、[エクスプローラー] ウィンドウで [Quantum ワークスペース] を展開します。

  4. ワークスペースを展開し、 Rigetti プロバイダーを展開します。

    注意

    Azure Quantum への接続に問題がある場合は、ワークスペース名の横に警告アイコンが表示されます。 ワークスペース名にカーソルを合わせると、エラー情報が表示されます。

  5. として rigetti.sim.qvm を選択します target。

    Rigetti シミュレーターを として target選択する方法を示す Visual Studio Code のスクリーンショット。

  6. 名前の右側にある再生アイコンを選択して、 target 現在の Q# プログラムの送信を開始します。 ポップアップが表示されたら、[ QIR target プロファイルの変更] を選択して続行します

    Rigetti シミュレーターを として target実行する方法を示す Visual Studio Code のスクリーンショット。

  7. ジョブを識別する名前を追加します。

  8. ショットの数、またはプログラムが実行される回数を追加します。

  9. Enter キーを押してジョブを送信します。 ジョブの状態が画面の下部に表示されます。

  10. [ ジョブ] を 展開し、ジョブの上にカーソルを合わせると、ジョブの時刻と状態が表示されます。

  11. 結果を表示するには、ジョブ名の横にあるクラウド アイコンを選択して、ワークスペース ストレージから結果をダウンロードし、VS Code に表示します。

    量子ジョブの結果をダウンロードして表示する方法を示す Visual Studio Code のスクリーンショット。

Jupyter Notebooks ジョブを Azure Quantum に送信する

VS Code を使用して、Q# Jupyter Notebookを実行、デバッグ、および Azure Quantum に送信する方法について説明します。 この記事の手順は、ローカルの Jupyter サーバー上の Jupyter Notebook、または Azure Quantum ポータルのノートブックにも適用されます。

前提条件

インストールの詳細については、「 VS Code へのモダン QDK のインストール」を参照してください。

  • Azure サブスクリプションの Azure Quantum ワークスペース。 ワークスペースを作成するには、Azure Quantum ワークスペースの作成に関する記事を参照してください。

  • Python と Pip がインストールされている Python 環境。

  • Azure Quantum Development KitPythonJupyter 拡張機能がインストールされた VS Code。

  • Azure Quantum qsharp、、 qsharp-widgetsおよび azure-quantum パッケージ、および ipykernel パッケージ。

    python -m pip install --upgrade qsharp qsharp-widgets azure-quantum ipykernel
    

ローカル シミュレーターでプログラムを実行してテストする

  1. VS Code で、[コマンド パレットの表示>] を選択し、[Create: 新しいJupyter Notebook] を選択します。

  2. 右上では、VS Code によって、ノートブック用に選択された Python のバージョンと仮想 Python 環境が検出され、表示されます。 複数の Python 環境がある場合は、右上のカーネル ピッカーを使用してカーネルを選択する必要がある場合があります。 環境が検出されなかった場合は、セットアップ情報については 、「VS Code の Jupyter Notebooks 」を参照してください。

  3. ノートブックの最初のセルで、次の Python コードを実行して、必要なモジュールをインポートします。

    import qsharp
    import azure.quantum
    
    • モジュールによって qsharp マジック コマンドが %%qsharp アクティブ化され、Q# コードをセルに直接入力できます。
    • このモジュールは azure-quantum 、Azure Quantum ワークスペースへの接続を提供します。

    注意

    Jupyter Python カーネル ipykernel が検出されない場合、VS Code によってインストールするように求められます。

  4. 別のセルを追加し、ユーザー指定のランダム ビット数を返す次の Q# コードを入力します。

    注意

    マジック コマンド %%qsharpを入力するとすぐに、ノートブック セルの型が Python から Q# に変わります。

    %%qsharp
    
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            set results += [r];
        }
        return results
    }
    
  5. 操作をテストするには、 メソッドを eval 使用します。このメソッドは、ノートブックで以前に定義された Q# 操作を呼び出すことができます。

    qsharp.eval("RandomNBits(4)")
    
    [Zero, One, One, Zero]
    
  6. ローカル シミュレーターに対してプログラムを実行するには、 メソッドを使用します run 。 プログラムを shots実行する回数 、、または 回数を指定すると、シミュレーターは結果を Python リストとして返します。

    qsharp.run("RandomNBits(4)", shots=10)
    
    [[One, One, One, One],
    [Zero, Zero, One, Zero],
    [One, Zero, Zero, One],
    [Zero, One, Zero, Zero],
    [One, Zero, One, One],
    [One, Zero, One, Zero],
    [One, One, One, Zero],
    [One, One, One, One],
    [Zero, Zero, Zero, One],
    [One, Zero, Zero, One]]
    

量子回路を視覚化する

パッケージを使用して量子回路を qsharp-widgets 視覚化できます。 このパッケージは、SVG イメージとして量子回路図をレンダリングするウィジェットを提供します。 詳細については、「 Jupyter Notebook を使用した量子回路図」を参照してください。

次のコードを新しいセルに追加して、回線を視覚化します。

from qsharp_widgets import Circuit

Circuit(qsharp.circuit("RandomNBits(4)"))

Q# 操作の回線を視覚化する方法を示すJupyter Notebookのスクリーンショット。

詳細については、「 Quantum 回線の規則」を参照してください。

基本プロファイルを使用してジョブをコンパイルする

ローカル量子シミュレーターでプログラムを実行すると、任意の種類の Q# プログラムを送信できます。 ただし、Azure Quantum ハードウェア targets では、すべての Q# プログラムを実行するために必要な完全な機能はまだサポートされていません。 Q# プログラムをコンパイルして Azure Quantum に送信するには、ハードウェアでサポートされている機能を target Q# に通知するようにプロファイルを設定する必要があります target 。 現在、これは基本プロファイルです。 詳細については、「 Azure Quantum のプロファイルの種類」を参照してください。

Q# インタープリターを再初期化し、基本プロファイルを使用してプログラムをコンパイルするには:

  1. メソッドを init 使用してプロファイルを設定します。

    qsharp.init(target_profile=qsharp.TargetProfile.Base)
    
  2. インタープリターを再初期化したので、新しいプロファイルでコードをもう一度実行する必要があります。

    %%qsharp
    
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            set results += [r];
        }
        return results
    }
    
  3. 次に、 メソッドを compile 使用して、プログラムのエントリ ポイントである操作または関数を指定します。 これにより、コードが QIR 形式にコンパイルされ、任意の量子ハードウェアに送信できます。

    MyProgram = qsharp.compile("RandomNBits(4)")
    

Azure Quantum に接続してジョブを送信する

プログラムを正しい形式にコンパイルしたら、Azure Quantum に接続するオブジェクトを azure.quantum.Workspace 作成します。 接続するには、Azure Quantum ワークスペースのリソース ID を使用します。 リソース ID と場所は、Azure portalのワークスペースの概要ページからコピーできます。

  1. 新しいセルで、Azure Quantum ワークスペースのリソース ID と場所を入力します。

    MyWorkspace = azure.quantum.Workspace(
        resource_id = "MyResourceID",
        location = "MyLocation"
    )
    
  2. メソッドを get_targets 使用して、ワークスペースで使用可能なハードウェア targets を確認します。

    MyTargets = MyWorkspace.get_targets()
    print("This workspace's targets:")
    MyTargets
    
  3. を選択します rigetti.sim.qvmtarget。

    MyTarget = MyWorkspace.get_targets("rigetti.sim.qvm")
    
  4. 最後に、 メソッドを submit 使用して、そのパラメーターを使用してプログラムを送信し、結果を表示します。

    job = MyTarget.submit(MyProgram, "MyQuantumJob", shots=100)
    job.get_results()
    
    {'Histogram': ['[0, 0, 0, 0]',
      0.3,
      '[1, 0, 0, 0]',
      0.1,
      '[1, 1, 1, 1]',
      0.3,
      '[0, 1, 1, 1]',
      0.3]}
    
  5. ジョブのすべてのプロパティには、 で job.detailsアクセスできます。次に例を示します。

    print(job.details)
    print("\nJob name:", job.details.name)
    print("Job status:", job.details.status)
    print("Job ID:", job.details.id)
    
    {'additional_properties': {'isCancelling': False}, 'id': '0150202e-9638-11ee-be2f-b16153380354', 'name': 'MyQuantumJob', 'provider_id': 'rigetti'...}
    Job name: MyQuantumJob
    Job status: Succeeded
    Job ID: 0150202e-9638-11ee-be2f-b16153380354
    

Q# ジョブを含む Python を Azure Quantum に送信する

VS Code を使用して、Q# 操作を呼び出す Python プログラムを記述し、Python コマンドまたは Azure CLI を使用して Azure に接続し、ジョブを送信する方法について説明します。

前提条件

インストールの詳細については、「 VS Code へのモダン QDK のインストール」を参照してください。

  • Azure サブスクリプションの Azure Quantum ワークスペース。 ワークスペースを作成するには、Azure Quantum ワークスペースの作成に関する記事を参照してください。
  • Python と Pip がインストールされている Python 環境。
  • Azure Quantum Development KitPython 拡張機能がインストールされた VS Code。
  • Azure Quantum qsharpazure-quantum パッケージ。
  • 最新の Azure Quantum 拡張機能がインストールされた Azure CLI

Q# 操作をCreateしてインポートする

パッケージを qsharp 使用すると、関数と操作を Q# ファイルに格納し、Python コードからそれらを呼び出すことができる Q# プロジェクト を作成できます。 これは、入力パラメーターを受け取るプログラムを起動する必要がある場合に特に役立ちます。

  1. 手順に従って Q# プロジェクトを作成します。

  2. 新しいテキスト ファイルを開き、ユーザー指定のランダム ビット数を返す次の Q# コードを追加し、ファイルを として source.qsプロジェクトに保存します。

    注意

    この Q# コードには@EntryPoint、Q# プログラムのような関数はありません (「Azure Quantum への Q# ジョブの送信」を参照してください)、Jupyter Notebookとは異なり名前空間が必要です (「Azure Quantum へのJupyter Notebook ジョブの送信」を参照してください)。

    namespace Sample {
    
      operation Random() : Result {
            use q = Qubit();
            H(q);
            let result = M(q);
            Reset(q);
            return result
      }
    
      operation RandomNBits(N: Int): Result[] {
            mutable results = [];
            for i in 0 .. N - 1 {
               let r = Random();
               set results += [r];
            }
            return results
      }
    }
    
  3. 同じフォルダーで、別のファイルを開き、 として randomNum.py保存します。

  4. モジュールと azure.quantum モジュールをインポートする次のコードをqsharp追加します。

    import qsharp
    import azure.quantum
    
  5. 次に、Q# プロジェクトのルート フォルダーを定義するコードを追加し、ローカル シミュレーターで操作を target テスト実行します。 操作は名前空間によって呼び出されます<>。<operation_name( )>、この場合は、返すランダムビットの数を渡します。

    qsharp.init(project_root = '/MyProjectRootFolder')
    print(qsharp.eval("Sample.RandomNBits(4)"))
    
    [Zero, One, One, Zero]
    
  6. 追加のパラメーターを渡shotsし、結果を run Python リストで返す メソッドを使用して操作をテストすることもできます。 で randomNum.py、前の print ステートメントを次のように置き換えます。

    result = qsharp.run("Sample.RandomNBits(4)", shots=10)
    for x in result:
        print(x)
    
    [[One, One, One, One],
    [Zero, Zero, One, Zero],
    [One, Zero, Zero, One],
    [Zero, One, Zero, Zero],
    [One, Zero, One, One],
    [One, Zero, One, Zero],
    [One, One, One, Zero],
    [One, One, One, One],
    [Zero, Zero, Zero, One],
    [One, Zero, Zero, One]]
    

基本プロファイルを使用してジョブをコンパイルする

ローカル量子シミュレーターでプログラムを実行すると、任意の種類の Q# プログラムを送信できます。 ただし、Azure Quantum ハードウェア targets では、すべての Q# プログラムを実行するために必要な完全な機能はまだサポートされていません。 Q# プログラムをコンパイルして Azure Quantum に送信するには、ハードウェアでサポートされている機能を target Q# に伝えるプロファイルを設定する必要があります target 。 現在、これは基本プロファイルです。 詳細については、「 Azure Quantum のプロファイルの種類」を参照してください。

注意

VS Code の Q# のみのプログラムの場合、VS Code はベース プロファイルを自動的に設定します。

  1. メソッドを init 使用してプロファイルを設定します。

    qsharp.init(target_profile=qsharp.TargetProfile.Base)
    
  2. 次に、 メソッドを compile 使用して、プログラムのエントリ ポイントである操作または関数を指定します。 コンパイルされたプログラムは、任意の量子ハードウェアに送信できます。

    MyProgram = qsharp.compile("Sample.RandomNBits(4)")
    

Azure Quantum に接続してジョブを送信する

Azure Quantum に接続し、Python で作成された Workspace オブジェクトを使用してジョブを送信することも、Azure CLI を使用してジョブを接続して送信することもできます。 Azure CLI を使用するには、コンパイルされたプログラムをテキスト ファイルとして保存し、CLI コマンドを使用してそのファイルを送信する必要があります。

プログラムを正しい形式にコンパイルしたら、Azure Quantum に接続するオブジェクトを作成 azure.quantum.Workspace します。 接続するには、Azure Quantum ワークスペースのリソース ID を使用します。 リソース ID と場所は、Azure portalのワークスペースの概要ページからコピーできます。

  1. に次のコードを追加し randomNum.py、Azure Quantum ワークスペースからリソース ID と場所を入力します。

    workspace = azure.quantum.Workspace(
        resource_id = "MyResourceID",
        location = "MyLocation"
    )
    
  2. ワークスペースで get_targets 使用可能なハードウェア targets を表示するには、 メソッドを使用します。

    MyTargets = workspace.get_targets()
    print("This workspace's targets:")
    for x in MyTargets:
        print(x)
    
  3. を選択します rigetti.sim.qvmtarget。

    MyTarget = workspace.get_targets("rigetti.sim.qvm")
    
  4. 最後に、 メソッドを submit 使用して、パラメーターを使用してプログラムを送信します。 ジョブの結果は Python ディクショナリとして返されます。

    job = MyTarget.submit(MyProgram, "MyPythonJob", shots=100)
    results = job.get_results()
    print("\nResults: ", results)
    
  5. 値だけを抽出して表示するには:

    resultList = results.get("Histogram")
    for x in resultList:
        print(x)
    
    [0, 0, 0, 0]
    0.3
    [1, 0, 0, 0]
    0.1
    [1, 1, 1, 1]
    0.3
    [0, 1, 1, 1]
    0.3
    
  6. ジョブのすべてのプロパティには、 で job.detailsアクセスできます。次に例を示します。

    print(job.details)
    print("\nJob name:", job.details.name)
    print("Job status:", job.details.status)
    print("Job ID:", job.details.id)
    
    {'additional_properties': {'isCancelling': False}, 'id': '0fc396d2-97dd-11ee-9958-6ca1004ff31f', 'name': 'MyPythonJob', 'provider_id': 'rigetti'...}
    Job name: MyPythonJob
    Job status: Succeeded
    Job ID: fc396d2-97dd-11ee-9958-6ca1004ff31f
    

次のステップ