{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f7d9993f",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"HI-VQE Chemistry - una función Qiskit de Qunova Computing\"\n",
        "description: \"Documentación de la función HI-VQE Qiskit de Qunova Computing. Se puede utilizar para resolver el estado fundamental y la energía del estado fundamental de los sistemas químicos.\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore lumo hivqe DMRG ccsd, ffsim, pvdz, Qunova, HI-VQE, AVAS, Dooh, pyscf, nucmod, GTO's, lucj, pseudopotential, pseudopotentials, magmom, Jastrow, multireference, Pellow, Jarman */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "dde95705",
      "metadata": {},
      "source": [
        "<span id=\"hi-vqe-chemistry---a-qiskit-function-by-qunova-computing\" />\n",
        "\n",
        "# HI-VQE Chemistry - una función Qiskit de Qunova Computing\n",
        "\n",
        "*Consulte la [referencia de la API](/docs/api/functions/qunova-chemistry)*\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Las funciones Qiskit son una función experimental disponible únicamente para los usuarios de los planes IBM Quantum® Premium Plan, Flex Plan y On-Prem (a través de IBM Quantum Platform API). Se trata de versiones preliminares sujetas a cambios.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bbfca10c",
      "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 siguiendo los siguientes requisitos.\n",
        "    Recomendamos utilizar estas versiones o posteriores.\n",
        "\n",
        "    ```\n",
        "    qiskit-ibm-runtime~=0.45.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e3498f9b",
      "metadata": {},
      "source": [
        "<span id=\"overview\" />\n",
        "\n",
        "## Visión general\n",
        "\n",
        "En química cuántica, el problema de la estructura electrónica se centra en hallar las soluciones de la ecuación electrónica de Schrödinger: las funciones de onda cuánticas que describen el comportamiento de los electrones del sistema. Estas funciones de onda son vectores de amplitudes complejas, correspondiendo cada amplitud a la contribución de una posible configuración del electrón.\n",
        "\n",
        "El estado básico es la función de onda de menor energía del sistema y tiene especial importancia en el estudio de los sistemas moleculares. La aproximación más precisa para calcular el estado básico considera todas las configuraciones posibles de los electrones, pero esto se vuelve intratable para sistemas más grandes, ya que el número de configuraciones crece exponencialmente con el tamaño del sistema.\n",
        "\n",
        "El Handover Iterative Variational Quantum Eigensolver (HI-VQE) es un innovador método híbrido cuántico-clásico para estimar con precisión el estado fundamental de sistemas moleculares. Integra el hardware cuántico con la informática clásica, utilizando procesadores cuánticos para explorar eficazmente las configuraciones electrónicas candidatas y calcular la función de onda resultante en ordenadores clásicos. Al generar funciones de onda compactas pero químicamente precisas, HI-VQE mejora la investigación y el descubrimiento en química cuántica y ciencia de materiales.\n",
        "\n",
        "![Imagen general del algoritmo HI-VQE de Qunova](https://quantum.cloud.ibm.com/docs/images/guides/qunova-chemistry/overview.svg)\n",
        "\n",
        "HI-VQE reduce la complejidad computacional del problema de estructura electrónica estimando eficientemente el estado fundamental con alta precisión. Se centra en un subconjunto cuidadosamente seleccionado de las configuraciones de electrones más relevantes, optimizando tanto la precisión como la eficacia.\n",
        "\n",
        "Combinando los puntos fuertes de los ordenadores clásicos y cuánticos, HI-VQE refina y mejora iterativamente la función de onda de la estimación actual. Sus exclusivas técnicas de construcción de subespacios ayudan a que la selección de configuraciones sea más eficiente, de modo que los usuarios tengan un mayor control computacional y una mayor precisión en las simulaciones de química cuántica.\n",
        "\n",
        "Si desea obtener más información sobre el algoritmo, puede [leer el artículo de investigación asociado.](https://arxiv.org/abs/2503.06292)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f761442",
      "metadata": {},
      "source": [
        "<span id=\"description\" />\n",
        "\n",
        "## Descripción\n",
        "\n",
        "El número de configuraciones de electrones de un sistema molecular crece exponencialmente con el tamaño del sistema. Sin embargo, para ciertos estados electrónicos, como el estado básico, es habitual que sólo una pequeña fracción de configuraciones contribuya significativamente a la energía del estado. Los métodos de interacción de configuraciones seleccionadas (SCI) explotan esta dispersión para reducir los costes computacionales identificando y centrándose en las configuraciones más relevantes. Este subconjunto de configuraciones se denomina subespacio.\n",
        "\n",
        "HI-VQE aprovecha la eficiencia inherente de los ordenadores cuánticos para representar sistemas moleculares con el fin de ayudar a la búsqueda de subespacios. Integra subrutinas clásicas y cuánticas para resolver el problema de la estructura electrónica con gran precisión. A diferencia de los métodos SCI cuánticos existentes, HI-VQE combina la formación variacional, la construcción iterativa de subespacios y el cribado de configuraciones previo a la diagonalización para mejorar la eficiencia mediante la reducción de las mediciones cuánticas, las iteraciones y los costes de diagonalización clásicos. Por tanto, HI-VQE puede aplicarse a sistemas moleculares más grandes que requieren más qubits, y reduce el coste de resolver un problema de un tamaño determinado con el mismo grado de precisión.\n",
        "\n",
        "![Imagen que muestra una descripción detallada de cada paso del algoritmo HI-VQE de Qunova.](https://quantum.cloud.ibm.com/docs/images/guides/qunova-chemistry/description.avif)\n",
        "\n",
        "Para calcular el estado fundamental de un sistema, HI-VQE utiliza en primer lugar el paquete de química clásica PySCF para generar una representación molecular a partir de los datos proporcionados por el usuario, como la geometría molecular y otra información molecular. A continuación, entra en un bucle de optimización híbrido cuántico-clásico, refinando de forma iterativa un subespacio para representar de forma óptima el estado base y minimizar al mismo tiempo el número de configuraciones incluidas. El bucle continúa hasta que se cumplen los criterios de convergencia, como el tamaño del subespacio o la estabilidad de la energía, tras lo cual se obtienen la función de onda y la energía del estado básico calculadas. Estos resultados pueden utilizarse para construir superficies de energía potencial precisas y realizar otros análisis del sistema.\n",
        "\n",
        "El ciclo de optimización se centra en ajustar los parámetros de un circuito cuántico para generar un subespacio de alta calidad. HI-VQE ofrece tres opciones de circuitos cuánticos: [`excitation_preserving`](/docs/api/qiskit/qiskit.circuit.library.excitation_preserving), [efficient\\_su2](/docs/api/qiskit/qiskit.circuit.library.efficient_su2) y [LUCJ](https://qiskit-community.github.io/ffsim/explanations/lucj.html). La optimización se inicia cerca del estado de referencia de Hartree-Fock debido a su idoneidad general. A continuación, el circuito se ejecuta en un dispositivo cuántico y se muestrean configuraciones del estado cuántico resultante antes de devolverlas como cadenas binarias. Debido al ruido de los dispositivos cuánticos, algunas configuraciones muestreadas pueden ser físicamente inválidas, ya que no conservan el número de electrones o el espín. HI-VQE resuelve este problema mediante el proceso de recuperación de la configuración del paquete [«qiskit-addon-sqd»](/docs/addons/qiskit-addon-sqd), de modo que los usuarios puedan corregir las configuraciones no válidas o descartarlas.\n",
        "\n",
        "A continuación, las configuraciones válidas se someten a una etapa opcional de cribado para eliminar las que se prevé que contribuyan mínimamente. Esto reduce la dimensión del subespacio, disminuyendo así el coste del paso de diagonalización. Si se activa el cribado, se construye un subespacio hamiltoniano preliminar a partir de las configuraciones válidas y se realiza una diagonalización con criterios de terminación muy laxos. Aunque la precisión de las amplitudes resultantes para cada configuración es baja, es eficaz para predecir qué configuraciones dejar fuera del subespacio en esta iteración, y es rápido de calcular.\n",
        "\n",
        "Las configuraciones seleccionadas se añaden al subespacio y el Hamiltoniano del sistema se proyecta en este subespacio. El subespacio se actualiza iterativamente, conservando las configuraciones más relevantes a lo largo de las iteraciones. Este enfoque contrasta con los métodos alternativos porque el circuito cuántico no necesita aproximarse al estado de reposo completo en cada paso.\n",
        "\n",
        "A continuación, el Hamiltoniano del subespacio se diagonaliza clásicamente para obtener el valor propio más bajo y su correspondiente vector propio, que representan una aproximación del estado básico y su energía. A medida que la calidad del subespacio mejora con las iteraciones, el estado básico calculado se aproxima más al verdadero estado básico. En este punto se puede realizar un paso de selección adicional para eliminar cualquier configuración del subespacio que no tenga una contribución sustancial al estado básico calculado. Este paso garantiza que el subespacio llevado a la siguiente iteración sea lo más compacto posible. Esto se evalúa basándose en las amplitudes que devuelve la diagonalización, ya que representan la contribución importante de cada configuración al estado fundamental calculado.\n",
        "\n",
        "A continuación, una comprobación de convergencia determina si un entrenamiento adicional mejoraría los resultados. Si es así, se realiza un paso opcional de expansión clásica, se actualizan los parámetros del circuito cuántico para minimizar aún más la energía calculada y se repite el proceso. El paso de expansión clásica genera configuraciones adicionales para el subespacio, complementando las configuraciones muestreadas del dispositivo cuántico. Primero identifica la configuración con la mayor amplitud en los resultados de la diagonalización, antes de generar nuevas configuraciones con excitaciones simples y dobles a partir de la configuración identificada. A continuación, se añade al subespacio el número deseado de estas configuraciones.\n",
        "\n",
        "Una vez que se determina que las iteraciones han convergido, HI-VQE devuelve el estado básico calculado (en forma de los estados en el subespacio y sus amplitudes en la función de onda del estado básico), su energía y una medida de varianza de energía que da una indicación de si el estado calculado forma un estado propio del Hamiltoniano del sistema.\n",
        "\n",
        "Los usuarios pueden decidir el circuito cuántico utilizado y el número de disparos realizados para cada circuito cuántico, así como controlar el tamaño del subespacio o permitir la generación clásica de configuraciones adicionales para ayudar a las configuraciones cuánticas generadas. De este modo, los usuarios pueden adaptar el comportamiento de HI-VQE a las aplicaciones que deseen.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "73390a19",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## Cómo empezar\n",
        "\n",
        "En primer lugar, [solicita acceso a la función](https://forms.office.com/r/zN3hvMTqJ1).\n",
        "A continuación, autentíquese utilizando su [clave API de IBM Quantum®](http://quantum.cloud.ibm.com/) y, suponiendo que ya haya [guardado su cuenta](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client) en su entorno local, seleccione la función Qiskit de la siguiente manera:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "95a715d2",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[QiskitFunction(qunova/hivqe-chemistry),\n",
              " QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),\n",
              " QiskitFunction(algorithmiq/tem),\n",
              " QiskitFunction(qedma/qesem),\n",
              " QiskitFunction(multiverse/singularity),\n",
              " QiskitFunction(ibm/circuit-function),\n",
              " QiskitFunction(q-ctrl/optimization-solver),\n",
              " QiskitFunction(colibritd/quick-pde),\n",
              " QiskitFunction(q-ctrl/performance-management),\n",
              " QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "import reprlib\n",
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(channel=\"ibm_quantum_platform\")\n",
        "\n",
        "# Verify that you have access to the function\n",
        "catalog.list()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "968af861",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Load the function\n",
        "function = catalog.load(\"qunova/hivqe-chemistry\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c3e0cc98",
      "metadata": {},
      "source": [
        "<span id=\"example\" />\n",
        "\n",
        "## Ejemplo\n",
        "\n",
        "El primer ejemplo muestra cómo calcular la energía del estado básico de una molécula NH3 utilizando el algoritmo HI-VQE.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b03aa968",
      "metadata": {},
      "source": [
        "<span id=\"define-the-molecular-geometry-and-options\" />\n",
        "\n",
        "#### Defina la geometría molecular y las opciones\n",
        "\n",
        "La geometría molecular de NH3 se proporciona con coordenadas cartesianas separadas con \";\" para cada átomo.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "970dadd1",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Define the molecule geometry\n",
        "geometry = \"\"\"\n",
        "N         -0.85188       -0.02741        0.03141;\n",
        "H          0.16545        0.00593       -0.01648;\n",
        "H         -1.16348       -0.39357       -0.86702;\n",
        "H         -1.16348        0.94228        0.06281;\n",
        "\"\"\""
      ]
    },
    {
      "cell_type": "markdown",
      "id": "64429e13",
      "metadata": {},
      "source": [
        "Se pueden definir y proporcionar opciones adicionales para el sistema molecular en el siguiente formato de diccionario.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "0f9e9a3c",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Configure some options for the job.\n",
        "molecule_options = {\"basis\": \"sto3g\"}\n",
        "hivqe_options = {\"shots\": 100, \"max_iter\": 20}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bf180336",
      "metadata": {},
      "source": [
        "Ejecutar la función con entradas de geometría y opciones.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "fdebf7f0",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Run HI-VQE\n",
        "job = function.run(\n",
        "    geometry=geometry,\n",
        "    # `backend_name` is the name of a backend with at least 16 qubits,\n",
        "    # for example, \"ibm_marrakesh\".\n",
        "    backend_name=backend_name,\n",
        "    max_states=2000,\n",
        "    max_expansion_states=10,\n",
        "    molecule_options=molecule_options,\n",
        "    hivqe_options=hivqe_options,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "75e46808-1638-4f14-bfe4-ea3eba2f738b",
      "metadata": {},
      "source": [
        "Es una buena idea imprimir el ID de trabajo de la función para poder proporcionarlo en las solicitudes de asistencia si algo va mal.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "87585ede-2ec4-467a-a269-514f59026602",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Job ID: e5ced6f2-fd1d-4244-a6aa-bd27cfb0cdee\n"
          ]
        }
      ],
      "source": [
        "print(\"Job ID:\", job.job_id)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "608cf736",
      "metadata": {},
      "source": [
        "Este ejemplo utiliza 16 qubits con 8 orbitales de la base sto3g para una molécula NH3.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ad1c9bcb",
      "metadata": {},
      "source": [
        "Comprueba [el estado](/docs/guides/functions-get-started#check-job-status) de tu carga de trabajo de Qiskit Function o obtén [los resultados](/docs/guides/functions-get-started#retrieve-results) de la siguiente manera:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "b442c581",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "QUEUED\n"
          ]
        }
      ],
      "source": [
        "print(job.status())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "aef704b8",
      "metadata": {},
      "source": [
        "Una vez finalizado el trabajo, los resultados pueden obtenerse con la instancia `result()` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "f447e506",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "{'eigenvector': [0.9824448589364075, 0.009527106392132133, 6.854074372058527e-08, 3.591500190038039e-07, 0.0012975231577544268, 2.310159709002111e-05, ...], 'energy': -55.52108557170985, 'energy_history': [-55.51901898989887, -55.52056881448526, -55.52065046778772, -55.520690696813716, -55.520691108428, -55.520708448092634, ...], 'energy_variance': 3.066239097617371e-10, ...}\n"
          ]
        }
      ],
      "source": [
        "result = job.result()\n",
        "\n",
        "# Output can be long, so we display a shortened representation\n",
        "shortened_result = reprlib.repr(result)\n",
        "print(shortened_result)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2b6fb05c",
      "metadata": {},
      "source": [
        "Para acceder a la energía del estado básico, utilice la tecla \"energía\". La clave \"eigenvector\" proporciona los coeficientes CI con la correspondiente notación bitstring de la configuración electrónica almacenada con los \"estados\" de los resultados.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "28cd677c",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "|Exact Energy - HI-VQE Energy|: 0.06246299427914437 mHa\n",
            "Sampled Number of States: 1936\n"
          ]
        }
      ],
      "source": [
        "fci_energy = -55.521148034704126  # the exact energy using FCI method\n",
        "hivqe_energy = result[\"energy\"]\n",
        "print(\n",
        "    f\"|Exact Energy - HI-VQE Energy|: \"\n",
        "    f\"{abs(fci_energy - hivqe_energy) * 1000} mHa\"\n",
        ")\n",
        "print(f\"Sampled Number of States: {len(result['states'])}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f252348-720f-47c0-9e7f-ae5e5512b8d1",
      "metadata": {},
      "source": [
        "<span id=\"licensing\" />\n",
        "\n",
        "## Licencias\n",
        "\n",
        "Ten en cuenta que el uso de esta función de Qiskit se limita a problemas que requieran un máximo de 20 qubits, a menos que se obtenga una licencia que permita un límite superior.\n",
        "\n",
        "Envía un correo electrónico a [qiskit.support @ qunovacomputing.com](mailto:qiskit.support@qunovacomputing.com) para cualquier consulta sobre licencias.\n",
        "\n",
        "<span id=\"example-of-licensed-function-use\" />\n",
        "\n",
        "### Ejemplo de uso de una función con licencia\n",
        "\n",
        "A los usuarios con licencia se les asigna un token de licencia y, a continuación, deben utilizar una biblioteca de envoltura para enviar dicho token a la función.\n",
        "La biblioteca de envoltura se puede instalar [desde PyPI](https://pypi.org/project/hivqe-qiskit-function-utils/) con `pip install hivqe-qiskit-function-utils`.\n",
        "El siguiente ejemplo muestra cómo se debe utilizar esta biblioteca para enviar tu token de licencia al llamar a la función.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a1d9ad0f-4add-4ef8-a63c-c1601b13e322",
      "metadata": {},
      "outputs": [],
      "source": [
        "import math\n",
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "from hivqe_qiskit_function_utils import FunctionWrapper\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(\n",
        "    token=\"your_qiskit_functions_catalog_token\",\n",
        "    channel=\"ibm_quantum_platform\",\n",
        "    instance=\"your_ibm_instance\",\n",
        ")\n",
        "\n",
        "molecule_geometry = f\"\"\"\n",
        "O 0 0 0;\n",
        "H {-0.957*math.sin(math.radians(104.5)/2.0)} {0.957*math.cos(math.radians(104.5)/2.0)} 0;\n",
        "H {0.957*math.sin(math.radians(104.5)/2.0)} {0.957*math.cos(math.radians(104.5)/2.0)} 0\n",
        "\"\"\"\n",
        "\n",
        "hivqe = FunctionWrapper(\n",
        "    token=\"your_hivqe_license_token\",\n",
        "    function=catalog.load(\"qunova/hivqe-chemistry\"),\n",
        ")\n",
        "job = hivqe.run(\n",
        "    geometry=molecule_geometry,\n",
        "    backend_name=\"ibm_torino\",\n",
        "    max_states=10000,\n",
        "    max_expansion_states=1000,\n",
        "    hivqe_options={\"ansatz\": \"epa\", \"max_iter\": 10},\n",
        ")\n",
        "result = job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4af252f6",
      "metadata": {},
      "source": [
        "<span id=\"performance\" />\n",
        "\n",
        "## Rendimiento\n",
        "\n",
        "Esta sección muestra los cálculos de referencia demostrados de HI-VQE con un caso de 24-qubit para Li2S, un caso de 40-qubit para una molécula N2, y un caso de 44-qubit para un sistema FeP-NO.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "54d8f446",
      "metadata": {},
      "source": [
        "<span id=\"dissociation-potential-energy-surface-curve-for-an-li2s-molecule-with-24-qubits\" />\n",
        "\n",
        "#### Curva de la superficie de energía potencial de disociación para una molécula de e Li2S a con 24 qubits\n",
        "\n",
        "La curva PES se muestra con la referencia FCI y la estimación inicial de RHF, junto con el error de energía de la referencia FCI.\n",
        "\n",
        "![Imagen que muestra que HI-VQE produce soluciones con una precisión química similar a la de una curva PES de referencia clásica para el sistema Li2S](https://quantum.cloud.ibm.com/docs/images/guides/qunova-chemistry/Li2S_PES.avif).\n",
        "\n",
        "Los cálculos se han realizado con las siguientes geometrías y opciones.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "8c998f54",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Define Li2S geometries\n",
        "Li2S_geoms = {\n",
        "    \"Li2S_1.51\": \"S        -1.239044    0.671232   -0.030374;Li       -1.506327    0.432403   -1.498949;Li       -0.899996    0.973348    1.826768;\",\n",
        "    \"Li2S_2.40\": \"S        -1.741432    0.680397    0.346702;Li       -0.529307    0.488006   -1.729343;Li       -1.284307    0.989409    2.177209;\",\n",
        "    \"Li2S_3.80\": \"S        -2.707255    0.674298    0.909161;Li        0.079218    0.552012   -1.671656;Li       -0.927010    0.931502    1.557063;\",\n",
        "}\n",
        "\n",
        "# Configure some options for the job.\n",
        "molecule_options = {\n",
        "    \"basis\": \"sto3g\",\n",
        "}\n",
        "hivqe_options = {\n",
        "    \"shots\": 100,\n",
        "    \"max_iter\": 20,\n",
        "}\n",
        "\n",
        "results = []\n",
        "for geom in [\"Li2S_1.51\", \"Li2S_2.40\", \"Li2S_3.80\"]:\n",
        "    # Run HI-VQE\n",
        "    job = function.run(\n",
        "        geometry=Li2S_geoms[geom],\n",
        "        backend_name=backend_name,  # can use any device with at least 38 qubits\n",
        "        max_states=2000,\n",
        "        max_expansion_states=10,\n",
        "        molecule_options=molecule_options,\n",
        "        hivqe_options=hivqe_options,\n",
        "    )\n",
        "    results.append(job.result())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "81129f0f",
      "metadata": {},
      "source": [
        "Los puntos rojos representan los resultados del cálculo HI-VQE para seis geometrías diferentes, y se proporcionan como entrada en la celda anterior tres geometrías correspondientes a 1.51, 2.40 y 3.80 Angstrom.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4d8d6cad",
      "metadata": {},
      "source": [
        "<span id=\"dissociation-pes-curve-for-an-n2-molecule-with-40-qubits\" />\n",
        "\n",
        "#### Curva PES de disociación para una molécula de e N2 a con 40 qubits\n",
        "\n",
        "La molécula de nitrógeno se ha identificado como un sistema multirreferencial con grandes contribuciones de energía de correlación más allá del estado Hartree-Fock. Realizamos un cálculo de referencia para la molécula N2 con base cc-pvdz, ( 20o,14e ) utilizando la selección de orbitales activos homo-lumo. El número de espacio activo completo (CAS) para representar este problema es 6.009.350.400. No es posible obtener la solución del problema de valores propios (para la energía y la estructura electrónica) con este número de estados utilizando un ordenador de sobremesa potente ( 16cpu/64GB ). Con HI-VQE, los usuarios pueden buscar eficientemente en el subespacio de estados CAS para encontrar resultados químicamente precisos al tiempo que ahorran recursos de cálculo de forma significativa. Los siguientes gráficos muestran la curva PES del cálculo HI-VQE de 40 qubits de la disociación de la molécula N2.\n",
        "\n",
        "![Imagen que muestra que HI-VQE produce soluciones con una precisión química similar a la de una curva PES de referencia clásica para el sistema N2.](https://quantum.cloud.ibm.com/docs/images/guides/qunova-chemistry/N2_PES_40qubits.avif)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e84bc625",
      "metadata": {},
      "source": [
        "<span id=\"dissociation-pes-curve-for-five-coordinated-ironii-porphyrin-with-an-no-system-with-44-qubits\" />\n",
        "\n",
        "#### Curva PES de disociación para hierro (II)-porfirina de cinco coordinados con un sistema NO con 44 qubits\n",
        "\n",
        "Otro sistema químico interesante es un complejo de hierro(II)-porfirina ( FeP ) con un ligando coordinado de óxido nítrico (NO), que representa un sistema de metaloporfirina biológicamente relevante que desempeña papeles cruciales en diversos procesos fisiológicos. En este ejemplo, se ha utilizado HI-VQE para estimar la curva de superficie de energía potencial exacta de la interacción intermolecular entre FeP y NO (energía de estado básico para geometrías separadas de forma diferente). El sistema combinado tiene 450 orbitales y 202 electrones ( 450o,202e ) con 6-31g(d ) base en total. Se utilizó la selección orbital activa homolumínica para calcular el caso más pequeño a partir del caso real con ( 22o,22e ). A partir de los siguientes resultados de referencia, pudimos alcanzar la precisión química (> 1.6 mHa ) con un cálculo de química computacional clásica de última generación de referencia CASCI(DMRG) ( 22o,22e ).\n",
        "\n",
        "![Imagen que muestra que HI-VQE produce soluciones con una precisión química similar a la de una curva PES de referencia clásica para el sistema FeP-NO.](https://quantum.cloud.ibm.com/docs/images/guides/qunova-chemistry/fepno_44qubits.avif)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b34fe075",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "## Referencias comparativas\n",
        "\n",
        "* El tamaño exacto de la matriz es el número de determinantes para la solución exacta, como FCI y CASCI.\n",
        "* Las muestras de cálculo HI-VQE y calcula el subespacio de la misma (como en, tamaño de la matriz HI-VQE).\n",
        "* El tiempo total incluye el tiempo de ejecución de QPU y las ejecuciones de Qiskit Function con CPU.\n",
        "* La precisión se estima a partir de la diferencia de energía respecto a la solución exacta.\n",
        "\n",
        "| Sistema químico   | Número de qubits | Tamaño exacto de la matriz | Tamaño de la matriz HI-VQE | E(diff) de exacto ( mHa ) | Número de iteraciones | Tiempo total | Uso del tiempo de ejecución de la QPU |\n",
        "| ----------------- | ---------------- | -------------------------- | -------------------------- | ------------------------- | --------------------- | ------------ | ------------------------------------- |\n",
        "| $NH_3$ (8o,10e)   | 16               | 3136                       | 1936                       | 0.08                      | 6                     | 37 s         | 34 s                                  |\n",
        "| $Li_2S$ (10o,10e) | 20               | 63504                      | 3969                       | 0.60                      | 5                     | 250 s        | 50 s                                  |\n",
        "| $NH_3$ (15o,10e)  | 30               | 9018009                    | 49729                      | 0.90                      | 5                     | 354 s        | 54 s                                  |\n",
        "| $N_2$ (16o,14e)   | 32               | 130873600                  | 1798281                    | 1.10                      | 9                     | 6531 s       | 121 s                                 |\n",
        "| $3H_2O$ (18o,24e) | 36               | 344622096                  | 399424                     | 0.90                      | 24                    | 5174 s       | 130 s                                 |\n",
        "| $N_2$ (20o,14e)   | 40               | 6009350400                 | 9012004                    | 1.20                      | 21                    | 46547 s      | 258 s                                 |\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "04236c83",
      "metadata": {},
      "source": [
        "<span id=\"fetch-error-messages\" />\n",
        "\n",
        "## Obtener mensajes de error\n",
        "\n",
        "Si su carga de trabajo falla, el estado será `ERROR` y la llamada a `job.result()` lanzará una excepción:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "90c6de7c",
      "metadata": {
        "editable": true,
        "slideshow": {
          "slide_type": ""
        },
        "tags": [
          "raises-exception"
        ]
      },
      "outputs": [
        {
          "ename": "QiskitServerlessException",
          "evalue": "[\"runner.UnknownRuntimeError: 'An unexpected error occurred during job execution. Please make sure that your inputs are valid. If you are still experiencing problems, you can contact the Qunova Computing support service at qiskit.support@qunovacomputing.com and provide the Function job ID of this job for more assistance. -- https://docs.quantum.ibm.com/errors#1500'\\n\"]",
          "output_type": "error",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mQiskitServerlessException\u001b[0m                 Traceback (most recent call last)",
            "Cell \u001b[0;32mIn[12], line 10\u001b[0m\n\u001b[1;32m      1\u001b[0m job \u001b[38;5;241m=\u001b[39m function\u001b[38;5;241m.\u001b[39mrun(\n\u001b[1;32m      2\u001b[0m     geometry\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124minvalid-geometry\u001b[39m\u001b[38;5;124m\"\u001b[39m,  \u001b[38;5;66;03m# This will cause an error\u001b[39;00m\n\u001b[1;32m      3\u001b[0m     backend_name\u001b[38;5;241m=\u001b[39mbackend_name,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m      7\u001b[0m     hivqe_options\u001b[38;5;241m=\u001b[39mhivqe_options,\n\u001b[1;32m      8\u001b[0m )\n\u001b[0;32m---> 10\u001b[0m \u001b[43mjob\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
            "File \u001b[0;32m~/work/documentation/documentation/.tox/py311/lib/python3.11/site-packages/qiskit_serverless/core/job.py:253\u001b[0m, in \u001b[0;36mJob.result\u001b[0;34m(self, wait, cadence, verbose, maxwait)\u001b[0m\n\u001b[1;32m    251\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstatus() \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mERROR\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m    252\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m results:\n\u001b[0;32m--> 253\u001b[0m         \u001b[38;5;28;01mraise\u001b[39;00m QiskitServerlessException(results)\n\u001b[1;32m    255\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m QiskitServerlessException(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfiltered_logs(include\u001b[38;5;241m=\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m(?i)error|exception\u001b[39m\u001b[38;5;124m\"\u001b[39m))\n\u001b[1;32m    257\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(results, \u001b[38;5;28mstr\u001b[39m):\n",
            "\u001b[0;31mQiskitServerlessException\u001b[0m: [\"runner.UnknownRuntimeError: 'An unexpected error occurred during job execution. Please make sure that your inputs are valid. If you are still experiencing problems, you can contact the Qunova Computing support service at qiskit.support@qunovacomputing.com and provide the Function job ID of this job for more assistance. -- https://docs.quantum.ibm.com/errors#1500'\\n\"]"
          ]
        }
      ],
      "source": [
        "job = function.run(\n",
        "    geometry=\"invalid-geometry\",  # This will cause an error\n",
        "    backend_name=backend_name,\n",
        "    max_states=2000,\n",
        "    max_expansion_states=15,\n",
        "    molecule_options=molecule_options,\n",
        "    hivqe_options=hivqe_options,\n",
        ")\n",
        "\n",
        "job.result()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "0b8de82f-3c5a-4024-8e3a-ef8efa83cfb9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'ERROR'"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "job.status()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e9ec2e67",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "## Obtener soporte\n",
        "\n",
        "Puede enviar un correo electrónico [qunovacomputing.com qiskit.support](mailto:qiskit.support@qunovacomputing.com) para obtener ayuda con esta función.\n",
        "\n",
        "Si desea ayuda para solucionar un error concreto, facilítenos el ID de trabajo de la función que ha detectado el error.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a6a25c8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximos pasos\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendaciones\">\n",
        "  * Solicite acceso a la función rellenando [este formulario](https://forms.office.com/r/zN3hvMTqJ1).\n",
        "  * Consulta la [referencia](/docs/api/functions/qunova-chemistry) de la API de esta función de Qiskit.\n",
        "  * Pruebe el tutorial [Calcular curva de disociación PES para FeP-NO con HI-VQE](/docs/tutorials/qunova-hivqe).\n",
        "  * Revisión [Pellow-Jarman, A., et al. (2025).  HIVQE: Solucionador iterativo variacional de valores propios cuánticos para cálculos eficientes de química cuántica. arXiv Preimpresión arXiv:2503.06292](https://arxiv.org/abs/2503.06292).\n",
        "  * Prueba las [curvas PES de disociación con](/docs/tutorials/qunova-hivqe) el tutorial « HiVQE » (Disociación de moléculas) de Qunova.\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
}