{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "0be36083-7bf5-48b7-9241-7979d6853d0c",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Exemplos de amostras\"\n",
        "description: \"Exemplos práticos de uso da primitiva “Sampler” do IBM Quantum.\"\n",
        "---\n",
        "\n",
        "<span id=\"sampler-examples\" />\n",
        "\n",
        "# Exemplos de amostras\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=\"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.1\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": [
        "Gerar distribuições de quase-probabilidade completas, com mitigação de erros, a partir de amostras das saídas de circuitos quânticos. Aproveite os recursos do Sampler para algoritmos de pesquisa e classificação, como o Grover e o QVSM.\n",
        "\n",
        "<span id=\"run-a-single-experiment\" />\n",
        "\n",
        "## Executar um único experimento\n",
        "\n",
        "Use o Sampler para retornar o resultado da medição como sequências de bits ou contagens de um único circuito.\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: ['1111010010110011001010101100010100001010110000100110111000000000100011100000001101110110001010000100000000010000000011000110101', '1001001111111001011011011011001010100101010000001101000010101101010000011100000000100100010000001000010000001010001001010101111', '0100001101111001110000000001000101101010001000010110111100011000100000010101101110001000010001111110001000100010011110000001100', '1000101001100101010000100001000101101010000011001110101111100010111011010110001010101010011011000001100000000010100100010100111', '1100011110101010000000011000100000100001110101011011100011011000111111110010000101000000000101011100001000100101000000000100001', '0000001100000000101100000000110100101011110100101101100110000000100110001110100000010010100000011101011001000000001011000100101', '1000001100110111001110100011101000111111101100110011100000000000000100001000100101100110000000100101000101001001110000001110000', '1100001000101000101100010011010101001010110010101000110111010100000100000011110000110011010110011010110010000000000000000000101', '0111010011101111010010000011010010001000000000010100000001001010001111100000100101000101000111110010101010100000101000100101011', '0100001000101010110010100111110100101001011111000011111010100110011000100001100000111101100101000000010010010000011110001011000']\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",
        "## Execute várias experiências em uma única tarefa\n",
        "\n",
        "Use o Sampler para retornar os resultados das medições como sequências de bits ou contagens de vários circuitos em uma única tarefa.\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: ['0101000101101010001010110001000101011010001000011001101011100011010001000000011001010110011001100000010001000001000100001111011', '0001010011100000101110011011110001110001000101000101011100101101010001000110101000001000101010000001000001000101101100000101000', '0100100110010110000000101011101100011000000101111110111111010001010000000010000010101110100101100111000101100010100111000010100', '1001011100111110000100011111110001011001100100001010000101010000111010000001100111110001101101001010110100000001010000010110000', '0001101101111010100001110101000011100001100001011101110100000110100001001101011110111011001011000101010110000010000111000001100']\n",
            " > First five results for pub 1: ['1111011001010000011101010001110000011000100000000001101010100000001100001001011010000100110100110111000001011000010010000000110', '0100111011011010011111101001110101101000100000000011111101011000100010000001110110010011000111010000100010101001011001001101110', '0110001000111101001000101000101000010010100010010000011011110001111010000000011010100000110000010000111101000010001001000100100', '1110110111110000010111101000111000100011110110011001100011000101000111110001001010000110100000011001100011101100000000000101010', '1000010011110101101101111100011000100101001011110010000101011100010111101100111001101111111111010100011010110100011000100100001']\n",
            " > First five results for pub 2: ['0100010111001111010001100100111010110000001000110000111010111001000011101110000110110010010000001000100100000010101000000001100', '0000110110001001100000001000101000001101010100011010111000101011011110000101011010000110000000000100000001010110010010000000001', '0001000111100100110100101100011011000010100001000100100000010001101110000000010101100111100100111101010111111001100101100010010', '0011110010110101011001111100000101000010001111000101100000001100110011111000000100010010101110111001011100000000001010000001001', '1110000001000100001010011100110100011110101010100100111111000110010111000001001100111000101001001100011011010010111000101000011']\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",
        "## Executar circuitos parametrizados\n",
        "\n",
        "Execute várias experiências em uma única tarefa, utilizando valores de parâmetros para aumentar a reutilização dos circuitos.\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: ['1001010001111101000000100001100110000001110001011100011001110011101111001110110100110101011001100100011001110001110011011100011', '1000101001000011110100010010001111101110000001111100001010100000100000100110101111110011000000111001010100110001011011101001111', '0110111100011101011000100011000011000010110110000100101100010101111001101011111110011111100000100011111001101101001111011110101', '0110111011101011011111000100000011110011010000010000100110000011101000111100011100100110111000110100111000101011111100010100111', '0000001110100110101011011110110011111100011111001011010101111100000010111110010100001110001001110000001011110011001001000001111']\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",
        "## Use lotes e opções avançadas\n",
        "\n",
        "Explore o [modo de execução](/docs/guides/execution-modes) em lote e as opções avançadas para otimizar o desempenho dos circuitos nas QPUs.\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: ['1001001101100100001000001111101111001011010010010110110001110000000101010010001101001111000010110010101011001110110111001000100', '0100000111100101000010001110100001000011000011010000100001011000001001010111110100010000111101011100000100001110010110110001010', '1100011001000001101101000000000111001011110101110100001001000001001001100000101010010000000000110011000000011010011011100001111', '0011111111110001010010101111110111000010100001010000011101100010011011110001001000001100101000010100101010100010001001010001010', '1001111101110101010101110110011101111010011101000101110100011011110100000100100100110001001110101000000100101001001111000001010']\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: ['1111111110000001000111010010010101010010111001110111001000100000010011101110101101001010001010000000000100011000010001000010000', '1110011100110100100100111001000101010011110001010110100100001110010010011100000000000100000010001001010100011110010000001011100', '1111101001010011110011011010000111000010001101100101000100000110000011001110001101100100100100100010011100001000000000100111010', '1100010101000011101000110100000101001000110110010100000000001000010110100110000111010101010010001101010010100000100111010110000', '1010100100100110011100010010100000101101101101000111000010101110010111010100001111000001100010100011110000000011101000101001100']\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",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendações\">\n",
        "  * [Especifique opções avançadas de tempo de execução](runtime-options-overview).\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).\n",
        "  * Entenda os [limites da tarefa](/docs/guides/job-limits) ao enviar uma tarefa para uma QPU do IBM®.\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
}