{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "0be36083-7bf5-48b7-9241-7979d6853d0c",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"샘플 예시\"\n",
        "description: \"IBM Quantum 샘플러 프리미티브 사용에 대한 실제 예시.\"\n",
        "---\n",
        "\n",
        "<span id=\"sampler-examples\" />\n",
        "\n",
        "# 샘플 예시\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ef0ce9e6-eee0-4b4b-a068-52e8cbd69115",
      "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": "ab973ab2-72aa-4a57-9132-b46002738489",
      "metadata": {},
      "source": [
        "양자 회로 출력값에서 샘플링된, 오류가 완화된 전체 준확률 분포를 생성합니다. Sampler의 기능을 활용하여 Grover’s 및 QVSM과 같은 검색 및 분류 알고리즘을 구현하십시오.\n",
        "\n",
        "<span id=\"run-a-single-experiment\" />\n",
        "\n",
        "## 단일 실험 실행\n",
        "\n",
        "Sampler를 사용하여 단일 회로의 측정 결과를 비트열 또는 카운트 값으로 반환합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "fffb9af3-e122-4ca9-93e3-79edd6112ff8",
      "metadata": {
        "scrolled": true
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > First ten results: ['0111010010000101000101110000000101010000100111110000110011101100001100101111100100010110000110101001100010100001111010000110000', '0010001000101011111011110111001100101010110111001101100111100000011010010000100000011101010011101010000100101001101100000110001', '0010100110101011001001010111010110111011000101110001001011111010011010001000010010010001110010000001100000100110010000110010001', '1111000001010000010111000010100111001110101000100101000001110110001110010100010100010110001000001000100001101100100001101010100', '1100111010001011001011001010111100011100110010110011110010100001011101100110111000010000011110101010110101100001011000000000000', '0010111110001001110000001110001110010001111110100111100001001011000010000111000010011000100100000001001100001110000001100000110', '0110010101111101101111001101011100111000101110101101010100101010010000010000011000000100101110001010010110101001110001010000110', '0000001111111000001101101010111011010001111101101001111110100101100001110010000111011000000010101000100000000001101110000000001', '1011001100100101111000001000100100001011001001100001001010111011001000001010100111010001001110010101110000100001000100101111001', '1111100010100111000011010101000110011011110111011000000010101000100011000001000100000101000110001000000001001011101101110011000']\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import iqp\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit.quantum_info import random_hermitian\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler\n",
        "\n",
        "n_qubits = 127\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=n_qubits\n",
        ")\n",
        "\n",
        "mat = np.real(random_hermitian(n_qubits, seed=1234))\n",
        "circuit = iqp(mat)\n",
        "circuit.measure_all()\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
        "isa_circuit = pm.run(circuit)\n",
        "\n",
        "sampler = Sampler(backend)\n",
        "job = sampler.run([isa_circuit])\n",
        "result = job.result()\n",
        "\n",
        "# Get results for the first (and only) PUB\n",
        "pub_result = result[0]\n",
        "\n",
        "print(f\" > First ten results: {pub_result.data.meas.get_bitstrings()[:10]}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6b1cd3d9-8487-4889-9cd6-638a13fc7127",
      "metadata": {},
      "source": [
        "<span id=\"run-multiple-experiments-in-a-single-job\" />\n",
        "\n",
        "## 단일 작업에서 여러 실험을 실행합니다\n",
        "\n",
        "Sampler를 사용하여 하나의 작업 내에서 여러 회로의 측정 결과를 비트열 또는 카운트 값으로 반환합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "4f68f509-7965-41f7-9f5e-7922a45ba22d",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > First five results for pub 0: ['0000111110010100100011101001111111000010000000100001011110000101000111100110000000000110010000001001000001100000101101000000011', '1000001101000100111010110001100100100011111100001000011010100001001011001110000100100011100010010101000100001110001110000101000', '1010001100001101011000000110100001101000010101000000110010100001100010010000001000011100100101011001000001110101100000100010001', '0010010011001100001001111111001100001011010010010111011010111000010010100011011101101100110000101001001101000000001010000001000', '0000101100100011000111100010110010111000000101010101010101011010010010011011000110011010011001011110010101000111000111000100000']\n",
            " > First five results for pub 1: ['1011011001010100010010111001111100011000110010000110000000100101101111100000010000011000100011101000101101001100000000011011000', '1110000000100001100111000010110011101110110010001011100001000000000100110011010010100010000100001111001101001000001000000011000', '0100000010010100010011000011111011010011010111110111110011101100110011111010111101011000110000001111110001110111001110000000001', '1110011011010111110110111000010111101010000110001101001000100000001010001001010000001000001110000000000110001101001010000010000', '1110010111110110100100100010100110101000001000100011100101001001110011001001011101000000000000110101010000100111010100010011000']\n",
            " > First five results for pub 2: ['0011110001000000010000101101010100011011101101001111001000011011101010011010011000010001000001010101100100010000011100010000000', '1010110011100101001111110000110111110011101101100011000100001111001001101011000010100001000000100011110001101001001000101100001', '1111000011001100000101010110100010110001000000000111100111100011011101101001100110001010010000000101001000011100100001000011100', '0100101011111000010100001001001110001100001001100111011100010010000001000010100101101000001001101000110011010000001010101000000', '1101011000010000010011001111111011110111011101000011010001000000100010000110001010000101110000111101000110100000100011110110000']\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import iqp\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit.quantum_info import random_hermitian\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler\n",
        "\n",
        "n_qubits = 127\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=n_qubits\n",
        ")\n",
        "\n",
        "rng = np.random.default_rng()\n",
        "mats = [np.real(random_hermitian(n_qubits, seed=rng)) for _ in range(3)]\n",
        "circuits = [iqp(mat) for mat in mats]\n",
        "for circuit in circuits:\n",
        "    circuit.measure_all()\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
        "isa_circuits = pm.run(circuits)\n",
        "\n",
        "sampler = Sampler(mode=backend)\n",
        "job = sampler.run(isa_circuits)\n",
        "result = job.result()\n",
        "\n",
        "for idx, pub_result in enumerate(result):\n",
        "    print(\n",
        "        f\" > First five results for pub {idx}: \"\n",
        "        f\"{pub_result.data.meas.get_bitstrings()[:5]}\"\n",
        "    )"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f6298621-8160-4e8b-8f43-316c5e388dd0",
      "metadata": {},
      "source": [
        "<span id=\"run-parameterized-circuits\" />\n",
        "\n",
        "## 매개변수화된 회로 실행\n",
        "\n",
        "단일 작업 내에서 여러 실험을 수행하고, 매개변수 값을 활용하여 회로의 재사용성을 높입니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "b8633a12-3cbc-42a2-85db-4ea1a2d7bda7",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " >> First five results for the meas output register: ['0110001001111000110000000111110011100111100001110100111011011011001111100011011010110011111000000110111000110000001110100110111', '1110001011100111100000001110010100010110001011110100111111110111100001100010010000011111100010000100000111100010011000000010111', '0111100101110001001011010111111110111010001001100011000111001101101010001011101101000010110010000011010101001011101110010100101', '0110110010001000010010000110000010000100111111101011111000010111010101000110001010100110100010110000000010101011000011111110110', '0001010111110100001010000011010010101110000101100011001000111111000010101111110100000011010000101111110110111110011010001001101']\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import real_amplitudes\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler\n",
        "\n",
        "n_qubits = 127\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=n_qubits\n",
        ")\n",
        "\n",
        "# Step 1: Map classical inputs to a quantum problem\n",
        "circuit = real_amplitudes(num_qubits=n_qubits, reps=2)\n",
        "circuit.measure_all()\n",
        "\n",
        "# Define three sets of parameters for the circuit\n",
        "rng = np.random.default_rng(1234)\n",
        "parameter_values = [\n",
        "    rng.uniform(-np.pi, np.pi, size=circuit.num_parameters) for _ in range(3)\n",
        "]\n",
        "\n",
        "# Step 2: Optimize problem for quantum execution.\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
        "isa_circuit = pm.run(circuit)\n",
        "\n",
        "# Step 3: Execute using IBM Quantum primitives.\n",
        "sampler = Sampler(backend)\n",
        "job = sampler.run([(isa_circuit, parameter_values)])\n",
        "result = job.result()\n",
        "# Get results for the first (and only) PUB\n",
        "pub_result = result[0]\n",
        "# Get counts from the classical register \"meas\".\n",
        "print(\n",
        "    f\" >> First five results for the meas output register: \"\n",
        "    f\"{pub_result.data.meas.get_bitstrings()[:5]}\"\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "06bf761a-e9b7-47ca-911e-01b126090466",
      "metadata": {},
      "source": [
        "<span id=\"use-batches-and-advanced-options\" />\n",
        "\n",
        "## 일괄 처리 및 고급 옵션 사용\n",
        "\n",
        "QPU에서 회로 성능을 최적화하기 위해 일괄 [실행 모드와](/docs/guides/execution-modes) 고급 옵션을 살펴보세요.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "536ac5b5-00cf-42bf-a114-28144008d744",
      "metadata": {
        "scrolled": true
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > The first five measurement results of job 1: ['0110100010111000010001000100100011111000100001010001000110010101011000100101000111010000110001010000001001101110101101000100000', '1001100000101110011000000101010000001100110110000101100011010001000000001001001000000011110000001110000000001001000000010000010', '0110000001010111011110011100010101101010011100000100001000110100010110100101111111000000010010001110100000000000000001100001100', '0000010011100000010111010111010100100100010000110110111111010111001010111101100010000100101011000000000010101110000011010001000', '0110000101011001001001111101011001111001100101000111010000001100111001000111111100000010001001110110010100110011000000000110110']\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import iqp\n",
        "from qiskit.quantum_info import random_hermitian\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import Batch, SamplerV2 as Sampler\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "n_qubits = 127\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=n_qubits\n",
        ")\n",
        "\n",
        "rng = np.random.default_rng(1234)\n",
        "mat = np.real(random_hermitian(n_qubits, seed=rng))\n",
        "circuit = iqp(mat)\n",
        "circuit.measure_all()\n",
        "mat = np.real(random_hermitian(n_qubits, seed=rng))\n",
        "another_circuit = iqp(mat)\n",
        "another_circuit.measure_all()\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
        "isa_circuit = pm.run(circuit)\n",
        "another_isa_circuit = pm.run(another_circuit)\n",
        "\n",
        "# The context manager automatically closes the batch.\n",
        "with Batch(backend=backend) as batch:\n",
        "    sampler = Sampler(mode=batch)\n",
        "    job = sampler.run([isa_circuit])\n",
        "    another_job = sampler.run([another_isa_circuit])\n",
        "    result = job.result()\n",
        "    another_result = another_job.result()\n",
        "\n",
        "# first job\n",
        "\n",
        "print(\n",
        "    f\" > The first five measurement results of job 1: \"\n",
        "    f\"{result[0].data.meas.get_bitstrings()[:5]}\"\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "44b4c746-232b-4876-87c4-002cf6d11db7",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > The first five measurement results of job 2: ['1001111000100001101101011000000001101101100101110001010110100000100111001011011110011010101001001010100100110001010000001000001', '1000111101000111011110110000000100010100011111110110001001101000001111111010001101010010111010000101101000001110100000110010001', '0101001101000011011000010101100101011110010010011000111100000000010010010010000001100000001001001000000010011110100011111100100', '0010110010110011100011001010100100011100001010001100110100000000111100111000000100011101111011011000101001000010100010101111000', '0011110001100010010111010010100110110010011000010000100100100000111011000011001001110100000110001010101000011000110001001101100']\n"
          ]
        }
      ],
      "source": [
        "# second job\n",
        "print(\n",
        "    \" > The first five measurement results of job 2:\",\n",
        "    another_result[0].data.meas.get_bitstrings()[:5],\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d5c423e4-7586-4fdf-8452-3c62a705c955",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"tip\" title=\"권장사항\">\n",
        "  * [고급 런타임 옵션을 지정합니다](runtime-options-overview).\n",
        "  * IBM Quantum Learning 의 [‘Cost’ 함수](/learning/courses/variational-algorithm-design/cost-functions) 강의를 따라가며 기본형(primitives)을 연습해 보세요.\n",
        "  * [‘트랜스파일’](/docs/guides/transpile/) 섹션에서 로컬 환경에서 트랜스파일하는 방법을 알아보세요.\n",
        "  * [‘트랜스파일러 설정 비교’](/docs/guides/circuit-transpilation-settings) 가이드를 확인해 보세요.\n",
        "  * IBM® QPU로 작업을 전송할 때 [작업 제한](/docs/guides/job-limits) 사항을 숙지하십시오.\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": 4
}