{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "e6e50bd6-8ac4-40b1-ac0f-6e22b6af1377",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"TEM関数を用いてキックされたアイジングモデルをシミュレートする\"\n",
        "description: \"アルゴリズムイクによるQiskit関数「TEM」の紹介：テンソルネットワークを用いたソフトウェア後処理誤差軽減による推定値計算\"\n",
        "---\n",
        "\n",
        "<span id=\"simulate-a-kicked-ising-model-with-the-tem-function\" />\n",
        "\n",
        "# TEM関数を用いてキックされたアイジングモデルをシミュレートする\n",
        "\n",
        "{/* cspell:ignore Floquet, linestyles */}\n",
        "\n",
        "アルゴリズム社のテンソルネットワーク誤差軽減（TEM）手法は、量子・古典ハイブリッドアルゴリズムであり、ノイズ軽減処理を完全に古典的な後処理段階で実行するよう設計されている。 TEMを用いることで、ユーザーは観測量の期待値を計算でき、量子ハードウェア上で発生する避けられないノイズ起因の誤差を、精度とコスト効率を高めつつ軽減できる。これにより、量子研究者や産業実務者双方にとって非常に魅力的な選択肢となっている。\n",
        "\n",
        "このチュートリアルでは、TEMが量子システムのダイナミクスに対して意味のある結果を得る方法を示します。これはエラー軽減なしでは得られないものであり、PECやZNEなどの他のエラー軽減手法を使用する場合、はるかに多くの量子リソースを必要とします。\n",
        "\n",
        "*使用量見積もり: このノートブックは、Heron r3 デバイス上で約10 QPU分を使用します。 実行時間は選択したデバイスによって大きく異なる場合があります。 セクションごとの使用量見積もりは以下に記載されています。*\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1f5e328d-fe93-4ee2-995b-2e70b36ea0de",
      "metadata": {},
      "source": [
        "<span id=\"run-error-mitigated-many-body-physics-experiments-with-the-tem-function\" />\n",
        "\n",
        "## TEM機能を用いたエラー緩和型多体系物理実験を実行する\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b63a662c-a4e9-4b5f-92fd-46352a2bd0bd",
      "metadata": {},
      "source": [
        "このチュートリアルは、以下の参考文献に基づいています： [L. E. Fischer et al., Nat. 物理学 (2026)](https://www.nature.com/articles/s41567-025-03144-9). 本論文は、最大91量子ビットの量子ハードウェアを用いた実シミュレーションについて論じている。 このチュートリアルでは、より小さな回路サイズで同様のシミュレーションを再現します。\n",
        "\n",
        "キックド・アイジングモデルは通常のアイジングモデルに対応する：\n",
        "\n",
        "$\\hat{H}_{\\text{I}} = J \\sum_{n=0}^{N-2} \\hat{Z}_n \\hat{Z}_{n+1} + h \\sum_{n=0}^{N-1} \\hat{Z}_n$\n",
        "\n",
        "これに横蹴りが加えられる：\n",
        "\n",
        "$\\hat{H}_{K} = b \\sum_{n=0}^{N-1} \\hat{X}_n$\n",
        "\n",
        "目標は、横方向キックイジングハミルトニアン下での状態のダイナミクスをシミュレートすることであり、その時間発展は、フロケユニタリ $\\hat{U}_{\\text{KI}} = e^{-i \\hat{H}_K} e^{-i \\hat{H}_I} $ によって実装することができます。発展させる初期状態は、最初の量子ビットが状態 $|+\\rangle$ にある一方で、他の量子ビットはペアになってベル状態 $(|00\\rangle + |11\\rangle)/\\sqrt{2}$ に設定されている状態です。\n",
        "\n",
        "私たちが観察したい量は相関関数である。 [本](https://www.nature.com/articles/s41567-025-03144-9)論文では、この量を $n^{th}$ 量子ビット上の $\\hat{X}$ パウリ演算子として書き換える方法を論じている。\n",
        "物理時間ステップ $t$ を数回実行した後、パウリ演算子 $\\hat{X}_{n=t}$ の値を計算する。\n",
        "システムのパラメータによっては、この観測量の値は正確に計算できる値に等しくなるか、近似法によるシミュレーションでしか得られない。 具体的には、 $|J|=|b|=\\pi/4$ に対して、 $[\\cos(2h)]^t$ に等しくなります。これが、このチュートリアルの結果をベンチマークするために使用する値となります。 さらに、ある時間ステップ $t$ において、 $\\langle\\hat{X}_{n\\neq t}\\rangle$ はゼロである。 これらの値を得る詳細およびこれらのパラメータ外における近似的な古典的シミュレーション結果との比較については、L. E. [Fischer et al. を参照のこと Nat. 物理学 (2026)](https://www.nature.com/articles/s41567-025-03144-9).\n",
        "\n",
        "TEMは、回路内の2量子ビットゲートを構成する各固有層のノイズ特性をまず評価するとともに、読み出し誤差の特性評価を行うことで機能する。 その後、回路は量子マシン上で実行される。 最後に、 IBM Cloud® の古典リソース上でテンソルネットワーク誤差軽減処理が実行され、軽減後の値が返される。 この例では、回路には特徴付けが必要な2つの固有の層がある。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4b30f191-9759-49de-ba8f-7cc616b61ec6",
      "metadata": {},
      "source": [
        "<span id=\"setup\" />\n",
        "\n",
        "## セットアップ\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9cf6d15e-324b-474a-886c-c3dca5a24141",
      "metadata": {},
      "source": [
        "前提条件として、必要な依存関係がインストールされていることを確認してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "1eeec332-29ca-4882-8129-d1c93ed82b2b",
      "metadata": {},
      "outputs": [],
      "source": [
        "%pip install numpy matplotlib qiskit qiskit-ibm-catalog qiskit-ibm-runtime pylatexenc qiskit_qasm3_import"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "ad0002b7-dbff-4699-af52-ba0df72ed200",
      "metadata": {},
      "outputs": [],
      "source": [
        "import os\n",
        "from matplotlib import pyplot as plt\n",
        "import numpy as np\n",
        "\n",
        "from qiskit.quantum_info import SparsePauliOp\n",
        "from qiskit.qasm3 import load\n",
        "\n",
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b95b9e75-37fe-4f86-a923-0a833c7960f8",
      "metadata": {},
      "source": [
        "<span id=\"error-mitigation-with-tem\" />\n",
        "\n",
        "## TEMによるエラー軽減\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "651a3f04-c8ba-4a39-8415-52d7e313ba2a",
      "metadata": {},
      "source": [
        "ここでは、前述のキックド・アイジングモデルを実装する回路を提供する。 回路は以下のように準備される。 まず、状態準備段階があり、この段階では最初の量子ビットが状態 $|+\\rangle$ にあり、他の量子ビットはベル対 $(|00\\rangle + |11\\rangle)/\\sqrt{2}$ を形成している。これに続いて、ユニタリー進化 $\\hat{U}_{\\text{KI}}$ を実現するレンガ積み構造が続く。物理的な時間ステップの数は、 $t/2$ 回路層に対応する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "11e42656-76ba-452c-af22-8f4cd22ff174",
      "metadata": {},
      "source": [
        "以下のコードは、このチュートリアルに必要な2つのQASMファイルをダウンロードします。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "39bf7188-3771-4994-a6c6-e9cfcae3484f",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Download required QASM files\n",
        "import urllib\n",
        "\n",
        "urllib.request.urlretrieve(\n",
        "    \"https://ibm.box.com/shared/static/swy5jtq309b0xpzluzlmsmj908yphes8.qasm\",\n",
        "    \"ki_30q.qasm\",\n",
        ")\n",
        "urllib.request.urlretrieve(\n",
        "    \"https://ibm.box.com/shared/static/et3gkodonw6gsp2trs43lzaozrdtiu7s.qasm\",\n",
        "    \"ki_12q.qasm\",\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1f6f9970-63fb-40f4-9586-261cba23cb88",
      "metadata": {},
      "source": [
        "12個の量子ビットと6つの時間ステップからなる回路の縮小版を可視化できます：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "381a4e25-bc9c-47d0-b9f1-172eb5516484",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/tutorials/simulate-kicked-ising-tem/extracted-outputs/381a4e25-bc9c-47d0-b9f1-172eb5516484-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Parameters of the kicked Ising model\n",
        "h = 0.0\n",
        "num_qubits = 12\n",
        "t_steps = 6\n",
        "\n",
        "# Load the circuit for the kicked Ising model\n",
        "small_circuit = load(\"ki_12q.qasm\")\n",
        "\n",
        "# Draw the circuit\n",
        "small_circuit.draw(\"mpl\", scale=0.25, fold=-1)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a674e407-504d-4812-82bf-98e91ec9a4b4",
      "metadata": {},
      "source": [
        "次に、オブザーバブル $\\hat{X}_{n=t}$ を構築します。これはQiskitで使用される順序に一致する順序で、単純なパウリ文字列として構成されます：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "a9a87f6c-176d-4c85-85e5-6751aea0c90b",
      "metadata": {},
      "outputs": [],
      "source": [
        "def xt_observable(n_qubits, t_steps):\n",
        "    pauli_str = \"\".join([\"I\" * t_steps, \"X\", \"I\" * (n_qubits - t_steps - 1)])\n",
        "    pauli_str = pauli_str[::-1]  # Reverse the string to match qiskit order\n",
        "    return SparsePauliOp(data=pauli_str, coeffs=1.0)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ba5f7042-4abd-4ae7-a091-591678377e8f",
      "metadata": {},
      "source": [
        "私たちの小さな12量子ビットの例では、観測量は次のようになります：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "b2608df1-b4e4-4143-bea5-a65ab8045fd4",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "SparsePauliOp(['IIIIIXIIIIII'],\n",
            "              coeffs=[1.+0.j])\n"
          ]
        }
      ],
      "source": [
        "# Build the observable for the kicked Ising model\n",
        "small_observable = xt_observable(n_qubits=12, t_steps=6)\n",
        "print(small_observable)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e588fafe-8db8-4445-8893-a78190b27b64",
      "metadata": {},
      "source": [
        "Qiskit Functions PUBsを入力収集の手段として使用する。 我々の場合、 PUB として単一の回路と観測量を考えよう：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "fc48eb54-148b-4b0d-8424-a135cb92039e",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Collect the input PUBs, in this case composed of a\n",
        "# single circuit and observable\n",
        "pubs = [(small_circuit, [small_observable])]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9a4bcd8d-ae21-40ab-b0e2-510236ba92de",
      "metadata": {},
      "source": [
        "次に、TEM機能にアクセスできるようになります。 まず、 IBM Cloud への必要な認証を設定し、利用可能なデバイスからバックエンドを選択します。 トークン、利用可能なバックエンド、および対応するクラウドリソース名（CRN）は、 [IBM Quantum Platform ダッシュボード](/)でアカウントにログインすることで取得できます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "6c9f80a8-4a65-4daa-94bb-a98edd6a1989",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Set IBM Quantum credentials and backend configuration\n",
        "personal_token = os.environ.get(\n",
        "    \"QISKIT_IBM_TOKEN\", \"<API-KEY>\"\n",
        ")  # Replace with your personal token or set the environment variable\n",
        "channel = \"ibm_quantum_platform\"\n",
        "crn = \"your_crn\"  # Replace with the Cloud Resource Name (CRN)\n",
        "\n",
        "# Select the QPU backend\n",
        "backend_name = \"ibm_qpu_name\"  # Replace with your desired backend's name"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "10df1803-5245-42b2-8eea-c0773cd655b6",
      "metadata": {},
      "source": [
        "[Qiskit Functions Catalog](/functions) から TEM 関数をロードします:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "2473b284-108f-45fe-a8d8-3aed584137f6",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Load the TEM function from the Qiskit Functions Catalog\n",
        "catalog = QiskitFunctionsCatalog(\n",
        "    channel=channel,\n",
        "    token=personal_token,\n",
        "    instance=crn,\n",
        ")\n",
        "tem = catalog.load(\"algorithmiq/tem\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3c732819-4dca-421c-bc2b-45ff5a5912db",
      "metadata": {},
      "source": [
        "TEMによるエラー軽減機能を備えたキックされたアイジング回路で実験を実行できるようになりました。 デフォルト設定を使用すると、TEMは簡単な方法で実行でき、QPUに応じて予想されるQPU実行時間は約 2.5 分です：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "b826e025-f36b-4fb5-90bd-e1ef36f5c1b2",
      "metadata": {},
      "outputs": [],
      "source": [
        "tem_job = tem.run(pubs=pubs, backend_name=backend_name)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4b692a80-5a10-4131-9d7f-785fedbe4221",
      "metadata": {},
      "source": [
        "デフォルト設定では、TEM関数は量子コンピュータ上で3つのジョブを実行します：ノイズ学習、読み出し緩和、回路サンプリングです。 これらの各々が使用するショット数は、関数に渡されるオプションで変更できます。 デフォルトでは、これらのパラメータは緩和された期待値において 0.05 の精度を達成するように設定されています。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "25b6f313-a928-493e-837f-45e6e7836aef",
      "metadata": {},
      "source": [
        "ジョブのステータスは[、 IBM Quantum Platform のダ](/)ッシュボードまたは以下の方法で確認できます：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "05e202ff-5b86-4a93-a693-86fbb1cf3e02",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "QUEUED\n"
          ]
        }
      ],
      "source": [
        "print(tem_job.status())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8e427c75-72fb-4a97-b723-97d695a692d3",
      "metadata": {},
      "source": [
        "ステータスが の場合 `DONE`、生の結果と緩和された結果を確認できます。 以下に定義される `tem_evs` は、要求された観測量の期待値であり、この場合単一の観測量である $\\langle \\hat X_{n=t}\\rangle$ の期待値であり、 `tem_std` は対応する標準偏差である。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "3ca34069-1363-4e37-9718-91639d817a82",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "TEM Result: 1.031 ± 0.046\n"
          ]
        }
      ],
      "source": [
        "# Get the results of the TEM job\n",
        "tem_results = tem_job.result()[\n",
        "    0\n",
        "]  # Get the first and only result from the job\n",
        "tem_evs = tem_results.data.evs[0]\n",
        "tem_std = tem_results.data.stds[0]\n",
        "\n",
        "print(f\"TEM Result: {tem_evs:.3f} ± {tem_std:.3f}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f90f503e-ab80-4550-a7cf-dfeea12babb0",
      "metadata": {},
      "source": [
        "各呼び出しで消費された量子ランタイム量は、 [IBM Quantum Platform]() で確認できます。あるいは、 Python のコードから結果メタデータを検査することで確認できます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "b05818d6-b680-483e-9084-f3fd2de067ab",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "TEM Runtime: 155.0 seconds\n"
          ]
        }
      ],
      "source": [
        "# Get the TEM job runtime\n",
        "tem_runtime = tem_job.result().metadata[\"resource_usage\"][\n",
        "    \"RUNNING: EXECUTING_QPU\"\n",
        "][\"QPU_TIME\"]\n",
        "\n",
        "print(f\"TEM Runtime: {tem_runtime} seconds\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6be333a8-41c9-4ba9-b07d-a0ac50149add",
      "metadata": {},
      "source": [
        "<span id=\"customize-tem-parameters-and-advanced-options\" />\n",
        "\n",
        "## TEMパラメータと高度なオプションのカスタマイズ\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "abee6fc2-90d6-4608-ad21-c606c936dd94",
      "metadata": {},
      "source": [
        "TEM機能は、エラー軽減ワークフローをカスタマイズするためのいくつかの高度なオプションを提供します。 これらのオプションにより、実験要件や利用可能な量子リソースに合わせて、精度、ショット数、ノイズ学習戦略、その他のパラメータを制御できます。\n",
        "\n",
        "一般的な詳細オプションは以下の通りです：\n",
        "\n",
        "* \\*\\*`precision`\\*\\*緩和された期待値の目標精度を指定してください。\n",
        "* **`default_shots`**: の代わりに `precision`、測定ジョブで使用するショット数を指定できます。\n",
        "* \\*\\*`tem_max_bond_dimension`\\*\\*テンソルネットワークで使用される最大結合次元。\n",
        "* \\*\\*`tem_compression_cutoff`\\*\\*テンソルネットワークに使用するカットオフ値。\n",
        "* **ノイズ学習オプション** ：ノイズの特性設定（繰り返し回数や特定のキャリブレーション回路など）を構成します。\n",
        "* \\*\\*`private`\\*\\*回路と実験結果があなた専用のものとなるよう確保し、ジョブ結果の複数回ダウンロードを無効にしてください。\n",
        "\n",
        "サポートされているオプションの完全なリストとその説明については[、TEMドキュメント](/docs/guides/algorithmiq-tem)または [Qiskit Functions Catalog](/functions) を参照してください。 これらのパラメータを調整することで、実行時間、リソース使用量、結果の精度のバランスを取ることができます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "24db681c-b306-41e0-8507-626ef279b076",
      "metadata": {},
      "source": [
        "TEM関数を実行する際、これらのオプションを辞書として引数 `options` に渡すことができます:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a2e9a032-91cb-4a18-9a00-00a149e60459",
      "metadata": {},
      "outputs": [],
      "source": [
        "options = {\n",
        "    \"default_shots\": 10_000,\n",
        "    \"tem_max_bond_dimension\": 512,\n",
        "    \"tem_compression_cutoff\": 1e-16,\n",
        "    # This option helps optimizing the measurement\n",
        "    # stage since the observable is strongly biased\n",
        "    # toward the X operator for all the qubits.\n",
        "    \"compute_shadows_bias_from_observable\": True,\n",
        "    # set to True to keep experiment results private,\n",
        "    # recommended for confidential circuits\n",
        "    \"private\": False,\n",
        "}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "db700868-4dae-48c8-be1a-668ef2e63177",
      "metadata": {},
      "source": [
        "ノイズ学習器向けのカスタムオプションも渡すことができます。 これらは、以下で使用されている定義に従っています： `qiskit-ibm-runtime`[`NoiseLearnerOptions`](/docs/api/qiskit-ibm-runtime/options-noise-learner-options)\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 29,
      "id": "30591014-3bc6-4548-ba0d-dc5cc22e9dcc",
      "metadata": {},
      "outputs": [],
      "source": [
        "nl_options = {\n",
        "    \"num_randomizations\": 32,\n",
        "    \"max_layers_to_learn\": 2,\n",
        "    \"shots_per_randomization\": 128,\n",
        "    \"layer_pair_depths\": [0, 1, 2, 4, 16, 32],\n",
        "}\n",
        "\n",
        "# add noise learning options to the overall options\n",
        "options |= nl_options"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "216ad12c-8c70-4073-8515-b07fd57f74d4",
      "metadata": {},
      "source": [
        "これらのカスタムオプションを当回路に合わせて調整し、実験を再実行してください。 予想される実行時間は約4QPU分です。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 30,
      "id": "ebce8e14-433f-4858-96c6-9d90ff0353af",
      "metadata": {},
      "outputs": [],
      "source": [
        "tem_job_custom = tem.run(\n",
        "    pubs=pubs, backend_name=backend_name, options=options\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bd8d2c12-c9da-4ac3-97c0-d53be1455091",
      "metadata": {},
      "source": [
        "ジョブが非公開に設定されていない場合、後で結果を復元できます。 そのためには、ここに表示されているジョブIDを保存し、. を使用してください `tem_job_custom = catalog.get_job_by_id(\"your-job-id\")`。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 31,
      "id": "0f99101b-9e72-45c8-8b00-9f3a257b8b3b",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Job ID: 1ba10094-a541-457a-9287-dbd49306d12d\n"
          ]
        }
      ],
      "source": [
        "job_id = tem_job_custom.job_id\n",
        "print(f\"Job ID: {job_id}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 33,
      "id": "0c751dac-e856-4371-aaed-f67aca31061f",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "TEM Result: 0.956 ± 0.018\n"
          ]
        }
      ],
      "source": [
        "results_custom = tem_job_custom.result()\n",
        "tem_evs = results_custom[0].data.evs[0]\n",
        "tem_std = results_custom[0].data.stds[0]\n",
        "\n",
        "print(f\"TEM Result: {tem_evs:.3f} ± {tem_std:.3f}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "edfef6f9-6bac-42bb-8bd2-95f977f7b31b",
      "metadata": {},
      "source": [
        "結果とメタデータを検証することで、実験に関する知見を得ることができます：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 34,
      "id": "dd189b2d-860b-4b9a-88c2-7e5c62b1f160",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Unmitigated Result: 0.894 ± 0.015\n",
            "Exact Result: 1.0\n"
          ]
        }
      ],
      "source": [
        "metadata_custom = results_custom[0].metadata\n",
        "\n",
        "unmitigated_evs = metadata_custom[\"evs_non_mitigated\"][0]\n",
        "unmitigated_stds = metadata_custom[\"stds_non_mitigated\"][0]\n",
        "print(f\"Unmitigated Result: {unmitigated_evs:.3f} ± {unmitigated_stds:.3f}\")\n",
        "\n",
        "# Exact result for the kicked Ising model from the reference paper\n",
        "exact_evs = np.cos(2 * h) ** t_steps\n",
        "print(\"Exact Result:\", exact_evs)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 35,
      "id": "c3a2168d-98df-491e-a1f8-05de5684ab96",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/tutorials/simulate-kicked-ising-tem/extracted-outputs/c3a2168d-98df-491e-a1f8-05de5684ab96-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Plot comparing the different expectation values\n",
        "plt.bar(\n",
        "    [\"Unmitigated\", \"TEM\"],\n",
        "    [unmitigated_evs, tem_evs],\n",
        "    yerr=[unmitigated_stds, tem_std],\n",
        "    color=[\"grey\", \"c\"],\n",
        ")\n",
        "plt.hlines(y=exact_evs, xmin=-0.5, xmax=1.5, colors=\"r\", linestyles=\"dashed\")\n",
        "plt.ylabel(\"Expectation Value\")\n",
        "plt.ylim(0, 1.1)\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d643bdb4-22e0-4f55-b3a8-d5ef39f6e696",
      "metadata": {},
      "source": [
        "最後に、カスタムオプションがQPUおよび古典的な実行時間に与える影響を確認できます：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 27,
      "id": "09cf2226-c48c-483b-aa49-80186229ae95",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "QPU Runtime: 342.0 seconds\n",
            "Classical Runtime: 107.632604 seconds\n"
          ]
        }
      ],
      "source": [
        "# Get the metadata of the TEM job\n",
        "job_metadata = results_custom.metadata\n",
        "\n",
        "# Get the runtime of the TEM job\n",
        "qpu_runtime = job_metadata[\"resource_usage\"][\"RUNNING: EXECUTING_QPU\"][\n",
        "    \"QPU_TIME\"\n",
        "]\n",
        "classical_runtime = (\n",
        "    job_metadata[\"resource_usage\"][\"RUNNING: OPTIMIZING_FOR_HARDWARE\"][\n",
        "        \"CPU_TIME\"\n",
        "    ]\n",
        "    + job_metadata[\"resource_usage\"][\"RUNNING: POST_PROCESSING\"][\"CPU_TIME\"]\n",
        ")\n",
        "\n",
        "print(f\"QPU Runtime: {qpu_runtime} seconds\")\n",
        "print(f\"Classical Runtime: {classical_runtime} seconds\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7cea6cf1-5530-4bf6-83da-ad2e9ff96806",
      "metadata": {},
      "source": [
        "<span id=\"scale-tem-to-large-circuits\" />\n",
        "\n",
        "## TEMを大規模回路に拡張する\n",
        "\n",
        "大規模な回路は、原則としてTEM機能で実行可能である。 ただし、TEMが IBM Cloud ランナー上で実行され、実行時間が非常に長くなる可能性があるため、古典的リソースの限界を認識することが重要です。 非常に大規模な回路については、 [qiskit\\ \\_ibm@algorithmiq.fi](mailto:qiskit_ibm@algorithmiq.fi) の TEM サポートチームにお問い合わせください。\n",
        "\n",
        "ここでは、より大規模なユーティリティ規模の30量子ビット回路を用いた例を実行し、精度ではなく速度を優先してTEMパラメータを最適化します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "f7ea1d3c-d745-48cc-8922-b070b2b5fd44",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Kicked Ising model parameters\n",
        "n_qubits = 30\n",
        "t_steps = 15\n",
        "h = 0.0\n",
        "\n",
        "# Load the circuit for the kicked Ising model\n",
        "circuit = load(\"ki_30q.qasm\")\n",
        "\n",
        "\n",
        "# Build the observable for the kicked Ising model\n",
        "observable = xt_observable(n_qubits=n_qubits, t_steps=t_steps)\n",
        "\n",
        "# Collect the input PUBs, in this case composed of a\n",
        "# single circuit and observable\n",
        "pubs = [(circuit, [observable])]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "854c3208-8c0f-4f7d-b260-0abba2bc71a0",
      "metadata": {},
      "source": [
        "パフォーマンス重視のオプションをいくつか定義しましょう：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 49,
      "id": "64882a71-3027-4e25-b714-9e9d6b13cd49",
      "metadata": {},
      "outputs": [],
      "source": [
        "options = {\n",
        "    \"num_randomizations\": 32,\n",
        "    \"max_layers_to_learn\": 2,\n",
        "    \"shots_per_randomization\": 128,\n",
        "    \"layer_pair_depths\": [0, 1, 2, 4, 16, 32, 64],\n",
        "    \"default_shots\": 5_000,\n",
        "    \"tem_max_bond_dimension\": 128,\n",
        "    \"tem_compression_cutoff\": 1e-10,\n",
        "    \"compute_shadows_bias_from_observable\": True,\n",
        "    \"private\": False,\n",
        "}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4ba36257-1974-4274-b04c-6daf3afe9d72",
      "metadata": {},
      "source": [
        "最後に、実験を実行し、結果を取得し、それを可視化する。 これは約 3.5 QPU分かかるでしょう。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 50,
      "id": "6faf7f80-dec9-49d2-80e7-d4e6fdea5100",
      "metadata": {},
      "outputs": [],
      "source": [
        "tem_job_large = tem.run(pubs=pubs, backend_name=backend_name, options=options)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 51,
      "id": "333b2335-b480-4bf9-854c-5155eedee900",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Job ID: 9f3f190f-f4b0-4dcb-bb83-5f71f37d0d77\n"
          ]
        }
      ],
      "source": [
        "job_id = tem_job_large.job_id\n",
        "print(f\"Job ID: {job_id}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 53,
      "id": "a04dd421-a212-473c-a8a9-4c8edcfc3667",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "TEM Result: 0.794 ± 0.026\n",
            "QPU Runtime: 203.0 seconds\n",
            "Classical Runtime: 251.71805499999996 seconds\n"
          ]
        }
      ],
      "source": [
        "results_large = tem_job_large.result()\n",
        "tem_evs = results_large[0].data.evs[0]\n",
        "tem_std = results_large[0].data.stds[0]\n",
        "\n",
        "print(f\"TEM Result: {tem_evs:.3f} ± {tem_std:.3f}\")\n",
        "\n",
        "\n",
        "# Get the metadata of the TEM job\n",
        "job_metadata = tem_job_large.result().metadata\n",
        "\n",
        "# Get the runtime of the TEM job\n",
        "qpu_runtime = job_metadata[\"resource_usage\"][\"RUNNING: EXECUTING_QPU\"][\n",
        "    \"QPU_TIME\"\n",
        "]\n",
        "classical_runtime = (\n",
        "    job_metadata[\"resource_usage\"][\"RUNNING: OPTIMIZING_FOR_HARDWARE\"][\n",
        "        \"CPU_TIME\"\n",
        "    ]\n",
        "    + job_metadata[\"resource_usage\"][\"RUNNING: POST_PROCESSING\"][\"CPU_TIME\"]\n",
        ")\n",
        "\n",
        "print(f\"QPU Runtime: {qpu_runtime} seconds\")\n",
        "print(f\"Classical Runtime: {classical_runtime} seconds\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 54,
      "id": "24894c44-e399-4b9d-a3ff-38a28ff32ece",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/tutorials/simulate-kicked-ising-tem/extracted-outputs/24894c44-e399-4b9d-a3ff-38a28ff32ece-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Plot comparing the different expectation values\n",
        "metadata_large = results_large[0].metadata\n",
        "unmitigated_evs = metadata_large[\"evs_non_mitigated\"][0]\n",
        "unmitigated_stds = metadata_large[\"stds_non_mitigated\"][0]\n",
        "\n",
        "exact_evs = np.cos(2 * h) ** t_steps\n",
        "\n",
        "plt.bar(\n",
        "    [\"Unmitigated\", \"TEM\"],\n",
        "    [unmitigated_evs, tem_evs],\n",
        "    yerr=[unmitigated_stds, tem_std],\n",
        "    color=[\"grey\", \"c\"],\n",
        ")\n",
        "plt.hlines(y=exact_evs, xmin=-0.5, xmax=1.5, colors=\"r\", linestyles=\"dashed\")\n",
        "plt.ylabel(\"Expectation Value\")\n",
        "plt.ylim(0, 1.1)\n",
        "plt.show()"
      ]
    },
    {
      "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"
    },
    "hours": 1.5,
    "qpuSeconds": 600
  },
  "nbformat": 4,
  "nbformat_minor": 4
}