{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "c08a245a-82c1-4c6f-b1e1-d0a27f093b7a",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"ローカルテストモード\"\n",
        "description: \"IBM Quantum Computeのローカルテストモードを使用して、量子ハードウェアをシミュレートします\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore superop */}\n",
        "\n",
        "<span id=\"test-locally\" />\n",
        "\n",
        "<span id=\"local-testing-mode\" />\n",
        "\n",
        "# ローカルテストモード\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "14778d9c-4e0e-4b84-8575-90e4efab25a2",
      "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",
        "    qiskit-aer~=0.17\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "435ec827-a348-4b70-b1ef-582849c0a76a",
      "metadata": {},
      "source": [
        "ローカルテストモード（ `qiskit-ibm-runtime` v0.22.0 以降で利用可能）を使用すると、プログラムを微調整して実際の量子ハードウェアに送信する前に、プログラムをテストすることができます。  ローカル・テスト・モードを使ってプログラムを検証した後、QPUで実行するために必要なのはバックエンド名を変更することだけだ。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Executorプリミティブはローカルテストモードに対応していません。\n",
        "</Admonition>\n",
        "\n",
        "ローカルテストモードを使用するには、 IBM Quantum プリミティブまたはセッションをインスタンス化する際に、のいずれかのフェイクバックエンドを指定するか `qiskit_ibm_runtime.fake_provider` 、Qiskit Aerバックエンドを指定してください。\n",
        "\n",
        "* **偽のバックエンド** ： `qiskit_ibm_runtime.fake_provider` の[偽のバックエンドは](/docs/api/qiskit-ibm-runtime/fake-provider)、QPUスナップショットを使用することで、 IBM® QPUの動作を模倣している。 QPUスナップショットには、結合マップ、基底ゲート、量子ビットの特性など、QPUに関する重要な情報が含まれており、トランスパイラのテストやQPUのノイジーシミュレーションの実行に役立ちます。 スナップショットのノイズモデルは、シミュレーション中に自動的に適用されます。\n",
        "* **Aerシミュレータ** ： [Qiskit Aerの](/docs/guides/simulate-with-qiskit-aer)シミュレータは、より大規模な回路や[カスタムノイズモデルを](/docs/guides/build-noise-models)扱うことができる、より高性能なシミュレーションを提供します。 `AerSimulator` をローカル・テスト・モードで使用する場合、シミュレーション方法のオプション・リストが利用できます。 多数の量子ビットを持つクリフォード回路を効率的にシミュレーションする方法を示す[クリフォード・シミュレーション・モードの例を](#clifford-sim)参照してください。\n",
        "\n",
        "  <Accordion>\n",
        "    <AccordionItem title=\"**Qiskit Aerで利用可能なシミュレーション手法一覧**\">\n",
        "      詳しくは [`AerSimulator`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.AerSimulator) ドキュメントを参照のこと。\n",
        "\n",
        "      * `\"automatic\"`:デフォルトのシミュレーション方法。 回路とノイズモデルに基づいて、シミュレーション方法を自動的に選択します。\n",
        "\n",
        "      * `\"statevector\"`: *理想的な*回路から測定結果をサンプリングできる高密度な状態ベクトルシミュレーション。 ノイズの多いシミュレーションでは、各ショットがノイズモデルからランダムにサンプリングされたノイズ回路をサンプリングする。\n",
        "\n",
        "      * `\"density_matrix\"`: *ノイズの多い*回路から測定結果をサンプリングできる密度行列シミュレーション。\n",
        "\n",
        "      * `\"stabilizer\"`:ノイズモデル中のすべての誤差がクリフォード誤差でもある場合、ノイズの多いクリフォード回路をシミュレートできる効率的なクリフォード・スタビライザ状態シミュレータ。\n",
        "\n",
        "      * `\"extended_stabilizer\"`:ランク付けされた安定化状態に状態を分解することに基づくクリフォード＋T回路の近似シミュレータ。 項数は、非クリフォード（T）ゲートの数とともに増加する。\n",
        "\n",
        "      * `\"matrix_product_state\"`:テンソルネットワークの状態ベクトルシミュレータで、状態に行列積状態(MPS)表現を用いる。 これは、シミュレータのオプションによって、MPSのボンド寸法を切り捨てるかどうかで行うことができます。 デフォルトの動作は切り捨てなしである。\n",
        "\n",
        "      * `\"unitary\"`:理想回路の密なユニタリー行列シミュレーション。 これは、初期量子状態の進化ではなく、回路自体のユニタリー行列をシミュレートしている。 この方法はゲートのシミュレーションしかできない。測定、リセット、ノイズはサポートしない。\n",
        "\n",
        "      * `\"superop\"`:理想回路またはノイズ回路の高密度スーパーオペレータ行列シミュレーション。 これは、初期量子状態の発展ではなく、回路自体のスーパーオペレータ行列をシミュレートするものである。 この方法は、理想的でノイズの多いゲートとリセットをシミュレートできるが、測定には対応していない。\n",
        "\n",
        "      * `\"tensor_network\"`:状態ベクトルと密度行列の両方をサポートするテンソルネットワークベースのシミュレーション。 現在のところ、これはGPUでのみ利用可能で、 cuQuantum `cuTensorNet` APIを使用することで高速化されている。\n",
        "    </AccordionItem>\n",
        "  </Accordion>\n",
        "\n",
        "<Admonition type=\"note\" title=\"ノート\">\n",
        "  - ローカルテストモードでは、 IBM Quantum のすべてのComputeオプションを指定できます。  ただし、ローカルシミュレータで実行する場合、ショット以外のすべてのオプションは無視されます。\n",
        "  - 偽のバックエンドやAerシミュレータを使用する前に、 `pip install qiskit-aer` を実行してQiskit Aerをインストールすることをお勧めします。 偽のバックエンドは、Aerのシミュレーターが利用可能であれば、その性能を利用するために、隠れてAerのシミュレーターを使用する。\n",
        "</Admonition>\n",
        "\n",
        "{/* If you currently use the Qiskit SDK, you can use the existing Qiskit Aer primitives for local testing.  See [exact and noisy simulation with Qiskit Aer primitives](/docs/guides/simulate-with-qiskit-aer) for details. */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "366b1216-fb2f-4d06-afd8-fe374ab6ed9a",
      "metadata": {},
      "source": [
        "<span id=\"fake-backends-example\" />\n",
        "\n",
        "## 偽のバックエンドの例\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "efda5007-260a-49c0-ab6f-eac91fdbdf84",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler\n",
        "from qiskit_ibm_runtime.fake_provider import FakeManilaV2\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Run the Sampler job locally using FakeManilaV2\n",
        "fake_manila = FakeManilaV2()\n",
        "pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "\n",
        "# You can use a fixed seed to get fixed results.\n",
        "options = {\"simulator\": {\"seed_simulator\": 42}}\n",
        "sampler = Sampler(mode=fake_manila, options=options)\n",
        "\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b51e77c0-31c9-4dfa-950c-0a9ea9247aac",
      "metadata": {},
      "source": [
        "<span id=\"aersimulator-examples\" />\n",
        "\n",
        "## AerSimulator 例\n",
        "\n",
        "ノイズのないセッションの例：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "63407a34-0c70-400a-bc34-f85ccd581c4d",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer import AerSimulator\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import Session, SamplerV2 as Sampler\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Run the Sampler job locally using AerSimulator.\n",
        "# Session syntax is supported but ignored because local mode doesn't support sessions.\n",
        "aer_sim = AerSimulator()\n",
        "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "with Session(backend=aer_sim) as session:\n",
        "    sampler = Sampler(mode=session)\n",
        "    result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6a511de6-dc37-4ac4-87f8-bee90e3014a3",
      "metadata": {},
      "source": [
        "ノイズを含むシミュレーションを行うには、QPU（量子ハードウェア）を指定し、それをAerに提出する。  Aerは、そのQPUからの校正データに基づいてノイズモデルを構築し、そのモデルを使ってAerバックエンドをインスタンス化する。  お望みなら、 [ノイズモデルを作る](/docs/guides/build-noise-models)こともできる。\n",
        "\n",
        "<Admonition type=\"caution\">\n",
        "  QPUはさまざまな種類のノイズの影響を受ける可能性がある。 ここで使用しているQiskit Aerのノイズモデルは、その一部をシミュレートしているに過ぎないため、実際のQPUのノイズよりも深刻度は低いと思われる。\n",
        "\n",
        "  QPUからノイズ・モデルを初期化する際にどのようなエラーが含まれるかについての詳細は、Aer [`NoiseModel`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.noise.NoiseModel.html#qiskit_aer.noise.NoiseModel.from_backend) APIリファレンスを参照してください。\n",
        "</Admonition>\n",
        "\n",
        "ノイズのある例：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "0878eec8-9959-4e98-aff7-bf114352b838",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer import AerSimulator\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler, QiskitRuntimeService\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Specify a QPU to use for the noise model\n",
        "real_backend = service.backend(\"ibm_fez\")\n",
        "aer = AerSimulator.from_backend(real_backend)\n",
        "\n",
        "# Run the Sampler job locally using AerSimulator.\n",
        "pm = generate_preset_pass_manager(backend=aer, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "sampler = Sampler(mode=aer)\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2a2815a4-19f9-4ebd-8e53-4e29bea4a8db",
      "metadata": {},
      "source": [
        "<span id=\"clifford-sim\" />\n",
        "\n",
        "<span id=\"clifford-simulation\" />\n",
        "\n",
        "### クリフォードシミュレーション\n",
        "\n",
        "クリフォード回路は効率的にシミュレーションでき、検証可能な結果が得られるため、クリフォード・シミュレーションは非常に有用なツールである。 詳細な例については、 [Qiskit Aerプリミティブによるスタビライザー回路の効率的なシミュレーションを](/docs/guides/simulate-stabilizer-circuits)参照してください。\n",
        "\n",
        "例:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "b9d0fdac-ba2e-4c4e-8c49-c924fb8b5c43",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import efficient_su2\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler\n",
        "\n",
        "n_qubits = 500  # <---- note this uses 500 qubits!\n",
        "circuit = efficient_su2(n_qubits)\n",
        "circuit.measure_all()\n",
        "\n",
        "rng = np.random.default_rng(1234)\n",
        "params = rng.choice(\n",
        "    [0, np.pi / 2, np.pi, 3 * np.pi / 2],\n",
        "    size=circuit.num_parameters,\n",
        ")\n",
        "\n",
        "# Tell Aer to use the stabilizer (Clifford) simulation method\n",
        "aer_sim = AerSimulator(method=\"stabilizer\")\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "sampler = Sampler(mode=aer_sim)\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ee461e4d-ee50-4430-9e83-c3b49cd7a1ef",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * [この `Neat`](/docs/guides/debug-qiskit-runtime-jobs) クラスを使用して、Estimator ワークロードに対するノイズの影響を分析します。\n",
        "  * 詳細な[サンプル例](/docs/guides/sampler-examples)を確認してください。\n",
        "  * [見積書の](/docs/guides/estimator-examples)詳細な例を確認してください。\n",
        "  * IBM Quantum Learningの [Cost functionのレッスンを通して](/learning/courses/variational-algorithm-design/cost-functions)、プリミティブの練習をしましょう。\n",
        "  * ローカルでトランスパイルする方法については、 [トランスパイルセクションを](/docs/guides/transpile)ご覧ください。\n",
        "  * [トランスパイラ設定の比較](/docs/guides/circuit-transpilation-settings#compare-transpiler-settings)チュートリアルを試してみてください。\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
}