{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "2d6582ed-04c1-44bb-9dd8-042d46bd8a7b",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Executor クイックスタート\"\n",
        "description: \"qiskit-ibm-runtime における Executor プリミティブの使用方法。\"\n",
        "\n",
        "---\n",
        "\n",
        "<span id=\"executor-quickstart\" />\n",
        "\n",
        "# Executor クイックスタート\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b91b019e-f1d9-4a7f-9c5a-68ead8bf2a6d",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"パッケージ・バージョン\">\n",
        "    このページのコードは、以下の要件に基づいて開発されました。\n",
        "    これらのバージョン以降のご利用をお勧めします。\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.4.0\n",
        "    qiskit-ibm-runtime~=0.46.1\n",
        "    samplomatic~=0.18.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e82a5b3c-eed9-41fe-8940-e88838101ca3",
      "metadata": {},
      "source": [
        "[Sampler](/docs/guides/get-started-with-sampler) プリミティブと同様に、Executorは量子回路の実行から出力レジスタをサンプリングしますが、組み込みのエラー抑制や軽減機能は備えていません。 むしろ、これはクライアント側で設計意図を捉えるための要素を提供し、コストのかかる回路バリエーションの生成をサーバー側に移行させる、 [指向性実行モデル](/docs/guides/directed-execution-model)の一部である。 Executorは、回路の注釈やオプションで指定された指示に従い、パラメータ値を生成してバインドし、バインドされた回路をハードウェア上で実行し、実行結果とメタデータを返します。 このシステムは、ユーザーに代わって暗黙の判断を下すことはなく、ユーザーに完全な制御権と透明性を提供します。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Qiskit パッケージには、現時点では Executor プリミティブ用の基底クラスが用意されていません。\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"before-you-begin\" />\n",
        "\n",
        "## 開始前に\n",
        "\n",
        "`samplex`このページにあるコード例の一部では、Samplomatic パッケージに含まれる を使用しています。  したがって、これらのコードブロックを実行する前に、次のコードブロックに示すように、Samplomaticをインストールする必要があります。  詳細については、 [Samplomaticのドキュメント](https://qiskit.github.io/samplomatic)を参照してください。\n",
        "\n",
        "```python\n",
        "pip install samplomatic\n",
        "\n",
        "# For visualization support, include the visualization dependencies.\n",
        "# pip install samplomatic[vis]\n",
        "```\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9112ddbd-7101-4cac-a53f-5ecf492bc8d4",
      "metadata": {},
      "source": [
        "<span id=\"steps-to-use-the-executor-primitive\" />\n",
        "\n",
        "## Executorプリミティブの使用手順\n",
        "\n",
        "<span id=\"1-initialize-the-account\" />\n",
        "\n",
        "### 1. アカウントを初期化する\n",
        "\n",
        "IBM Quantum Compute Service はマネージド サービスであるため、まずアカウントを初期化する必要があります。 その後、期待値の計算に使用するQPUを選択できます。\n",
        "\n",
        "まだ[アカウント](/docs/guides/cloud-setup)をお持ちでない場合は、「 IBM Cloud® アカウントの設定」の手順に従ってください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "c0b08867-a635-481e-ac4f-52359382c94d",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService, Executor\n",
        "from qiskit_ibm_runtime.quantum_program import QuantumProgram\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from samplomatic.transpiler import generate_boxing_pass_manager\n",
        "from samplomatic import build\n",
        "\n",
        "# Initialize the service and choose a backend\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(operational=True, simulator=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "ec105ea7-d806-4333-92af-2d7c578c67d9",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "<IBMBackend('ibm_fez')>\n"
          ]
        }
      ],
      "source": [
        "print(backend)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "89c4ffd9-acde-4b1f-8ada-fc39b7a708ed",
      "metadata": {},
      "source": [
        "<span id=\"2-create-and-transpile-a-circuit\" />\n",
        "\n",
        "### 2. 回路を作成し、トランスパイルする\n",
        "\n",
        "Executorプリミティブを使用するには、少なくとも1つの回路が必要です。  必要に応じてパラメータを指定できます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "7671b4dd-b031-44b7-bd4a-48dd39fb93f4",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Generate the circuit\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.h(0)\n",
        "circuit.h(1)\n",
        "circuit.cz(0, 1)\n",
        "circuit.h(1)\n",
        "\n",
        "# Using `measure_all` automatically creates the necessary\n",
        "# classical registers.\n",
        "circuit.measure_all()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "127d6de9-084e-47d5-82d6-f2197c0bd74c",
      "metadata": {},
      "source": [
        "この回路は、QPUがサポートする命令のみを使用するように変換する必要があります（ *これは命令セットアーキテクチャ（ISA）* 回路と呼ばれます）。 これを行うには、トランスパイラーを使用してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "7a98fb20-8731-43f3-a81c-fb2bc8cba9db",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Transpile the circuit\n",
        "preset_pass_manager = generate_preset_pass_manager(\n",
        "    backend=backend, optimization_level=0\n",
        ")\n",
        "isa_circuit = preset_pass_manager.run(circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "172b3622-adbb-43f6-9cec-b70dc72094e0",
      "metadata": {},
      "source": [
        "<span id=\"3-initialize-a-quantumprogram\" />\n",
        "\n",
        "### 3. ` `QuantumProgram` ` を初期化する\n",
        "\n",
        "ワークロードに合わせて を `QuantumProgram` 初期化してください。 `QuantumProgramItems`A `QuantumProgram` は で構成されています。 通常、各項目は回路、一連のパラメータ値、および場合によっては回路の内容をランダム化する機能 `samplex` で構成されます。 詳細については、 [「Executorの入力と出力」](/docs/guides/executor-input-output) を参照してください。\n",
        "\n",
        "次のセルでは、 を `QuantumProgram` 初期化し、25回の発射を行うよう指定しています。 次に、トランスパイルされたターゲット回路を追加します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "eb6719cf-c7f1-4265-8602-9a65071a2dd5",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Initialize an empty program\n",
        "program = QuantumProgram(shots=25)\n",
        "\n",
        "# Append the circuit to the program\n",
        "program.append_circuit_item(isa_circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "da542e9b-f143-4651-ab3d-86fb54c066ab",
      "metadata": {},
      "source": [
        "<span id=\"4-optional-group-gates-and-measurements-into-annotated-boxes\" />\n",
        "\n",
        "### 4. 任意：ゲートと測定値を注釈付きボックスにまとめる\n",
        "\n",
        "命令をボックスにまとめ、注釈を付けることが、意図を明確にする主な方法です。 次の例では、およびそのツイリングパラメータを使用して `generate_boxing_pass_manager` 、2量子ビットゲートと測定をボックスにグループ化し、ツイリング注釈を適用します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "245a4574-3ce9-4f77-98c8-af32cde8ac01",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/get-started-with-executor/extracted-outputs/245a4574-3ce9-4f77-98c8-af32cde8ac01-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Generate a boxing pass manager to group gates\n",
        "# and measurements into boxes and add\n",
        "# a`Twirl` annotation.\n",
        "boxes_pm = generate_boxing_pass_manager(\n",
        "    # Add gate twirling\n",
        "    enable_gates=True,\n",
        "    # Add measurement twirling\n",
        "    enable_measures=True,\n",
        ")\n",
        "\n",
        "boxed_circuit = boxes_pm.run(isa_circuit)\n",
        "boxed_circuit.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2b2fe4a7-2a1c-489e-9063-3084edfc2517",
      "metadata": {},
      "source": [
        "<span id=\"5-optional-build-a-template-circuit-and-samplex-and-add-them-to-the-program\" />\n",
        "\n",
        "### 5. 任意：テンプレート回路とsamplexを作成し、プログラムに追加する\n",
        "\n",
        "次に、Samplomatic [のビルド](https://qiskit.github.io/samplomatic/api/auto/samplomatic.build.html#samplomatic.build)手法を使用して、 *テンプレート回路*と *samplex* ペアを生成します。 このテンプレート回路は、元の回路と構造的に同等です。 ただし、所定の注釈（この例ではゲートおよび測定のツイリング）を実装するために、その単一量子ビットゲートはパラメータ化ゲートに置き換えられている。 このサンプレックスには、テンプレート回路のランダム化されたパラメータを生成するために必要なすべての情報がエンコードされています。\n",
        "\n",
        "テンプレート回路とサンプルクス・ペアを生成したら、` `append\\_samplex\\_item` method` を使用してそのペアをプログラムに追加します。\n",
        "\n",
        "およびその引数に関する `samplomatic.samplex.Samplex` 詳細については、Samplomatic [API](https://qiskit.github.io/samplomatic/api/index.html) ドキュメントを参照してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "47bbeef2-2d85-4495-b740-2e64eb9066b7",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Build the template circuit and the samplex\n",
        "template_circuit, samplex = build(boxed_circuit)\n",
        "\n",
        "# Append the template circuit and samplex as a `samplex_item`\n",
        "program.append_samplex_item(\n",
        "    template_circuit,\n",
        "    samplex=samplex,\n",
        "    shape=(num_randomizations := 20,),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3733cce7-15d5-4c04-a1cd-0bf83e94aeaf",
      "metadata": {},
      "source": [
        "<span id=\"6-invoke-executor-and-get-results\" />\n",
        "\n",
        "### 6. Executorを呼び出して結果を取得する\n",
        "\n",
        "IBM® バックエンド上で、デフォルトオプションを `Executor` 指定して プリミティブを実行します `QuantumProgram` 。 利用可能なオプションについては、 [「Executor オプション」](/docs/guides/executor-options) を参照してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "b767050c-0299-4100-8be4-b73b0587e088",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<RuntimeJobV2('d8286580bvlc73d1vmsg', 'executor')>"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Initialize an Executor with the default options\n",
        "executor = Executor(mode=backend)\n",
        "\n",
        "# Submit the job\n",
        "job = executor.run(program)\n",
        "job"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "a341681d-0704-4800-af65-e49b7627bb36",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the result\n",
        "result = job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e649245b-633d-4123-ad55-9971b9366433",
      "metadata": {},
      "source": [
        "[`QuantumProgramResult`](/docs/api/qiskit-ibm-runtime/results-quantum-program-result)結果は 型です。 結果オブジェクトの詳細については、 「[Executor の入力と出力](/docs/guides/executor-input-output) 」を参照してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a6e149b1-de4f-41bb-b972-0781f082fa45",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * [Executorのサンプル](/docs/guides/executor-examples)を試してみてください。\n",
        "  * [実行者の入力と出力を](/docs/guides/executor-input-output)理解する。\n",
        "  * [Executorのブロードキャストの動作](/docs/guides/executor-broadcasting)について学びましょう。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}