{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "b793601b-95bc-4d36-adfc-c9fc34ce45cd",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"トランスパイラ段階\"\n",
        "description: \"Qiskitにおける量子回路トランスパイルパイプラインのデフォルトの段階。\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore fontsize */}\n",
        "\n",
        "<span id=\"transpiler-stages\" />\n",
        "\n",
        "# トランスパイラ段階\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4a38c84a-eed2-4fa4-9823-3d544e572398",
      "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",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9f2ecc4b-e6a3-418c-8a65-a9f3ac98c3dc",
      "metadata": {},
      "source": [
        "このページでは、Qiskit SDKにあらかじめ組み込まれているトランスパイルパイプラインのステージについて説明します。 ステージは6つある：\n",
        "\n",
        "1. `init`\n",
        "2. `layout`\n",
        "3. `routing`\n",
        "4. `translation`\n",
        "5. `optimization`\n",
        "6. `scheduling`\n",
        "\n",
        "この [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) 関数は、これらのステージで構成される[プリセット・ステージド・パス・マネージャーを](/docs/api/qiskit/qiskit.transpiler.StagedPassManager)作成する。 各ステージを構成する具体的なパスは、 `generate_preset_pass_manager` に渡される引数によって決まる。 `optimization_level` は、指定しなければならない位置引数であり、0、1、2、3のいずれかの整数である。 値が大きいほど、最適化は重くなるが、コストがかかることを示す（ [Transpilation defaults and configuration optionsを](defaults-and-configuration-options)参照）。\n",
        "\n",
        "回路をトランスパイルする推奨される方法は、 [パス・マネージャーを使ったトランスパイルで](transpile-with-pass-managers)説明されているように、プリセット・ステージド・パス・マネージャーを作成し、そのパス・マネージャーを回路上で実行することです。 しかし、よりシンプルだがカスタマイズ性の低い代替案として [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile) 関数を使うことだ。 この関数は、回路を直接引数として受け取る。 `generate_preset_pass_manager` と同様、使用される特定のトランスパイラ・パスは、 `transpile` に渡される `optimization_level` のような引数に依存する。 実際、 `transpile` 関数は内部で `generate_preset_pass_manager` を呼び出し、プリセットのステージド・パス・マネージャーを作成し、回路上で実行する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "18140654-10ff-40c5-ab75-4d19b8a7f5dd",
      "metadata": {},
      "source": [
        "<span id=\"init-stage\" />\n",
        "\n",
        "## 初期化段階\n",
        "\n",
        "この最初のステージは、デフォルトではほとんど何もせず、独自の初期最適化を含めたい場合に主に役立つ。  ほとんどのレイアウトと配線アルゴリズムは、1量子ビットと2量子ビットのゲートでしか動作しないように設計されているため、この段階は、2量子ビット以上で動作するゲートを、1量子ビットか2量子ビットだけで動作するゲートに変換するためにも使われる。\n",
        "\n",
        "この段階での独自の初期最適化の実装については、プラグインとパスマネージャーのカスタマイズのセクションを参照してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "506a831f-b317-4335-8124-20ed994292cd",
      "metadata": {},
      "source": [
        "<span id=\"layout-stage\" />\n",
        "\n",
        "## レイアウト段階\n",
        "\n",
        "次の段階では、回路が送信されるバックエンドのレイアウトや接続構成を検討します。  一般的に、量子回路とは、その量子ビットが、計算に使用される実際の量子ビットの「仮想的」あるいは「論理的」な表現である抽象的な実体である。  一連のゲートを実行するには、実際の量子デバイスにおいて、「仮想」量子ビットと「物理」量子ビットとの一対一の対応付けが必要である。  このマッピングはオブジェクト `Layout` として保存され、バックエンドの[命令セットアーキテクチャ（ISA）](/docs/guides/transpile#instruction-set-architecture) 内で定義された制約の一部を構成しています。\n",
        "\n",
        "![この図は、ワイヤ表現から、QPU上で量子ビットがどのように接続されているかを表す図への量子ビットのマッピングを示しています。](https://quantum.cloud.ibm.com/docs/images/guides/transpiler-stages/layout-mapping.svg \"量子ビットのマッピング\")\n",
        "\n",
        "マッピングの選択は、入力回路をデバイス・トポロジーにマッピングするために必要なSWAP演算の回数を最小化し、最もよく較正された量子ビットを確実に使用するために極めて重要である。  この段階が重要であるため、プリセット・パスのマネージャーは最適なレイアウトを見つけるためにいくつかの異なる方法を試す。  まず、\"完璧な \"レイアウト（SWAP操作を必要としないレイアウト）を見つけようとするステップと、完璧なレイアウトが見つからない場合に使用する最適なレイアウトを見つけようとするヒューリスティックなステップである。  この最初のステップでは、通常2つの `Passes` ：\n",
        "\n",
        "* `TrivialLayout`: 各仮想量子ビットをデバイス上の同じ番号の物理量子ビットに単純にマッピングします（つまり、 \\[`0`、`1`、`1`、`3`] -> \\[`0`、`1`、`1`、`3`] ）。これは、 `optimzation_level=1` 完璧なレイアウトを見つけようとします。  失敗した場合は、 `VF2Layout` 。\n",
        "* `VF2Layout`:これは `AnalysisPass` 、この段階を VF2++ アルゴリズムによって解決される部分グラフ同型問題として扱うことによって、理想的なレイアウトを選択するものである。  複数のレイアウトが見つかった場合、スコアリング・ヒューリスティックが実行され、平均誤差が最も小さいマッピングが選択される。\n",
        "\n",
        "そしてヒューリスティック・ステージでは、デフォルトで2パスが使用される：\n",
        "\n",
        "* `DenseLayout`:最大の接続性を持ち、回路と同じ数の量子ビットを持つデバイスのサブグラフを見つける（回路内に制御フロー操作（ IfElseOp など）が存在する場合、最適化レベル1に使用）。\n",
        "* `SabreLayout`このパスは、初期のランダムなレイアウトから開始し、アルゴリズム `SabreSwap` を繰り返し実行することでレイアウトを選択します。  このパスは、最適化レベル1、2、3においてのみ使用され、パーフェクトレイアウトが パス `VF2Layout` によって見出されない場合に限り適用される。  このアルゴリズムの詳細については、論文「 [arXiv:1809.02573](https://arxiv.org/abs/1809.02573) 」を参照してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cf772b6c-2578-455d-8014-9a7de2f9db19",
      "metadata": {},
      "source": [
        "<span id=\"routing-stage\" />\n",
        "\n",
        "## ルーティング段階\n",
        "\n",
        "量子デバイス上で直接接続されていない量子ビット間の2量子ビットゲートを実装するためには、1つ以上のSWAPゲートを回路に挿入し、デバイスのゲートマップ上で隣接するまで量子ビットの状態を移動させる必要がある。  各SWAPゲートは、高価でノイズの多い動作になる。  したがって、ある回路をあるデバイスにマッピングするのに必要なSWAPゲートの最小数を見つけることは、トランスパイルプロセスにおける重要なステップである。  効率化のため、このステージはデフォルトでレイアウトステージと一緒に計算されるのが一般的だが、論理的には別物である。  *レイアウトステージは*、使用するハードウェア量子ビットを選択し、 *ルーティング*ステージは、選択されたレイアウトを使用して回路を実行するために、適切な量のSWAPゲートを挿入する。\n",
        "\n",
        "しかし、最適なSWAPマッピングを見つけるのは難しい。  実際、この問題はNP困難問題であり、最小の量子デバイスと入力回路を除いて、計算には法外なコストがかかる。  これを回避するために、Qiskitは `SabreSwap` と呼ばれる確率的発見的アルゴリズムを使って、必ずしも最適ではないが、良いSWAPマッピングを計算します。 確率論的手法を使うということは、生成される回路が繰り返し実行されても同じであるとは保証されないということである。  実際、同じ回路を繰り返し実行すると、回路の深さと出力のゲート数の分布が生じる。  このため、多くのユーザーは、ルーティング機能（または `StagedPassManager` 全体）を何度も実行し、出力の分布から最も深さの浅い回路を選択する。\n",
        "\n",
        "例えば、15量子ビットのGHZ回路を \"悪い\"（切断された） `initial_layout` を使って100回実行したとしよう。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "62479697-cef1-4a89-ac2a-20051dd294f4",
      "metadata": {
        "tags": []
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "Text(0, 0.5, 'Counts')"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpiler-stages/extracted-outputs/62479697-cef1-4a89-ac2a-20051dd294f4-1.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "import matplotlib.pyplot as plt\n",
        "from qiskit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit.providers.fake_provider import GenericBackendV2\n",
        "\n",
        "backend = GenericBackendV2(15)\n",
        "\n",
        "\n",
        "ghz = QuantumCircuit(15)\n",
        "ghz.h(0)\n",
        "ghz.cx(0, range(1, 15))\n",
        "\n",
        "depths = []\n",
        "for seed in range(100):\n",
        "    pass_manager = generate_preset_pass_manager(\n",
        "        optimization_level=1,\n",
        "        backend=backend,\n",
        "        layout_method=\"trivial\",  # Fixed layout mapped in circuit order\n",
        "        seed_transpiler=seed,  # For reproducible results\n",
        "    )\n",
        "    depths.append(pass_manager.run(ghz).depth())\n",
        "\n",
        "plt.figure(figsize=(8, 6))\n",
        "plt.hist(depths, align=\"left\", color=\"#AC557C\")\n",
        "plt.xlabel(\"Depth\", fontsize=14)\n",
        "plt.ylabel(\"Counts\", fontsize=14)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ff31f484-a816-4479-8827-d56641501319",
      "metadata": {},
      "source": [
        "この幅広い分布は、SWAPマッパーが最適なマッピングを計算することがいかに難しいかを示している。  いくつかのヒントを得るために、実行されている回路とハードウェア上で選択された量子ビットの両方を見てみよう。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "ab89c4ea-06c4-4320-b493-feb691b3570d",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpiler-stages/extracted-outputs/ab89c4ea-06c4-4320-b493-feb691b3570d-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "ghz.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "f6a3a92a-8656-4518-ba2c-c3b0b038f507",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpiler-stages/extracted-outputs/f6a3a92a-8656-4518-ba2c-c3b0b038f507-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import plot_circuit_layout\n",
        "\n",
        "# Plot the hardware graph and indicate which hardware qubits were chosen to run the circuit\n",
        "transpiled_circ = pass_manager.run(ghz)\n",
        "plot_circuit_layout(transpiled_circ, backend)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0ec2818a-8087-42ba-990d-b3c1258dbf35",
      "metadata": {},
      "source": [
        "ご覧のように、この回路は接続グラフ上で非常に離れている量子ビット0と14の間で2量子ビットゲートを実行しなければならない。  したがって、この回路を実行するには、 `SabreSwap` パスを使ってすべての2量子ビットゲートを実行するためにSWAPゲートを挿入する必要がある。\n",
        "\n",
        "また、 `SabreSwap` アルゴリズムは、前段階の大きな `SabreLayout` 方式とは異なることに注意。  デフォルトでは、 `SabreLayout` 、レイアウトと配線の両方が実行され、変換された回路が返される。  これは、パスの [APIリファレンス](../api/qiskit/qiskit.transpiler.passes.SabreLayout)ページに明記されている、いくつかの特別な技術的理由によるものである。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "650f978b-d992-4d67-a356-5bf73902f212",
      "metadata": {},
      "source": [
        "<span id=\"translation-stage\" />\n",
        "\n",
        "## 翻訳段階\n",
        "\n",
        "量子回路を作成する際には、任意の量子ゲート（ユニタリ演算）を自由に使用できるほか、量子ビットの測定やリセット命令といったゲート以外の操作も組み合わせて使用できます。  しかし、ほとんどの量子デバイスは、本来、ごく少数の量子ゲートおよび非ゲート演算しかサポートしていない。  これらのネイティブゲートは、 [ターゲット](/docs/guides/transpile#instruction-set-architecture)のISAの定義の一部であり、プリセットのこの段階では、回路で指定されたゲートを、指定 `PassManagers` されたバックエンドのネイティブベースのゲートに変換（ *またはアンロール* ）します。  これは、バックエンドによって回路を実行できるようにするという点で重要なステップですが、通常、回路の深さとゲート数が増加することにつながります。\n",
        "\n",
        "このステージが何をするのかを説明するのに役立つ、2つの特別なケースが特に重要である。\n",
        "\n",
        "1. SWAPゲートがターゲット・バックエンドのネイティブ・ゲートでない場合、3つのCNOTゲートが必要となる：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "d4d1f65a-3336-4d70-9189-65ba010f2366",
      "metadata": {
        "tags": []
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "native gates:['cx', 'delay', 'id', 'measure', 'reset', 'rz', 'sx', 'x']\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpiler-stages/extracted-outputs/d4d1f65a-3336-4d70-9189-65ba010f2366-1.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "print(\"native gates:\" + str(sorted(backend.operation_names)))\n",
        "qc = QuantumCircuit(2)\n",
        "qc.swap(0, 1)\n",
        "qc.decompose().draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "56347603-8766-4165-af18-1f6fe4c61d4f",
      "metadata": {},
      "source": [
        "3つのCNOTゲートの積であるSWAPは、ノイズの多い量子デバイスで実行するには高価な演算である。  しかし、このような操作は、通常、多くのデバイスの限られたゲート接続性の中に回路を組み込むために必要である。  したがって、回路内のSWAPゲートの数を最小化することは、トランスパイルプロセスにおける主要な目標である。\n",
        "\n",
        "2. トッフォリゲート（controlled-controlled-not gate、`ccx` ）は、3量子ビットゲートである。  基底ゲートセットには1量子ビットと2量子ビットのゲートしか含まれていないため、この演算は分解しなければならない。  しかし、かなりコストがかかる：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "4552b367-75e9-4faa-a59d-8317e25ac145",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpiler-stages/extracted-outputs/4552b367-75e9-4faa-a59d-8317e25ac145-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc = QuantumCircuit(3)\n",
        "qc.ccx(0, 1, 2)\n",
        "qc.decompose().draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "70af8d85-84c2-43cf-96fa-37bcf68f89c9",
      "metadata": {},
      "source": [
        "量子回路のトッフォリゲート1つに対して、ハードウェアは最大6つのCNOTゲートと数個のシングル量子ビットゲートを実行する可能性がある。  この例は、複数のトフォリ・ゲートを使用するアルゴリズムは、最終的に回路深度が大きくなり、ノイズの影響を大きく受けることを示している。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8b396526-b14b-48a3-93ed-37e590b06caf",
      "metadata": {},
      "source": [
        "<span id=\"optimization-stage\" />\n",
        "\n",
        "## 最適化段階\n",
        "\n",
        "この段階では、量子回路をターゲット・デバイスの基本ゲート・セットに分解することが中心で、レイアウトや配線段階で深さが増すのと戦わなければならない。  幸いなことに、ゲートを組み合わせたり取り除いたりすることで回路を最適化するルーチンは数多く存在する。  場合によっては、これらの方法は非常に効果的で、レイアウトとハードウェア・トポロジーへの配線後でさえ、出力回路は入力回路よりも深さが浅くなる。  また、ノイズの多いデバイスでは計算が難しい場合もある。  この段階から、さまざまな最適化レベルの違いが出てくる。\n",
        "\n",
        "* `optimization_level=1` の場合、この段階で準備される。 [`Optimize1qGatesDecomposition`](../api/qiskit/qiskit.transpiler.passes.Optimize1qGatesDecomposition) と [`CXCancellation`](/docs/api/qiskit/1.4/qiskit.transpiler.passes.CXCancellation)を準備する。これは単一量子ビットゲートの連鎖を結合し、背中合わせのCNOTゲートをキャンセルする。\n",
        "* このステージでは、 `optimization_level=2` の代わりに [`CommutativeCancellation`](../api/qiskit/qiskit.transpiler.passes.CommutativeCancellation) パスの代わりに `CXCancellation`、整流関係を利用して冗長なゲートを削除する。\n",
        "* `optimization_level=3` の場合、このステージでは以下のパスを準備する：\n",
        "  * [`Collect2qBlocks`](../api/qiskit/qiskit.transpiler.passes.Collect2qBlocks)\n",
        "  * [`ConsolidateBlocks`](../api/qiskit/qiskit.transpiler.passes.ConsolidateBlocks)\n",
        "  * [`UnitarySynthesis`](../api/qiskit/qiskit.transpiler.passes.UnitarySynthesis)\n",
        "  * [`Optimize1qGateDecomposition`](../api/qiskit/qiskit.transpiler.passes.Optimize1qGatesDecomposition)\n",
        "  * [`CommutativeCancellation`](../api/qiskit/qiskit.transpiler.passes.CommutativeCancellation)\n",
        "\n",
        "さらにこの段階では、回路内のすべての命令がターゲット・バックエンドで利用可能な基底ゲートで構成されていることを確認するために、いくつかの最終チェックも実行する。\n",
        "\n",
        "GHZステートを使用した以下の例は、最適化レベル設定の違いによる回路の深さとゲート数への影響を示しています。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  ストキャスティックなSWAPマッパーのため、トランスピレーション出力は変化する。 したがって、以下の数値はコードを実行するたびに変化する可能性が高い。\n",
        "</Admonition>\n",
        "\n",
        "![15qubitのGHZ状態](https://quantum.cloud.ibm.com/docs/images/guides/transpiler-stages/transpiler-11.avif \"15qubitのGHZ状態 移調前\")\n",
        "\n",
        "以下のコードでは、15qubitのGHZステートを構築し、結果として得られる回路深さ、ゲート数、および多qubitゲート数の観点から、 `optimization_levels` 。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "2700405a-f559-45d3-99a9-5b4447621743",
      "metadata": {
        "tags": []
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpiler-stages/extracted-outputs/2700405a-f559-45d3-99a9-5b4447621743-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "ghz = QuantumCircuit(15)\n",
        "ghz.h(0)\n",
        "ghz.cx(0, range(1, 15))\n",
        "\n",
        "depths = []\n",
        "gate_counts = []\n",
        "multiqubit_gate_counts = []\n",
        "levels = [str(x) for x in range(4)]\n",
        "for level in range(4):\n",
        "    pass_manager = generate_preset_pass_manager(\n",
        "        optimization_level=level,\n",
        "        backend=backend,\n",
        "        seed_transpiler=1234,\n",
        "    )\n",
        "    circ = pass_manager.run(ghz)\n",
        "    depths.append(circ.depth())\n",
        "    gate_counts.append(sum(circ.count_ops().values()))\n",
        "    multiqubit_gate_counts.append(circ.count_ops()[\"cx\"])\n",
        "\n",
        "fig, (ax1, ax2) = plt.subplots(2, 1)\n",
        "ax1.bar(levels, depths, label=\"Depth\")\n",
        "ax1.set_xlabel(\"Optimization Level\")\n",
        "ax1.set_ylabel(\"Depth\")\n",
        "ax1.set_title(\"Output Circuit Depth\")\n",
        "ax2.bar(levels, gate_counts, label=\"Number of Circuit Operations\")\n",
        "ax2.bar(levels, multiqubit_gate_counts, label=\"Number of CX gates\")\n",
        "ax2.set_xlabel(\"Optimization Level\")\n",
        "ax2.set_ylabel(\"Number of gates\")\n",
        "ax2.legend()\n",
        "ax2.set_title(\"Number of output circuit gates\")\n",
        "fig.tight_layout()\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c870a48f-2bc4-4150-83ff-857a06e42ffb",
      "metadata": {},
      "source": [
        "<span id=\"scheduling\" />\n",
        "\n",
        "## スケジューリング\n",
        "\n",
        "この最後のステージは、明示的に呼び出された場合にのみ実行され（Initステージと同様）、デフォルトでは実行されない（ただし、 `generate_preset_pass_manager` を呼び出す際に `scheduling_method` 引数を設定することで、メソッドを指定できる）。  スケジューリング・ステージは通常、回路がターゲット・ベースに変換され、デバイスにマッピングされ、最適化された時点で使用される。  これらのパスは、回路内のすべてのアイドル時間を考慮することに重点を置いている。  高いレベルでは、スケジューリング・パスは、ゲート実行間のアイドル時間を考慮し、回路がバックエンドで実行される時間を検査するために、明示的に遅延命令を挿入すると考えることができる。\n",
        "\n",
        "以下に例を示します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "ae2d9390-5c26-46f3-9418-a684ba8a406a",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpiler-stages/extracted-outputs/ae2d9390-5c26-46f3-9418-a684ba8a406a-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "ghz = QuantumCircuit(5)\n",
        "ghz.h(0)\n",
        "ghz.cx(0, range(1, 5))\n",
        "\n",
        "\n",
        "# Use fake backend\n",
        "backend = GenericBackendV2(5)\n",
        "\n",
        "# Run with optimization level 3 and 'asap' scheduling pass\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3,\n",
        "    backend=backend,\n",
        "    scheduling_method=\"asap\",\n",
        "    seed_transpiler=1234,\n",
        ")\n",
        "\n",
        "\n",
        "circ = pass_manager.run(ghz)\n",
        "circ.draw(output=\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "442cb546-3463-4044-8406-1c68d371a2c9",
      "metadata": {},
      "source": [
        "![遅延指示回路](https://quantum.cloud.ibm.com/docs/images/guides/transpiler-stages/transpiler-16.avif)\n",
        "\n",
        "トランスパイラーは、各量子ビットのアイドル時間を考慮し、 `Delay` 。 回路のタイミングをよりよく知るために、 `timeline.draw()` ：\n",
        "\n",
        "![timeline.draw () 同じ回路の図](https://quantum.cloud.ibm.com/docs/images/guides/transpiler-stages/transpiler-17.svg)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0b214bba-1f0e-49fc-be7e-29ccb57fff8a",
      "metadata": {},
      "source": [
        "回路のスケジューリングには、解析と制約マッピングの2つのパートがあり、その後にパディング・パスが続く。  最初のパートでは、スケジューリング解析パス（デフォルトではこれは [`ALAPSchedulingAnalysis`](../api/qiskit/qiskit.transpiler.passes.ALAPScheduleAnalysis))を実行する必要があります。これは回路を解析し、回路内の各命令の開始時刻をスケジュールに記録します。  回路に初期スケジュールが設定されると、ターゲットとなるバックエンドのタイミング制約を考慮するために、追加のパスを実行することができる。  最後に [`PadDelay`](../api/qiskit/qiskit.transpiler.passes.PadDelay) または [`PadDynamicalDecoupling`](../api/qiskit/qiskit.transpiler.passes.PadDynamicalDecoupling) などのパディングパスが実行できる。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "62c19c54-6dcc-4025-b800-7a74be69808d",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * `generate_preset_passmanager` 機能の使い方を学ぶには、 [トランスピレーションのデフォルト設定と構成オプションの](defaults-and-configuration-options)トピックから始めてください。\n",
        "  * [パス マネージャーを使用したトランスパイルの](transpile-with-pass-managers)トピックでトランスパイルについて学習を続けます。\n",
        "  * [トランスパイラ設定の比較](/docs/guides/circuit-transpilation-settings)ガイドをお試しください。\n",
        "  * [Transpile API ドキュメント](https://docs.quantum-computing.ibm.com/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"
    },
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "state": {},
        "version_major": 2,
        "version_minor": 0
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}