{
  "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.2\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",
        "키스킷 SDK의 맥락에서 변환은 입력 회로를 양자 디바이스에서 실행하기에 적합한 형태로 변환하는 과정을 의미합니다. 트랜스파일링은 일반적으로 트랜스파일러 패스라고 하는 일련의 단계로 이루어집니다. 회로는 각 트랜스파일러 패스에 의해 순차적으로 처리되며, 한 패스의 출력은 다음 패스의 입력이 됩니다. 예를 들어, 한 패스가 회로를 통과하여 연속된 모든 단일 큐비트 게이트 시퀀스를 병합한 다음 다음 패스에서 이러한 게이트를 대상 디바이스의 기본 집합으로 합성할 수 있습니다. 키스킷에 포함된 트랜스파일러 패스는 트랜스파일러의 [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` 메서드로 회로 또는 회로 목록을 전달합니다. 하다마드와 인접한 두 개의 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` 함수에 사용할 수 있는 인수에 대한 설명은 [번역 기본값 및 구성 옵션을](defaults-and-configuration-options) 참조하세요. `generate_preset_pass_manager` 의 인수는 의 인수가 [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile) 함수의 인자와 일치합니다.\n",
        "\n",
        "사전 설정된 패스 매니저가 요구 사항을 충족하지 않는 경우 (단계별) 패스 매니저 또는 트랜스필레이션 패스를 생성하여 트랜스필레이션을 사용자 지정하세요. 이 페이지의 나머지 부분에서는 패스 관리자를 만드는 방법에 대해 설명합니다. 트랜스파일링 패스를 만드는 방법에 대한 지침은 [나만의 트랜스파일러 패스 작성을](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": [
        "이 패스 매니저가 실제로 작동하는 모습을 보려면, 하다마드와 인접한 두 개의 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` 두 단계로 구성된 스테이지 패스 관리자를 생성합니다. `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",
        "  * [Compare 트랜스파일러 설정](/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
}