{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "ba5ec3d7-2a51-4ffa-b270-cbe18e98a454",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"AI 기반 트랜스파일러 통과\"\n",
        "description: \"AI 트랜스파일러 패스란 무엇이며 어떻게 사용하나요?\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore Eprint */}\n",
        "\n",
        "<span id=\"ai-powered-transpiler-passes\" />\n",
        "\n",
        "# AI 기반 트랜스파일러 통과\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3c78c2c0-7afc-4cf3-988d-9e044b5d0fca",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7244dd08-62a0-4c10-8c0d-0bd01eebe68f",
      "metadata": {},
      "source": [
        "AI 기반 트랜스파일러 패스는 일부 트랜스파일링 작업에서 “기존” Qiskit 패스를 그대로 대체할 수 있는 패스입니다. 이들은 기존 휴리스틱 알고리즘(예: 더 낮은 탐색 깊이와 더 적은 CNOT 횟수)보다 더 나은 결과를 내는 경우가 많을 뿐만 아니라, 부울 만족성 솔버와 같은 최적화 알고리즘보다 훨씬 빠릅니다. AI 트랜스파일러는 사용자의 로컬 환경에서 실행됩니다.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  AI 기반 트랜스파일러 패스는 베타 릴리스 상태이며 변경될 수 있습니다.\n",
        "  피드백이 있거나 개발자 팀에 연락하고 싶다면 이 [키스킷 슬랙 워크스페이스 채널을](https://qiskit.slack.com/archives/C06KF8YHUAU) 이용하세요.\n",
        "</Admonition>\n",
        "\n",
        "현재 사용 가능한 패스는 다음과 같습니다:\n",
        "\n",
        "**라우팅 패스**\n",
        "\n",
        "* `AIRouting`: 레이아웃 선택 및 회로 라우팅\n",
        "\n",
        "**회로 합성 패스**\n",
        "\n",
        "* `AICliffordSynthesis`: 클리포드 회로 합성\n",
        "* `AILinearFunctionSynthesis`: 선형 함수 회로 합성\n",
        "* `AIPermutationSynthesis`: 순열 회로 합성\n",
        "\n",
        "AI 트랜스파일러 패스를 사용하려면 먼저 해당 `qiskit-ibm-transpiler` 패키지를 설치하십시오. 사용 가능한 다양한 옵션에 대한 자세한 내용은 [qiskit-ibm-transpiler API](/docs/api/qiskit-ibm-transpiler) 문서를 참조하십시오.\n",
        "\n",
        "```sh\n",
        "pip install qiskit-ibm-transpiler\n",
        "```\n",
        "\n",
        "<span id=\"ai-routing-pass\" />\n",
        "\n",
        "## AI 라우팅 패스\n",
        "\n",
        "`AIRouting` 패스는 레이아웃 단계와 라우팅 단계의 역할을 모두 수행합니다. `PassManager` 내에서 다음과 같이 사용할 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c104fcd0-4a85-4927-b026-93f4a6fdab51",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import PassManager\n",
        "from qiskit.circuit.library import efficient_su2\n",
        "from qiskit_ibm_transpiler.ai.routing import AIRouting\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "import logging\n",
        "\n",
        "backend = QiskitRuntimeService().backend(\"ibm_fez\")\n",
        "ai_passmanager = PassManager(\n",
        "    [\n",
        "        AIRouting(\n",
        "            backend=backend,\n",
        "            optimization_level=2,\n",
        "            layout_mode=\"optimize\",\n",
        "        )\n",
        "    ]\n",
        ")\n",
        "\n",
        "\n",
        "circuit = efficient_su2(101, entanglement=\"circular\", reps=1)\n",
        "logging.getLogger(\n",
        "    \"qiskit_ibm_transpiler.wrappers.ai_local_synthesis\"\n",
        ").setLevel(logging.WARNING)\n",
        "transpiled_circuit = ai_passmanager.run(circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "28c2cfa3-e4d8-48d5-9d6c-b02fcf548ef1",
      "metadata": {},
      "source": [
        "여기서 `backend` 은 라우팅할 커플링 맵을 결정하고, `optimization_level` (1, 2 또는 3)은 프로세스에 소요되는 계산 노력을 결정하며(일반적으로 더 나은 결과를 제공하지만 더 오래 걸림), `layout_mode` 은 레이아웃 선택을 처리하는 방법을 지정합니다.\n",
        "`layout_mode` 에는 다음과 같은 옵션이 포함되어 있습니다:\n",
        "\n",
        "* `keep`: 이전 트랜스파일러 패스에서 설정한 레이아웃을 존중합니다(설정하지 않은 경우 기본 레이아웃 사용). 일반적으로 디바이스의 특정 큐비트에서 회로를 실행해야 하는 경우에만 사용됩니다. 최적화를 위한 여지가 적기 때문에 종종 더 나쁜 결과를 낳습니다.\n",
        "* `improve`: 이전 트랜스파일러 패스에서 설정한 레이아웃을 시작점으로 사용합니다. 예를 들어 장치의 커플링 맵을 거의 따르는 방식으로 구축된 회로와 같이 레이아웃에 대한 초기 추측이 좋은 경우에 유용합니다. `AIRouting` 패스와 함께 다른 특정 레이아웃 패스를 사용해보고 싶은 경우에도 유용합니다.\n",
        "* `optimize`: 기본 모드입니다. 레이아웃을 잘 추측할 수 없는 일반적인 회로에 가장 적합합니다. 이 모드는 이전 레이아웃 선택을 무시합니다.\n",
        "\n",
        "<span id=\"ai-circuit-synthesis-passes\" />\n",
        "\n",
        "## AI 회로 합성 통과\n",
        "\n",
        "AI 회로 합성 패스를 사용하면 다양한 회로 유형 ([클리포드](/docs/api/qiskit/qiskit.quantum_info.Clifford), [선형 함수](/docs/api/qiskit/qiskit.circuit.library.LinearFunction), [순열](/docs/api/qiskit/qiskit.circuit.library.Permutation#permutation), 파울리 네트워크)의 조각을 재합성하여 최적화할 수 있습니다. 합성 패스를 사용하는 일반적인 방법은 다음과 같습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "8655f68d-f88a-4a15-ad89-f39f2ba3fe71",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import PassManager\n",
        "\n",
        "from qiskit_ibm_transpiler.ai.routing import AIRouting\n",
        "from qiskit_ibm_transpiler.ai.synthesis import AILinearFunctionSynthesis\n",
        "from qiskit_ibm_transpiler.ai.collection import CollectLinearFunctions\n",
        "from qiskit.circuit.library import efficient_su2\n",
        "\n",
        "ibm_kingston = QiskitRuntimeService().backend(\"ibm_kingston\")\n",
        "ai_passmanager = PassManager(\n",
        "    [\n",
        "        AIRouting(\n",
        "            backend=ibm_kingston,\n",
        "            optimization_level=3,\n",
        "            layout_mode=\"optimize\",\n",
        "            local_mode=True,\n",
        "        ),  # Route circuit\n",
        "        CollectLinearFunctions(),  # Collect Linear Function blocks\n",
        "        AILinearFunctionSynthesis(\n",
        "            backend=ibm_kingston, local_mode=True\n",
        "        ),  # Re-synthesize Linear Function blocks\n",
        "    ]\n",
        ")\n",
        "\n",
        "circuit = efficient_su2(10, entanglement=\"full\", reps=1)\n",
        "\n",
        "transpiled_circuit = ai_passmanager.run(circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "779f180e-c29f-4a96-b4b0-e3d2a4c8a1b9",
      "metadata": {},
      "source": [
        "합성은 디바이스의 커플링 맵을 존중하므로 회로를 방해하지 않고 다른 라우팅 패스를 안전하게 실행할 수 있으므로 전체 회로가 여전히 디바이스 제한을 따릅니다. 기본적으로 합성은 합성된 하위 회로가 원본보다 개선된 경우에만 원본 하위 회로를 대체하지만(현재는 CNOT 수만 확인), `replace_only_if_better=False` 을 설정하여 항상 회로를 대체하도록 강제할 수 있습니다.\n",
        "\n",
        "다음 합성 패스는 `qiskit_ibm_transpiler.ai.synthesis` 에서 사용할 수 있습니다:\n",
        "\n",
        "* *AICliffordSynthesis* : [클리포드](/docs/api/qiskit/qiskit.quantum_info.Clifford) 회로( `H`, `S`, `CX` 게이트 블록)를 합성합니다. 현재 최대 9개의 큐비트 블록이 있습니다.\n",
        "* *AILinearFunctionSynthesis* : [선형 함수](/docs/api/qiskit/qiskit.circuit.library.LinearFunction) 회로( `CX` 및 `SWAP` 게이트 블록)를 위한 합성입니다. 현재 최대 9개의 큐비트 블록이 있습니다.\n",
        "* *AIPermutationSynthesis* : [순열](/docs/api/qiskit/qiskit.circuit.library.Permutation#permutation) 회로( `SWAP` 게이트 블록)에 대한 합성. 현재 65, 33, 27 큐비트 블록을 사용할 수 있습니다.\n",
        "* *AIPauliNetworkSynthesis* : 폴리 네트워크 회로( `H`, `S`, `SX`, `CX`, `RX`, `RY` 및 `RZ` 게이트 블록)에 대한 합성. 현재 최대 6개의 큐비트 블록이 있습니다.\n",
        "\n",
        "지원되는 블록의 크기를 점차 늘려나갈 예정입니다.\n",
        "\n",
        "모든 패스는 스레드 풀을 사용하여 여러 요청을 병렬로 전송합니다. 기본적으로 최대 스레드 수는 코어 수에 4개를 더한 값입니다( `ThreadPoolExecutor` Python 객체의 기본값). 그러나 전달 인스턴스화 시 `max_threads` 인수를 사용하여 고유한 값을 설정할 수 있습니다. 예를 들어, 다음 줄은 최대 20개의 스레드를 사용할 수 있는 `AILinearFunctionSynthesis` 패스를 인스턴스화합니다.\n",
        "\n",
        "```python\n",
        "AILinearFunctionSynthesis(backend=ibm_torino, max_threads=20)  # Re-synthesize Linear Function blocks using 20 threads max\n",
        "```\n",
        "\n",
        "환경 변수 `AI_TRANSPILER_MAX_THREADS` 를 원하는 최대 스레드 수로 설정하면 그 이후에 인스턴스화된 모든 합성 패스는 해당 값을 사용합니다.\n",
        "\n",
        "AI 합성 패스가 하위 회로를 합성하려면 커플링 맵의 연결된 서브그래프 위에 놓여야 합니다(블록을 수집하기 전에 라우팅 패스를 사용하는 것도 한 가지 방법이지만 이 방법만 있는 것은 아닙니다). 합성 패스는 특정 서브그래프가 지원되는지 자동으로 확인하고, 그렇지 않은 경우 경고를 표시하고 원래 서브회로를 변경하지 않습니다.\n",
        "\n",
        "`qiskit_ibm_transpiler.ai.collection` 에서 임포트할 수 있는 클리포드, 선형 함수 및 퍼뮤테이션에 대한 다음 커스텀 컬렉션 패스도 합성 패스를 보완합니다:\n",
        "\n",
        "* *수집 클리포드* : 클리포드 블록을 `Instruction` 오브젝트로 수집하고 합성 후 비교할 원본 서브회로를 저장합니다.\n",
        "* *수집선형함수* : `SWAP` 및 `CX` 블록을 `LinearFunction` 객체로 수집하고 합성 후 비교하기 위해 원본 하위 회로를 저장합니다.\n",
        "* *콜렉트퍼뮤테이션* : `SWAP` 회로의 블록을 `Permutations` 으로 수집합니다.\n",
        "* *폴리 네트워크 수집* : 폴리 네트워크 블록을 수집하고 합성 후 비교할 원본 서브 회로를 저장합니다.\n",
        "\n",
        "이러한 커스텀 컬렉션 패스는 수집된 하위 회로의 크기를 제한하여 AI 기반 합성 패스에서 지원되도록 합니다. 따라서 전반적인 최적화를 위해 라우팅이 통과한 후 합성이 통과하기 전에 사용하는 것이 좋습니다.\n",
        "\n",
        "<span id=\"hybrid-heuristic-ai-circuit-transpilation\" />\n",
        "\n",
        "## 하이브리드 휴리스틱-AI 회로 트랜스파일레이션\n",
        "\n",
        "`qiskit-ibm-transpiler` 에서 키스킷의 휴리스틱과 AI 기반 트랜스파일러 패스의 장점을 결합한 하이브리드 패스 매니저를 구성할 수 있습니다. 이 기능은 키스킷 `generate_pass_manager` 메서드와 유사하게 작동합니다. 일반적인 사용 방법( `generate_ai_pass_manager` )은 다음과 같습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "2f5bbf22-22cd-46fa-885c-851f769552f0",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_transpiler import generate_ai_pass_manager\n",
        "from qiskit.circuit.library import efficient_su2\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "\n",
        "backend = QiskitRuntimeService().backend(\"ibm_kingston\")\n",
        "kingston_coupling_map = backend.coupling_map\n",
        "\n",
        "\n",
        "su2_circuit = efficient_su2(101, entanglement=\"circular\", reps=1)\n",
        "\n",
        "ai_transpiler_pass_manager = generate_ai_pass_manager(\n",
        "    coupling_map=kingston_coupling_map,\n",
        "    ai_optimization_level=3,\n",
        "    optimization_level=3,\n",
        "    ai_layout_mode=\"optimize\",\n",
        ")\n",
        "\n",
        "ai_su2_transpiled_circuit = ai_transpiler_pass_manager.run(su2_circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7f34294b-c520-439a-b1d7-2962af07aced",
      "metadata": {},
      "source": [
        "이 예제에서는 다음 옵션이 사용됩니다:\n",
        "\n",
        "* `coupling_map` - 트랜스필레이션에 사용할 커플링 맵을 지정합니다.\n",
        "* `ai_optimization_level` - PassManager 의 AI 구성 요소에 사용할 최적화 수준(1\\~3)을 지정합니다.\n",
        "* `optimization_level` - PassManager 의 휴리스틱 구성 요소에 대해 회로에서 수행할 최적화의 양을 지정합니다.\n",
        "* `ai_layout_mode` - PassManager 의 AI 라우팅 부분이 레이아웃을 처리하는 방법을 지정합니다. 이 `ai_layout_mode` 매개변수에 대한 구성 옵션을 검토하려면 [AI 라우팅 패스](#ai-routing-pass) 섹션을 참조하세요.\n",
        "\n",
        "<span id=\"citation\" />\n",
        "\n",
        "## 인용\n",
        "\n",
        "인용\n",
        "연구에서 이 `qiskit-ibm-transpiler` 패키지의 AI 기반 기능을 사용할 경우, 다음의 권장 인용 형식을 따르십시오:\n",
        "\n",
        "```\n",
        "@misc{2405.13196,\n",
        "Author = {David Kremer and Victor Villar and Hanhee Paik and Ivan Duran and Ismael Faro and Juan Cruz-Benito},\n",
        "Title = {Practical and efficient quantum circuit synthesis and transpiling with Reinforcement Learning},\n",
        "Year = {2024},\n",
        "Eprint = {arXiv:2405.13196},\n",
        "}\n",
        "```\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": 4
}