{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "008d2ceb-f6fa-42f6-a7df-6bd604775278",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Guia de introdução rápida ao Sampler\"\n",
        "description: \"Como usar a primitiva Sampler no ` Qiskit Runtime `.\"\n",
        "---\n",
        "\n",
        "<span id=\"sampler-quickstart\" />\n",
        "\n",
        "# Guia de introdução rápida ao Sampler\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b7e96291-0925-4d7f-81a8-a7738549477c",
      "metadata": {},
      "source": [
        "A principal função do Sampler é amostrar o registro de saída resultante da execução de um ou mais circuitos quânticos. São aceitos [circuitos dinâmicos](/docs/guides/execute-dynamic-circuits) e circuitos parametrizados como entrada (caso sejam enviados circuitos parametrizados, os valores dos parâmetros também devem ser fornecidos). O Sampler também oferece suporte a desacoplamento dinâmico e twirling integrados para [supressão de erros](/docs/guides/error-mitigation-and-suppression-techniques).\n",
        "\n",
        "As etapas deste tópico descrevem como configurar o Sampler, explorar as opções disponíveis para configurá-lo 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": "64e2e09f-8528-4088-897b-1529b451ab1e",
      "metadata": {},
      "source": [
        "<span id=\"steps-to-use-the-sampler-primitive\" />\n",
        "\n",
        "## Passos para usar a primitiva Sampler\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 no tópico [“Configurar sua conta do IBM Cloud ”](/docs/guides/cloud-setup) caso ainda não tenha uma conta configurada.\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": "b40504d7-aee5-4b30-98b1-265e70bece8d",
      "metadata": {},
      "outputs": [],
      "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",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "73374fbc-d3b6-4d2d-84c6-edf85b43ea25",
      "metadata": {},
      "source": [
        "<span id=\"2-create-a-circuit\" />\n",
        "\n",
        "### 2. Criar um circuito\n",
        "\n",
        "É necessário ter pelo menos um circuito como entrada para a primitiva Sampler.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "dfe23a34-2ea9-48af-bd1d-c7e3185aa80c",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import efficient_su2\n",
        "\n",
        "circuit = efficient_su2(127, entanglement=\"linear\")\n",
        "circuit.measure_all()\n",
        "# The circuit is parametrized, so we will define the parameter values for execution\n",
        "param_values = np.random.rand(circuit.num_parameters)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6cf08ef6-34d3-42e6-8cb3-391b60217289",
      "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": "062bd89b-b13e-46d0-96b6-6c84b2131415",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Circuit ops (ISA): OrderedDict([('rz', 3036), ('sx', 1769), ('cz', 378), ('measure', 127), ('barrier', 1)])\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",
        "print(f\">>> Circuit ops (ISA): {isa_circuit.count_ops()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cf0f2c0a-8574-45c6-a43b-1a99eac81279",
      "metadata": {},
      "source": [
        "<span id=\"3-initialize-the-qiskit-runtime-sampler\" />\n",
        "\n",
        "### 3. Inicializar o amostrador “ Qiskit Runtime ”\n",
        "\n",
        "Ao inicializar o Sampler, 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": "a2b80dca-dff8-49f9-8154-e2cb0b768507",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import SamplerV2 as Sampler\n",
        "\n",
        "sampler = Sampler(mode=backend)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f35972bf-17d3-40be-852b-9e56615c7c3c",
      "metadata": {},
      "source": [
        "<span id=\"4-invoke-sampler-and-get-results\" />\n",
        "\n",
        "### 4. Executar o Sampler e obter os resultados\n",
        "\n",
        "Em seguida, chame o `run()` método para gerar a saída. O circuito e os conjuntos de valores de parâmetros opcionais são inseridos como tuplas *de blocos unificados primitivos* ( PUB ).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "e52e6a96-dc23-4f76-8152-b54514a99dfb",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Job ID: d9bjioe6hjac73ffpt00\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Job Status: QUEUED\n"
          ]
        }
      ],
      "source": [
        "job = sampler.run([(isa_circuit, param_values)])\n",
        "print(f\">>> Job ID: {job.job_id()}\")\n",
        "print(f\">>> Job Status: {job.status()}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "4543fac5-abdc-4440-a1a2-d32aabe135d6",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "First ten results for the 'meas' output register: ['1101010100010000110010011111001100111000110001001100000001111010010000110001000110011011001000011101010101011011011001100100011', '1010000011001001001010000000010011101110010000011010001001000010110000100010011010101110001100000100000011011111001000000000001', '1001100110001100100011000001000010000010011010100000000011010011110101001100001101100000001010000111010000011010010001100110011', '0101010101010101010100111011101110010110010101110000100010100010110011000010101000000110011001011101010000101011101001100001000', '0101011011101110110010101100100011111001001100001101001001101010000000110101001010011000010100100011000001000101010001100010011', '1101010101001111011111100111001001111110011010101000011100001110000101111010000011100110101010001101000011001100110011001010000', '0000000000000010001000111111100011101100011010101110011011110011100110011001010100011100101100100011100110011111001000110010000', '1010101000100110110100010100000000011100011010010110100000111011111001111011101010101111011100100111010010000110100000100000000', '0001111001000100110011110010011001101100001110111001100010101011001100001100110010001010001000010011010000101011110001110001100', '1100100011000011001010000011010101110110010101100111010111100101011110110110100010010001001100110011000100001010010101010010011']\n"
          ]
        }
      ],
      "source": [
        "result = job.result()\n",
        "\n",
        "# Get results for the first (and only) PUB\n",
        "pub_result = result[0]\n",
        "print(\n",
        "    f\"First ten results for the 'meas' output register: \"\n",
        "    f\"{pub_result.data.meas.get_bitstrings()[:10]}\"\n",
        ")"
      ]
    },
    {
      "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](sampler-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](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](/docs/guides/runtime-options-overview).\n",
        "  * Consulte a API para ver as opções [do Sampler](/docs/api/qiskit-ibm-runtime/options-sampler-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
}