{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "2d6582ed-04c1-44bb-9dd8-042d46bd8a7b",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Guia rápido do Executor\"\n",
        "description: \"Como usar a primitiva Executor no ` Qiskit Runtime `.\"\n",
        "\n",
        "---\n",
        "\n",
        "<span id=\"executor-quickstart\" />\n",
        "\n",
        "# Guia rápido do Executor\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b91b019e-f1d9-4a7f-9c5a-68ead8bf2a6d",
      "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 o uso dessas versões ou versões mais recentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.4.0\n",
        "    qiskit-ibm-runtime~=0.46.1\n",
        "    samplomatic~=0.18.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e82a5b3c-eed9-41fe-8940-e88838101ca3",
      "metadata": {},
      "source": [
        "Assim como a primitiva [Sampler](/docs/guides/get-started-with-sampler), o Executor coleta amostras dos registros de saída das execuções de circuitos quânticos, mas não possui nenhum mecanismo integrado de supressão ou mitigação de erros. Na verdade, faz parte do [modelo de execução direcionada](/docs/guides/directed-execution-model), que fornece os elementos necessários para capturar as intenções do projeto no lado do cliente e transfere a dispendiosa geração de variantes de circuitos para o lado do servidor. O Executor segue as diretrizes fornecidas nas anotações e opções dos circuitos, gera e vincula os valores dos parâmetros, executa os circuitos vinculados no hardware e retorna os resultados da execução e os metadados. Ele não toma nenhuma decisão por você e oferece total controle e transparência.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  O pacote Qiskit ainda não possui uma classe base para a primitiva Executor.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"before-you-begin\" />\n",
        "\n",
        "## Antes de iniciar\n",
        "\n",
        "Alguns dos exemplos de código nesta página utilizam `samplex`, que faz parte do pacote Samplomatic.  Portanto, antes de executar esses blocos de código, é necessário instalar o Samplomatic, conforme mostrado no bloco de código a seguir.  Para mais informações, consulte a [documentação do Samplomatic](https://qiskit.github.io/samplomatic).\n",
        "\n",
        "```python\n",
        "pip install samplomatic\n",
        "\n",
        "# For visualization support, include the visualization dependencies.\n",
        "# pip install samplomatic[vis]\n",
        "```\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9112ddbd-7101-4cac-a53f-5ecf492bc8d4",
      "metadata": {},
      "source": [
        "<span id=\"steps-to-use-the-executor-primitive\" />\n",
        "\n",
        "## Passos para usar a primitiva Executor\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. Em seguida, você pode selecionar a QPU que deseja usar para calcular o valor esperado.\n",
        "\n",
        "Siga as etapas descritas na seção [“Configurar sua conta no IBM Cloud® ”](/docs/guides/cloud-setup) caso ainda não tenha uma conta.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "c0b08867-a635-481e-ac4f-52359382c94d",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService, Executor\n",
        "from qiskit_ibm_runtime.quantum_program import QuantumProgram\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from samplomatic.transpiler import generate_boxing_pass_manager\n",
        "from samplomatic import build\n",
        "\n",
        "# Initialize the service and choose a backend\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(operational=True, simulator=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "ec105ea7-d806-4333-92af-2d7c578c67d9",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "<IBMBackend('ibm_fez')>\n"
          ]
        }
      ],
      "source": [
        "print(backend)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "89c4ffd9-acde-4b1f-8ada-fc39b7a708ed",
      "metadata": {},
      "source": [
        "<span id=\"2-create-and-transpile-a-circuit\" />\n",
        "\n",
        "### 2. Criar e compilar um circuito\n",
        "\n",
        "É necessário ter pelo menos um circuito para usar a primitiva Executor.  Ela pode, opcionalmente, ter parâmetros.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "7671b4dd-b031-44b7-bd4a-48dd39fb93f4",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Generate the circuit\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.h(0)\n",
        "circuit.h(1)\n",
        "circuit.cz(0, 1)\n",
        "circuit.h(1)\n",
        "\n",
        "# Using `measure_all` automatically creates the necessary\n",
        "# classical registers.\n",
        "circuit.measure_all()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "127d6de9-084e-47d5-82d6-f2197c0bd74c",
      "metadata": {},
      "source": [
        "O circuito precisa ser adaptado para utilizar apenas instruções compatíveis com a QPU (conhecidos como circuitos *de arquitetura de conjunto de instruções, ou ISA* ). Use o transpiler para fazer isso.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "7a98fb20-8731-43f3-a81c-fb2bc8cba9db",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Transpile the circuit\n",
        "preset_pass_manager = generate_preset_pass_manager(\n",
        "    backend=backend, optimization_level=0\n",
        ")\n",
        "isa_circuit = preset_pass_manager.run(circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "172b3622-adbb-43f6-9cec-b70dc72094e0",
      "metadata": {},
      "source": [
        "<span id=\"3-initialize-a-quantumprogram\" />\n",
        "\n",
        "### 3. Inicializar um objeto ` `QuantumProgram` `\n",
        "\n",
        "Inicialize um `QuantumProgram` com sua carga de trabalho. A `QuantumProgram` é composta por `QuantumProgramItems`. Normalmente, cada item consiste em um circuito, um conjunto de valores de parâmetros e, eventualmente, um mecanismo `samplex` para randomizar o conteúdo do circuito. Para obter mais detalhes, consulte [Entradas e saídas do Executor](/docs/guides/executor-input-output).\n",
        "\n",
        "A célula a seguir inicializa um `QuantumProgram` e especifica a execução de 25 disparos. Em seguida, ele anexa o circuito de destino compilado.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "eb6719cf-c7f1-4265-8602-9a65071a2dd5",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Initialize an empty program\n",
        "program = QuantumProgram(shots=25)\n",
        "\n",
        "# Append the circuit to the program\n",
        "program.append_circuit_item(isa_circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "da542e9b-f143-4651-ab3d-86fb54c066ab",
      "metadata": {},
      "source": [
        "<span id=\"4-optional-group-gates-and-measurements-into-annotated-boxes\" />\n",
        "\n",
        "### 4. Opcional: Agrupe portões e medições em caixas anotadas\n",
        "\n",
        "Agrupar instruções em blocos e anotá-las é a principal forma de especificar sua intenção. No exemplo a seguir, usamos `generate_boxing_pass_manager` e seus parâmetros de rotação para agrupar portas de dois qubits e medições em caixas e aplicar a anotação de rotação.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "245a4574-3ce9-4f77-98c8-af32cde8ac01",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/get-started-with-executor/extracted-outputs/245a4574-3ce9-4f77-98c8-af32cde8ac01-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Generate a boxing pass manager to group gates\n",
        "# and measurements into boxes and add\n",
        "# a`Twirl` annotation.\n",
        "boxes_pm = generate_boxing_pass_manager(\n",
        "    # Add gate twirling\n",
        "    enable_gates=True,\n",
        "    # Add measurement twirling\n",
        "    enable_measures=True,\n",
        ")\n",
        "\n",
        "boxed_circuit = boxes_pm.run(isa_circuit)\n",
        "boxed_circuit.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2b2fe4a7-2a1c-489e-9063-3084edfc2517",
      "metadata": {},
      "source": [
        "<span id=\"5-optional-build-a-template-circuit-and-samplex-and-add-them-to-the-program\" />\n",
        "\n",
        "### 5. Opcional: Crie um circuito modelo e um samplex e adicione-os ao programa\n",
        "\n",
        "Em seguida, use o método [de construção](https://qiskit.github.io/samplomatic/api/auto/samplomatic.build.html#samplomatic.build) Samplomatic para gerar o *circuito modelo* e o par *de samplex*. O circuito modelo é estruturalmente equivalente ao circuito original. No entanto, suas portas de qubit único são substituídas por portas parametrizadas, a fim de implementar as anotações prescritas (rotação de portas e medições, neste exemplo). O samplex codifica todas as informações necessárias para gerar parâmetros aleatórios para o circuito modelo.\n",
        "\n",
        "Depois de gerar o circuito modelo e o par de amostras, use o `append_samplex_item` método para adicionar o par ao programa.\n",
        "\n",
        "Consulte a documentação [da API](https://qiskit.github.io/samplomatic/api/index.html) do Samplomatic para obter todos os detalhes sobre `samplomatic.samplex.Samplex` e seus argumentos.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "47bbeef2-2d85-4495-b740-2e64eb9066b7",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Build the template circuit and the samplex\n",
        "template_circuit, samplex = build(boxed_circuit)\n",
        "\n",
        "# Append the template circuit and samplex as a `samplex_item`\n",
        "program.append_samplex_item(\n",
        "    template_circuit,\n",
        "    samplex=samplex,\n",
        "    shape=(num_randomizations := 20,),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3733cce7-15d5-4c04-a1cd-0bf83e94aeaf",
      "metadata": {},
      "source": [
        "<span id=\"6-invoke-executor-and-get-results\" />\n",
        "\n",
        "### 6. Executar o Executor e obter os resultados\n",
        "\n",
        "Execute o `QuantumProgram` em um backend do IBM® usando a `Executor` primitiva com as opções padrão. Consulte [as opções do Executor](/docs/guides/executor-options) para saber mais sobre as opções disponíveis.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "b767050c-0299-4100-8be4-b73b0587e088",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<RuntimeJobV2('d8286580bvlc73d1vmsg', 'executor')>"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Initialize an Executor with the default options\n",
        "executor = Executor(mode=backend)\n",
        "\n",
        "# Submit the job\n",
        "job = executor.run(program)\n",
        "job"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "a341681d-0704-4800-af65-e49b7627bb36",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the result\n",
        "result = job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e649245b-633d-4123-ad55-9971b9366433",
      "metadata": {},
      "source": [
        "O resultado é do tipo [`QuantumProgramResult`](/docs/api/qiskit-ibm-runtime/results-quantum-program-result). Consulte [Entrada e saída do Executor](/docs/guides/executor-input-output) para saber mais sobre o objeto de resultado.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a6e149b1-de4f-41bb-b972-0781f082fa45",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendações\">\n",
        "  * Experimente alguns [exemplos do Executor](/docs/guides/executor-examples).\n",
        "  * Compreender [a entrada e a saída do Executor](/docs/guides/executor-input-output).\n",
        "  * Saiba mais sobre [a semântica de transmissão do Executor](/docs/guides/executor-broadcasting).\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
}