{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "c08a245a-82c1-4c6f-b1e1-d0a27f093b7a",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"로컬 테스트 모드\"\n",
        "description: \"IBM Quantum Compute의 로컬 테스트 모드를 사용하여 양자 하드웨어를 시뮬레이션하세요\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore superop */}\n",
        "\n",
        "<span id=\"test-locally\" />\n",
        "\n",
        "<span id=\"local-testing-mode\" />\n",
        "\n",
        "# 로컬 테스트 모드\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "14778d9c-4e0e-4b84-8575-90e4efab25a2",
      "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",
        "    qiskit-aer~=0.17\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "435ec827-a348-4b70-b1ef-582849c0a76a",
      "metadata": {},
      "source": [
        "로컬 테스트 모드( `qiskit-ibm-runtime` v0.22.0 이상에서 사용 가능)를 사용하여 프로그램을 미세 조정하고 실제 양자 하드웨어로 전송하기 전에 프로그램을 테스트하세요.  로컬 테스트 모드를 사용하여 프로그램을 검증한 후에는 백엔드 이름만 변경하면 QPU에서 실행할 수 있습니다.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Executor 기본 객체는 로컬 테스트 모드를 지원하지 않습니다.\n",
        "</Admonition>\n",
        "\n",
        "로컬 테스트 모드를 사용하려면, IBM Quantum 프리미티브나 세션을 인스턴스화할 때 가짜 백엔드 중 하나를 지정하거나 `qiskit_ibm_runtime.fake_provider` Qiskit Aer 백엔드를 지정하십시오.\n",
        "\n",
        "* **가짜 백엔드** : `qiskit_ibm_runtime.fake_provider` 의 [가짜 백엔드는](/docs/api/qiskit-ibm-runtime/fake-provider) QPU 스냅샷을 사용하여 IBM® QPU의 동작을 모방합니다. QPU 스냅샷에는 커플링 맵, 기저 게이트, 큐비트 속성 등 QPU에 대한 중요한 정보가 포함되어 있어 트랜스파일러를 테스트하고 QPU의 노이즈 시뮬레이션을 수행하는 데 유용합니다. 스냅샷의 노이즈 모델은 시뮬레이션 중에 자동으로 적용됩니다.\n",
        "* **Aer 시뮬레이터** : [키스킷 에어의](/docs/guides/simulate-with-qiskit-aer) 시뮬레이터는 더 큰 회로와 [맞춤형 노이즈 모델을](/docs/guides/build-noise-models) 처리할 수 있는 고성능 시뮬레이션을 제공합니다. 로컬 테스트 모드에서 `AerSimulator` 을 사용하면 시뮬레이션 방법 옵션 목록을 사용할 수 있습니다. 많은 수의 큐비트가 있는 클리포드 회로를 효율적으로 시뮬레이션하는 방법을 보여주는 [클리포드 시뮬레이션 모드 예시를](#clifford-sim) 참조하세요.\n",
        "\n",
        "  <Accordion>\n",
        "    <AccordionItem title=\"**키스킷 에어에서 사용할 수 있는 시뮬레이션 방법 목록**\">\n",
        "      자세한 내용은 [`AerSimulator`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.AerSimulator) 문서를 참조하세요.\n",
        "\n",
        "      * `\"automatic\"`: 기본 시뮬레이션 방법. 회로 및 노이즈 모델에 따라 시뮬레이션 방법을 자동으로 선택합니다.\n",
        "\n",
        "      * `\"statevector\"`: 모든 측정값이 회로의 끝에 있는 *이상적인* 회로에서 측정 결과를 샘플링할 수 있는 고밀도 상태 벡터 시뮬레이션입니다. 노이즈 시뮬레이션의 경우, 각 샷은 노이즈 모델에서 무작위로 샘플링된 노이즈 회로를 샘플링합니다.\n",
        "\n",
        "      * `\"density_matrix\"`: 모든 측정값이 회로의 끝에 있는 *잡음이* 많은 회로에서 측정 결과를 샘플링할 수 있는 밀도 매트릭스 시뮬레이션입니다.\n",
        "\n",
        "      * `\"stabilizer\"`: 잡음 모델의 모든 오차가 클리포드 오차이기도 한 경우 잡음이 있는 클리포드 회로를 시뮬레이션할 수 있는 효율적인 클리포드 안정기 상태 시뮬레이터입니다.\n",
        "\n",
        "      * `\"extended_stabilizer\"`: 상태를 순위 안정화 상태로 분해하여 클리포드 + T 회로의 대략적인 시뮬레이터입니다. 항의 수는 클리포드(T)가 아닌 게이트의 수에 따라 증가합니다.\n",
        "\n",
        "      * `\"matrix_product_state\"`: 상태의 행렬 곱 상태(MPS) 표현을 사용하는 텐서 네트워크 상태 벡터 시뮬레이터입니다. 이 작업은 시뮬레이터 옵션에 따라 MPS 본드 치수를 자르거나 자르지 않고 수행할 수 있습니다. 기본 동작은 잘림 없음입니다.\n",
        "\n",
        "      * `\"unitary\"`: 이상적인 회로의 고밀도 유니타리 매트릭스 시뮬레이션. 이는 초기 양자 상태의 진화가 아닌 회로 자체의 단일 행렬을 시뮬레이션합니다. 이 방법은 게이트 시뮬레이션만 가능하며 측정, 리셋 또는 노이즈는 지원하지 않습니다.\n",
        "\n",
        "      * `\"superop\"`: 이상적인 또는 잡음이 있는 회로의 고밀도 슈퍼 연산자 매트릭스 시뮬레이션입니다. 이는 초기 양자 상태의 진화가 아닌 회로 자체의 슈퍼 연산자 행렬을 시뮬레이션합니다. 이 방법은 이상적이고 잡음이 많은 게이트와 리셋을 시뮬레이션할 수 있지만 측정은 지원하지 않습니다.\n",
        "\n",
        "      * `\"tensor_network\"`: 상태 벡터와 밀도 행렬을 모두 지원하는 텐서 네트워크 기반 시뮬레이션입니다. 현재 이 기능은 GPU에서만 사용할 수 있으며 cuQuantum `cuTensorNet` API를 사용하여 가속됩니다.\n",
        "    </AccordionItem>\n",
        "  </Accordion>\n",
        "\n",
        "<Admonition type=\"note\" title=\"참고\">\n",
        "  - 로컬 테스트 모드에서 ‘ IBM Quantum ’ 컴퓨트 옵션 전체를 지정할 수 있습니다.  그러나 로컬 시뮬레이터에서 실행할 때는 샷을 제외한 모든 옵션이 무시됩니다.\n",
        "  - 가짜 백엔드나 에어 시뮬레이터를 사용하기 전에 `pip install qiskit-aer` 를 실행하여 키스킷 에어를 설치하는 것이 좋습니다. 가짜 백엔드는 가능한 경우 Aer 시뮬레이터를 은밀하게 사용하여 성능을 활용합니다.\n",
        "</Admonition>\n",
        "\n",
        "{/* If you currently use the Qiskit SDK, you can use the existing Qiskit Aer primitives for local testing.  See [exact and noisy simulation with Qiskit Aer primitives](/docs/guides/simulate-with-qiskit-aer) for details. */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "366b1216-fb2f-4d06-afd8-fe374ab6ed9a",
      "metadata": {},
      "source": [
        "<span id=\"fake-backends-example\" />\n",
        "\n",
        "## 가짜 백엔드 예시\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "efda5007-260a-49c0-ab6f-eac91fdbdf84",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler\n",
        "from qiskit_ibm_runtime.fake_provider import FakeManilaV2\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Run the Sampler job locally using FakeManilaV2\n",
        "fake_manila = FakeManilaV2()\n",
        "pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "\n",
        "# You can use a fixed seed to get fixed results.\n",
        "options = {\"simulator\": {\"seed_simulator\": 42}}\n",
        "sampler = Sampler(mode=fake_manila, options=options)\n",
        "\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b51e77c0-31c9-4dfa-950c-0a9ea9247aac",
      "metadata": {},
      "source": [
        "<span id=\"aersimulator-examples\" />\n",
        "\n",
        "## AerSimulator 예시\n",
        "\n",
        "노이즈가 없는 세션의 예입니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "63407a34-0c70-400a-bc34-f85ccd581c4d",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer import AerSimulator\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import Session, SamplerV2 as Sampler\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Run the Sampler job locally using AerSimulator.\n",
        "# Session syntax is supported but ignored because local mode doesn't support sessions.\n",
        "aer_sim = AerSimulator()\n",
        "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "with Session(backend=aer_sim) as session:\n",
        "    sampler = Sampler(mode=session)\n",
        "    result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6a511de6-dc37-4ac4-87f8-bee90e3014a3",
      "metadata": {},
      "source": [
        "노이즈로 시뮬레이션하려면 QPU(양자 하드웨어)를 지정하고 이를 Aer에 제출하세요.  Aer는 해당 QPU의 캘리브레이션 데이터를 기반으로 노이즈 모델을 빌드하고 해당 모델을 사용하여 Aer 백엔드를 인스턴스화합니다.  원하는 경우 [노이즈 모델을 구축할](/docs/guides/build-noise-models) 수 있습니다.\n",
        "\n",
        "<Admonition type=\"caution\">\n",
        "  QPU는 다양한 종류의 노이즈에 영향을 받을 수 있습니다. 여기에 사용된 키스킷 에어 노이즈 모델은 일부만 시뮬레이션하므로 실제 QPU의 노이즈보다 덜 심각할 수 있습니다.\n",
        "\n",
        "  QPU에서 노이즈 모델을 초기화할 때 어떤 오류가 포함되는지에 대한 자세한 내용은 Aer [`NoiseModel`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.noise.NoiseModel.html#qiskit_aer.noise.NoiseModel.from_backend) API 레퍼런스를 참조하세요.\n",
        "</Admonition>\n",
        "\n",
        "노이즈가 있는 예시입니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "0878eec8-9959-4e98-aff7-bf114352b838",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer import AerSimulator\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler, QiskitRuntimeService\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Specify a QPU to use for the noise model\n",
        "real_backend = service.backend(\"ibm_fez\")\n",
        "aer = AerSimulator.from_backend(real_backend)\n",
        "\n",
        "# Run the Sampler job locally using AerSimulator.\n",
        "pm = generate_preset_pass_manager(backend=aer, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "sampler = Sampler(mode=aer)\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2a2815a4-19f9-4ebd-8e53-4e29bea4a8db",
      "metadata": {},
      "source": [
        "<span id=\"clifford-sim\" />\n",
        "\n",
        "<span id=\"clifford-simulation\" />\n",
        "\n",
        "### 클리포드 시뮬레이션\n",
        "\n",
        "클리포드 회로를 효율적으로 시뮬레이션하여 검증 가능한 결과를 얻을 수 있기 때문에 클리포드 시뮬레이션은 매우 유용한 도구입니다. 자세한 예시는 [키스킷 에어 프리미티브를 사용한 안정기 회로의 효율적인 시뮬레이션을](/docs/guides/simulate-stabilizer-circuits) 참조하세요.\n",
        "\n",
        "예:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "b9d0fdac-ba2e-4c4e-8c49-c924fb8b5c43",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import efficient_su2\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler\n",
        "\n",
        "n_qubits = 500  # <---- note this uses 500 qubits!\n",
        "circuit = efficient_su2(n_qubits)\n",
        "circuit.measure_all()\n",
        "\n",
        "rng = np.random.default_rng(1234)\n",
        "params = rng.choice(\n",
        "    [0, np.pi / 2, np.pi, 3 * np.pi / 2],\n",
        "    size=circuit.num_parameters,\n",
        ")\n",
        "\n",
        "# Tell Aer to use the stabilizer (Clifford) simulation method\n",
        "aer_sim = AerSimulator(method=\"stabilizer\")\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "sampler = Sampler(mode=aer_sim)\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ee461e4d-ee50-4430-9e83-c3b49cd7a1ef",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"tip\" title=\"권장사항\">\n",
        "  * [이 `Neat`](/docs/guides/debug-qiskit-runtime-jobs) 클래스를 사용하여 Estimator 워크로드에 미치는 노이즈의 영향을 분석하십시오.\n",
        "  * 자세한 [샘플러 예제를](/docs/guides/sampler-examples) 살펴보세요.\n",
        "  * 상세한 [견적서 예시를](/docs/guides/estimator-examples) 살펴보세요.\n",
        "  * IBM 양자 학습의 [비용 함수 강의를](/learning/courses/variational-algorithm-design/cost-functions) 통해 프리미티브로 연습해 보세요.\n",
        "  * [Transpile](/docs/guides/transpile) 섹션에서 로컬로 트랜스파일하는 방법을 알아보세요.\n",
        "  * [Compare transpiler settings](/docs/guides/circuit-transpilation-settings#compare-transpiler-settings) 튜토리얼을 시도해 보세요.\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
}