{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "008d2ceb-f6fa-42f6-a7df-6bd604775278",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Estimator クイックスタート\"\n",
        "description: \"IBM Quantum の「Estimator」プリミティブの使用方法に関するクイックスタートガイド。\"\n",
        "---\n",
        "\n",
        "<span id=\"estimator-quickstart\" />\n",
        "\n",
        "# Estimator クイックスタート\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "49f269ba-e11d-4e5c-bbba-9d4a10540ad8",
      "metadata": {},
      "source": [
        "Estimatorプリミティブは、量子回路によって生成された状態に関して、1つまたは複数の観測量の期待値を計算します。 パラメータ値がプリミティブへの入力としても指定されている限り、回路をパラメータ化することができます。\n",
        "\n",
        "このプリミティブには、動的デカップリング、パウリ・トゥワーリング、ゲート・フォールディングZNE、PEA、PECなど、いくつかの組み込み[のエラー軽減および抑制手法](/docs/guides/error-mitigation-and-suppression-techniques)が備わっています。 また、コストと精度のバランスを簡単に調整できるオプション `resilience_level` もサポートしています。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b7e96291-0925-4d7f-81a8-a7738549477c",
      "metadata": {},
      "source": [
        "このトピックの手順では、Estimator のセットアップ方法、設定に使用できるオプションの確認方法、およびプログラム内での呼び出し方法について説明します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "818a2b3d-3950-4a28-8e37-39959c56484b",
      "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.5.1\n",
        "    qiskit-ibm-runtime~=0.47.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bafa61f0-c049-4ee6-ac76-a0ed97e67caf",
      "metadata": {},
      "source": [
        "{/*Verified the v2 examples 2/29/24 - updated 10/29/24*/}\n",
        "\n",
        "<span id=\"steps-to-use-the-estimator-primitive\" />\n",
        "\n",
        "## 「Estimator」プリミティブの使用手順\n",
        "\n",
        "<span id=\"1-initialize-the-account\" />\n",
        "\n",
        "### 1. アカウントを初期化する\n",
        "\n",
        "まず、アカウントを初期化する必要があります。 その後、期待値の計算に使用するQPUを選択できます。\n",
        "\n",
        "まだ[アカウント](cloud-setup)をお持ちでない場合は、「 IBM Cloud アカウントの設定」の手順に従ってください。\n",
        "\n",
        "<Admonition type=\"note\" title=\"部分ゲート\">\n",
        "  新たにサポートされた[フラクショナル・ゲート](/docs/guides/fractional-gates)を使用するには、インスタンス `QiskitRuntimeService` からバックエンドをリクエストする際に を `use_fractional_gates=True` 設定してください。 例:\n",
        "\n",
        "  ```python\n",
        "  service = QiskitRuntimeService()\n",
        "  fractional_gate_backend = service.least_busy(use_fractional_gates=True)\n",
        "  ```\n",
        "\n",
        "  これは実験的な機能であり、今後変更される可能性があります。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "71d62ba2-b1ba-405a-b304-5bdd7ec5e11b",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "ibm_fez\n"
          ]
        }
      ],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=127\n",
        ")\n",
        "\n",
        "print(backend.name)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d894fbe3-3ea8-4db0-908e-95790b560ddb",
      "metadata": {},
      "source": [
        "<span id=\"2-create-a-circuit-and-an-observable\" />\n",
        "\n",
        "### 2. 回路と観測可能変数を作成する\n",
        "\n",
        "Estimatorプリミティブへの入力として、少なくとも1つの回路と1つの観測変数が必要です。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "c0ad8982-d19b-46d4-8a2d-dd30357c0e52",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.circuit.library import qaoa_ansatz\n",
        "from qiskit.quantum_info import SparsePauliOp\n",
        "\n",
        "entanglement = [tuple(edge) for edge in backend.coupling_map.get_edges()]\n",
        "observable = SparsePauliOp.from_sparse_list(\n",
        "    [(\"ZZ\", [i, j], 0.5) for i, j in entanglement],\n",
        "    num_qubits=backend.num_qubits,\n",
        ")\n",
        "circuit = qaoa_ansatz(observable, reps=2)\n",
        "# The circuit is parametrized, so we will define the parameter values for execution\n",
        "param_values = [0.1, 0.2, 0.3, 0.4]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "84b42c6f-d80e-4cff-8e34-03affa566a97",
      "metadata": {},
      "source": [
        "回路と観測量は、QPUがサポートする命令のみを使用するように変換する必要があります（ *これは命令セットアーキテクチャ（ISA）* 回路と呼ばれます）。 これを行うには、トランスパイラーを使用してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "abefc665-24a7-466e-a9ec-67cac6a50ebd",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Circuit ops (ISA): OrderedDict([('rz', 4472), ('sx', 1884), ('cz', 1120)])\n"
          ]
        }
      ],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "pm = generate_preset_pass_manager(optimization_level=1, backend=backend)\n",
        "isa_circuit = pm.run(circuit)\n",
        "isa_observable = observable.apply_layout(isa_circuit.layout)\n",
        "print(f\">>> Circuit ops (ISA): {isa_circuit.count_ops()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b53e9ab3-7d87-4dd5-b362-138b24cfa73b",
      "metadata": {},
      "source": [
        "<span id=\"3-initialize-the-ibm-quantum-estimator\" />\n",
        "\n",
        "### 3. IBM Quantum 推定器を初期化する\n",
        "\n",
        "Estimator を初期化する際は、 `mode` パラメータを使用して、実行したいモードを指定してください。  取り得る値は `batch`、バッチ実行モード、セッション実行モード、ジョブ実行モードに対して、それぞれ、 `session`、または `backend` オブジェクトです。 詳細については、 [「 IBM Quantum Compute Service の実行モードの概要」](/docs/guides/execution-modes) を参照してください なお、Open Planのユーザーはセッションジョブを送信することはできません。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "961508db-e534-4fc9-970d-7babcd6c39ef",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import EstimatorV2 as Estimator\n",
        "\n",
        "estimator = Estimator(mode=backend)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "59b13a43-0c9f-4fdb-a379-af5115c153e1",
      "metadata": {},
      "source": [
        "<span id=\"4-invoke-estimator-and-get-results\" />\n",
        "\n",
        "### 4. Estimatorを実行して結果を取得する\n",
        "\n",
        "次に、この `run()` メソッドを呼び出して、入力回路および観測量の期待値を計算します。 回路、観測可能パラメータ、およびオプションのパラメータ値のセットは\\*、プリミティブ統一ブロック\\* （ PUB ）のタプルとして入力されます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "f1a60bad-cf09-4136-aa1a-4482759b3aea",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Job ID: d9mq9tnurbec73e67aj0\n",
            ">>> Job Status: QUEUED\n"
          ]
        }
      ],
      "source": [
        "job = estimator.run([(isa_circuit, isa_observable, param_values)])\n",
        "print(f\">>> Job ID: {job.job_id()}\")\n",
        "print(f\">>> Job Status: {job.status()}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "c817cce5-4686-43d2-89a1-ed0842d8ace3",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), 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",
            "  > Expectation value: 29.745702323497138\n",
            "  > Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}\n"
          ]
        }
      ],
      "source": [
        "result = job.result()\n",
        "print(f\">>> {result}\")\n",
        "print(f\"  > Expectation value: {result[0].data.evs}\")\n",
        "print(f\"  > Metadata: {result[0].metadata}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d38dd409-e0d8-4749-bb22-58ae9a53d26a",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * 量子コンピュータで実行する前に、 [ローカル環境でテスト](local-testing-mode)する方法をご紹介します。\n",
        "  * 具体的な[例](/docs/guides/estimator-examples)を確認してください。\n",
        "  * IBM Quantum Learning の「 [Cost関数](/learning/courses/variational-algorithm-design/cost-functions) 」のレッスンに取り組んで、プリミティブ型の扱い方を練習しましょう。\n",
        "  * 「[トランスパイル](/docs/guides/transpile/) 」のセクションで、ローカルでのトランスパイル方法について学びましょう。\n",
        "  * [「トランスパイラ設定の比較」](/docs/guides/circuit-transpilation-settings#compare-transpiler-settings) ガイドをお試しください。\n",
        "  * [プリミティブ・オプション](runtime-options-overview)の使い方を学びましょう。\n",
        "  * 「[Estimator](/docs/api/qiskit-ibm-runtime/options-estimator-options) 」のオプションに関するAPIを参照してください。\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
}