{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "5b6cbc5d-14d4-40c6-a702-0ce635c483d8",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"トランスパイラ向けの量子コンピュータを表現する\"\n",
        "description: \"トランスパイルのための結合マップ、基底ゲート、プロセッサエラーについて学ぶ\"\n",
        "---\n",
        "\n",
        "<span id=\"represent-quantum-computers-for-the-transpiler\" />\n",
        "\n",
        "# トランスパイラ向けの量子コンピュータを表現する\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "aed00912-17af-4e4c-8639-77957b314b98",
      "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": "9dbd70a7-3353-4286-aa6b-3547d7894f58",
      "metadata": {},
      "source": [
        "抽象回路を特定のQPU（量子プロセッシング・ユニット）上で動作するISA回路に変換するには、トランスパイラがQPUに関する特定の情報を必要とする。 この情報は、ジョブの投入を計画している `BackendV2` (またはレガシー `BackendV1`) オブジェクトと、バックエンドの `Target` 属性の2箇所にあります。\n",
        "\n",
        "* デバイスコンテナには、デバイス [`Target`](/docs/api/qiskit/qiskit.transpiler.Target) に関連するすべての制約が含まれます。これには、サポートされている命令セット、量子ビットの接続性、パルスやタイミング情報などが含まれます。\n",
        "* デフォルト `Target` で を [`Backend`](/docs/api/qiskit/qiskit.providers.BackendV2) 保持し、追加情報（例：）を含み、量子回路ジョブの提出 [`InstructionScheduleMap`](/docs/api/qiskit/1.4/qiskit.pulse.InstructionScheduleMap)インターフェースを提供する。\n",
        "\n",
        "また、特定のユースケースがある場合や、トランスパイラがより最適化された回路を生成するのに役立つと思われる場合など、トランスパイラが使用する情報を明示的に提供することもできます。\n",
        "\n",
        "トランスパイラが特定のハードウェアに最適な回路を生成する精度は、 `Target` または `Backend` がその制約に関する情報をどれだけ持っているかに依存します。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  基礎となる移調アルゴリズムの多くは確率的であるため、より良い回路が見つかる保証はない。\n",
        "</Admonition>\n",
        "\n",
        "このページでは、QPU情報をトランスパイラに渡すいくつかの例を紹介します。\n",
        "\n",
        "<span id=\"default-config\" />\n",
        "\n",
        "<span id=\"default-configuration\" />\n",
        "\n",
        "## デフォルト構成\n",
        "\n",
        "トランスパイラの最も単純な使い方は、 `Backend` または `Target` を提供することで、すべてのQPU情報を提供することである。 トランスパイラがどのように機能するかをよりよく理解するために、次のように回路を構成し、異なる情報でトランスパイルする。\n",
        "\n",
        "必要なライブラリをインポートし、QPUをインスタンス化する： 抽象回路を特定のプロセッサ上で動作するISA回路に変換するために、トランスパイラにはプロセッサに関する特定の情報が必要です。  通常、この情報は [`Backend`](/docs/api/qiskit/qiskit.providers.Backend#backend) または [`Target`](/docs/api/qiskit/qiskit.transpiler.Target#target) に格納され、それ以上の情報は必要ない。 ただし、特定のユースケースがある場合や、トランスパイラがより最適化された回路を生成するのに役立つと思われる場合など、トランスパイラが使用する情報を明示的に提供することもできます。\n",
        "\n",
        "このトピックでは、トランスパイラに情報を渡すいくつかの例を紹介します。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  これらの例では、 `qiskit_ibm_runtime`[`FakeSherbrooke`](/docs/api/qiskit-ibm-runtime/fake-provider-fake-sherbrooke#fakesherbrooke) モックバックエンドのターゲットを使用しています。  ただし、Qiskitと互換性のある実機またはシミュレータであれば、どのバックエンドでも試すことができます。  実際の結果は異なる場合があります。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "a52d0681-5436-4d7a-8d45-9832472e59ca",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "target = backend.target"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4064b5ad-8a3a-462b-ae30-29576230c084",
      "metadata": {},
      "source": [
        "回路例では [`efficient_su2`](/docs/api/qiskit/qiskit.circuit.library.efficient_su2) のインスタンスを使用する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "97f9acc1-ac53-4025-b413-485777932a9b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/represent-quantum-computers/extracted-outputs/97f9acc1-ac53-4025-b413-485777932a9b-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import efficient_su2\n",
        "\n",
        "qc = efficient_su2(12, entanglement=\"circular\", reps=1)\n",
        "\n",
        "qc.draw(\"mpl\")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "b133229c-0146-4feb-a366-548d175b858e",
      "metadata": {},
      "source": [
        "この例では、デフォルトの設定を使用して、 `backend` の `target` にトランスパイルしている。これは、回路をバックエンドで動作するものに変換するために必要なすべての情報を提供するものである。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "4b81fb9d-d199-45c5-b119-c1f0b973afe9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/represent-quantum-computers/extracted-outputs/4b81fb9d-d199-45c5-b119-c1f0b973afe9-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, target=target, seed_transpiler=12345\n",
        ")\n",
        "qc_t_target = pass_manager.run(qc)\n",
        "qc_t_target.draw(\"mpl\", idle_wires=False, fold=-1)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2ad3848d",
      "metadata": {},
      "source": [
        "この例は、このトピックの後半セクションで、最適な回路構築のためにトランスパイラに渡すべき必須情報として、結合マップとサポートされる命令セットが挙げられることを示すために使用される。 QPUは通常、タイミングやスケジューリングなど、渡されないその他の情報についてデフォルト設定を選択できます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "956f1b7a-80b4-4cda-9ecf-6057f560deb9",
      "metadata": {},
      "source": [
        "<span id=\"coupling-map\" />\n",
        "\n",
        "## 結合マップ\n",
        "\n",
        "カップリング・マップは、どの量子ビットが連結しているかを示すグラフであり、したがってそれらの間に2量子ビットのゲートがある。 つまり、2量子ビットのゲートは一方向にしか進まない。 しかしトランスパイラーは、1量子ビットのゲートを追加することで、いつでもゲートの方向を反転させることができる。 SWAPゲートを導入して量子情報を移動させれば、接続性が制限されていても、抽象的な量子回路は常にこのグラフ上で表現できる。\n",
        "\n",
        "抽象回路から得られる量子ビットは*仮想量子ビットと*呼ばれ、結合マップ上の量子ビットは*物理量子ビット*である。 トランスパイラーは、仮想量子ビットと物理量子ビットの間のマッピングを提供する。 移籍の最初のステップのひとつである*レイアウト*段階で、このマッピングが行われる。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  ルーティング・ステージは*レイアウト・ステージ* （実際の量子ビットを選択するステージ）とデフォルトでは絡み合っているが、このトピックでは簡単にするために別々のステージとして扱う。 配線とレイアウトの組み合わせは、 *量子ビット・マッピングと*呼ばれる。  これらのステージの詳細については、 [Transpiler stagesの](transpiler-stages)トピックを参照してください。\n",
        "</Admonition>\n",
        "\n",
        "`coupling_map` キーワードを引数に渡すと、トランスパイラへの影響を見ることができる：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "ec354bee-e06b-42ea-a117-6c1a9308ca73",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/represent-quantum-computers/extracted-outputs/ec354bee-e06b-42ea-a117-6c1a9308ca73-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "coupling_map = target.build_coupling_map()\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=0, coupling_map=coupling_map, seed_transpiler=12345\n",
        ")\n",
        "qc_t_cm_lv0 = pass_manager.run(qc)\n",
        "qc_t_cm_lv0.draw(\"mpl\", idle_wires=False, fold=-1)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0d3fe7d4-3a40-423d-975f-b4de6613efe9",
      "metadata": {},
      "source": [
        "上に示したように、複数のSWAPゲート（それぞれ3つのCXゲートで構成）が挿入されており、現在のデバイスでは多くのエラーが発生する。 実際の量子ビットトポロジー上でどの量子ビットが選択されているかを見るには、Qiskit Visualizationsの `plot_circuit_layout` ：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "9be74535-ed36-4d51-afeb-ee53c3f8a046",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/represent-quantum-computers/extracted-outputs/9be74535-ed36-4d51-afeb-ee53c3f8a046-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import plot_circuit_layout\n",
        "\n",
        "plot_circuit_layout(qc_t_cm_lv0, backend, view=\"physical\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "633744e3-b9e7-4333-ac7b-0089f28e9c27",
      "metadata": {},
      "source": [
        "これは、我々の仮想量子ビット0-11が物理量子ビット0-11のラインに些細なことでマッピングされたことを示している。 `optimization_level=1`ルーティングが必要な場合は `VF2Layout` 。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "8035fd05-f7cd-4151-b19a-4968202246e6",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/represent-quantum-computers/extracted-outputs/8035fd05-f7cd-4151-b19a-4968202246e6-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, coupling_map=coupling_map, seed_transpiler=12345\n",
        ")\n",
        "qc_t_cm_lv1 = pass_manager.run(qc)\n",
        "qc_t_cm_lv1.draw(\"mpl\", idle_wires=False, fold=-1)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "217c75f4-4c86-46bb-9a34-b451ff4743ef",
      "metadata": {},
      "source": [
        "これでSWAPゲートが挿入されなくなり、選択される物理量子ビットは `target` 。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "25d9fac3-abda-4b2d-81b4-351dc0772722",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/represent-quantum-computers/extracted-outputs/25d9fac3-abda-4b2d-81b4-351dc0772722-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import plot_circuit_layout\n",
        "\n",
        "plot_circuit_layout(qc_t_cm_lv1, backend, view=\"physical\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "db62df0f",
      "metadata": {},
      "source": [
        "これでレイアウトはリング状になった。  このレイアウトは回路の接続性を尊重しているため、SWAPゲートは存在せず、実行回路としてははるかに優れている。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f62e0541",
      "metadata": {},
      "source": [
        "<span id=\"supported-instructions\" />\n",
        "\n",
        "## サポートされている命令\n",
        "\n",
        "すべての量子コンピュータは、限られた命令セットをサポートする。  回路内のすべてのゲートは、この集合の要素に変換されなければならない。 このゲートセットは、単一量子ビットゲートと二量子ビットゲートで構成されるべきであり、それらが普遍ゲートセットを提供する。つまり、あらゆる量子操作がそれらのゲートに分解できることを意味する。  [これは](/docs/api/qiskit/qiskit.transpiler.passes.BasisTranslator) BasisTranslatorによって行われ、この情報を提供するためにトランスパイラへのキーワード引数として指定できます `basis_gates` 。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "4445ff03",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "['sx', 'switch_case', 'if_else', 'rz', 'for_loop', 'ecr', 'id', 'reset', 'measure', 'x', 'delay']\n"
          ]
        }
      ],
      "source": [
        "basis_gates = list(target.operation_names)\n",
        "print(basis_gates)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6e9aed06",
      "metadata": {},
      "source": [
        "のデフォルトの1量子 `FakeSherbrooke` ビットゲートは `rz`、 `x`、 であり `sx`、デフォルトの2量子ビットゲートは （エコー・クロス `ecr` 共鳴）である。 CXゲートはゲート `ecr` から構成されているため、QPUによっては `ecr` が2量子ビット基底ゲートとして指定される一方、他のQPUでは `cx` がデフォルトとなっている。 ゲート `ecr` は、ゲートの\\*絡み合う \\*`cx` 部分である。 制御ゲートに加えて、および `measurement` 命令 `delay` もあります。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  QPUにはデフォルトの基底ゲートがありますが、命令を提供するかパルスゲートを追加すれば、任意のゲートを選択できます（ [トランスペイラパスの作成を](/docs/guides/custom-transpiler-pass)参照） デフォルトの基底ゲートとは、QPU上でキャリブレーションが完了しているゲートを指すため、追加の命令/パルスゲートを提供する必要はない。 例えば、一部のQPUではデフォルトの2 `cx` 量子ビットゲートはであり、他のQPUでは `ecr` である。 詳細については、利用可能な[ネイティブゲートと演算](/docs/guides/qpu-information#native-gates)の一覧を参照してください。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "313e4743",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/represent-quantum-computers/extracted-outputs/313e4743-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1,\n",
        "    coupling_map=coupling_map,\n",
        "    basis_gates=basis_gates,\n",
        "    seed_transpiler=12345,\n",
        ")\n",
        "qc_t_cm_bg = pass_manager.run(qc)\n",
        "qc_t_cm_bg.draw(\"mpl\", idle_wires=False, fold=-1)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b0195ba6",
      "metadata": {},
      "source": [
        "オブジェクト `CXGate` はゲートと単一量子ビット `ecr` 基底ゲートに分解されていることに注意してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "eb3f5aff-3ca2-4688-a59e-da05c724ef09",
      "metadata": {},
      "source": [
        "<span id=\"device-error-rates\" />\n",
        "\n",
        "## デバイスエラー率\n",
        "\n",
        "`Target` クラスは、デバイスに対する操作のエラー率に関する情報を含むことができる。\n",
        "例えば、以下のコードはqubit 1と0の間のエコー交差共鳴（ECR）ゲートのプロパティを取得します（ECRゲートは指向性であることに注意してください）：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "38aa1eca-a6aa-4db9-af36-66289e2059d2",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "InstructionProperties(duration=5.333333333333332e-07, error=0.007494257741828603)"
            ]
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "target[\"ecr\"][(1, 0)]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "90cca3a8-ca25-4795-a22f-57ba6d8cfcaa",
      "metadata": {},
      "source": [
        "出力には、ゲートの継続時間（秒）とエラー率が表示される。 トランスパイラにエラー情報を提供するには、上記の `basis_gates` と `coupling_map` を使ってターゲットモデルを構築し、バックエンド `FakeSherbrooke` からのエラー値を入力します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "e92c39d7-4aab-4657-aa9a-1b8b5788cb58",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import Target\n",
        "from qiskit.circuit.controlflow import IfElseOp, SwitchCaseOp, ForLoopOp\n",
        "\n",
        "err_targ = Target.from_configuration(\n",
        "    basis_gates=basis_gates,\n",
        "    coupling_map=coupling_map,\n",
        "    num_qubits=target.num_qubits,\n",
        "    custom_name_mapping={\n",
        "        \"if_else\": IfElseOp,\n",
        "        \"switch_case\": SwitchCaseOp,\n",
        "        \"for_loop\": ForLoopOp,\n",
        "    },\n",
        ")\n",
        "\n",
        "for i, (op, qargs) in enumerate(target.instructions):\n",
        "    if op.name in basis_gates:\n",
        "        err_targ[op.name][qargs] = target.instruction_properties(i)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "433f2772-b397-42ab-b3a5-a44a85192f3c",
      "metadata": {},
      "source": [
        "新しいターゲット `err_targ` をターゲットとしたトランスパイル：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "f1e270c4-e2cc-487e-a050-4180bc321b0b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/represent-quantum-computers/extracted-outputs/f1e270c4-e2cc-487e-a050-4180bc321b0b-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, target=err_targ, seed_transpiler=12345\n",
        ")\n",
        "qc_t_cm_bg_et = pass_manager.run(qc)\n",
        "qc_t_cm_bg_et.draw(\"mpl\", idle_wires=False, fold=-1)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f8b516be-805d-4d0b-92f9-44d3fbe3b51f",
      "metadata": {},
      "source": [
        "ターゲットにはエラー情報が含まれているため、 `VF2PostLayout` パスでは使用する最適な量子ビットを見つけようとし、その結果、同じ物理量子ビットで元々見つかっていた回路と同じ回路ができる。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e815a158-c77a-4e82-bebe-1710d0ae4f1f",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * [トランスパイラルのデフォルト設定と構成オプション](defaults-and-configuration-options)を理解する。\n",
        "  * [トランスピレーションでよく使用されるパラメータ](common-parameters) 」のトピックを確認してください。\n",
        "  * [トランスパイラ設定の比較](/docs/guides/circuit-transpilation-settings#compare-transpiler-settings)ガイドをお試しください。\n",
        "  * [Transpile 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
}