{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "fbce2fd6-c79e-4e90-9074-6cde8a09b517",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Parámetros comúnmente utilizados para la transpilación\"\n",
        "description: \"Descripción general de los parámetros más utilizados para controlar la transpilación de circuitos cuánticos en Qiskit.\"\n",
        "---\n",
        "\n",
        "<span id=\"commonly-used-parameters-for-transpilation\" />\n",
        "\n",
        "# Parámetros comúnmente utilizados para la transpilación\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6beea7ff-7407-47be-a0b7-1e7981328df5",
      "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": "05fb8adb-3b36-4449-b669-108d2d749ca5",
      "metadata": {},
      "source": [
        "En esta página se describen algunos de los parámetros más utilizados para la transpilación local. Estos parámetros se configuran mediante argumentos 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",
        "<span id=\"approx-degree\" />\n",
        "\n",
        "<span id=\"approximation-degree\" />\n",
        "\n",
        "## Grado de aproximación\n",
        "\n",
        "Puede utilizar el grado de aproximación para especificar hasta qué punto desea que el circuito resultante coincida con el circuito deseado (de entrada).  Se trata de un valor flotante en el rango ( 0.0 - 1.0 ), donde 0.0 es la máxima aproximación y 1.0 (por defecto) es ninguna aproximación. Los valores más pequeños cambian la precisión de la salida por la facilidad de ejecución (es decir, menos puertas).  El valor por defecto es 1.0.\n",
        "\n",
        "En la síntesis unitaria de dos qubits (utilizada en las etapas iniciales de todos los niveles y para la etapa de optimización con nivel de optimización 3), este valor especifica la fidelidad objetivo de la descomposición de salida. Es decir, cuánto error se introduce cuando una representación matricial de un circuito se convierte en puertas discretas. Si el grado de aproximación es un valor más bajo (más aproximación), el circuito de salida de la síntesis diferirá más de la matriz de entrada, pero también es probable que tenga menos puertas (porque cualquier operación arbitraria de dos qubits se puede descomponer perfectamente con un máximo de tres puertas CX) y es más fácil de ejecutar.\n",
        "\n",
        "Cuando el grado de aproximación es inferior a 1.0, pueden sintetizarse circuitos con una o dos puertas CX, lo que conlleva menos error del hardware, pero más de la aproximación. Dado que CX es la puerta más costosa en términos de error, podría ser beneficioso disminuir el número de ellas a costa de la fidelidad en la síntesis (esta técnica se utilizó para aumentar el volumen cuántico en dispositivos IBM® : [Validación de ordenadores cuánticos mediante circuitos modelo aleatorios](https://arxiv.org/abs/1811.12926) ).\n",
        "\n",
        "Como ejemplo, generamos un `UnitaryGate` aleatorio de dos qubits que se sintetizará en la etapa inicial. Ajustando `approximation_degree` a menos de 1.0 se podría generar un circuito aproximado. También debemos especificar `basis_gates` para que el método de síntesis sepa qué puertas puede utilizar para la síntesis aproximada.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "e660bec2-f806-4050-955b-53a50289158e",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "2\n"
          ]
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit, QuantumRegister\n",
        "from qiskit.circuit.library import UnitaryGate\n",
        "from qiskit.quantum_info import random_unitary\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "UU = random_unitary(4, seed=12345)\n",
        "rand_U = UnitaryGate(UU)\n",
        "\n",
        "qubits = QuantumRegister(2, name=\"q\")\n",
        "qc = QuantumCircuit(qubits)\n",
        "qc.append(rand_U, qubits)\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1,\n",
        "    approximation_degree=0.85,\n",
        "    basis_gates=[\"sx\", \"rz\", \"cx\"],\n",
        ")\n",
        "approx_qc = pass_manager.run(qc)\n",
        "print(approx_qc.count_ops()[\"cx\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6f067d6e-0157-43fc-8cb2-c86855b6bdac",
      "metadata": {},
      "source": [
        "El resultado es `2` porque la aproximación requiere menos puertas CX.\n",
        "\n",
        "<span id=\"seed\" />\n",
        "\n",
        "<span id=\"random-number-generator-seed\" />\n",
        "\n",
        "## Semilla del generador de números aleatorios\n",
        "\n",
        "Algunas partes del transpilador son estocásticas, por lo que la repetición de la transpilación puede dar resultados diferentes. Para obtener un resultado reproducible, puede establecer la semilla para el generador de números pseudoaleatorios utilizando el argumento `seed_transpiler` . Si se repite la operación con la misma semilla, se obtendrán los mismos resultados.\n",
        "\n",
        "Ejemplo:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, seed_transpiler=11, basis_gates=[\"sx\", \"rz\", \"cx\"]\n",
        ")\n",
        "optimized_1 = pass_manager.run(qc)\n",
        "optimized_1.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "20b95efa-8aa8-41ac-a037-dac2a3336879",
      "metadata": {},
      "source": [
        "<span id=\"init-layout\" />\n",
        "\n",
        "<span id=\"initial-layout\" />\n",
        "\n",
        "## Diseño inicial\n",
        "\n",
        "Antes de la transpilación, los qubits contenidos en tu circuito son qubits virtuales que no se corresponden necesariamente con qubits físicos en el backend de destino. Puede especificar la asignación inicial de qubits virtuales a qubits físicos utilizando el argumento `initial_layout` . Tenga en cuenta que la disposición final de los qubits puede diferir de la disposición inicial porque el transpilador puede permutar los qubits utilizando puertas de intercambio u otros medios.\n",
        "\n",
        "En el siguiente ejemplo, construimos un diseño inicial para el backend [`FakeSherbrooke`](/docs/api/qiskit-ibm-runtime/fake-provider-fake-sherbrooke#fakesherbrooke) creando un objeto [`Layout`](/docs/api/qiskit/qiskit.transpiler.Layout) objeto Nuestra disposición mapea el primer qubit de nuestro circuito al qubit 5 de Sherbrooke, y mapea el segundo qubit de nuestro circuito al qubit 6 de Sherbrooke. Tenga en cuenta que los qubits físicos siempre se representan mediante números enteros.\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": 3,
      "id": "e18c034c-eb26-4d9d-81d7-37e0eafa17c7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/e18c034c-eb26-4d9d-81d7-37e0eafa17c7-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "from qiskit.transpiler import Layout\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "\n",
        "a, b = qubits\n",
        "initial_layout = Layout({a: 5, b: 6})\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "261055f3-cb88-4651-9a98-31891a4db535",
      "metadata": {},
      "source": [
        "Además de especificar un objeto Layout, también se puede pasar una lista de enteros, donde el $i$ -ésimo elemento de la lista contiene el qubit físico al que se debe mapear el $i$ -ésimo qubit. Por ejemplo:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "a7800d8a-7354-48e4-a55f-f902ae28c875",
      "metadata": {
        "scrolled": true
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/a7800d8a-7354-48e4-a55f-f902ae28c875-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "initial_layout = [5, 6]\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d2034dd5-23e5-4473-89b8-aaf4233775c7",
      "metadata": {},
      "source": [
        "Puede utilizar la función [`plot_error_map`](/docs/api/qiskit/qiskit.visualization.plot_error_map) para generar un diagrama del gráfico del dispositivo con información de error y con los qubits físicos etiquetados. También puede ver diagramas similares en la página [Recursos informáticos](/computers).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "8df57c6a-1ff4-4d58-9b7e-4378452c3025",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/8df57c6a-1ff4-4d58-9b7e-4378452c3025-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import plot_error_map\n",
        "\n",
        "plot_error_map(backend, figsize=(30, 24))"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "25c05cca-b93b-4ba1-b46c-7280ec4ef8cb",
      "metadata": {},
      "source": [
        "<span id=\"xx-method\" />\n",
        "\n",
        "<span id=\"transpiler-stage-and-plugin-options\" />\n",
        "\n",
        "## Opciones de la etapa del transpilador y del complemento\n",
        "\n",
        "Estas opciones llevan el sufijo `_method`. Influyen en el funcionamiento del transpilador y se utilizan para intentar obtener un resultado mejor, diferente o específico del transpilador.\n",
        "\n",
        "* `init_method` (str) - El plugin a utilizar para la etapa de inicialización.\n",
        "\n",
        "* `layout_method` (str) - El paso de selección de diseño (`trivial`, `dense`, `sabre`). Esto también puede ser el nombre del plugin externo a utilizar para la etapa de diseño.\n",
        "\n",
        "* `optimization_method` (str) - El plugin a utilizar para la etapa de optimización.\n",
        "\n",
        "* `routing_method` (str) - Nombre del paso de enrutamiento (`basic`, `lookahead`, `default`, `sabre`, `none`). También puede ser el nombre del plugin externo a utilizar para la etapa de enrutamiento.\n",
        "\n",
        "* `scheduling_method` (str) - Nombre del pase de programación. Este también puede ser el nombre del plugin externo a utilizar para la etapa de programación.\n",
        "  * `as_soon_as_possible`: Programar instrucciones con avidez: lo antes posible en un recurso qubit (alias: `asap`).\n",
        "  * `as_late_as_possible`: Programar las instrucciones con retraso.  Es decir, mantener los qubits en el estado de tierra siempre que sea posible (alias: `alap`).\n",
        "\n",
        "* `translation_method` (str) - Nombre del paso de traducción (`unroller`, `translator`, `synthesis`). También puede ser el nombre del plugin externo a utilizar para la etapa de traducción.\n",
        "\n",
        "* `unitary_synthesis_method` (str) - El nombre del método de síntesis unitaria a utilizar. Por defecto se utiliza `default` .\n",
        "\n",
        "<Admonition>\n",
        "  Para ver una lista de todos los plugins instalados para una etapa determinada, ejecute [`list_stage_plugins(\"stage_name\")`](/docs/api/qiskit/transpiler_plugins). Por ejemplo, si desea ver una lista de todos los plugins instalados para la etapa de enrutamiento, ejecute `list_stage_plugins(routing)`.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximos pasos\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendación\">\n",
        "  * Revise el tema [Opciones por defecto y ajustes de configuración](defaults-and-configuration-options).\n",
        "  * Aprenda a [configurar el nivel de optimización](set-optimization).\n",
        "  * Prueba la guía [de configuración del transpilador Compare](/docs/guides/circuit-transpilation-settings).\n",
        "  * Revisa la [documentación de la API del transpilador](/docs/api/qiskit/transpiler).\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": 5
}