{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9e6be239",
   "metadata": {},
   "source": [
    "# Simulación y ejecución en hardware\n",
    "\n",
    "Recorres el camino completo desde la simulación ideal hasta un procesador real:\n",
    "\n",
    "1. el error estadístico según el número de disparos;\n",
    "2. el efecto del ruido con `AerSimulator.from_backend`;\n",
    "3. la transpilación a circuitos ISA y los niveles de optimización;\n",
    "4. el `Sampler` de `qiskit-ibm-runtime` con un backend falso, que funciona sin cuenta."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "063283f8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:32.401383Z",
     "iopub.status.busy": "2026-09-29T19:07:32.401127Z",
     "iopub.status.idle": "2026-09-29T19:07:33.621801Z",
     "shell.execute_reply": "2026-09-29T19:07:33.621260Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fake_manila | 5 qubits | puertas nativas: ['cx', 'delay', 'for_loop', 'id', 'if_else', 'measure', 'reset', 'rz', 'switch_case', 'sx', 'x']\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from qiskit import QuantumCircuit, transpile\n",
    "from qiskit.primitives import StatevectorSampler\n",
    "from qiskit.transpiler import generate_preset_pass_manager\n",
    "from qiskit_aer import AerSimulator\n",
    "from qiskit_ibm_runtime.fake_provider import FakeManilaV2\n",
    "from qiskit_ibm_runtime.executor_sampler import Sampler\n",
    "\n",
    "backend = FakeManilaV2()\n",
    "print(backend.name, \"|\", backend.num_qubits, \"qubits | puertas nativas:\", sorted(backend.operation_names))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a48aaa8",
   "metadata": {},
   "source": [
    "## Disparos y error estadístico\n",
    "\n",
    "Estimamos $P(1) = 0.5$ con distintos números de disparos, repitiendo 40 veces con semillas diferentes. La dispersión de las estimaciones sigue $\\sqrt{p(1-p)/N}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f331a8ed",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:33.622830Z",
     "iopub.status.busy": "2026-09-29T19:07:33.622645Z",
     "iopub.status.idle": "2026-09-29T19:07:34.665839Z",
     "shell.execute_reply": "2026-09-29T19:07:34.665448Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 700x350 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "qc = QuantumCircuit(1)\n",
    "qc.h(0)\n",
    "qc.measure_all()\n",
    "\n",
    "disparos = [50, 100, 500, 1000, 5000, 10000]\n",
    "dispersion = []\n",
    "for shots in disparos:\n",
    "    estimaciones = []\n",
    "    for semilla in range(40):\n",
    "        conteos = StatevectorSampler(seed=semilla).run([qc], shots=shots).result()[0].data.meas.get_counts()\n",
    "        estimaciones.append(conteos.get(\"1\", 0) / shots)\n",
    "    dispersion.append(np.std(estimaciones))\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 3.5))\n",
    "ax.loglog(disparos, dispersion, \"o\", label=\"medido (40 repeticiones)\")\n",
    "ax.loglog(disparos, [np.sqrt(0.25 / n) for n in disparos], \"--\", label=\"teoría: √(p(1−p)/N)\")\n",
    "ax.set_xlabel(\"Disparos\")\n",
    "ax.set_ylabel(\"Error típico de P(1)\")\n",
    "ax.set_title(\"Cien veces más disparos: diez veces menos error\")\n",
    "ax.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68dc416a",
   "metadata": {},
   "source": [
    "## Ideal frente a ruidoso\n",
    "\n",
    "`AerSimulator.from_backend` copia el ruido, las puertas nativas y la conectividad del procesador. El circuito debe transpilarse para ese modelo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "87aadb68",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:34.666826Z",
     "iopub.status.busy": "2026-09-29T19:07:34.666695Z",
     "iopub.status.idle": "2026-09-29T19:07:34.837378Z",
     "shell.execute_reply": "2026-09-29T19:07:34.836622Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ideal    fidelidad = 1.000 | {'000': 991, '111': 1009}\n",
      "ruidoso  fidelidad = 0.880 | {'000': 892, '001': 21, '010': 17, '011': 85, '100': 77, '101': 19, '110': 20, '111': 869}\n"
     ]
    }
   ],
   "source": [
    "def ghz(n):\n",
    "    qc = QuantumCircuit(n)\n",
    "    qc.h(0)\n",
    "    for i in range(n - 1):\n",
    "        qc.cx(i, i + 1)\n",
    "    qc.measure_all()\n",
    "    return qc\n",
    "\n",
    "ideal = AerSimulator(seed_simulator=5)\n",
    "ruidoso = AerSimulator.from_backend(backend, seed_simulator=5)\n",
    "for nombre, sim in [(\"ideal\", ideal), (\"ruidoso\", ruidoso)]:\n",
    "    conteos = sim.run(transpile(ghz(3), sim, seed_transpiler=5), shots=2000).result().get_counts()\n",
    "    correctos = conteos.get(\"000\", 0) + conteos.get(\"111\", 0)\n",
    "    print(f\"{nombre:8s} fidelidad = {correctos / 2000:.3f} | {dict(sorted(conteos.items()))}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "605275ff",
   "metadata": {},
   "source": [
    "## Transpilación a ISA\n",
    "\n",
    "Un procesador solo ejecuta sus puertas nativas y solo aplica `cx` entre qubits conectados. Revisamos la conectividad de `FakeManilaV2` y transpilamos un GHZ en forma de estrella (el qubit 0 controla a todos), que obliga al transpilador a agregar intercambios (`swap`). Cada intercambio se descompone en tres `cx`, por eso el circuito transpilado tiene muchas más `cx` que el original. Los niveles de optimización 0 a 3 buscan circuitos más cortos a cambio de más tiempo de compilación."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "cc2b7e77",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:34.839349Z",
     "iopub.status.busy": "2026-09-29T19:07:34.839124Z",
     "iopub.status.idle": "2026-09-29T19:07:34.864968Z",
     "shell.execute_reply": "2026-09-29T19:07:34.864284Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conectividad: [(0, 1), (1, 0), (1, 2), (2, 1), (2, 3), (3, 2), (3, 4), (4, 3)]\n",
      "Original: profundidad 6 | cx 4\n",
      "nivel 0: profundidad  17 | cx 13\n",
      "nivel 1: profundidad  11 | cx 10\n",
      "nivel 2: profundidad  11 | cx 10\n",
      "nivel 3: profundidad  11 | cx 10\n"
     ]
    }
   ],
   "source": [
    "print(\"Conectividad:\", sorted(backend.coupling_map.get_edges()))\n",
    "\n",
    "estrella = QuantumCircuit(5)\n",
    "estrella.h(0)\n",
    "for i in range(1, 5):\n",
    "    estrella.cx(0, i)\n",
    "estrella.measure_all()\n",
    "print(\"Original: profundidad\", estrella.depth(), \"| cx\", estrella.count_ops()[\"cx\"])\n",
    "\n",
    "for nivel in range(4):\n",
    "    pm = generate_preset_pass_manager(optimization_level=nivel, backend=backend, seed_transpiler=7)\n",
    "    isa = pm.run(estrella)\n",
    "    ops = isa.count_ops()\n",
    "    print(f\"nivel {nivel}: profundidad {isa.depth():3d} | cx {ops.get('cx', 0):2d}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4bac72da",
   "metadata": {},
   "source": [
    "## Sampler de IBM Runtime con un backend falso\n",
    "\n",
    "Es el mismo código que usarás con un procesador real. Con un backend falso como `mode`, el trabajo se ejecuta localmente con el ruido del procesador."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "6a8a339b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T19:07:34.866818Z",
     "iopub.status.busy": "2026-09-29T19:07:34.866593Z",
     "iopub.status.idle": "2026-09-29T19:07:35.053003Z",
     "shell.execute_reply": "2026-09-29T19:07:35.052387Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "global phase: π/4\n",
      "         ┌─────────┐┌────┐┌─────────┐      ░ ┌─┐   \n",
      "q_0 -> 0 ┤ Rz(π/2) ├┤ √X ├┤ Rz(π/2) ├──■───░─┤M├───\n",
      "         └─────────┘└────┘└─────────┘┌─┴─┐ ░ └╥┘┌─┐\n",
      "q_1 -> 1 ────────────────────────────┤ X ├─░──╫─┤M├\n",
      "                                     └───┘ ░  ║ └╥┘\n",
      " meas: 2/═════════════════════════════════════╩══╩═\n",
      "                                              0  1 \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'00': 1942, '11': 1824, '10': 110, '01': 124}"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Fidelidad del estado de Bell: 0.942\n"
     ]
    }
   ],
   "source": [
    "bell = QuantumCircuit(2)\n",
    "bell.h(0)\n",
    "bell.cx(0, 1)\n",
    "bell.measure_all()\n",
    "\n",
    "pm = generate_preset_pass_manager(optimization_level=1, backend=backend, seed_transpiler=1)\n",
    "isa = pm.run(bell)\n",
    "print(isa.draw(\"text\", idle_wires=False))\n",
    "\n",
    "resultado = Sampler(mode=backend).run([isa], shots=4000).result()\n",
    "conteos = resultado[0].data.meas.get_counts()\n",
    "fidelidad = (conteos.get(\"00\", 0) + conteos.get(\"11\", 0)) / 4000\n",
    "print(conteos)\n",
    "print(f\"Fidelidad del estado de Bell: {fidelidad:.3f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "907a1183",
   "metadata": {},
   "source": [
    "## Cambiar a un procesador real\n",
    "\n",
    "Con tu cuenta de IBM Quantum Platform guardada (`QiskitRuntimeService.save_account(channel=\"ibm_quantum_platform\", token=..., instance=...)`), solo cambia la forma de obtener el backend:\n",
    "\n",
    "```python\n",
    "from qiskit_ibm_runtime import QiskitRuntimeService\n",
    "\n",
    "service = QiskitRuntimeService()\n",
    "backend = service.least_busy(operational=True, simulator=False)\n",
    "pm = generate_preset_pass_manager(optimization_level=1, backend=backend)\n",
    "isa = pm.run(bell)\n",
    "job = Sampler(mode=backend).run([isa], shots=4000)\n",
    "print(job.job_id())           # guárdalo para recuperar el resultado después\n",
    "conteos = job.result()[0].data.meas.get_counts()\n",
    "```\n",
    "\n",
    "El trabajo entra en una cola; con `service.job(job_id)` puedes recuperarlo más tarde. El plan abierto tiene un tiempo mensual limitado de procesador: prueba todo antes en simulación.\n",
    "\n",
    "## Resumen\n",
    "\n",
    "- El error estadístico baja con la raíz del número de disparos.\n",
    "- El ruido aparece como resultados que el circuito ideal nunca produce.\n",
    "- Transpilar es obligatorio: puertas nativas + conectividad. Más puertas de dos qubits, más error.\n",
    "- El mismo código de `Sampler` sirve para backends falsos y procesadores reales."
   ]
  }
 ],
 "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.13.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
