{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "008d2ceb-f6fa-42f6-a7df-6bd604775278",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Guia de introdução rápida ao Estimador\"\n",
        "description: \"Como usar a primitiva Estimator no Qiskit Runtime.\"\n",
        "---\n",
        "\n",
        "<span id=\"estimator-quickstart\" />\n",
        "\n",
        "# Guia de introdução rápida ao Estimador\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "49f269ba-e11d-4e5c-bbba-9d4a10540ad8",
      "metadata": {},
      "source": [
        "A primitiva Estimator calcula os valores esperados para uma ou mais variáveis observáveis em relação aos estados preparados por circuitos quânticos. Os circuitos podem ser parametrizados, desde que os valores dos parâmetros também sejam fornecidos como entrada para a primitiva.\n",
        "\n",
        "Esta primitiva possui várias [técnicas](/docs/guides/error-mitigation-and-suppression-techniques) integradas de mitigação e supressão de erros, incluindo desacoplamento dinâmico, Pauli-twirling, ZNE com gate-folding, PEA e PEC. Ele também oferece uma `resilience_level` opção que permite configurar facilmente o equilíbrio entre custo e precisão.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b7e96291-0925-4d7f-81a8-a7738549477c",
      "metadata": {},
      "source": [
        "As etapas descritas neste tópico explicam como configurar o Estimator, explorar as opções disponíveis para sua configuração e chamá-lo em um programa.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "818a2b3d-3950-4a28-8e37-39959c56484b",
      "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 com base nos seguintes requisitos.\n",
        "    Recomendamos usar essas versões ou versões mais recentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.0\n",
        "    qiskit-ibm-runtime~=0.47.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bafa61f0-c049-4ee6-ac76-a0ed97e67caf",
      "metadata": {},
      "source": [
        "{/*Verified the v2 examples 2/29/24 - updated 10/29/24*/}\n",
        "\n",
        "<span id=\"steps-to-use-the-estimator-primitive\" />\n",
        "\n",
        "## Passos para usar a primitiva Estimator\n",
        "\n",
        "<span id=\"1-initialize-the-account\" />\n",
        "\n",
        "### 1. Inicializar a conta\n",
        "\n",
        "Como o Qiskit Runtime é um serviço gerenciado, você precisa primeiro configurar sua conta. Você pode então selecionar a QPU que deseja usar para calcular o valor esperado.\n",
        "\n",
        "Siga as etapas descritas na seção [“Configurar sua conta do IBM Cloud ”](cloud-setup) caso ainda não tenha uma conta.\n",
        "\n",
        "<Admonition type=\"note\" title=\"Portas fracionárias\">\n",
        "  Para usar os [gates fracionários](/docs/guides/fractional-gates) agora suportados, defina `use_fractional_gates=True` ao solicitar um backend de uma `QiskitRuntimeService` instância. Por exemplo:\n",
        "\n",
        "  ```python\n",
        "  service = QiskitRuntimeService()\n",
        "  fractional_gate_backend = service.least_busy(use_fractional_gates=True)\n",
        "  ```\n",
        "\n",
        "  Este é um recurso experimental e pode sofrer alterações no futuro.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "71d62ba2-b1ba-405a-b304-5bdd7ec5e11b",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "ibm_marrakesh\n"
          ]
        }
      ],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=127\n",
        ")\n",
        "\n",
        "print(backend.name)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d894fbe3-3ea8-4db0-908e-95790b560ddb",
      "metadata": {},
      "source": [
        "<span id=\"2-create-a-circuit-and-an-observable\" />\n",
        "\n",
        "### 2. Crie um circuito e uma variável observável\n",
        "\n",
        "Você precisa de pelo menos um circuito e uma variável observável como entradas para a primitiva Estimator.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "c0ad8982-d19b-46d4-8a2d-dd30357c0e52",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.circuit.library import qaoa_ansatz\n",
        "from qiskit.quantum_info import SparsePauliOp\n",
        "\n",
        "entanglement = [tuple(edge) for edge in backend.coupling_map.get_edges()]\n",
        "observable = SparsePauliOp.from_sparse_list(\n",
        "    [(\"ZZ\", [i, j], 0.5) for i, j in entanglement],\n",
        "    num_qubits=backend.num_qubits,\n",
        ")\n",
        "circuit = qaoa_ansatz(observable, reps=2)\n",
        "# The circuit is parametrized, so we will define the parameter values for execution\n",
        "param_values = [0.1, 0.2, 0.3, 0.4]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "84b42c6f-d80e-4cff-8e34-03affa566a97",
      "metadata": {},
      "source": [
        "O circuito e a variável observável precisam ser transformados para utilizar apenas instruções compatíveis com a QPU (conhecidos como circuitos *de arquitetura de conjunto de instruções (ISA)* ). Use o transpilador para fazer isso.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "abefc665-24a7-466e-a9ec-67cac6a50ebd",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Circuit ops (ISA): OrderedDict([('rz', 4472), ('sx', 1884), ('cz', 1120)])\n"
          ]
        }
      ],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "pm = generate_preset_pass_manager(optimization_level=1, backend=backend)\n",
        "isa_circuit = pm.run(circuit)\n",
        "isa_observable = observable.apply_layout(isa_circuit.layout)\n",
        "print(f\">>> Circuit ops (ISA): {isa_circuit.count_ops()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b53e9ab3-7d87-4dd5-b362-138b24cfa73b",
      "metadata": {},
      "source": [
        "<span id=\"3-initialize-qiskit-runtime-estimator\" />\n",
        "\n",
        "### 3. Inicializar o Estimador d Qiskit Runtime\n",
        "\n",
        "Ao inicializar o Estimator, use o `mode` parâmetro para especificar o modo em que deseja que ele seja executado.  Os valores possíveis `backend` são `batch`, `session`, ou para os modos de execução em lote, sessão e tarefa, respectivamente. Para obter mais informações, consulte [a Introdução aos modos de execução do `Qiskit Runtime`.](execution-modes) Observe que os usuários do Open Plan não podem enviar tarefas de sessão.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "961508db-e534-4fc9-970d-7babcd6c39ef",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import EstimatorV2 as Estimator\n",
        "\n",
        "estimator = Estimator(mode=backend)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "59b13a43-0c9f-4fdb-a379-af5115c153e1",
      "metadata": {},
      "source": [
        "<span id=\"4-invoke-estimator-and-get-results\" />\n",
        "\n",
        "### 4. Execute o Estimator e obtenha os resultados\n",
        "\n",
        "Em seguida, chame o `run()` método para calcular os valores esperados dos circuitos de entrada e das variáveis observáveis. Os conjuntos de valores dos parâmetros de circuito, observáveis e opcionais são inseridos como tuplas *de blocos unificados primitivos* ( PUB ).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "f1a60bad-cf09-4136-aa1a-4482759b3aea",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Job ID: d9bjisbv6alc73ct56dg\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Job Status: QUEUED\n"
          ]
        }
      ],
      "source": [
        "job = estimator.run([(isa_circuit, isa_observable, param_values)])\n",
        "print(f\">>> Job ID: {job.job_id()}\")\n",
        "print(f\">>> Job Status: {job.status()}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "c817cce5-4686-43d2-89a1-ed0842d8ace3",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})\n",
            "  > Expectation value: 24.052015949594512\n",
            "  > Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}\n"
          ]
        }
      ],
      "source": [
        "result = job.result()\n",
        "print(f\">>> {result}\")\n",
        "print(f\"  > Expectation value: {result[0].data.evs}\")\n",
        "print(f\"  > Metadata: {result[0].metadata}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d38dd409-e0d8-4749-bb22-58ae9a53d26a",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendações\">\n",
        "  * Saiba como [testar localmente](local-testing-mode) antes de executar em computadores quânticos.\n",
        "  * Analise [exemplos](/docs/guides/estimator-examples) detalhados.\n",
        "  * Pratique com primitivas seguindo a [lição](/learning/courses/variational-algorithm-design/cost-functions) sobre a função `Cost` em IBM Quantum Learning.\n",
        "  * Saiba como fazer a transpilagem localmente na seção [Transpilagem](/docs/guides/transpile/).\n",
        "  * Consulte o guia [de comparação de configurações do transpiler](/docs/guides/circuit-transpilation-settings#compare-transpiler-settings).\n",
        "  * Aprenda a [usar as opções básicas](runtime-options-overview).\n",
        "  * Veja as opções da API do [Estimator](/docs/api/qiskit-ibm-runtime/options-estimator-options).\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
}