{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "58b0ed8c-a233-4d70-9127-b740c757955f",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"パス・マネージャーを使用したトランスパイル\"\n",
        "description: \"Qiskitにおけるパスマネージャーを用いた量子回路のトランスパイル方法\"\n",
        "---\n",
        "\n",
        "<span id=\"transpile-with-pass-managers\" />\n",
        "\n",
        "# パス・マネージャーを使用したトランスパイル\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a6414f1d-e0c5-4022-b297-719ea5958842",
      "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": "d93f555a-6238-4660-91b5-181ae0da4a53",
      "metadata": {},
      "source": [
        "回路をトランスパイルする推奨の方法は、ステージド・パス・マネージャーを作成し、回路を入力としてその `run` メソッドを実行することです。 このページでは、この方法で量子回路をトランスパイルする方法を説明する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "47730af4-67a2-44b4-a304-224296926799",
      "metadata": {},
      "source": [
        "<span id=\"what-is-a-staged-pass-manager\" />\n",
        "\n",
        "## （段階的な）パスマネージャーとは何ですか？\n",
        "\n",
        "Qiskit SDKの文脈では、トランスパイルとは、入力回路を量子デバイスでの実行に適した形に変換するプロセスを指します。 トランスパレーションは通常、トランスパイラー・パスと呼ばれる一連のステップで行われる。 回路はトランスパイラの各パスによって順番に処理され、あるパスの出力が次のパスの入力となる。 例えば、1つのパスで回路を通過させ、シングル量子ビット・ゲートの連続するシーケンスをすべてマージし、次のパスでこれらのゲートをターゲット・デバイスの基底セットに合成することができる。 Qiskitに含まれるトランスパイラパスは [qiskit.transpiler.passes](/docs/api/qiskit/transpiler_passes) モジュールにあります。\n",
        "\n",
        "パス・マネージャーは、トランスパイラー・パスのリストを保存し、回路上で実行できるオブジェクトです。 を初期化してパス・マネージャーを作成する。 [`PassManager`](/docs/api/qiskit/qiskit.transpiler.PassManager) をトランスパイラ・パスのリストで初期化することでパス・マネージャを作成します。 回路上でトランスパレーションを実行するには、回路を入力として [`run`](/docs/api/qiskit/qiskit.transpiler.PassManager#run) メソッドを呼び出す。\n",
        "\n",
        "ステージド・パス・マネージャーは、通常のパス・マネージャーよりも抽象度が高い特別なパス・マネージャーです。 通常のパス・マネージャーが複数のトランスパイラー・パスを組み合わせて構成されるのに対し、ステージド・パス・マネージャーは複数の*パス・マネージャーで*構成される。 [トランスパイラのステージで](transpiler-stages)説明されているように、トランスパイルは通常、個別のステージで行われ、各ステージはパスマネージャで表されるため、これは有用な抽象化である。 ステージド・パスマネージャーは [`StagedPassManager`](/docs/api/qiskit/qiskit.transpiler.StagedPassManager) クラスで表されます。 このページの残りの部分では、（段階的な）パス・マネージャーの作成とカスタマイズの方法について説明します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9d1aaab0-e9e9-4066-9a9a-f551fdc410b9",
      "metadata": {},
      "source": [
        "<span id=\"generate-a-preset-staged-pass-manager\" />\n",
        "\n",
        "## プリセットステージドパスマネージャを生成する\n",
        "\n",
        "適切なデフォルト値が設定されたプリセットのステージド・パス・マネージャーを作成するには、関数を使用 [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) します。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  これらの例では の `FakeSherbrooke``qiskit_ibm_runtime` モックバックエンドを使用していますが、Qiskitと互換性のある実在のバックエンドや模擬バックエンドであれば、どれでも試すことができます。  実際の結果は異なる場合があります。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "293c1f9f-f9da-4c60-b456-80fea88b1194",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7796dd8b-5f42-4712-bcd8-ebff5096c5f1",
      "metadata": {},
      "source": [
        "パス・マネージャで回路または回路のリストをトランスパイルするには、回路または回路のリストを `run` メソッドに渡す。 ハダマードの後に2つの隣接するCXゲートが続く2量子ビット回路でこれをやってみよう：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "c1426e6c-f506-4938-8c0a-05198bae9746",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpile-with-pass-managers/extracted-outputs/c1426e6c-f506-4938-8c0a-05198bae9746-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumRegister, QuantumCircuit\n",
        "\n",
        "# Create a circuit\n",
        "qubits = QuantumRegister(2, name=\"q\")\n",
        "circuit = QuantumCircuit(qubits)\n",
        "a, b = qubits\n",
        "circuit.h(a)\n",
        "circuit.cx(a, b)\n",
        "circuit.cx(b, a)\n",
        "\n",
        "# Transpile it by calling the run method of the pass manager\n",
        "transpiled = pass_manager.run(circuit)\n",
        "\n",
        "# Draw it, excluding idle qubits from the diagram\n",
        "transpiled.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9568b846-12b9-4de0-88a7-594d14312db4",
      "metadata": {},
      "source": [
        "`generate_preset_pass_manager` 関数に指定できる引数については、 [Transpilation defaults and configuration options を](defaults-and-configuration-options)参照のこと。 `generate_preset_pass_manager` 。 [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile) 関数の引数と一致します。\n",
        "\n",
        "もしプリセットのパス・マネージャーがあなたのニーズを満たさない場合は、（ステージングされた）パス・マネージャーやトランスピレーション・パスを作成してトランスピレーションをカスタマイズしてください。 このページの残りの部分では、パス・マネージャーの作成方法について説明します。 トランスパイルパスの作成方法については、 [Write your own transpiler passを](custom-transpiler-pass)参照してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2a6d45c6-1d88-4566-92f2-0ae149c606fa",
      "metadata": {},
      "source": [
        "<span id=\"create-your-own-pass-manager\" />\n",
        "\n",
        "## 独自のパス管理ツールを作成する\n",
        "\n",
        "この [qiskit.transpiler.passes](/docs/api/qiskit/transpiler_passes) モジュールには、パス・マネージャーを作成するのに使えるトランスパイラー・パスが多数含まれている。 パス・マネージャーを作成するには、パスのリストで `PassManager` を初期化する。 例えば、次のコードは、隣接する2量子ビットのゲートをマージするトランスパイラー・パスを作成し、それらを以下の基底に合成する。 [$R_y$](/docs/api/qiskit/qiskit.circuit.library.RYGate), [$R_z$](/docs/api/qiskit/qiskit.circuit.library.RZGate) と [$R_{xx}$](/docs/api/qiskit/qiskit.circuit.library.RXXGate) ゲートの基底に合成する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "054a634f-958a-49e3-81d5-c53257e25b65",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import PassManager\n",
        "from qiskit.transpiler.passes import (\n",
        "    Collect2qBlocks,\n",
        "    ConsolidateBlocks,\n",
        "    UnitarySynthesis,\n",
        ")\n",
        "\n",
        "basis_gates = [\"rx\", \"ry\", \"rxx\"]\n",
        "translate = PassManager(\n",
        "    [\n",
        "        Collect2qBlocks(),\n",
        "        ConsolidateBlocks(basis_gates=basis_gates),\n",
        "        UnitarySynthesis(basis_gates),\n",
        "    ]\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a93ff400-d04e-4aa1-9a70-4f583425cc3c",
      "metadata": {},
      "source": [
        "このパス・マネージャーを実際に動作させるために、ハダマードの後に2つの隣接するCXゲートが続く2量子ビット回路でテストしてみよう：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "01317c54-68b5-4e41-893f-82ee223e22f0",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpile-with-pass-managers/extracted-outputs/01317c54-68b5-4e41-893f-82ee223e22f0-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumRegister, QuantumCircuit\n",
        "\n",
        "qubits = QuantumRegister(2, name=\"q\")\n",
        "circuit = QuantumCircuit(qubits)\n",
        "\n",
        "a, b = qubits\n",
        "circuit.h(a)\n",
        "circuit.cx(a, b)\n",
        "circuit.cx(b, a)\n",
        "\n",
        "circuit.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1a852fa1-6fe0-42b7-b6ad-26c29e844a3a",
      "metadata": {},
      "source": [
        "回路上でパス・マネージャーを実行するには、 `run` メソッドを呼び出す。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "019ad99b-bd38-4217-90ee-da43959dc8ad",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpile-with-pass-managers/extracted-outputs/019ad99b-bd38-4217-90ee-da43959dc8ad-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "translated = translate.run(circuit)\n",
        "translated.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bc0944c9-b25f-4efe-a6ab-9ae4b5b27976",
      "metadata": {},
      "source": [
        "ダイナミック・デカップリングとして知られるエラー抑制テクニックを実装するためにパス・マネージャーを作成する方法を示す、より高度な例については、 [ダイナミック・デカップリングのためのパス・マネージャーの作成を](dynamical-decoupling-pass-manager)参照してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0abb7cb1-3a5e-42c1-9817-f2838ad98b98",
      "metadata": {},
      "source": [
        "<span id=\"create-a-staged-pass-manager\" />\n",
        "\n",
        "## 段階的なパス管理者の作成\n",
        "\n",
        "`StagedPassManager` は、個々のステージで構成されるパス・マネージャーであり、各ステージは `PassManager` インスタンスによって定義される。 希望するステージを指定して、 `StagedPassManager` 。 例えば、以下のコードは、 `init` と `translation` の2つのステージを持つステージド・パスマネージャーを作成します。 `translation` ステージは、以前に作成されたパス・マネージャーによって定義される。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "8f1c1a26-b6bc-470c-9b8a-7f9d53db8b01",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import PassManager, StagedPassManager\n",
        "from qiskit.transpiler.passes import UnitarySynthesis, Unroll3qOrMore\n",
        "\n",
        "basis_gates = [\"rx\", \"ry\", \"rxx\"]\n",
        "init = PassManager(\n",
        "    [UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]\n",
        ")\n",
        "staged_pm = StagedPassManager(\n",
        "    stages=[\"init\", \"translation\"], init=init, translation=translate\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "45d3105f-e852-4571-b221-70bf517ff519",
      "metadata": {},
      "source": [
        "ステージ・パス・マネージャーに入れるステージ数に制限はない。\n",
        "\n",
        "ステージド・パス・マネージャーを作るもう一つの便利な方法は、プリセットのステージド・パス・マネージャーから始めて、ステージの一部を入れ替えることだ。 例えば、次のコードは最適化レベル3のプリセット・パス・マネージャーを生成し、カスタム `pre_layout` ステージを指定する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "2a2b86b9-f46a-460b-b2d6-5962cffeec01",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import HGate, PhaseGate, RXGate, TdgGate, TGate\n",
        "from qiskit.transpiler.passes import InverseCancellation\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(3, backend)\n",
        "inverse_gate_list = [\n",
        "    HGate(),\n",
        "    (RXGate(np.pi / 4), RXGate(-np.pi / 4)),\n",
        "    (PhaseGate(np.pi / 4), PhaseGate(-np.pi / 4)),\n",
        "    (TGate(), TdgGate()),\n",
        "]\n",
        "logical_opt = PassManager(\n",
        "    [\n",
        "        InverseCancellation(inverse_gate_list),\n",
        "    ]\n",
        ")\n",
        "\n",
        "# Add pre-layout stage to run extra logical optimization\n",
        "pass_manager.pre_layout = logical_opt"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9d49e4a5-2868-4f09-85f8-a0b89f35338c",
      "metadata": {},
      "source": [
        "[ステージ・ジェネレーター関数は](/docs/api/qiskit/transpiler_preset#stage-generator-functions)、カスタム・パス・マネージャーを構築するのに便利かもしれない。\n",
        "多くのパス・マネージャーで使用される共通機能を提供するステージを生成する。\n",
        "例えば [`generate_embed_passmanager`](/docs/api/qiskit/transpiler_preset#qiskit.transpiler.preset_passmanagers.generate_embed_passmanager) を使用してステージ を使用して、レイアウトパスから選択された初期 `Layout` を指定されたターゲットデバイスに「埋め込む」ことができます。\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"勧告\">\n",
        "  * [カスタムトランスパイラパスを書く](custom-transpiler-pass)。\n",
        "  * [ダイナミック・デカップリングのためのパス・マネージャーを作る](dynamical-decoupling-pass-manager)。\n",
        "  * `generate_preset_passmanager` 機能の詳細については、 [トランスピレーションのデフォルト設定と構成オプションの](defaults-and-configuration-options)トピックを参照してください。\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": {
    "celltoolbar": "Raw Cell Format",
    "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
}