{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "92e0efa3-cda3-491c-99fc-650b2ce4cfa8",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Instalar y utilizar complementos de transpilador\"\n",
        "description: \"Cómo instalar y utilizar complementos de transpilador en Qiskit.\"\n",
        "---\n",
        "\n",
        "<span id=\"install-and-use-transpiler-plugins\" />\n",
        "\n",
        "# Instalar y utilizar complementos de transpilador\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a4052f5-554d-4633-a588-eb0583f66871",
      "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 versiones más recientes.\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": "12018a80-a1ce-4508-9d04-23c4176028e6",
      "metadata": {},
      "source": [
        "Para facilitar el desarrollo y la reutilización de código de transpilación personalizado por parte de la amplia comunidad de usuarios de Qiskit, el SDK de Qiskit admite una interfaz de plugin que permite a los paquetes Python de terceros declarar que proporcionan una funcionalidad de transpilación ampliada accesible a través de Qiskit.\n",
        "\n",
        "Actualmente, los plugins de terceros pueden ofrecer funciones de transpilación ampliadas de tres maneras:\n",
        "\n",
        "* Un [plugin de etapa de transpilador](/docs/api/qiskit/transpiler_plugins) proporciona un gestor de pases que puede utilizarse en lugar de una de las [6 etapas](transpiler-stages) de un gestor de pases por etapas preestablecido: `init`, `layout`, `routing`, `translation`, `optimization`, y `scheduling`.\n",
        "* Un [complemento de síntesis un](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.UnitarySynthesisPlugin) itaria proporciona funciones ampliadas para la síntesis de puertas unitarias.\n",
        "* Un [complemento de síntesis](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPlugin) de alto nivel ofrece funciones ampliadas para sintetizar \"objetos de alto nivel\", como funciones lineales u operadores Clifford. Los objetos de alto nivel están representados por subclases de la clase [Operación](/docs/api/qiskit/qiskit.circuit.Operation).\n",
        "\n",
        "El resto de la página describe cómo listar los plugins disponibles, instalar nuevos y utilizarlos.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "934388b3-8efd-43b6-82f8-ace84d3bb0d4",
      "metadata": {},
      "source": [
        "<span id=\"list-available-plugins-and-install-new-ones\" />\n",
        "\n",
        "## Enumera los complementos disponibles e instala otros nuevos\n",
        "\n",
        "Qiskit ya incluye algunos plugins integrados para la transpilación. Para instalar más, puede utilizar su gestor de paquetes Python. Por ejemplo, puede ejecutar `pip install qiskit-toqm` para instalar el plugin de etapa de enrutamiento [Qiskit TOQM](https://github.com/qiskit-toqm/qiskit-toqm). Varios plugins de terceros forman parte del [ecosistema Qiskit](https://qiskit.github.io/ecosystem/#transpiler_plugin).\n",
        "\n",
        "<span id=\"list-available-transpiler-stage-plugins\" />\n",
        "\n",
        "### Lista de complementos de etapa de transpilador disponibles\n",
        "\n",
        "Utilice la función [list\\_stage\\_plugins](/docs/api/qiskit/transpiler_plugins#qiskit.transpiler.preset_passmanagers.plugin.list_stage_plugins), pasando el nombre de la etapa cuyos plugins desea listar.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "817254a8-77d7-4eb4-8630-623e67bb2186",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['default', 'dense', 'sabre', 'trivial']"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins\n",
        "\n",
        "list_stage_plugins(\"layout\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "354f9be8-3567-4449-ba60-4d1c3258bb50",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['basic', 'default', 'lookahead', 'none', 'sabre']"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "list_stage_plugins(\"routing\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ac57d3ce-afb3-4aba-8601-93513d4dd491",
      "metadata": {},
      "source": [
        "Si `qiskit-toqm` estuviera instalado, entonces `toqm` aparecería en la lista de plugins `routing` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1397de7f-c447-463e-8aba-ed1f569be86c",
      "metadata": {},
      "source": [
        "<span id=\"list-available-unitary-synthesis-plugins\" />\n",
        "\n",
        "### Lista de plugins de síntesis unitarios disponibles\n",
        "\n",
        "Utilice la función [unitary\\_synthesis\\_plugin\\_names](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "596cbb3d-2ece-4193-929c-79149f7e23bd",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['aqc', 'clifford', 'default', 'gridsynth', 'sk']"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names\n",
        "\n",
        "unitary_synthesis_plugin_names()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e33885d4-788f-4759-bd63-e26d7a45ff9e",
      "metadata": {},
      "source": [
        "<span id=\"list-available-high-level-synthesis-plugins\" />\n",
        "\n",
        "### Lista de complementos de síntesis de alto nivel disponibles\n",
        "\n",
        "Utilice la función [high\\_level\\_synthesis\\_plugin\\_names](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.high_level_synthesis_plugin_names), pasando el nombre del tipo de \"objeto de alto nivel\" a sintetizar. El nombre corresponde al atributo [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name) de la clase [Operación](/docs/api/qiskit/qiskit.circuit.Operation) que representa el tipo de objeto que se está sintetizando.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "3b2d72bb-d661-4432-acfe-970f0a2dcd53",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis import (\n",
        "    high_level_synthesis_plugin_names,\n",
        ")\n",
        "\n",
        "high_level_synthesis_plugin_names(\"clifford\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "583d7529-ab3e-449d-b7d0-e732801d7ae0",
      "metadata": {},
      "source": [
        "Puede utilizar la clase [HighLevelSynthesisPluginManager](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPluginManager) para listar los nombres de todos los plugins de síntesis de alto nivel:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "b17192e5-ddac-4cf6-b2e2-597e8c505568",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['FullAdder.default',\n",
              " 'FullAdder.ripple_c04',\n",
              " 'FullAdder.ripple_v95',\n",
              " 'HalfAdder.default',\n",
              " 'HalfAdder.qft_d00',\n",
              " 'HalfAdder.ripple_c04',\n",
              " 'HalfAdder.ripple_r25',\n",
              " 'HalfAdder.ripple_v95',\n",
              " 'IntComp.default',\n",
              " 'IntComp.noaux',\n",
              " 'IntComp.twos',\n",
              " 'ModularAdder.default',\n",
              " 'ModularAdder.modular_v17',\n",
              " 'ModularAdder.qft_d00',\n",
              " 'ModularAdder.ripple_c04',\n",
              " 'ModularAdder.ripple_v95',\n",
              " 'Multiplier.cumulative_h18',\n",
              " 'Multiplier.default',\n",
              " 'Multiplier.qft_r17',\n",
              " 'PauliEvolution.default',\n",
              " 'PauliEvolution.rustiq',\n",
              " 'WeightedSum.default',\n",
              " 'annotated.default',\n",
              " 'clifford.ag',\n",
              " 'clifford.bm',\n",
              " 'clifford.default',\n",
              " 'clifford.greedy',\n",
              " 'clifford.layers',\n",
              " 'clifford.lnn',\n",
              " 'linear_function.default',\n",
              " 'linear_function.kms',\n",
              " 'linear_function.pmh',\n",
              " 'mcmt.default',\n",
              " 'mcmt.noaux',\n",
              " 'mcmt.vchain',\n",
              " 'mcmt.xgate',\n",
              " 'mcx.1_clean_b95',\n",
              " 'mcx.1_clean_kg24',\n",
              " 'mcx.1_dirty_kg24',\n",
              " 'mcx.2_clean_kg24',\n",
              " 'mcx.2_dirty_kg24',\n",
              " 'mcx.default',\n",
              " 'mcx.gray_code',\n",
              " 'mcx.n_clean_m15',\n",
              " 'mcx.n_dirty_i15',\n",
              " 'mcx.noaux_hp24',\n",
              " 'mcx.noaux_v24',\n",
              " 'permutation.acg',\n",
              " 'permutation.basic',\n",
              " 'permutation.default',\n",
              " 'permutation.kms',\n",
              " 'permutation.token_swapper',\n",
              " 'qft.default',\n",
              " 'qft.full',\n",
              " 'qft.line',\n",
              " 'clifford.rb_default']"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis.plugin import (\n",
        "    HighLevelSynthesisPluginManager,\n",
        ")\n",
        "\n",
        "HighLevelSynthesisPluginManager().plugins.names()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4eed49d1-4723-4366-9edc-1f5aa73907ba",
      "metadata": {},
      "source": [
        "<span id=\"use-a-plugin\" />\n",
        "\n",
        "## Utiliza un complemento\n",
        "\n",
        "En esta sección, mostramos cómo utilizar los plugins del transpilador. En los ejemplos de código, utilizamos plugins que vienen con Qiskit, pero los plugins instalados desde paquetes de terceros se utilizan de la misma manera.\n",
        "\n",
        "<span id=\"use-a-transpiler-stage-plugin\" />\n",
        "\n",
        "### Utiliza un complemento de etapa transpiladora\n",
        "\n",
        "Para utilizar un complemento de etapa de transpilador, especifica su nombre con el argumento correspondiente en [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) o [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). El argumento se forma añadiendo `_method` al nombre de la etapa de transpilación. Por ejemplo, para utilizar el complemento `lookahead` de enrutamiento, especificaríamos `lookahead` para el `routing_method` argumento.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  En estos ejemplos se utiliza el backend `FakeSherbrooke``qiskit_ibm_runtime` simulado de, pero puedes probarlo con cualquier backend real o simulado compatible con Qiskit.  Tus resultados pueden ser diferentes.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "d5e598b3-9226-4fbc-ac76-8eca08ec4af3",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend, routing_method=\"lookahead\"\n",
        ")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "657db73c-7064-4569-a212-87642f16216e",
      "metadata": {},
      "source": [
        "<span id=\"use-a-unitary-synthesis-plugin\" />\n",
        "\n",
        "### Utiliza un complemento de síntesis unitaria\n",
        "\n",
        "Para utilizar un plugin de síntesis unitaria, especifique su nombre como argumento `unitary_synthesis_method` a [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) o [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile):\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "28184c68-4b1e-46d2-a8a0-5480814bad9b",
      "metadata": {},
      "outputs": [],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3,\n",
        "    backend=backend,\n",
        "    unitary_synthesis_method=\"sk\",\n",
        "    unitary_synthesis_plugin_config=dict(\n",
        "        basis_gates=[\"cz\", \"id\", \"rz\", \"sx\", \"x\"]\n",
        "    ),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c019cb3d-5069-4257-bfb6-e15600caa342",
      "metadata": {},
      "source": [
        "La síntesis unitaria se utiliza en las etapas `init`, `translation`, y `optimization` del gestor de pases por etapas devuelto por [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) o se utiliza en [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Consulte [Etapas del transpilador](transpiler-stages) para obtener una descripción de estas etapas.\n",
        "\n",
        "Utilice el argumento `unitary_synthesis_plugin_config` , un diccionario de forma libre, para pasar opciones para el método de síntesis unitaria. La documentación del método de síntesis debe explicar las opciones que admite. Consulte [esta lista](/docs/api/qiskit/transpiler_synthesis_plugins#unitary-synthesis-plugins-2) para obtener enlaces a la documentación de los plugins de síntesis unitaria incorporados.\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "d4ce7ad9-711f-4e43-9012-3f404b885ab1",
      "metadata": {},
      "source": [
        "<span id=\"use-a-high-level-synthesis-plugin\" />\n",
        "\n",
        "### Utiliza un complemento de síntesis de alto nivel\n",
        "\n",
        "En primer lugar, cree un [HLSConfig](/docs/api/qiskit/qiskit.transpiler.passes.HLSConfig) para almacenar los nombres de los plugins a utilizar para varios objetos de alto nivel. Por ejemplo:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "d4672004-aead-4827-9c10-5c70c3c2289b",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler.passes import HLSConfig\n",
        "\n",
        "hls_config = HLSConfig(clifford=[\"layers\"], linear_function=[\"pmh\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4eab8d19-4b58-4f50-a205-039288e4a00d",
      "metadata": {},
      "source": [
        "Esta celda de código crea una configuración de síntesis de alto nivel que utiliza el plugin `layers` para sintetizar objetos [Clifford](/docs/api/qiskit/qiskit.quantum_info.Clifford#clifford) y el plugin `pmh` para sintetizar [LinearFunction](/docs/api/qiskit/qiskit.circuit.library.LinearFunction#linearfunction) objetos. Los nombres de los argumentos de las palabras clave corresponden a las [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name) de la clase [Operación](/docs/api/qiskit/qiskit.circuit.Operation) que representa el tipo de objeto que se está sintetizando.\n",
        "Para cada objeto de alto nivel, la lista de plugins dados se prueba en secuencia hasta que uno de ellos (en el ejemplo anterior, cada lista contiene un único plugin).\n",
        "\n",
        "Además de especificar un complemento por su nombre, puede pasar una tupla `(name, options)` , donde el segundo elemento de la tupla es un diccionario que contiene opciones para el complemento. La documentación del método de síntesis debe explicar las opciones que admite. En [esta lista](/docs/api/qiskit/transpiler_synthesis_plugins#high-level-synthesis-plugins-2) encontrará enlaces a la documentación de los plugins de síntesis de alto nivel incorporados.\n",
        "\n",
        "Una vez creado el objeto `HLSConfig` , páselo como `hls_config` argumento a [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) o [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile):\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "8784b881-2f37-4f75-b5c7-c84cdb8b8a60",
      "metadata": {},
      "outputs": [],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend, hls_config=hls_config\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ea63c611-c213-4736-83f7-c46e918eb862",
      "metadata": {},
      "source": [
        "La síntesis de alto nivel se utiliza en las etapas `init`, `translation`, y `optimization` del gestor de pases por etapas devuelto por [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) o se utiliza en [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Consulte [Etapas del transpilador](transpiler-stages) para obtener una descripción de estas etapas.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "aae87a98-f16d-4ac1-9b85-11a771e04224",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximos pasos\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendación\">\n",
        "  * [Crea un complemento de transpilador](/docs/guides/create-transpiler-plugin).\n",
        "  * Consulta los [tutoriales](/docs/tutorials) para ver ejemplos de transpilación y ejecución de circuitos cuánticos.\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
}