{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "fbce2fd6-c79e-4e90-9074-6cde8a09b517",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"トランスパイラで一般的に使用されるパラメータ\"\n",
        "description: \"Qiskitにおける量子回路トランスパイルを制御する一般的なパラメータの概要\"\n",
        "---\n",
        "\n",
        "<span id=\"commonly-used-parameters-for-transpilation\" />\n",
        "\n",
        "# トランスパイラで一般的に使用されるパラメータ\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6beea7ff-7407-47be-a0b7-1e7981328df5",
      "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": "05fb8adb-3b36-4449-b669-108d2d749ca5",
      "metadata": {},
      "source": [
        "このページでは、ローカルトランスピレーションによく使われるパラメータについて説明します。 これらのパラメータは [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) または [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile).\n",
        "\n",
        "<span id=\"approx-degree\" />\n",
        "\n",
        "<span id=\"approximation-degree\" />\n",
        "\n",
        "## 近似度\n",
        "\n",
        "近似度を使用して、結果の回路を目的の（入力）回路にどれだけ近づけたいかを指定できます。  これは範囲 ( 0.0 - 1.0 ) の浮動小数点数で、 0.0 は最大近似、 1.0 (デフォルト) は近似なし。 小さい値は、出力の正確さと実行のしやすさ（つまりゲート数の少なさ）を引き換えにする。  デフォルト値は 1.0 です。\n",
        "\n",
        "2量子ビット・ユニタリー合成（全レベルの初期段階と最適化レベル3の最適化段階で使用）では、この値は出力分解の目標忠実度を指定する。 つまり、回路の行列表現を離散ゲートに変換したときに、どれだけの誤差が生じるかということである。 近似度が低い（近似度が高い）場合、合成から得られる出力回路は入力行列との違いが大きくなるが、ゲート数は少なくなり（任意の2量子ビット演算は最大でも3つのCXゲートで完全に分解できるため）、実行が容易になる。\n",
        "\n",
        "近似度が 1.0 より小さい場合、1つまたは2つのCXゲートを持つ回路が合成される可能性があり、ハードウェアによる誤差は小さくなるが、近似度による誤差は大きくなる。 CXは誤差の点で最も高価なゲートであるため、合成の忠実度を犠牲にしてでもゲート数を減らすことが有益かもしれない（この手法は、 IBM® デバイスの量子体積を増やすために使用された）： [ランダム化モデル回路を用いた量子コンピュータの検証](https://arxiv.org/abs/1811.12926) ）。\n",
        "\n",
        "例として、初期段階で合成されるランダムな2量子ビット `UnitaryGate` 。 `approximation_degree` を 1.0 より小さく設定すると、近似回路が生成される可能性がある。 また、近似合成に使用できるゲートを合成手法に知らせるために、 `basis_gates` 。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "e660bec2-f806-4050-955b-53a50289158e",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "2\n"
          ]
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit, QuantumRegister\n",
        "from qiskit.circuit.library import UnitaryGate\n",
        "from qiskit.quantum_info import random_unitary\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "UU = random_unitary(4, seed=12345)\n",
        "rand_U = UnitaryGate(UU)\n",
        "\n",
        "qubits = QuantumRegister(2, name=\"q\")\n",
        "qc = QuantumCircuit(qubits)\n",
        "qc.append(rand_U, qubits)\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1,\n",
        "    approximation_degree=0.85,\n",
        "    basis_gates=[\"sx\", \"rz\", \"cx\"],\n",
        ")\n",
        "approx_qc = pass_manager.run(qc)\n",
        "print(approx_qc.count_ops()[\"cx\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6f067d6e-0157-43fc-8cb2-c86855b6bdac",
      "metadata": {},
      "source": [
        "近似に必要なCXゲートの数が少ないため、 `2` 。\n",
        "\n",
        "<span id=\"seed\" />\n",
        "\n",
        "<span id=\"random-number-generator-seed\" />\n",
        "\n",
        "## 乱数生成器のシード\n",
        "\n",
        "トランスパイラの一部は確率的であるため、トランスパイラを繰り返し実行すると異なる結果を返すことがある。 再現可能な結果を得るには、 `seed_transpiler` 引数を用いて擬似乱数生成器のシードを設定することができる。 同じシードを使用して繰り返し実行すると、同じ結果が返される。\n",
        "\n",
        "例:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, seed_transpiler=11, basis_gates=[\"sx\", \"rz\", \"cx\"]\n",
        ")\n",
        "optimized_1 = pass_manager.run(qc)\n",
        "optimized_1.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "20b95efa-8aa8-41ac-a037-dac2a3336879",
      "metadata": {},
      "source": [
        "<span id=\"init-layout\" />\n",
        "\n",
        "<span id=\"initial-layout\" />\n",
        "\n",
        "## 初期レイアウト\n",
        "\n",
        "トランスパイレーション前の回路に含まれる量子ビットは仮想的な量子ビットであり、必ずしもターゲット・バックエンド上の物理的な量子ビットに対応するわけではない。 仮想量子ビットの物理量子ビットへの初期マッピングは、 `initial_layout` 引数を使用して指定できます。 最終的な量子ビットのレイアウトは、トランスパイラがスワップゲートなどを使って量子ビットを並べ替える可能性があるため、最初のレイアウトとは異なる可能性があることに注意してください。\n",
        "\n",
        "以下の例では [`FakeSherbrooke`](/docs/api/qiskit-ibm-runtime/fake-provider-fake-sherbrooke#fakesherbrooke) モックバックエンド用の [`Layout`](/docs/api/qiskit/qiskit.transpiler.Layout) オブジェクトを作成します。 私たちのレイアウトは、私たちの回路の最初の量子ビットをシャーブルックの量子ビット5にマッピングし、私たちの回路の2番目の量子ビットをシャーブルックの量子ビット6にマッピングしている。 物理的な量子ビットは常に整数で表されることに注意。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  これらの例では の `FakeSherbrooke``qiskit_ibm_runtime` モックバックエンドを使用していますが、Qiskitと互換性のある実在のバックエンドや模擬バックエンドであれば、どれでも試すことができます。  実際の結果は異なる場合があります。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "e18c034c-eb26-4d9d-81d7-37e0eafa17c7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/e18c034c-eb26-4d9d-81d7-37e0eafa17c7-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "from qiskit.transpiler import Layout\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "\n",
        "a, b = qubits\n",
        "initial_layout = Layout({a: 5, b: 6})\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "261055f3-cb88-4651-9a98-31891a4db535",
      "metadata": {},
      "source": [
        "Layoutオブジェクトを指定するだけでなく、整数のリストを渡すこともできます。リストの $i$ -番目の要素には、 $i$ -番目の量子ビットがマッピングされるべき物理量子ビットが含まれます。 例:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "a7800d8a-7354-48e4-a55f-f902ae28c875",
      "metadata": {
        "scrolled": true
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/a7800d8a-7354-48e4-a55f-f902ae28c875-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "initial_layout = [5, 6]\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d2034dd5-23e5-4473-89b8-aaf4233775c7",
      "metadata": {},
      "source": [
        "を使用することができます。 [`plot_error_map`](/docs/api/qiskit/qiskit.visualization.plot_error_map) 関数を使用すると、エラー情報と物理量子ビットのラベルが付いたデバイス・グラフの図を生成できます。 また、 [コンピュート・リソースの](/computers)ページでも同様の図を見ることができる。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "8df57c6a-1ff4-4d58-9b7e-4378452c3025",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/8df57c6a-1ff4-4d58-9b7e-4378452c3025-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import plot_error_map\n",
        "\n",
        "plot_error_map(backend, figsize=(30, 24))"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "25c05cca-b93b-4ba1-b46c-7280ec4ef8cb",
      "metadata": {},
      "source": [
        "<span id=\"xx-method\" />\n",
        "\n",
        "<span id=\"transpiler-stage-and-plugin-options\" />\n",
        "\n",
        "## トランスパイラ段階とプラグインオプション\n",
        "\n",
        "これらのオプションのサフィックスは `_method`。 これらはトランスパイラの動作に影響を与え、トランスパイラからより良い、異なる、あるいは特定の出力を得ようとするために使用されます。\n",
        "\n",
        "* `init_method` (str) - 初期化段階で使用するプラグイン。\n",
        "\n",
        "* `layout_method` (str) - レイアウト選択パス (`trivial`, `dense`, `sabre`)。また、レイアウトステージに使用する外部プラグイン名を指定することもできます。\n",
        "\n",
        "* `optimization_method` (str) - 最適化段階で使用するプラグイン。\n",
        "\n",
        "* `routing_method` (str) - ルーティング・パスの名前 (`basic`, `lookahead`, `default`, `sabre`, `none`)。これは、ルーティングステージに使用する外部プラグイン名にもなります。\n",
        "\n",
        "* `scheduling_method` (str) - スケジューリングパスの名前。 これは、スケジューリング段階で使用する外部プラグイン名にもなります。\n",
        "  * `as_soon_as_possible`:貪欲に命令をスケジューリングする：量子ビットリソース上で可能な限り早期に（別名： `asap` ）。\n",
        "  * `as_late_as_possible`:スケジュールの指示が遅い。  つまり、可能な限り量子ビットを基底状態に保つ（別名： `alap` ）。\n",
        "\n",
        "* `translation_method` (str) - 翻訳パスの名前 (`unroller`, `translator`, `synthesis`)。これは、翻訳段階で使用する外部プラグインの名前にもなります。\n",
        "\n",
        "* `unitary_synthesis_method` (str) - 使用するユニタリー合成法の名前。 デフォルトでは `default` 。\n",
        "\n",
        "<Admonition>\n",
        "  指定したステージにインストールされているすべてのプラグインのリストを見るには、以下を実行する。 [`list_stage_plugins(\"stage_name\")`](/docs/api/qiskit/transpiler_plugins). 例えば、ルーティングステージにインストールされているすべてのプラグインのリストを見たい場合は、 `list_stage_plugins(routing)`.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"勧告\">\n",
        "  * [デフォルトのオプションと構成設定の](defaults-and-configuration-options)トピックを確認してください。\n",
        "  * [最適化レベル](set-optimization)の設定方法を学びましょう。\n",
        "  * [トランスパイラ設定の比較](/docs/guides/circuit-transpilation-settings)ガイドをお試しください。\n",
        "  * [トランスパイラ API ドキュメント](/docs/api/qiskit/transpiler)を確認してください。\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
}