{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "dde95705",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"성과 관리 - Q-CTRL Fire Opal의 Qiskit 함수\"\n",
        "description: \"Q-CTRL의 Fire Opal 성능 관리를 통해 자동화된 오류 억제 적용\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore fontsize, Mundada, Yamauchi, supersymmetric, Paterakis, Gharibyan */}\n",
        "\n",
        "<span id=\"performance-management-a-qiskit-function-by-q-ctrl-fire-opal\" />\n",
        "\n",
        "# 성과 관리: Q-CTRL Fire Opal의 Qiskit 함수\n",
        "\n",
        "*[API 참조](/docs/api/functions/q-ctrl-performance-management) 보기*\n",
        "\n",
        "<Admonition type=\"note\" title=\"참고\">\n",
        "  키스킷 기능은 IBM 퀀텀 프리미엄 요금제, 플렉스 요금제 및 온프레미스( IBM 퀀텀 플랫폼 API를 통해) 요금제 사용자에게만 제공되는 실험적 기능입니다. 프리뷰 릴리스 상태이며 변경될 수 있습니다.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ace2ed13",
      "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.3.1\n",
        "    qiskit-ibm-runtime~=0.45.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c1732b45",
      "metadata": {},
      "source": [
        "<span id=\"overview\" />\n",
        "\n",
        "## 개요\n",
        "\n",
        "파이어 오팔 성능 관리를 사용하면 양자 하드웨어 전문가가 아니더라도 누구나 손쉽게 대규모로 양자 컴퓨터에서 의미 있는 결과를 얻을 수 있습니다. 파이어 오팔 성능 관리로 회로를 실행하면 AI 기반 오류 억제 기술이 자동으로 적용되어 더 많은 게이트와 큐비트로 더 큰 문제를 확장할 수 있습니다. 이 접근 방식은 추가 오버헤드 없이 정답에 도달하는 데 필요한 샷 수를 줄여주므로 컴퓨팅 시간과 비용을 크게 절감할 수 있습니다.\n",
        "\n",
        "성능 관리는 오류를 억제하고 노이즈가 많은 하드웨어에서 정답을 얻을 확률을 높입니다. 즉, 신호 대 잡음비가 증가합니다. 다음 이미지는 10큐비트 양자 푸리에 변환 알고리즘의 경우 성능 관리를 통해 정확도를 높이면 추가 촬영의 필요성을 줄일 수 있는 방법을 보여줍니다. 기본값(`QiskitRuntime` 샘플러, `optimization_level`=3 및 `resilience_level`=1, `ibm_sherbrooke`)은 170,000개의 샷이 필요한 반면, Q-CTRL은 30개의 샷만으로 99% 신뢰도 임계값에 도달할 수 있습니다. 정답을 더 빨리 얻음으로써 컴퓨팅 런타임을 크게 절약할 수 있습니다.\n",
        "\n",
        "![개선된 런타임 시각화](https://quantum.cloud.ibm.com/docs/images/guides/qctrl-performance-management/achieve_more.svg)\n",
        "\n",
        "성능 관리 기능은 어떤 알고리즘과도 함께 사용할 수 있으며, 표준 [IBM Quantum 기본](/docs/guides/primitives) 기능을 대신하여 손쉽게 활용할 수 있습니다. 배후에서는 여러 오류 억제 기법이 서로 연동되어 런타임 시 오류가 발생하지 않도록 방지합니다. Fire Opal의 모든 파이프라인 방식은 미리 구성되어 있으며 알고리즘에 구애받지 않으므로, 설치 즉시 항상 최상의 성능을 발휘합니다.\n",
        "\n",
        "성과 관리에 액세스하려면 [Q-CTRL에 문의하세요](https://form.typeform.com/to/uOAVDnGg?typeform-source=q-ctrl.com).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f761442",
      "metadata": {},
      "source": [
        "<span id=\"description\" />\n",
        "\n",
        "## 설명\n",
        "\n",
        "Fire Opal Performance Management에는 IBM Quantum 의 기본 요소와 유사한 두 가지 실행 옵션이 있으므로, Q-CTRL 샘플러와 에스티메이터를 쉽게 교체하여 사용할 수 있습니다. 성과 관리 기능을 사용하는 일반적인 워크플로는 다음과 같습니다\n",
        "\n",
        "1. 회로(및 추정기의 경우 연산자)를 정의합니다.\n",
        "2. 회로를 실행합니다.\n",
        "3. 결과를 검색\n",
        "\n",
        "하드웨어 노이즈를 줄이기 위해 Fire Opal은 다음 이미지에 설명된 다양한 AI 기반 오류 억제 기술을 사용합니다. Fire Opal을 사용하면 전체 파이프라인을 구성할 필요 없이 완전히 자동화할 수 있습니다.\n",
        "\n",
        "파이어 오팔의 파이프라인은 양자 런타임 증가나 추가 물리적 큐비트와 같은 추가 오버헤드가 필요하지 않습니다. 클래식 처리 시간은 여전히 요소로 남아 있습니다(추정치는 [벤치마크](#benchmarks) 섹션을 참조하세요. 여기서 '총 시간'은 클래식 처리와 퀀텀 처리를 모두 반영합니다). 샘플링 형태의 오버헤드가 필요한 오류 완화와 달리, Fire Opal의 오류 억제는 게이트와 펄스 레벨 모두에서 작동하여 다양한 노이즈 원인을 해결하고 오류 발생 가능성을 방지합니다. 오류를 방지하면 비용이 많이 드는 후처리가 필요하지 않습니다.\n",
        "\n",
        "다음 이미지는 Fire Opal 성능 관리에서 자동화한 오류 억제 방법을 보여줍니다.\n",
        "\n",
        "![오류 억제 파이프라인의 시각화](https://quantum.cloud.ibm.com/docs/images/guides/qctrl-performance-management/error_suppression.svg)\n",
        "\n",
        "이 함수는 Sampler와 Estimator라는 두 가지 기본 함수를 제공하며, 두 함수의 입력과 출력은 [IBM Quantum V2](/docs/guides/primitive-input-output#pubs) 에 명시된 기본 함수 사양을 확장한 것입니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "64534d1a",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "## 벤치마크\n",
        "\n",
        "[공개된 알고리즘 벤치마킹](https://journals.aps.org/prapplied/abstract/10.1103/PhysRevApplied.20.024034) 결과에 따르면 번스타인-바지라니, 양자 푸리에 변환, 그로버 검색, 양자 근사 최적화 알고리즘, 가변 양자 아이겐솔버 등 다양한 알고리즘에서 성능이 크게 개선된 것으로 나타났습니다. 이 섹션의 나머지 부분에서는 실행할 수 있는 알고리즘 유형과 예상 성능 및 런타임에 대한 자세한 내용을 설명합니다.\n",
        "\n",
        "다음의 독립적인 연구는 Q-CTRL의 성능 관리가 어떻게 기록적인 규모의 알고리즘 연구를 가능하게 하는지를 보여줍니다:\n",
        "\n",
        "* [네트워크 서비스 장애 진단을 위한 매개변수화된 에너지 효율적인 양자 커널](https://arxiv.org/abs/2405.09724v1) - 최대 50큐비트 양자 커널 학습\n",
        "* [대규모 데모를 위한 텐서 기반 양자 위상차 추정](https://arxiv.org/abs/2408.04946) - 최대 33큐비트 양자 위상 추정\n",
        "* [양자 ML을 위한 계층적 학습: 대규모 가변 양자 회로를 위한 새로운 훈련 기술](https://arxiv.org/abs/2311.12929) - 최대 21큐비트 양자 데이터 로딩 가능\n",
        "\n",
        "다음 표는 `ibm_fez` 에서 수행한 이전 벤치마킹의 정확도 및 런타임에 대한 대략적인 가이드를 제공합니다. 다른 기기에서의 성능은 다를 수 있습니다. 사용 시간은 회로당 10,000회 촬영을 가정한 것입니다. 표시된 '큐비트 수'는 엄격한 제한이 아니라 매우 일관된 솔루션 정확도를 기대할 수 있는 대략적인 임계값을 나타냅니다. 더 큰 규모의 문제도 성공적으로 해결되었으며, 이러한 한계를 넘어서는 테스트가 권장됩니다.\n",
        "\n",
        "| 예                         | 큐비트 수 | 정확도      | 정확도 측정                                             | 총시간(초)  | 런타임 사용량(초) | 프리미티브(모드) |\n",
        "| ------------------------- | ----- | -------- | -------------------------------------------------- | ------- | ---------- | --------- |\n",
        "| 번스타인-바지라니                 | 50Q   | 100%로    | 성공률(정답이 가장 많은 비트 문자열인 실행의 백분율)                     | 1,000만  | 8          | 샘플러       |\n",
        "| 양자 푸리에 변환                 | 30Q   | 100%로    | 성공률(정답이 가장 많은 비트 문자열인 실행의 백분율)                     | 1,000만  | 8          | 샘플러       |\n",
        "| 양자 위상 추정                  | 30Q   | 99.9998% | 발견된 각도의 정확도: `1- abs(real_angle - angle_found)/pi` | 1,000만  | 8          | 샘플러       |\n",
        "| 양자 시뮬레이션: 아이싱 모델(15단계)    | 20Q   | 99.775%  | $A$ (아래 정의)                                        | 60(단계당) | 15(단계당)    | 추정자       |\n",
        "| 양자 시뮬레이션 2: 분자 역학(20개 시점) | 34Q   | 96.78%   | $A_{mean}$ (아래 정의)                                 | 10(시점당) | 6(시점별)     | 추정자       |\n",
        "\n",
        "기대값 측정의 정확도 정의 - $A$ 메트릭은 다음과 같이 정의됩니다:\n",
        "\n",
        "$$\n",
        "A = 1 - \\frac{|\\epsilon^{ideal} - \\epsilon^{meas}|}{\\epsilon^{ideal}_{max} - \\epsilon^{ideal}_{min}},\n",
        "$$\n",
        "\n",
        "여기서 $\\epsilon^{ideal}$ = 이상적인 기대값, $\\epsilon^{meas}$ = 측정된 기대값, $\\epsilon^{ideal}_{max} $ = 이상적인 최대값, $\\epsilon^{ideal}_{min}$ = 이상적인 최소값. $A_{mean}$ 는 여러 측정값에 대한 $A$ 값의 평균입니다.\n",
        "\n",
        "이 메트릭은 달성 가능한 값 범위에서 글로벌 시프트 및 스케일링에 변하지 않기 때문에 사용됩니다. 즉, 가능한 기대값의 범위를 더 높이거나 낮추거나 스프레드를 늘리더라도 $A$ 값은 일관되게 유지되어야 합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "870af0fe",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## 시작하기\n",
        "\n",
        "Fire Opal 성과 관리 시스템은 권장 버전인 Qiskit v를 사용합니다`2.0.0`. 지원되는 버전은 Qiskit v`2.0.0`. 이상입니다.\n",
        "[IBM Quantum Platform API 키를](http://quantum.cloud.ibm.com/) 사용하여 인증한 후, 다음과 같이 Qiskit 함수를 선택하세요. (이 코드 조각은 이미 [계정을](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client) 로컬 환경에 저장해 두었다고 가정합니다.)\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "11af8fb4",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[QiskitFunction(qunova/hivqe-chemistry),\n",
              " QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),\n",
              " QiskitFunction(algorithmiq/tem),\n",
              " QiskitFunction(qedma/qesem),\n",
              " QiskitFunction(multiverse/singularity),\n",
              " QiskitFunction(ibm/circuit-function),\n",
              " QiskitFunction(q-ctrl/optimization-solver),\n",
              " QiskitFunction(colibritd/quick-pde),\n",
              " QiskitFunction(q-ctrl/performance-management),\n",
              " QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(channel=\"ibm_quantum_platform\")\n",
        "\n",
        "# verify that you have access to the function\n",
        "catalog.list()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "736255e4-1c1f-42a7-bf76-1487878c9e76",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Access Function\n",
        "perf_mgmt = catalog.load(\"q-ctrl/performance-management\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d4657810",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\" title=\"이 기능은 모든 IBM 백엔드를 지원합니까?\">\n",
        "  이 함수가 현재 지원하지 않는 백엔드를 사용하고자 하는 경우, [Q-CTRL에 문의하여](https://form.typeform.com/to/iuujEAEI?typeform-source=q-ctrl.com) 지원 기능을 추가해 주시기 바랍니다.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2947b5c3",
      "metadata": {},
      "source": [
        "<span id=\"estimator-primitive\" />\n",
        "\n",
        "## 추정기 기본체\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "df2788d5",
      "metadata": {},
      "source": [
        "<span id=\"estimator-example\" />\n",
        "\n",
        "### 추정기 예시\n",
        "\n",
        "파이어 오팔 성능 관리의 추정기 프리미티브를 사용하여 단일 회로 관측 가능 쌍의 기대값을 결정합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "82932760",
      "metadata": {},
      "source": [
        "`qiskit-ibm-catalog` 및 `qiskit` 패키지 외에도 `numpy` 패키지를 사용하여 이 예제를 실행합니다. IPython 커널을 사용하는 노트북에서 이 예제를 실행하는 경우 다음 셀의 주석 처리를 해제하여 이 패키지를 설치할 수 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "70bb93ef",
      "metadata": {},
      "outputs": [],
      "source": [
        "# %pip install numpy"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "02b2a79a",
      "metadata": {},
      "source": [
        "**1. 회로 만들기**\n",
        "\n",
        "예를 들어, 성능 관리 함수에 입력할 임의의 헤르미티안 연산자와 관측값을 생성합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "32037218",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import iqp\n",
        "from qiskit.quantum_info import random_hermitian, SparsePauliOp\n",
        "\n",
        "n_qubits = 50\n",
        "\n",
        "# Generate a random circuit\n",
        "mat = np.real(random_hermitian(n_qubits, seed=1234))\n",
        "circuit = iqp(mat)\n",
        "circuit.measure_all()\n",
        "\n",
        "# Define observables as a string\n",
        "observable = SparsePauliOp(\"Z\" * n_qubits)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "476fae6a",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Create PUB tuple\n",
        "estimator_pubs = [(circuit, observable)]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "09e64cd7",
      "metadata": {},
      "source": [
        "**2. 회로 실행**\n",
        "\n",
        "회로를 실행하고 선택적으로 백엔드 및 촬영 횟수를 정의합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "26952e1f",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Run the circuit using Estimator\n",
        "qctrl_estimator_job = perf_mgmt.run(\n",
        "    primitive=\"estimator\",\n",
        "    pubs=estimator_pubs,\n",
        "    backend_name=backend_name,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c07af9d0",
      "metadata": {},
      "source": [
        "익숙한 [Qiskit Serverless API](/docs/guides/serverless) 를 사용하여 Qiskit Function 워크로드의 상태를 확인할 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "2b309861",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'QUEUED'"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qctrl_estimator_job.status()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "23556c8e",
      "metadata": {},
      "source": [
        "**3. 결과 검색**\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "8be67088",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the counts from the result list\n",
        "result = qctrl_estimator_job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7375fcad",
      "metadata": {},
      "source": [
        "결과는 [Estimator](/docs/guides/estimator-input-output) 결과와 동일한 형식을 따릅니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "id": "ef85a036",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The result of the submitted job had 1 PUB\n",
            "The result of the submitted job had 1 PUB and has a value:\n",
            " PubResult(data=DataBin(evs=0.0195, stds=0.9998098569228051), metadata={'precision': None})\n",
            "\n",
            "The associated PubResult of this job has the following DataBins:\n",
            "DataBin(evs=0.0195, stds=0.9998098569228051)\n",
            "\n",
            "And this DataBin has attributes: dict_keys(['evs', 'stds'])\n",
            "The expectation values measured from this PUB are:\n",
            "0.0195\n"
          ]
        }
      ],
      "source": [
        "import numpy\n",
        "\n",
        "result_str = str(result)\n",
        "\n",
        "with numpy.printoptions(threshold=200):\n",
        "    print(\n",
        "        f\"The result of the submitted job had {len(result)} PUB \"\n",
        "        f\"and has a value:\\n {result[0]}\\n\"\n",
        "    )\n",
        "\n",
        "print(\"The associated PubResult of this job has the following DataBins:\")\n",
        "print(f\"{result[0].data}\\n\")\n",
        "\n",
        "print(f\"And this DataBin has attributes: {result[0].data.keys()}\")\n",
        "\n",
        "print(\"The expectation values measured from this PUB are:\")\n",
        "print(f\"{result[0].data.evs}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a78ce8bd",
      "metadata": {},
      "source": [
        "<span id=\"sampler-primitive\" />\n",
        "\n",
        "## 샘플러 기본체\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b1300f06",
      "metadata": {},
      "source": [
        "<span id=\"sampler-example\" />\n",
        "\n",
        "### 샘플러 예시\n",
        "\n",
        "파이어 오팔 성능 관리의 샘플러 프리미티브를 사용하여 번스타인-바지라니 회로를 실행합니다. 블랙박스 함수의 출력에서 숨겨진 문자열을 찾는 데 사용되는 이 알고리즘은 하나의 정답이 있기 때문에 일반적인 벤치마킹 알고리즘입니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "144e48f3",
      "metadata": {},
      "source": [
        "**1. 회로 만들기**\n",
        "\n",
        "알고리즘, 숨겨진 비트 문자열 및 번스타인-바지라니 회로의 정답을 정의합니다. `circuit_width` 을 변경하여 회로의 폭을 조정할 수 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "2cd807b1",
      "metadata": {},
      "outputs": [],
      "source": [
        "import qiskit\n",
        "\n",
        "circuit_width = 35\n",
        "hidden_bitstring = \"1\" * circuit_width\n",
        "\n",
        "# Create circuit, reserving one qubit for BV oracle\n",
        "bv_circuit = qiskit.QuantumCircuit(circuit_width + 1, circuit_width)\n",
        "bv_circuit.x(circuit_width)\n",
        "bv_circuit.h(range(circuit_width + 1))\n",
        "for input_qubit, bit in enumerate(reversed(hidden_bitstring)):\n",
        "    if bit == \"1\":\n",
        "        bv_circuit.cx(input_qubit, circuit_width)\n",
        "bv_circuit.barrier()\n",
        "bv_circuit.h(range(circuit_width + 1))\n",
        "bv_circuit.barrier()\n",
        "for input_qubit in range(circuit_width):\n",
        "    bv_circuit.measure(input_qubit, input_qubit)\n",
        "\n",
        "# Create PUB tuple\n",
        "sampler_pubs = [(bv_circuit,)]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "85d3c00b",
      "metadata": {},
      "source": [
        "**2. 회로 실행**\n",
        "\n",
        "회로를 실행하고 선택적으로 백엔드 및 촬영 횟수를 정의합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "2595df84",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Run the circuit using Sampler\n",
        "qctrl_sampler_job = perf_mgmt.run(\n",
        "    primitive=\"sampler\",\n",
        "    pubs=sampler_pubs,\n",
        "    backend_name=backend_name,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3c49fbba",
      "metadata": {},
      "source": [
        "다음과 같이 Qiskit 함수 워크로드의 [상태를](/docs/guides/functions-get-started#check-job-status) 확인하거나 [결과를](/docs/guides/functions-get-started#retrieve-results) 반환하세요:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "id": "b7acbb7f",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "60fe2fa1-a860-43e4-8615-c6ac4180f93b\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "'QUEUED'"
            ]
          },
          "execution_count": 14,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Print the ID so you can use it later, if necessary\n",
        "print(qctrl_sampler_job.job_id)\n",
        "\n",
        "qctrl_sampler_job.status()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "35921605",
      "metadata": {},
      "source": [
        "**3. 결과 검색**\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "id": "2d4f5f7d",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the job results\n",
        "sampler_result = qctrl_sampler_job.result()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "7a359d99",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Counts for the meas output register (limited to 30 results):\n",
            "  11111111111111111111111111111111111: 1661\n",
            "  11111111111111111111111111110111111: 60\n",
            "  11111111111111111111111111111101111: 54\n",
            "  11111111111111111111111111111110111: 54\n",
            "  11111111111111011111111111111111111: 46\n",
            "  11111111111111111110111111111111111: 44\n",
            "  11111111111111111111111101111111111: 42\n",
            "  11111111111111111111111110111111111: 42\n",
            "  11111111111111110111111111111111111: 41\n",
            "  11111111111111111111111111111111101: 39\n",
            "  11111111111111111111101111111111111: 38\n",
            "  11111111111111111111110111111111111: 38\n",
            "  11111111111111111111111111101111111: 37\n",
            "  11111111111111111111111111111111110: 36\n",
            "  11111111111110111111111111111111111: 35\n",
            "  11111111111111111111111111111011111: 32\n",
            "  11111111111111101111111111111111111: 32\n",
            "  01111111111111111111111111111111111: 27\n",
            "  11111111111111111011111111111111111: 23\n",
            "  11111111101111111111111111111111111: 22\n",
            "  11111111111111111111111111111111011: 21\n",
            "  11111111011111111111111111111111111: 20\n",
            "  00000000000000011111111111111111111: 18\n",
            "  11111111111111111111110101111111111: 18\n",
            "  00000001111111111111111111111111111: 17\n",
            "  11111111001111111111111111111111111: 16\n",
            "  11101111111111111111111111111111111: 16\n",
            "  11111111111101111111111111111111111: 16\n",
            "  00000101111111111111111111111111111: 13\n",
            "  11111111111111111111111011111111111: 13\n",
            "  11111111111111111111111110101111111: 13\n",
            "  11111111111111111101111111111111111: 12\n",
            "  10111111111111111111111111111111111: 12\n",
            "  11111111111111111111111110001111111: 12\n",
            "  00000000000000000011111111111111111: 11\n",
            "  11111111111111111111111111111110110: 10\n",
            "  00000000000000000000000001111111111: 10\n",
            "  11111111111011111111111111111111111: 9\n",
            "  11111111111111101011111111111111111: 9\n",
            "  00000000011111111111111111111111111: 8\n",
            "  10101111111111111111111111111111111: 8\n",
            "  00000000000000000000000001011111111: 8\n",
            "  11111111111111111111111111111111001: 8\n",
            "  00000111111111111111111111111111111: 7\n",
            "  11111111111111111111111111111101110: 7\n",
            "  11111111110111111111111111111111111: 7\n",
            "  00000000000001011111111111111111111: 6\n",
            "  00000000000000001111111111111111111: 6\n",
            "  00000000000000000001011111111111111: 6\n",
            "  11111111111111111111111111011111111: 6\n",
            "  ... (1050 more items)\n"
          ]
        }
      ],
      "source": [
        "# Get results for the first (and only) PUB\n",
        "pub_result = sampler_result[0]\n",
        "counts = pub_result.data.c.get_counts()\n",
        "\n",
        "print(\"Counts for the meas output register (limited to 30 results):\")\n",
        "for i, (bitstring, count) in enumerate(counts.items()):\n",
        "    if i >= 50:\n",
        "        print(f\"  ... ({len(counts) - 30} more items)\")\n",
        "        break\n",
        "    print(f\"  {bitstring}: {count}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d920922e",
      "metadata": {},
      "source": [
        "**3. 상위 비트 문자열 플롯**\n",
        "\n",
        "숨겨진 비트스트링이 모드인지 확인하기 위해 가장 높은 카운트를 가진 비트스트링을 플롯합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "id": "cefa2234",
      "metadata": {},
      "outputs": [],
      "source": [
        "import matplotlib.pyplot as plt\n",
        "\n",
        "\n",
        "def plot_top_bitstrings(counts_dict, hidden_bitstring=None):\n",
        "    # Sort and take the top 100 bitstrings\n",
        "    top_100 = sorted(counts_dict.items(), key=lambda x: x[1], reverse=True)[\n",
        "        :100\n",
        "    ]\n",
        "    if not top_100:\n",
        "        print(\"No bitstrings found in the input dictionary.\")\n",
        "        return\n",
        "\n",
        "    # Unzip the bitstrings and their counts\n",
        "    bitstrings, counts = zip(*top_100)\n",
        "\n",
        "    # Assign colors: purple if the bitstring matches hidden_bitstring,\n",
        "    # otherwise gray\n",
        "    colors = [\n",
        "        \"#680CE9\" if bit == hidden_bitstring else \"gray\" for bit in bitstrings\n",
        "    ]\n",
        "\n",
        "    # Create the bar plot\n",
        "    plt.figure(figsize=(15, 8))\n",
        "    plt.bar(\n",
        "        range(len(bitstrings)), counts, tick_label=bitstrings, color=colors\n",
        "    )\n",
        "\n",
        "    # Rotate the bitstrings for better readability\n",
        "    plt.xticks(rotation=90, fontsize=8)\n",
        "    plt.xlabel(\"Bitstrings\")\n",
        "    plt.ylabel(\"Counts\")\n",
        "    plt.title(\"Top 100 Bitstrings by Counts\")\n",
        "\n",
        "    # Show the plot\n",
        "    plt.tight_layout()\n",
        "    plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1d9d3b69",
      "metadata": {},
      "source": [
        "숨겨진 비트스트링은 보라색으로 강조 표시되며, 카운트 수가 가장 많은 비트스트링이어야 합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "8106d906",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/q-ctrl-performance-management/extracted-outputs/8106d906-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "plot_top_bitstrings(counts, hidden_bitstring)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d8104000b3d94c69",
      "metadata": {},
      "source": [
        "<span id=\"changelog\" />\n",
        "\n",
        "## 변경 로그\n",
        "\n",
        "* 2026-02-20: 사용 중단 공지 - 메타데이터 `provider_job_ids` 필드는 버전 0.13.0 에서 30일 후 사용 중단됩니다. 사용자는 런타임 서비스의 메서드를 `job_id()` 통해 작업 ID에 접근할 수 있습니다.\n",
        "* 2026-02-11: 이제 를 `ibm_miami`지원하며, 실행 메타데이터를 에 추가했습니다 `PubResult`.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bb33258d",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "## 지원 받기\n",
        "\n",
        "질문이나 문제가 있는 경우 [Q-CTRL에 문의](https://form.typeform.com/to/iuujEAEI) 하세요.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2fe4a6ea",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"tip\" title=\"권장사항\">\n",
        "  * [Q-CTRL 성과 관리](/functions?id=q-ctrl-performance-management) 시스템에 대한 접근 권한을 요청합니다.\n",
        "  * 이 Qiskit 함수에 대한 [API 참조](/docs/api/functions/q-ctrl-performance-management) 를 확인해 보세요.\n",
        "  * [Q-CTRL의 성능 관리](/docs/tutorials/transverse-field-ising-model) 튜토리얼로 횡자계 이징 모델을 시도해 보세요.\n",
        "  * [Q-CTRL의 양자 제어( Qiskit Functions )](/docs/tutorials/quantum-phase-estimation-qctrl) 튜토리얼로 양자 위상 추정(Quantum Phase Estimation)을 시도해 보세요\n",
        "  * 검토 [문다다 P. S., 등 (2023). 양자 알고리즘을 위한 자동화된 결정론적 오류 억제 워크플로우의 실험적 벤치마킹. Physical Review Applied, 20, 2](https://quantum-journal.org/papers/q-2023-07-25-1067/).\n",
        "  * 칸노, S [. 검토 등 (2025). 대규모 실증용 텐서 기반 양자 위상차 추정 arXiv 사전 인쇄본 arXiv:2408.04946](https://arxiv.org/abs/2408.04946).\n",
        "  * [SoftBank Corp.](https://www.softbank.jp/en/corp/technology/research/topics/102/) 검토, 양자 퀀텀 컴퓨팅( Machine Learning )을 활용한 통신 서비스 장애 진단 시스템 시범 실험 (블로그), 2024년 8월 30일.\n",
        "  * 리뷰 [야마우치, H., 등 (2024). 네트워크 서비스 장애 진단을 위한 매개변수화된 에너지 효율적 양자 커널 arXiv 사전 인쇄본 arXiv:2405.09724v1](https://arxiv.org/abs/2405.09724v1).\n",
        "  * 리뷰 [야마우치, H., 등 (2025). 초대칭 해밀토니안을 통한 위상 역학의 양자 분광학 arXiv 사전 인쇄본 arXiv:2511.23169v1](https://arxiv.org/abs/2511.23169v1).\n",
        "  * 리뷰 [왕, Y., 등 (2025).  Δ-모티프: 데이터 중심 병렬 처리를 통한 대규모 부분 그래프 동형성. arXiv 사전 인쇄본 arXiv:2508.21287](https://arxiv.org/abs/2508.21287).\n",
        "  * 리뷰 [파테라키스, N. G., 등 (2025).  전력 전자공학의 계산 환경에서 양자 컴퓨팅: 비전과 현실. arXiv 사전 인쇄본 arXiv:2507.02577](https://arxiv.org/abs/2507.02577).\n",
        "  * 리뷰 [가리비안, H., 등 (2023).  양자 머신러닝을 위한 계층적 학습: 대규모 변분 양자 회로에 대한 새로운 훈련 기법. arXiv 사전 인쇄본 arXiv:2311.12929](https://arxiv.org/abs/2311.12929).\n",
        "  * [미쓰비시 화학(Mitsubishi Chemical Corp) 사례 연구를](https://q-ctrl.com/case-study/unlocking-new-performance-capability-in-quantum-chemistry) 검토하십시오.\n",
        "  * [수정된 은행 사례 연구를](https://q-ctrl.com/case-study/reducing-quantum-compute-costs-2-500x-with-fire-opal) 검토하십시오.\n",
        "  * [BlueQubit 사례](https://q-ctrl.com/case-study/enabling-data-loading-for-quantum-machine-learning-with-fire-opal) 연구를 검토하십시오.\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
}