{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "dde95705",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"パフォーマンス管理 - Q-CTRL Fire Opal による Qiskit 関数\"\n",
        "description: \"Q-CTRLのFire Opalパフォーマンス管理による自動エラー抑制を適用する\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore fontsize, Mundada, Yamauchi, supersymmetric, Paterakis, Gharibyan */}\n",
        "\n",
        "<span id=\"performance-management-a-qiskit-function-by-q-ctrl-fire-opal\" />\n",
        "\n",
        "# パフォーマンス管理：Q-CTRL Fire OpalによるQiskit関数\n",
        "\n",
        "*[APIリファレンス](/docs/api/functions/q-ctrl-performance-management)を参照してください*\n",
        "\n",
        "<Admonition type=\"note\" title=\"注\">\n",
        "  Qiskit 関数は、 IBM Quantum® Premium Plan、Flex Plan、およびオンプレム ( IBM Quantum Platform API 経由) Plan ユーザーだけが利用できる実験的な機能です。 これらはプレビューリリースであり、変更される可能性がある。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ace2ed13",
      "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.1\n",
        "    qiskit-ibm-runtime~=0.45.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c1732b45",
      "metadata": {},
      "source": [
        "<span id=\"overview\" />\n",
        "\n",
        "## 概要\n",
        "\n",
        "Fire Opalのパフォーマンス管理は、量子ハードウェアの専門家でなくても、誰でも簡単に量子コンピューターから有意義な結果を大規模に得ることができます。 Fire Opalパフォーマンス・マネージメントで回路を実行すると、AI駆動のエラー抑制技術が自動的に適用され、ゲートや量子ビットの数が多い大規模な問題のスケーリングが可能になります。 このアプローチは、オーバーヘッドを追加することなく、正解に到達するために必要なショットの数を減らし、計算時間とコストの両方で大幅な節約をもたらします。\n",
        "\n",
        "パフォーマンス管理はエラーを抑制し、ノイズの多いハードウェアで正解を得る確率を高める。 言い換えれば、S/N比を高めるということだ。 次の画像は、10量子ビットの量子フーリエ変換アルゴリズムの場合、パフォーマンス管理によって精度を高めることで、追加ショットの必要性を減らすことができることを示している。 Q-CTRLはわずか30ショットで信頼度99％の閾値に達するが、デフォルト（`QiskitRuntime` Sampler, `optimization_level`=3, `resilience_level`=1, `ibm_sherbrooke` ）は170,000ショットを必要とする。 正しい答えをより早く得ることで、計算の実行時間を大幅に節約できる。\n",
        "\n",
        "![改善されたランタイムの可視化](https://quantum.cloud.ibm.com/docs/images/guides/qctrl-performance-management/achieve_more.svg)\n",
        "\n",
        "パフォーマンス管理機能は、あらゆるアルゴリズムで利用可能であり、標準の [IBM Quantum プリミティブ](/docs/guides/primitives)の代わりに簡単に使用できます。 舞台裏では、複数のエラー抑制技術が連携して、実行時にエラーが発生するのを防いでいます。 Fire Opalのすべてのパイプライン手法はあらかじめ設定済みであり、アルゴリズムに依存しないため、導入直後から常に最高のパフォーマンスを発揮します。\n",
        "\n",
        "パフォーマンス・マネジメントへのアクセスについては、 [Q-CTRLまでお問い合わせ](https://form.typeform.com/to/uOAVDnGg?typeform-source=q-ctrl.com)ください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f761442",
      "metadata": {},
      "source": [
        "<span id=\"description\" />\n",
        "\n",
        "## 説明\n",
        "\n",
        "Fire Opal Performance Management には、 IBM Quantum のプリミティブと類似した2つの実行オプションが用意されているため、Q-CTRLのサンプラーやエスティメーターを簡単に置き換えることができます。 パフォーマンス管理機能を使用する際の一般的なワークフローは以下の通りです：\n",
        "\n",
        "1. 回路（Estimatorの場合は演算子）を定義します。\n",
        "2. サーキットを走らせる。\n",
        "3. 結果を取得する。\n",
        "\n",
        "ハードウェア・ノイズを低減するために、Fire Opalは以下の画像にあるようなAIによるエラー抑制技術を採用している。 Fire Opalでは、パイプライン全体が完全に自動化されており、設定の必要はありません。\n",
        "\n",
        "Fire Opalのパイプラインは、量子実行時間の増加や余分な物理量子ビットのような追加のオーバーヘッドを必要としない。 なお、古典的な処理時間も要因の1つであることに留意されたい（推定値については[ベンチマーク](#benchmarks)セクションを参照されたい。） サンプリングという形でオーバーヘッドを必要とするエラー緩和とは対照的に、Fire Opalのエラー抑制はゲートとパルスの両方のレベルで機能し、さまざまなノイズ源に対処し、エラー発生の可能性を防ぐ。 エラーを防ぐことで、高価な後処理が不要になる。\n",
        "\n",
        "次の図は、Fire Opal Performance Managementによって自動化されたエラー抑制方法を示しています。\n",
        "\n",
        "![エラー抑制パイプラインの可視化](https://quantum.cloud.ibm.com/docs/images/guides/qctrl-performance-management/error_suppression.svg)\n",
        "\n",
        "この関数は、「Sampler」と「Estimator」という 2 つのプリミティブを提供しており、両者の入力および出力は、 [IBM Quantum V2 のプリミティブについて](/docs/guides/primitive-input-output#pubs)実装された仕様を拡張したものです。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "64534d1a",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "## ベンチマーク\n",
        "\n",
        "[公開されたアルゴリズムのベンチマーク](https://journals.aps.org/prapplied/abstract/10.1103/PhysRevApplied.20.024034)結果では、Bernstein-Vazirani、量子フーリエ変換、Groverの探索、量子近似最適化アルゴリズム、変分量子固有値解法など、さまざまなアルゴリズムで大幅な性能向上が実証されています。 このセクションの残りの部分では、実行可能なアルゴリズムの種類、予想されるパフォーマンスとランタイムの詳細を説明します。\n",
        "\n",
        "以下の独立研究は、Q-CTRLのパフォーマンスマネジメントが、記録的な規模のアルゴリズム研究をいかに可能にしているかを実証しています：\n",
        "\n",
        "* [ネットワークサービス障害診断のためのパラメトライズされたエネルギー効率に優れた量子カーネル](https://arxiv.org/abs/2405.09724v1) - 最大50量子ビットの量子カーネル学習\n",
        "* [大規模実証のためのテンソルベースの量子位相差推定](https://arxiv.org/abs/2408.04946) - 最大33量子ビットの量子位相推定\n",
        "* [量子MLのための階層的学習：大規模変分量子回路のための新しい学習技法](https://arxiv.org/abs/2311.12929) - 21量子ビットの量子データロードまで\n",
        "\n",
        "以下の表は、 `ibm_fez` で過去に実施されたベンチマークの精度と実行時間の大まかな目安です。 他の機器での性能は異なる場合があります。 使用時間は、1回線あたり10,000ショットを想定している。 表示されている \"量子ビット数 \"は難しい制限ではなく、極めて安定した解の精度が期待できる大まかな閾値を表しています。 より大きな問題サイズでも解決に成功しており、この限界を超えたテストが奨励されている。\n",
        "\n",
        "| 例                            | 量子ビット数 | 正確性      | 正確さの尺度                                          | 合計回数         | ランタイム使用量 (s) | プリミティブ（モード） |\n",
        "| ---------------------------- | ------ | -------- | ----------------------------------------------- | ------------ | ------------ | ----------- |\n",
        "| バーンスタイン・バジラニ                 | 50Q    | 100％     | 成功率（正解が最高カウントのビット列である実行の割合）                     | 10           | 8            | サンプラー       |\n",
        "| 量子フーリエ変換                     | 30Q    | 100％     | 成功率（正解が最高カウントのビット列である実行の割合）                     | 10           | 8            | サンプラー       |\n",
        "| 量子位相推定                       | 30Q    | 99.9998% | 求めた角度の精度： `1- abs(real_angle - angle_found)/pi` | 10           | 8            | サンプラー       |\n",
        "| 量子シミュレーションイジング模型（15ステップ）     | 20Q    | 99.775%  | $A$ (以下に定義する）                                   | 60（1ステップあたり） | 15（各ステップ）    | 推定法         |\n",
        "| 量子シミュレーション2：分子動力学（20タイムポイント） | 34Q    | 96.78%   | $A_{mean}$ (以下に定義する）                            | 10（各時点）      | 6（各時点）       | 推定法         |\n",
        "\n",
        "期待値の測定精度の定義-指標 $A$ は以下のように定義される：\n",
        "\n",
        "$$\n",
        "A = 1 - \\frac{|\\epsilon^{ideal} - \\epsilon^{meas}|}{\\epsilon^{ideal}_{max} - \\epsilon^{ideal}_{min}},\n",
        "$$\n",
        "\n",
        "ここで、 $\\epsilon^{ideal}$ = 理想的な期待値、 $\\epsilon^{meas}$ = 測定された期待値、 $\\epsilon^{ideal}_{max} $ = 理想的な最大値、 $\\epsilon^{ideal}_{min}$ = 理想的な最小値。 $A_{mean}$ は、単に複数の測定にわたる $A$ の値の平均である。\n",
        "\n",
        "この指標が使われるのは、グローバルなシフトや到達可能な値の範囲でのスケーリングに対して不変だからだ。 言い換えれば、期待値の可能性の範囲を上下にずらそうが、スプレッドを大きくしようが、 $A$ の値は一定であるべきなのだ。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "870af0fe",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## 使用を開始する\n",
        "\n",
        "Fire Opal Performance Management では、推奨バージョン`2.0.0`である Qiskit v を使用しています。 対応しているバージョンは、Qiskit v`2.0.0`.以上です。\n",
        "[IBM Quantum Platform](http://quantum.cloud.ibm.com/) のAPIキーを使用して認証を行い、次のようにQiskit Functionを選択してください。 （このスニペットは[、アカウントが](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client)すでにローカル環境に保存されていることを前提としています。）\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "11af8fb4",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[QiskitFunction(qunova/hivqe-chemistry),\n",
              " QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),\n",
              " QiskitFunction(algorithmiq/tem),\n",
              " QiskitFunction(qedma/qesem),\n",
              " QiskitFunction(multiverse/singularity),\n",
              " QiskitFunction(ibm/circuit-function),\n",
              " QiskitFunction(q-ctrl/optimization-solver),\n",
              " QiskitFunction(colibritd/quick-pde),\n",
              " QiskitFunction(q-ctrl/performance-management),\n",
              " QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(channel=\"ibm_quantum_platform\")\n",
        "\n",
        "# verify that you have access to the function\n",
        "catalog.list()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "736255e4-1c1f-42a7-bf76-1487878c9e76",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Access Function\n",
        "perf_mgmt = catalog.load(\"q-ctrl/performance-management\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d4657810",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\" title=\"この関数は、すべての IBM バックエンドに対応していますか？\">\n",
        "  この関数が現在サポートしていないバックエンドを使用したい場合は、 [Q-CTRLまでご連絡いただき](https://form.typeform.com/to/iuujEAEI?typeform-source=q-ctrl.com)、サポートの追加をご依頼ください。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2947b5c3",
      "metadata": {},
      "source": [
        "<span id=\"estimator-primitive\" />\n",
        "\n",
        "## 推定器プリミティブ\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "df2788d5",
      "metadata": {},
      "source": [
        "<span id=\"estimator-example\" />\n",
        "\n",
        "### 見積もりツールの例\n",
        "\n",
        "Fire Opal Performance ManagementのEstimatorプリミティブを使用して、1つの回路と観測可能なペアの期待値を決定します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "82932760",
      "metadata": {},
      "source": [
        "`qiskit-ibm-catalog` 、 `qiskit` パッケージに加え、 `numpy` パッケージもこの例の実行に使用します。 IPythonカーネルを使ってこのサンプルをノートブックで実行している場合は、以下のセルをアンコメントすることでこのパッケージをインストールできます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "70bb93ef",
      "metadata": {},
      "outputs": [],
      "source": [
        "# %pip install numpy"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "02b2a79a",
      "metadata": {},
      "source": [
        "**1.回路を作る**\n",
        "\n",
        "例として、ランダムなエルミート演算子と観測値を生成し、パフォーマンス管理関数に入力する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "32037218",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import iqp\n",
        "from qiskit.quantum_info import random_hermitian, SparsePauliOp\n",
        "\n",
        "n_qubits = 50\n",
        "\n",
        "# Generate a random circuit\n",
        "mat = np.real(random_hermitian(n_qubits, seed=1234))\n",
        "circuit = iqp(mat)\n",
        "circuit.measure_all()\n",
        "\n",
        "# Define observables as a string\n",
        "observable = SparsePauliOp(\"Z\" * n_qubits)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "476fae6a",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Create PUB tuple\n",
        "estimator_pubs = [(circuit, observable)]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "09e64cd7",
      "metadata": {},
      "source": [
        "**2.サーキットを走る**\n",
        "\n",
        "サーキットを走らせ、オプションでバックエンドとショット数を定義する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "26952e1f",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Run the circuit using Estimator\n",
        "qctrl_estimator_job = perf_mgmt.run(\n",
        "    primitive=\"estimator\",\n",
        "    pubs=estimator_pubs,\n",
        "    backend_name=backend_name,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c07af9d0",
      "metadata": {},
      "source": [
        "おなじみの [Qiskit Serverless API](/docs/guides/serverless) を使用して、Qiskit Functionワークロードのステータスを確認できます：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "2b309861",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'QUEUED'"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qctrl_estimator_job.status()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "23556c8e",
      "metadata": {},
      "source": [
        "**3.結果の取得**\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "8be67088",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the counts from the result list\n",
        "result = qctrl_estimator_job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7375fcad",
      "metadata": {},
      "source": [
        "結果は[、Estimatorの結果](/docs/guides/estimator-input-output)と同じ形式になっています：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "id": "ef85a036",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The result of the submitted job had 1 PUB\n",
            "The result of the submitted job had 1 PUB and has a value:\n",
            " PubResult(data=DataBin(evs=0.0195, stds=0.9998098569228051), metadata={'precision': None})\n",
            "\n",
            "The associated PubResult of this job has the following DataBins:\n",
            "DataBin(evs=0.0195, stds=0.9998098569228051)\n",
            "\n",
            "And this DataBin has attributes: dict_keys(['evs', 'stds'])\n",
            "The expectation values measured from this PUB are:\n",
            "0.0195\n"
          ]
        }
      ],
      "source": [
        "import numpy\n",
        "\n",
        "result_str = str(result)\n",
        "\n",
        "with numpy.printoptions(threshold=200):\n",
        "    print(\n",
        "        f\"The result of the submitted job had {len(result)} PUB \"\n",
        "        f\"and has a value:\\n {result[0]}\\n\"\n",
        "    )\n",
        "\n",
        "print(\"The associated PubResult of this job has the following DataBins:\")\n",
        "print(f\"{result[0].data}\\n\")\n",
        "\n",
        "print(f\"And this DataBin has attributes: {result[0].data.keys()}\")\n",
        "\n",
        "print(\"The expectation values measured from this PUB are:\")\n",
        "print(f\"{result[0].data.evs}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a78ce8bd",
      "metadata": {},
      "source": [
        "<span id=\"sampler-primitive\" />\n",
        "\n",
        "## サンプラープリミティブ\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b1300f06",
      "metadata": {},
      "source": [
        "<span id=\"sampler-example\" />\n",
        "\n",
        "### サンプラーの例\n",
        "\n",
        "Fire Opal Performance ManagementのSamplerプリミティブを使用して、Bernstein-Vazirani回路を実行します。 ブラックボックス関数の出力から隠れた文字列を見つけるために使われるこのアルゴリズムは、正解が1つであるため、一般的なベンチマークアルゴリズムである。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "144e48f3",
      "metadata": {},
      "source": [
        "**1.回路を作る**\n",
        "\n",
        "アルゴリズム、隠しビット列、Bernstein-Vazirani 回路の正解を定義しなさい。 `circuit_width` を変えるだけで、回路の幅を調整できる。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "2cd807b1",
      "metadata": {},
      "outputs": [],
      "source": [
        "import qiskit\n",
        "\n",
        "circuit_width = 35\n",
        "hidden_bitstring = \"1\" * circuit_width\n",
        "\n",
        "# Create circuit, reserving one qubit for BV oracle\n",
        "bv_circuit = qiskit.QuantumCircuit(circuit_width + 1, circuit_width)\n",
        "bv_circuit.x(circuit_width)\n",
        "bv_circuit.h(range(circuit_width + 1))\n",
        "for input_qubit, bit in enumerate(reversed(hidden_bitstring)):\n",
        "    if bit == \"1\":\n",
        "        bv_circuit.cx(input_qubit, circuit_width)\n",
        "bv_circuit.barrier()\n",
        "bv_circuit.h(range(circuit_width + 1))\n",
        "bv_circuit.barrier()\n",
        "for input_qubit in range(circuit_width):\n",
        "    bv_circuit.measure(input_qubit, input_qubit)\n",
        "\n",
        "# Create PUB tuple\n",
        "sampler_pubs = [(bv_circuit,)]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "85d3c00b",
      "metadata": {},
      "source": [
        "**2.サーキットを走る**\n",
        "\n",
        "サーキットを走らせ、オプションでバックエンドとショット数を定義する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "2595df84",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Run the circuit using Sampler\n",
        "qctrl_sampler_job = perf_mgmt.run(\n",
        "    primitive=\"sampler\",\n",
        "    pubs=sampler_pubs,\n",
        "    backend_name=backend_name,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3c49fbba",
      "metadata": {},
      "source": [
        "Qiskit Function [ワーク](/docs/guides/functions-get-started#check-job-status)ロードのステータスを確認したり、 [結果を](/docs/guides/functions-get-started#retrieve-results)返したりするには、次のように操作してください：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "id": "b7acbb7f",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "60fe2fa1-a860-43e4-8615-c6ac4180f93b\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "'QUEUED'"
            ]
          },
          "execution_count": 14,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Print the ID so you can use it later, if necessary\n",
        "print(qctrl_sampler_job.job_id)\n",
        "\n",
        "qctrl_sampler_job.status()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "35921605",
      "metadata": {},
      "source": [
        "**3.結果の取得**\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "id": "2d4f5f7d",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the job results\n",
        "sampler_result = qctrl_sampler_job.result()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "7a359d99",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Counts for the meas output register (limited to 30 results):\n",
            "  11111111111111111111111111111111111: 1661\n",
            "  11111111111111111111111111110111111: 60\n",
            "  11111111111111111111111111111101111: 54\n",
            "  11111111111111111111111111111110111: 54\n",
            "  11111111111111011111111111111111111: 46\n",
            "  11111111111111111110111111111111111: 44\n",
            "  11111111111111111111111101111111111: 42\n",
            "  11111111111111111111111110111111111: 42\n",
            "  11111111111111110111111111111111111: 41\n",
            "  11111111111111111111111111111111101: 39\n",
            "  11111111111111111111101111111111111: 38\n",
            "  11111111111111111111110111111111111: 38\n",
            "  11111111111111111111111111101111111: 37\n",
            "  11111111111111111111111111111111110: 36\n",
            "  11111111111110111111111111111111111: 35\n",
            "  11111111111111111111111111111011111: 32\n",
            "  11111111111111101111111111111111111: 32\n",
            "  01111111111111111111111111111111111: 27\n",
            "  11111111111111111011111111111111111: 23\n",
            "  11111111101111111111111111111111111: 22\n",
            "  11111111111111111111111111111111011: 21\n",
            "  11111111011111111111111111111111111: 20\n",
            "  00000000000000011111111111111111111: 18\n",
            "  11111111111111111111110101111111111: 18\n",
            "  00000001111111111111111111111111111: 17\n",
            "  11111111001111111111111111111111111: 16\n",
            "  11101111111111111111111111111111111: 16\n",
            "  11111111111101111111111111111111111: 16\n",
            "  00000101111111111111111111111111111: 13\n",
            "  11111111111111111111111011111111111: 13\n",
            "  11111111111111111111111110101111111: 13\n",
            "  11111111111111111101111111111111111: 12\n",
            "  10111111111111111111111111111111111: 12\n",
            "  11111111111111111111111110001111111: 12\n",
            "  00000000000000000011111111111111111: 11\n",
            "  11111111111111111111111111111110110: 10\n",
            "  00000000000000000000000001111111111: 10\n",
            "  11111111111011111111111111111111111: 9\n",
            "  11111111111111101011111111111111111: 9\n",
            "  00000000011111111111111111111111111: 8\n",
            "  10101111111111111111111111111111111: 8\n",
            "  00000000000000000000000001011111111: 8\n",
            "  11111111111111111111111111111111001: 8\n",
            "  00000111111111111111111111111111111: 7\n",
            "  11111111111111111111111111111101110: 7\n",
            "  11111111110111111111111111111111111: 7\n",
            "  00000000000001011111111111111111111: 6\n",
            "  00000000000000001111111111111111111: 6\n",
            "  00000000000000000001011111111111111: 6\n",
            "  11111111111111111111111111011111111: 6\n",
            "  ... (1050 more items)\n"
          ]
        }
      ],
      "source": [
        "# Get results for the first (and only) PUB\n",
        "pub_result = sampler_result[0]\n",
        "counts = pub_result.data.c.get_counts()\n",
        "\n",
        "print(\"Counts for the meas output register (limited to 30 results):\")\n",
        "for i, (bitstring, count) in enumerate(counts.items()):\n",
        "    if i >= 50:\n",
        "        print(f\"  ... ({len(counts) - 30} more items)\")\n",
        "        break\n",
        "    print(f\"  {bitstring}: {count}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d920922e",
      "metadata": {},
      "source": [
        "**3.上位のビット列をプロットする**\n",
        "\n",
        "隠されたビット列がモードであったかどうかを確認するために、カウント数の最も多いビット列をプロットする。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "id": "cefa2234",
      "metadata": {},
      "outputs": [],
      "source": [
        "import matplotlib.pyplot as plt\n",
        "\n",
        "\n",
        "def plot_top_bitstrings(counts_dict, hidden_bitstring=None):\n",
        "    # Sort and take the top 100 bitstrings\n",
        "    top_100 = sorted(counts_dict.items(), key=lambda x: x[1], reverse=True)[\n",
        "        :100\n",
        "    ]\n",
        "    if not top_100:\n",
        "        print(\"No bitstrings found in the input dictionary.\")\n",
        "        return\n",
        "\n",
        "    # Unzip the bitstrings and their counts\n",
        "    bitstrings, counts = zip(*top_100)\n",
        "\n",
        "    # Assign colors: purple if the bitstring matches hidden_bitstring,\n",
        "    # otherwise gray\n",
        "    colors = [\n",
        "        \"#680CE9\" if bit == hidden_bitstring else \"gray\" for bit in bitstrings\n",
        "    ]\n",
        "\n",
        "    # Create the bar plot\n",
        "    plt.figure(figsize=(15, 8))\n",
        "    plt.bar(\n",
        "        range(len(bitstrings)), counts, tick_label=bitstrings, color=colors\n",
        "    )\n",
        "\n",
        "    # Rotate the bitstrings for better readability\n",
        "    plt.xticks(rotation=90, fontsize=8)\n",
        "    plt.xlabel(\"Bitstrings\")\n",
        "    plt.ylabel(\"Counts\")\n",
        "    plt.title(\"Top 100 Bitstrings by Counts\")\n",
        "\n",
        "    # Show the plot\n",
        "    plt.tight_layout()\n",
        "    plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1d9d3b69",
      "metadata": {},
      "source": [
        "隠されたビット列は紫色で強調表示され、カウント数が最も多いビット列でなければならない。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "8106d906",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/q-ctrl-performance-management/extracted-outputs/8106d906-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "plot_top_bitstrings(counts, hidden_bitstring)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d8104000b3d94c69",
      "metadata": {},
      "source": [
        "<span id=\"changelog\" />\n",
        "\n",
        "## 変更ログ\n",
        "\n",
        "* 2026-02-20: 非推奨通知 - メタデータフィールド `provider_job_ids` は、バージョン 0.13.0 において30日後に非推奨となります。 ユーザーはランタイムサービスのメソッド `job_id()` を通じてジョブIDにアクセスできます。\n",
        "* 2026-02-11: 現在は のサポートを提供 `ibm_miami`し、 に実行メタ `PubResult`データを追加しました。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bb33258d",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "## サポートの利用\n",
        "\n",
        "ご質問や問題がございましたら、 [Q-CTRLまでお問い合わせ](https://form.typeform.com/to/iuujEAEI)ください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2fe4a6ea",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * [Q-CTRL パフォーマンス管理](/functions?id=q-ctrl-performance-management)へのアクセス権を申請してください。\n",
        "  * このQiskit関数の [APIリファレンス](/docs/api/functions/q-ctrl-performance-management)をご覧ください。\n",
        "  * [Q-CTRLのパフォーマンス管理](/docs/tutorials/transverse-field-ising-model)チュートリアルで横磁場イジングモデルを試してみてください。\n",
        "  * [Q-CTRLの Qiskit Functions チュートリアルで量子位相推定](/docs/tutorials/quantum-phase-estimation-qctrl)を試す\n",
        "  * レビュー [マンダダ P. S et al. (2023). 量子アルゴリズム向け自動化された決定論的エラー抑制ワークフローの実験的ベンチマーク評価 Physical Review Applied, 20, 2](https://quantum-journal.org/papers/q-2023-07-25-1067/).\n",
        "  * レビュー [菅野, S., et al. (2025). 大規模実証のためのテンソルベース量子位相差推定 arXiv プレプリント arXiv:2408.04946](https://arxiv.org/abs/2408.04946).\n",
        "  * レビュー： [SoftBank 社、量子 Machine Learning を用いた通信サービス障害診断システムのデモンストレーション実験（ブログ）、2024年8月30日](https://www.softbank.jp/en/corp/technology/research/topics/102/)。\n",
        "  * レビュー [山内英樹, et al. (2024). ネットワークサービス障害診断のためのパラメータ化エネルギー効率型量子カーネル arXiv プレプリント arXiv:2405.09724v1](https://arxiv.org/abs/2405.09724v1).\n",
        "  * レビュー [山内英樹, et al. (2025). 超対称ハミルトニアンによるトポロジカルダイナミクスの量子分光法 arXiv プレプリント arXiv:2511.23169v1](https://arxiv.org/abs/2511.23169v1).\n",
        "  * 王、Y. [ のレビュー et al. (2025).  Δ-モチーフ：データ中心並列処理による大規模サブグラフ同型性問題 arXiv プレプリント arXiv:2508.21287](https://arxiv.org/abs/2508.21287).\n",
        "  * レビュー [パテラキス, N. G., et al. (2025).  パワーエレクトロニクスの計算環境における量子コンピューティング：展望と現状 arXiv プレプリント arXiv:2507.02577](https://arxiv.org/abs/2507.02577).\n",
        "  * レビュー [ガリビアン, H., et al. (2023).  量子機械学習のための階層的学習：大規模変分量子回路のための新規トレーニング手法 arXiv プレプリント arXiv:2311.12929](https://arxiv.org/abs/2311.12929).\n",
        "  * [三菱化学株式会社](https://q-ctrl.com/case-study/unlocking-new-performance-capability-in-quantum-chemistry)のケーススタディを検討する。\n",
        "  * [編集](https://q-ctrl.com/case-study/reducing-quantum-compute-costs-2-500x-with-fire-opal)済み銀行ケーススタディを確認する。\n",
        "  * [BlueQubit](https://q-ctrl.com/case-study/enabling-data-loading-for-quantum-machine-learning-with-fire-opal) のケーススタディを確認する。\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": 5
}