{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "2d6582ed-04c1-44bb-9dd8-042d46bd8a7b",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Guía rápida de Executor\"\n",
        "description: \"Cómo utilizar la primitiva «Executor» en Qiskit Runtime.\"\n",
        "\n",
        "---\n",
        "\n",
        "<span id=\"executor-quickstart\" />\n",
        "\n",
        "# Guía rápida de 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=\"Versiones del paquete\">\n",
        "    El código de esta página se ha desarrollado teniendo en cuenta los siguientes requisitos.\n",
        "    Recomendamos utilizar estas versiones o posteriores.\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": [
        "Al igual que la primitiva [Sampler](/docs/guides/get-started-with-sampler), Executor toma muestras de los registros de salida de las ejecuciones de circuitos cuánticos, pero no cuenta con ningún mecanismo integrado de supresión o mitigación de errores. Más bien, forma parte del [modelo de ejecución dirigida](/docs/guides/directed-execution-model), que proporciona los elementos necesarios para reflejar las intenciones del diseño en el lado del cliente y traslada la costosa generación de variantes de circuitos al lado del servidor. El ejecutor sigue las instrucciones proporcionadas en las anotaciones y opciones de los circuitos, genera y asigna los valores de los parámetros, ejecuta los circuitos asignados en el hardware y devuelve los resultados de la ejecución y los metadatos. No toma ninguna decisión por ti de forma implícita y te ofrece un control total y total transparencia.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  El paquete Qiskit aún no cuenta con una clase base para la primitiva Executor.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"before-you-begin\" />\n",
        "\n",
        "## Antes de empezar\n",
        "\n",
        "Algunos de los ejemplos de código de esta página utilizan `samplex`, que forma parte del paquete Samplomatic.  Por lo tanto, antes de ejecutar esos bloques de código, debes instalar Samplomatic, tal y como se muestra en el siguiente bloque de código.  Para obtener más información, consulta la [documentación de 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",
        "## Pasos para utilizar la primitiva Executor\n",
        "\n",
        "<span id=\"1-initialize-the-account\" />\n",
        "\n",
        "### 1. Inicializar la cuenta\n",
        "\n",
        "Dado que Qiskit Runtime es un servicio gestionado, primero debe configurar su cuenta. A continuación, puedes seleccionar la QPU que deseas utilizar para calcular el valor esperado.\n",
        "\n",
        "Sigue los pasos [que se indican](/docs/guides/cloud-setup) en la guía «Configurar tu cuenta de IBM Cloud® » si aún no tienes una cuenta.\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. Crear y compilar un circuito\n",
        "\n",
        "Se necesita al menos un circuito para utilizar la primitiva Executor.  Opcionalmente, puede tener 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": [
        "Es necesario modificar el circuito para que utilice únicamente instrucciones compatibles con la QPU (lo que se conoce como circuitos *de arquitectura de conjunto de instrucciones, o ISA* ). Para ello, utiliza el transpilador.\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 un objeto ` `QuantumProgram` `\n",
        "\n",
        "Inicializa un `QuantumProgram` con tu carga de trabajo. A `QuantumProgram` está compuesto por `QuantumProgramItems`. Por lo general, cada elemento consta de un circuito, un conjunto de valores de parámetros y, en algunos casos, un mecanismo `samplex` para aleatorizar el contenido del circuito. Para obtener más información, consulta «[Entradas y salidas del ejecutor](/docs/guides/executor-input-output) ».\n",
        "\n",
        "La siguiente celda inicializa un `QuantumProgram` y especifica que se realicen 25 disparos. A continuación, añade el 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: Agrupa las puertas y las mediciones en recuadros con anotaciones\n",
        "\n",
        "Agrupar las instrucciones en bloques y añadirles comentarios es la forma principal de expresar lo que quieres hacer. En el siguiente ejemplo, utilizamos `generate_boxing_pass_manager` y sus parámetros de giro para agrupar puertas de dos qubits y mediciones en recuadros y aplicar la anotación de giro.\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: Crea un circuito de referencia y un samplex, y añádelos al programa\n",
        "\n",
        "A continuación, utiliza el método [de construcción](https://qiskit.github.io/samplomatic/api/auto/samplomatic.build.html#samplomatic.build) «Samplomatic» para generar el *circuito de referencia* y el par *de samplex*. El circuito modelo es estructuralmente equivalente al circuito original. Sin embargo, sus puertas de un solo qubit se sustituyen por puertas parametrizadas con el fin de implementar las anotaciones prescritas (rotación de puertas y mediciones, en este ejemplo). El samplex codifica toda la información necesaria para generar parámetros aleatorios para el circuito de plantilla.\n",
        "\n",
        "Una vez generados el circuito de plantilla y el par de muestras, utiliza el `append_samplex_item` método para añadir el par al programa.\n",
        "\n",
        "Consulte la documentación [de la API](https://qiskit.github.io/samplomatic/api/index.html) de Samplomatic para obtener información detallada sobre `samplomatic.samplex.Samplex` y sus 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. Ejecutar el programa y obtener los resultados\n",
        "\n",
        "Ejecuta el `QuantumProgram` en un backend de IBM® utilizando la `Executor` primitiva con las opciones predeterminadas. Consulte [las opciones de Executor](/docs/guides/executor-options) para conocer las opciones disponibles.\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": [
        "El resultado es de tipo [`QuantumProgramResult`](/docs/api/qiskit-ibm-runtime/results-quantum-program-result). Consulta [«Entradas y salidas de Executor»](/docs/guides/executor-input-output) para obtener más información sobre el objeto de resultado.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a6e149b1-de4f-41bb-b972-0781f082fa45",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximos pasos\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendaciones\">\n",
        "  * Prueba algunos [ejemplos de Executor](/docs/guides/executor-examples).\n",
        "  * Comprender [la entrada y la salida del ejecutor](/docs/guides/executor-input-output).\n",
        "  * Descubre [la semántica](/docs/guides/executor-broadcasting) de la difusión de Executor.\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
}