{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "c08a245a-82c1-4c6f-b1e1-d0a27f093b7a",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Qiskit Runtime modo de teste local\"\n",
        "description: \"Use o modo de teste local para simular hardware quântico em Qiskit Runtime\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore superop */}\n",
        "\n",
        "<span id=\"test-locally\" />\n",
        "\n",
        "<span id=\"qiskit-runtime-local-testing-mode\" />\n",
        "\n",
        "# Qiskit Runtime modo de teste local\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=\"Versões do pacote\">\n",
        "    O código desta página foi desenvolvido usando os seguintes requisitos.\n",
        "    Recomendamos o uso dessas versões ou de versões mais recentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.0\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": [
        "Use o modo de teste local (disponível em `qiskit-ibm-runtime` v0.22.0 ou posterior) para testar os programas antes de ajustá-los e enviá-los para o hardware quântico real.  Depois de usar o modo de teste local para verificar seu programa, tudo o que você precisa alterar é o nome do backend para executá-lo em uma QPU.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  A primitiva Executor não suporta o modo de teste local.\n",
        "</Admonition>\n",
        "\n",
        "Para usar o modo de teste local, especifique um dos backends falsos de `qiskit_ibm_runtime.fake_provider` ou especifique um backend do Qiskit Aer ao instanciar uma primitiva ou uma sessão de Qiskit Runtime.\n",
        "\n",
        "* **Backends falsos** : Os [backends falsos](/docs/api/qiskit-ibm-runtime/fake-provider) em `qiskit_ibm_runtime.fake_provider` imitam os comportamentos das QPUs IBM® usando instantâneos de QPUs. Os instantâneos da QPU contêm informações importantes sobre a QPU, como o mapa de acoplamento, as portas de base e as propriedades do qubit, que são úteis para testar o transpilador e realizar simulações com ruído da QPU. O modelo de ruído do instantâneo é aplicado automaticamente durante a simulação.\n",
        "* **Simulador Aer** : Os simuladores do [Qiskit Aer](/docs/guides/simulate-with-qiskit-aer) oferecem simulação de alto desempenho que pode lidar com circuitos maiores e [modelos de ruído personalizados](/docs/guides/build-noise-models). Uma lista de opções de métodos de simulação está disponível quando você usa o site `AerSimulator` no modo de teste local. Veja o [exemplo do modo de simulação Clifford](#clifford-sim), que demonstra como simular com eficiência os circuitos Clifford com um grande número de qubits.\n",
        "\n",
        "  <Accordion>\n",
        "    <AccordionItem title=\"**Lista de métodos de simulação disponíveis no Qiskit Aer**\">\n",
        "      Consulte a [`AerSimulator`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.AerSimulator) para obter mais informações.\n",
        "\n",
        "      * `\"automatic\"`: Método de simulação padrão. Selecione o método de simulação automaticamente, com base no modelo de circuito e ruído.\n",
        "\n",
        "      * `\"statevector\"`: Uma simulação de vetor de estado denso que pode amostrar resultados de medição de circuitos *ideais* com todas as medições no final do circuito. Para simulações com ruídos, cada disparo coleta uma amostra aleatória de um circuito com ruídos do modelo de ruídos.\n",
        "\n",
        "      * `\"density_matrix\"`: Uma simulação de matriz de densidade que pode amostrar resultados de medição de circuitos *ruidosos* com todas as medições no final do circuito.\n",
        "\n",
        "      * `\"stabilizer\"`: Um simulador de estado estabilizador de Clifford eficiente que pode simular circuitos de Clifford com ruído se todos os erros no modelo de ruído também forem erros de Clifford.\n",
        "\n",
        "      * `\"extended_stabilizer\"`: Um simulador aproximado para circuitos Clifford + T baseado na decomposição do estado em um estado estabilizador classificado. O número de termos aumenta com o número de portas não-Clifford (T).\n",
        "\n",
        "      * `\"matrix_product_state\"`: Um simulador de vetor de estado de rede tensorial que usa uma representação de estado de produto de matriz (MPS) para o estado. Isso pode ser feito com ou sem truncamento das dimensões do vínculo MPS, dependendo das opções do simulador. O comportamento padrão é sem truncamento.\n",
        "\n",
        "      * `\"unitary\"`: Uma simulação de matriz unitária densa de um circuito ideal. Isso simula a matriz unitária do próprio circuito, em vez da evolução de um estado quântico inicial. Esse método só pode simular portas; ele não oferece suporte a medição, redefinição ou ruído.\n",
        "\n",
        "      * `\"superop\"`: Uma simulação de matriz de superoperador densa de um circuito ideal ou com ruído. Isso simula a matriz de superoperador do próprio circuito, em vez da evolução de um estado quântico inicial. Esse método pode simular portas e reinicializações ideais e com ruído, mas não oferece suporte a medições.\n",
        "\n",
        "      * `\"tensor_network\"`: Uma simulação baseada em rede de tensores que suporta tanto o vetor de estado quanto a matriz de densidade. Atualmente, isso só está disponível para GPU e é acelerado pelo uso das APIs cuQuantum `cuTensorNet` .\n",
        "    </AccordionItem>\n",
        "  </Accordion>\n",
        "\n",
        "<Admonition type=\"note\" title=\"Notas\">\n",
        "  - Você pode especificar todas as opções do site Qiskit Runtime no modo de teste local.  No entanto, todas as opções, exceto disparos, são ignoradas quando executadas em um simulador local.\n",
        "  - Recomenda-se que você instale o Qiskit Aer antes de usar backends falsos ou simuladores Aer, executando `pip install qiskit-aer`. Os back-ends falsos usam simuladores da Aer sob o disfarce, se disponíveis, para aproveitar o desempenho deles.\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",
        "## Exemplo de backends falsos\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 exemplos\n",
        "\n",
        "Exemplo com sessões, sem ruído:\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": [
        "Para simular com ruído, especifique um QPU (hardware quântico) e envie-o para o Aer.  O Aer cria um modelo de ruído com base nos dados de calibração dessa QPU e instancia um backend do Aer com esse modelo.  Se preferir, você pode [criar um modelo de ruído](/docs/guides/build-noise-models).\n",
        "\n",
        "<Admonition type=\"caution\">\n",
        "  Uma QPU pode ser afetada por diferentes tipos de ruído. O modelo de ruído do Qiskit Aer usado aqui simula apenas alguns deles e, portanto, é provável que seja menos grave do que o ruído em uma QPU real.\n",
        "\n",
        "  Para obter detalhes sobre quais erros são incluídos ao inicializar um modelo de ruído de uma QPU, consulte a referência da API Aer [`NoiseModel`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.noise.NoiseModel.html#qiskit_aer.noise.NoiseModel.from_backend) Referência da API.\n",
        "</Admonition>\n",
        "\n",
        "Exemplo com ruído:\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",
        "### Simulação de Clifford\n",
        "\n",
        "Como os circuitos de Clifford podem ser simulados de forma eficiente com resultados verificáveis, a simulação de Clifford é uma ferramenta muito útil. Para obter um exemplo detalhado, consulte [Simulação eficiente de circuitos estabilizadores com primitivos Qiskit Aer](/docs/guides/simulate-stabilizer-circuits).\n",
        "\n",
        "Exemplo:\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",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendações\">\n",
        "  * Use o [`Neat` aula](/docs/guides/debug-qiskit-runtime-jobs) para analisar o impacto do ruído na carga de trabalho do Estimator.\n",
        "  * Analise [exemplos](/docs/guides/sampler-examples) detalhados do Sampler.\n",
        "  * Analise [exemplos](/docs/guides/estimator-examples) detalhados do Estimator.\n",
        "  * Pratique com primitivos trabalhando na [lição sobre função de custo](/learning/courses/variational-algorithm-design/cost-functions) em IBM Quantum Learning.\n",
        "  * Saiba como transpilar localmente na seção [Transpilar](/docs/guides/transpile).\n",
        "  * Experimente o tutorial [Comparar configurações do transpiler](/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
}