{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f4e55284-8bd6-4cb2-b044-11816cba1e2d",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"ジョブをバッチで実行する\"\n",
        "description: \"IBM Quantum Compute Service を使用して、量子コンピューティングジョブをバッチモードで実行する方法。\"\n",
        "---\n",
        "\n",
        "<span id=\"run-jobs-in-a-batch\" />\n",
        "\n",
        "# ジョブをバッチで実行する\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3f77b9f7-7967-45ad-a68b-3db6e0d36456",
      "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.3.0\n",
        "    qiskit-ibm-runtime~=0.43.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "388d0a36-0a7c-4b60-8607-4e535f8adf2c",
      "metadata": {},
      "source": [
        "バッチモードを使用して、複数のプリミティブジョブを同時に送信します。 以下は、バッチの使用例である。\n",
        "\n",
        "<span id=\"set-up-to-use-batches\" />\n",
        "\n",
        "## バッチを使用する設定\n",
        "\n",
        "バッチを開始する前に、 [IBM Quantum Compute クライアントを設定し](/docs/guides/install-qiskit)、サービスとして初期化する必要があります\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "340d9d45-9ec0-473f-bf17-9dc7eb0804ed",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import (\n",
        "    QiskitRuntimeService,\n",
        "    Batch,\n",
        "    SamplerV2 as Sampler,\n",
        "    EstimatorV2 as Estimator,\n",
        "    Executor,\n",
        ")\n",
        "\n",
        "\n",
        "service = QiskitRuntimeService()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fc80a9fa-ffc1-419f-be98-ef36b73eda9a",
      "metadata": {},
      "source": [
        "<span id=\"open-a-batch\" />\n",
        "\n",
        "## バッチを開く\n",
        "\n",
        "コンテキスト・マネージャー `with Batch(...)` を使うか、あるいは `Batch` クラスを初期化することで開くことができます。 バッチを開始する際には、 `backend` オブジェクトを渡して QPU を指定する必要があります。  バッチは、最初のジョブが実行を開始した時点で開始される。\n",
        "\n",
        "**バッチクラス**\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "02e53d53-3410-4e07-9c02-c582b97e15e1",
      "metadata": {},
      "outputs": [],
      "source": [
        "backend = service.least_busy(operational=True, simulator=False)\n",
        "batch = Batch(backend=backend)\n",
        "estimator = Estimator(mode=batch)\n",
        "sampler = Sampler(mode=batch)\n",
        "executor = Executor(mode=batch)\n",
        "# Close the batch because no context manager was used.\n",
        "batch.close()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ad0927c2-cbba-4392-bced-fddcde738521",
      "metadata": {},
      "source": [
        "**コンテキスト・マネージャー**\n",
        "\n",
        "コンテキストマネージャーは自動的にバッチを開いたり閉じたりする。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "fe96e5dd-8237-458d-8657-dd0f71c65f8a",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import (\n",
        "    Batch,\n",
        "    SamplerV2 as Sampler,\n",
        "    EstimatorV2 as Estimator,\n",
        "    Executor,\n",
        ")\n",
        "\n",
        "backend = service.least_busy(operational=True, simulator=False)\n",
        "with Batch(backend=backend):\n",
        "    estimator = Estimator()\n",
        "    sampler = Sampler()\n",
        "    executor = Executor()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "285f7538-3abd-4940-bca1-b1a61bc25bd5",
      "metadata": {},
      "source": [
        "<span id=\"specify-batch-length\" />\n",
        "\n",
        "<span id=\"batch-length\" />\n",
        "\n",
        "## バッチ長\n",
        "\n",
        "`max_time` パラメータでバッチの最大生存時間（TTL）を定義できる。 これは、最長ジョブの実行時間を上回るはずである。 このタイマーは、バッチが開始されたときにスタートする。  その値に達すると、そのバッチは終了する。  実行中のジョブはすべて終了するが、キューに残っているジョブは失敗する。\n",
        "\n",
        "```python\n",
        "with Batch(backend=backend, max_time=\"25m\"):\n",
        "  ...\n",
        "```\n",
        "\n",
        "また、設定できないインタラクティブ・タイム・トゥ・ライブ（インタラクティブTTL）値もある（すべてのプランで1分）。  そのウィンドウ内にバッチジョブがキューに入っていない場合、バッチは一時的に無効化される。\n",
        "\n",
        "デフォルトの最大TTL値：\n",
        "\n",
        "| インスタンス・タイプ | デフォルトの最大TTL |\n",
        "| ---------- | ----------- |\n",
        "| すべての有料プラン  | 8 時間        |\n",
        "| 開く         | 10 分間       |\n",
        "\n",
        "バッチの最大TTLまたは対話的TTLを決定するには、「 [バッチの詳細を決定する](#batch-details) 」の指示に従い、それぞれ `max_time` または `interactive_timeout` の値を探す。\n",
        "\n",
        "<span id=\"close\" />\n",
        "\n",
        "<span id=\"close-a-batch\" />\n",
        "\n",
        "## バッチを閉じる\n",
        "\n",
        "コンテキストマネージャーを終了すると、バッチは自動的に終了する。 バッチコンテキストマネージャーが終了すると、バッチは「進行中、新規ジョブは受け付けない」ステータスになる。 これは、最大TTL値に達するまで、実行中またはキューに入っているすべてのジョブの処理をバッチが終了することを意味する。 すべてのジョブが完了すると、バッチは直ちに閉じられる。 閉じたバッチにジョブを投入することはできません。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "05868749-5c03-4540-b780-3e151054e4cf",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\">\n",
        "  以下のコードでは、Estimator や Sampler の PUB、およびバックエンドなど、独自の情報を指定する必要があります。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "39fa154b-d5f2-411f-8953-367bd5e3c879",
      "metadata": {},
      "outputs": [],
      "source": [
        "with Batch(backend=backend) as batch:\n",
        "    estimator = Estimator()\n",
        "    sampler = Sampler()\n",
        "    job1 = estimator.run([estimator_pub])\n",
        "    job2 = sampler.run([sampler_pub])\n",
        "\n",
        "# The batch is no longer accepting jobs but the submitted job will run to completion.\n",
        "result = job1.result()\n",
        "result2 = job2.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "92515062-ec5e-41a1-8969-59e78c448b1f",
      "metadata": {},
      "source": [
        "<Admonition type=\"tip\">\n",
        "  コンテキストマネージャーを使用していない場合は、手動でバッチを閉じる。  バッチを開いたままにしておいて、後でさらにジョブを投入すると、後続のジョブが実行を開始する前に最大TTLに達してしまい、キャンセルされる可能性がある。 バッチへのジョブ投入が終わったら、すぐにバッチを閉じることができる。 バッチが `batch.close()` で閉じられると、新しいジョブは受け付けられなくなるが、すでに投入されたジョブは完了するまで実行され、その結果を取り出すことができる。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "d1cb86c0-b397-47a9-ad93-055aa71ca327",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Result1: PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(3, 2), dtype=float64>), stds=np.ndarray(<shape=(3, 2), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(3, 2), dtype=float64>), shape=(3, 2)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})\n",
            "Result2: PrimitiveResult([SamplerPubResult(data=DataBin(meas=BitArray(<shape=(3, 2), num_shots=4096, num_bits=2>), meas0=BitArray(<shape=(3, 2), num_shots=4096, num_bits=133>), shape=(3, 2)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2026-02-15 07:58:55', stop='2026-02-15 07:59:02', size=24576>)])}, 'version': 2})\n"
          ]
        }
      ],
      "source": [
        "batch = Batch(backend=backend)\n",
        "\n",
        "# If using qiskit-ibm-runtime earlier than 0.24.0, change `mode=` to `batch=`\n",
        "estimator = Estimator(mode=batch)\n",
        "sampler = Sampler(mode=batch)\n",
        "job1 = estimator.run([estimator_pub])\n",
        "job2 = sampler.run([sampler_pub])\n",
        "print(f\"Result1: {job1.result()}\")\n",
        "print(f\"Result2: {job2.result()}\")\n",
        "\n",
        "# Manually close the batch. Running and queued jobs will run to completion.\n",
        "batch.close()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9594105f-b003-43ee-9a5f-5cf3d6410887",
      "metadata": {},
      "source": [
        "<span id=\"batch-details\" />\n",
        "\n",
        "<span id=\"determine-batch-details\" />\n",
        "\n",
        "## バッチの詳細を決定する\n",
        "\n",
        "対話型や最大TTLなど、バッチの設定やステータスの包括的な概要については、 `batch.details() method`。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "8a21ca0e-0373-456c-879f-9bcddda5289a",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "{'id': '970fe01d-d2cf-45f0-b32b-f886b987a462', 'backend_name': 'ibm_torino', 'interactive_timeout': 1, 'max_time': 28800, 'active_timeout': 28800, 'state': 'open', 'accepting_jobs': True, 'last_job_started': None, 'last_job_completed': None, 'started_at': None, 'closed_at': None, 'activated_at': None, 'mode': 'batch', 'usage_time': None}\n"
          ]
        }
      ],
      "source": [
        "from qiskit_ibm_runtime import (\n",
        "    QiskitRuntimeService,\n",
        "    batch,\n",
        "    SamplerV2 as Sampler,\n",
        ")\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(operational=True, simulator=False)\n",
        "\n",
        "with Batch(backend=backend) as batch:\n",
        "    print(batch.details())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cbdc7521-7b4c-4e02-a24d-2b5ca0a11abe",
      "metadata": {},
      "source": [
        "<span id=\"partition\" />\n",
        "\n",
        "<span id=\"reconfigure-jobs-for-parallel-processing\" />\n",
        "\n",
        "## 並列処理のためにジョブを再構成する\n",
        "\n",
        "バッチ処理による並列処理を利用するためにジョブを再構成する方法は複数あります。 次の例では、長い回路リストを複数のジョブに分割し、バッチとして実行することで並列処理を利用する方法を示しています。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "31ae3a23-e8bd-4dcd-86c1-10f6d7b5cee4",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import SamplerV2 as Sampler, Batch\n",
        "from qiskit.circuit.random import random_circuit\n",
        "\n",
        "max_circuits = 100\n",
        "circuits = [pm.run(random_circuit(5, 5)) for _ in range(5 * max_circuits)]\n",
        "for circuit in circuits:\n",
        "    circuit.measure_active()\n",
        "all_partitioned_circuits = []\n",
        "for i in range(0, len(circuits), max_circuits):\n",
        "    all_partitioned_circuits.append(circuits[i : i + max_circuits])\n",
        "jobs = []\n",
        "start_idx = 0\n",
        "\n",
        "with Batch(backend=backend):\n",
        "    sampler = Sampler()\n",
        "    for partitioned_circuits in all_partitioned_circuits:\n",
        "        job = sampler.run(partitioned_circuits)\n",
        "        jobs.append(job)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5d4420f8-9c8d-4953-8561-1b0bdb8372eb",
      "metadata": {},
      "source": [
        "<Admonition type=\"caution\">\n",
        "  プリミティブ内で を `backend=backend` 設定すると、バッチまたはセッションコンテキスト内であっても、プログラムはジョブモードで実行されます。 Qiskit Runtime 以降、設定 `backend=backend` は非推奨となりました。 v0.24.0  代わりに、パラメータ `mode` を使用してください。\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * 「 [エラー軽減オプションとEstimatorプリミティブの組み合わせ](/docs/tutorials/combine-error-mitigation-techniques) 」チュートリアルにある例を試してみてください。\n",
        "  * [Batch API](/docs/api/qiskit-ibm-runtime/batch#batch) リファレンスを確認する。\n",
        "  * IBM® のQPUにジョブを送信する際は[、ジョブの制限事項](/docs/guides/job-limits)を理解しておく必要があります。\n",
        "  * [実行モードに関するよくある質問](/docs/guides/execution-modes-faq)を確認する。\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
}