{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "c08a245a-82c1-4c6f-b1e1-d0a27f093b7a",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Qiskit Runtime modo de prueba local\"\n",
        "description: \"Utilice el modo de prueba local para simular hardware cuántico en Qiskit Runtime\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore superop */}\n",
        "\n",
        "<span id=\"test-locally\" />\n",
        "\n",
        "<span id=\"qiskit-runtime-local-testing-mode\" />\n",
        "\n",
        "# Qiskit Runtime modo de prueba local\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "14778d9c-4e0e-4b84-8575-90e4efab25a2",
      "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",
        "    qiskit-aer~=0.17\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "435ec827-a348-4b70-b1ef-582849c0a76a",
      "metadata": {},
      "source": [
        "Utilice el modo de prueba local (disponible en `qiskit-ibm-runtime` v0.22.0 o posterior) para probar los programas antes de ajustarlos y enviarlos al hardware cuántico real.  Después de usar el modo de prueba local para verificar tu programa, todo lo que necesitas cambiar es el nombre del backend para ejecutarlo en una QPU.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  La primitiva Executor no admite el modo de prueba local.\n",
        "</Admonition>\n",
        "\n",
        "Para utilizar el modo de prueba local, especifique uno de los backends falsos de `qiskit_ibm_runtime.fake_provider` o especifique un backend Qiskit Aer al instanciar una primitiva Qiskit Runtime o una sesión.\n",
        "\n",
        "* Falsos **backends** : Los [backends](/docs/api/qiskit-ibm-runtime/fake-provider) falsos en `qiskit_ibm_runtime.fake_provider` imitan los comportamientos de IBM® QPUs mediante el uso de instantáneas QPU. Las instantáneas de la QPU contienen información importante sobre la QPU, como el mapa de acoplamiento, las puertas base y las propiedades de los qubits, que son útiles para probar el transpilador y realizar simulaciones ruidosas de la QPU. El modelo de ruido de la instantánea se aplica automáticamente durante la simulación.\n",
        "* **Simulador Aer** : Los simuladores de [Qiskit](/docs/guides/simulate-with-qiskit-aer) Aer proporcionan una simulación de mayor rendimiento que puede manejar circuitos más grandes y [modelos de ruido personalizados](/docs/guides/build-noise-models). Si utiliza `AerSimulator` en modo de prueba local, dispondrá de una lista de opciones de métodos de simulación. Vea el [ejemplo del modo de simulación Cl](#clifford-sim) ifford, que demuestra cómo simular eficientemente circuitos Clifford con un gran número de qubits.\n",
        "\n",
        "  <Accordion>\n",
        "    <AccordionItem title=\"**Lista de métodos de simulación disponibles en Qiskit Aer**\">\n",
        "      Consulte la [`AerSimulator`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.AerSimulator) para más información.\n",
        "\n",
        "      * `\"automatic\"`: Método de simulación por defecto. Selecciona automáticamente el método de simulación en función del circuito y del modelo de ruido.\n",
        "\n",
        "      * `\"statevector\"`: Una simulación densa de vectores de estado que puede muestrear resultados de mediciones de circuitos *ideales* con todas las mediciones al final del circuito. Para las simulaciones ruidosas, cada disparo muestrea un circuito ruidoso muestreado aleatoriamente a partir del modelo de ruido.\n",
        "\n",
        "      * `\"density_matrix\"`: Una simulación de matriz de densidad que puede muestrear los resultados de las mediciones de circuitos *ruidosos* con todas las mediciones al final del circuito.\n",
        "\n",
        "      * `\"stabilizer\"`: Un simulador eficiente del estado del estabilizador Clifford que puede simular circuitos Clifford ruidosos si todos los errores en el modelo de ruido son también errores Clifford.\n",
        "\n",
        "      * `\"extended_stabilizer\"`: Un simulador aproximado para circuitos Clifford + T basado en la descomposición del estado en un estado clasificado-estabilizador. El número de términos crece con el número de puertas no Clifford (T).\n",
        "\n",
        "      * `\"matrix_product_state\"`: Un simulador tensor-red estado-vector que utiliza una representación Matrix Product State (MPS) para el estado. Esto puede hacerse con o sin truncamiento de las dimensiones de enlace MPS, dependiendo de las opciones del simulador. El comportamiento por defecto es sin truncamiento.\n",
        "\n",
        "      * `\"unitary\"`: Una simulación de matriz unitaria densa de un circuito ideal. Esto simula la matriz unitaria del propio circuito, en lugar de la evolución de un estado cuántico inicial. Este método sólo puede simular puertas; no admite medición, reinicio ni ruido.\n",
        "\n",
        "      * `\"superop\"`: Una simulación matricial de superoperador denso de un circuito ideal o ruidoso. Esto simula la matriz de superoperadores del propio circuito, en lugar de la evolución de un estado cuántico inicial. Este método puede simular puertas y reinicios ideales y ruidosos, pero no admite mediciones.\n",
        "\n",
        "      * `\"tensor_network\"`: Una simulación basada en redes tensoriales que admite tanto vectores de estado como matrices de densidad. Actualmente sólo está disponible para GPU y se acelera utilizando las API de cuQuantum `cuTensorNet` .\n",
        "    </AccordionItem>\n",
        "  </Accordion>\n",
        "\n",
        "<Admonition type=\"note\" title=\"Notas\">\n",
        "  - Puede especificar todas las opciones de Qiskit Runtime en modo de prueba local.  Sin embargo, todas las opciones excepto los disparos se ignoran cuando se ejecuta en un simulador local.\n",
        "  - Se recomienda instalar Qiskit Aer antes de utilizar backends falsos o simuladores Aer ejecutando `pip install qiskit-aer`. Los falsos backends utilizan simuladores Aer de forma encubierta, si están disponibles, para aprovechar su rendimiento.\n",
        "</Admonition>\n",
        "\n",
        "{/* If you currently use the Qiskit SDK, you can use the existing Qiskit Aer primitives for local testing.  See [exact and noisy simulation with Qiskit Aer primitives](/docs/guides/simulate-with-qiskit-aer) for details. */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "366b1216-fb2f-4d06-afd8-fe374ab6ed9a",
      "metadata": {},
      "source": [
        "<span id=\"fake-backends-example\" />\n",
        "\n",
        "## Ejemplo de backends falsos\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "efda5007-260a-49c0-ab6f-eac91fdbdf84",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler\n",
        "from qiskit_ibm_runtime.fake_provider import FakeManilaV2\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Run the Sampler job locally using FakeManilaV2\n",
        "fake_manila = FakeManilaV2()\n",
        "pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "\n",
        "# You can use a fixed seed to get fixed results.\n",
        "options = {\"simulator\": {\"seed_simulator\": 42}}\n",
        "sampler = Sampler(mode=fake_manila, options=options)\n",
        "\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b51e77c0-31c9-4dfa-950c-0a9ea9247aac",
      "metadata": {},
      "source": [
        "<span id=\"aersimulator-examples\" />\n",
        "\n",
        "## AerSimulator ejemplos\n",
        "\n",
        "Ejemplo con sesiones, sin ruido:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "63407a34-0c70-400a-bc34-f85ccd581c4d",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer import AerSimulator\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import Session, SamplerV2 as Sampler\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Run the Sampler job locally using AerSimulator.\n",
        "# Session syntax is supported but ignored because local mode doesn't support sessions.\n",
        "aer_sim = AerSimulator()\n",
        "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "with Session(backend=aer_sim) as session:\n",
        "    sampler = Sampler(mode=session)\n",
        "    result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6a511de6-dc37-4ac4-87f8-bee90e3014a3",
      "metadata": {},
      "source": [
        "Para simular con ruido, especifique una QPU (hardware cuántico) y envíela a Aer.  Aer construye un modelo de ruido basado en los datos de calibración de esa QPU e instantiza un backend Aer con ese modelo.  Si lo prefieres, puedes [construir un modelo de ruido](/docs/guides/build-noise-models).\n",
        "\n",
        "<Admonition type=\"caution\">\n",
        "  Una QPU puede verse afectada por distintos tipos de ruido. El modelo de ruido Qiskit Aer utilizado aquí sólo simula algunos de ellos y, por tanto, es probable que sea menos grave que el ruido de una QPU real.\n",
        "\n",
        "  Para más detalles sobre qué errores se incluyen al inicializar un modelo de ruido desde una QPU, véase la referencia de la API Aer [`NoiseModel`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.noise.NoiseModel.html#qiskit_aer.noise.NoiseModel.from_backend) API reference.\n",
        "</Admonition>\n",
        "\n",
        "Ejemplo con ruido:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "0878eec8-9959-4e98-aff7-bf114352b838",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer import AerSimulator\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler, QiskitRuntimeService\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Specify a QPU to use for the noise model\n",
        "real_backend = service.backend(\"ibm_fez\")\n",
        "aer = AerSimulator.from_backend(real_backend)\n",
        "\n",
        "# Run the Sampler job locally using AerSimulator.\n",
        "pm = generate_preset_pass_manager(backend=aer, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "sampler = Sampler(mode=aer)\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2a2815a4-19f9-4ebd-8e53-4e29bea4a8db",
      "metadata": {},
      "source": [
        "<span id=\"clifford-sim\" />\n",
        "\n",
        "<span id=\"clifford-simulation\" />\n",
        "\n",
        "### Simulación de Clifford\n",
        "\n",
        "Dado que los circuitos Clifford pueden simularse eficazmente con resultados verificables, la simulación Clifford es una herramienta muy útil. Para ver un ejemplo detallado, consulte [Simulación eficiente de circuitos estabilizadores con primitivas Qiskit Aer](/docs/guides/simulate-stabilizer-circuits).\n",
        "\n",
        "Ejemplo:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "b9d0fdac-ba2e-4c4e-8c49-c924fb8b5c43",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import efficient_su2\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler\n",
        "\n",
        "n_qubits = 500  # <---- note this uses 500 qubits!\n",
        "circuit = efficient_su2(n_qubits)\n",
        "circuit.measure_all()\n",
        "\n",
        "rng = np.random.default_rng(1234)\n",
        "params = rng.choice(\n",
        "    [0, np.pi / 2, np.pi, 3 * np.pi / 2],\n",
        "    size=circuit.num_parameters,\n",
        ")\n",
        "\n",
        "# Tell Aer to use the stabilizer (Clifford) simulation method\n",
        "aer_sim = AerSimulator(method=\"stabilizer\")\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "sampler = Sampler(mode=aer_sim)\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ee461e4d-ee50-4430-9e83-c3b49cd7a1ef",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximos pasos\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendaciones\">\n",
        "  * Utilice el [`Neat` clase](/docs/guides/debug-qiskit-runtime-jobs) para analizar el impacto del ruido en una carga de trabajo de Estimator.\n",
        "  * Consulte [ejemplos](/docs/guides/sampler-examples) detallados de Sampler.\n",
        "  * Consulte [ejemplos](/docs/guides/estimator-examples) detallados de Estimator.\n",
        "  * Lea [Migrar a V2 primitives](/docs/guides/v2-primitives).\n",
        "  * Practique con las primitivas trabajando a través de la [lección Función de coste](/learning/courses/variational-algorithm-design/cost-functions) en IBM Quantum Learning.\n",
        "  * Aprenda a transpilar localmente en la sección [Transpilar](/docs/guides/transpile).\n",
        "  * Prueba el tutorial [Comparar la configuración del transpilador](/docs/guides/circuit-transpilation-settings#compare-transpiler-settings).\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
}