{
  "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.2\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 보다 작으면 하나 또는 두 개의 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",
        "## 난수 생성 프로그램 시드(seed)\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 큐비트에 매핑하고, 회로의 두 번째 큐비트를 셔브룩의 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": [
        "레이아웃 객체를 지정하는 것 외에도 정수의 목록을 전달할 수 있는데, 목록의 $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",
        "  * [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": {
    "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
}