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' キーを押してグラフをパンできます。

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を実行、デバッグ、送信する方法について説明します。 この記事の手順は、ローカルの Jupyter サーバー上の Jupyter Notebook、または Azure Quantum ポータルのノートブックにも適用されます。

前提条件

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

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

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

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

  3. ノートブックの最初のセルで、 を実行します。

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

    注意

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

  4. 別のセルを追加し、ユーザー指定のランダム ビット数を返す次の 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]]
    

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

ローカル量子シミュレーターでプログラムを実行する場合は、任意の種類の 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# 操作を作成してインポートする

パッケージを 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
    

次のステップ