{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f7d9993f",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"HI-VQE Chemistry - Uma função Qiskit da Qunova Computing\"\n",
        "description: \"Documentação para a função HI-VQE Qiskit da Qunova Computing. Pode ser usado para resolver o estado fundamental e a energia do estado fundamental de 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 - Uma função Qiskit da Qunova Computing\n",
        "\n",
        "*Consulte a [referência da API](/docs/api/functions/qunova-chemistry)*\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  As funções do Qiskit são um recurso experimental disponível apenas para usuários dos planos IBM Quantum® Premium Plan, Flex Plan e On-Prem (via IBM Quantum Platform API). Eles estão no status de versão prévia e estão sujeitos a alterações.\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=\"Versões do pacote\">\n",
        "    O código nesta página foi desenvolvido utilizando os seguintes requisitos.\n",
        "    Recomendamos usar essas versões ou mais recentes.\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",
        "## Visão geral\n",
        "\n",
        "Na química quântica, o problema da estrutura eletrônica concentra-se em encontrar as soluções para a equação eletrônica de Schrödinger - as funções de onda quântica que descrevem o comportamento dos elétrons do sistema. Essas funções de onda são vetores de amplitudes complexas, com cada amplitude correspondendo à contribuição de uma possível configuração de elétrons.\n",
        "\n",
        "O estado fundamental é a função de onda de energia mais baixa do sistema e tem uma importância especial no estudo de sistemas moleculares. A abordagem mais precisa para calcular o estado fundamental considera todas as configurações possíveis de elétrons, mas isso se torna intratável para sistemas maiores, pois o número de configurações cresce exponencialmente com o tamanho do sistema.\n",
        "\n",
        "O Handover Iterative Variational Quantum Eigensolver (HI-VQE) é um método quântico-clássico híbrido inovador para estimar com precisão o estado fundamental de sistemas moleculares. Ele integra hardware quântico com computação clássica, usando processadores quânticos para explorar com eficiência as configurações de elétrons candidatos e calcular a função de onda resultante em computadores clássicos. Ao gerar funções de onda compactas, porém quimicamente precisas, o HI-VQE aprimora a pesquisa e a descoberta em química quântica e ciência dos materiais.\n",
        "\n",
        "![Imagem mostrando uma visão geral do algoritmo HI-VQE do Qunova](https://quantum.cloud.ibm.com/docs/images/guides/qunova-chemistry/overview.svg)\n",
        "\n",
        "O HI-VQE reduz a complexidade computacional do problema de estrutura eletrônica ao estimar com eficiência o estado fundamental com alta precisão. Ele se concentra em um subconjunto cuidadosamente selecionado das configurações de elétrons mais relevantes, otimizando a precisão e a eficiência.\n",
        "\n",
        "Combinando os pontos fortes dos computadores clássicos e quânticos, o HI-VQE refina e aprimora iterativamente a função de onda da estimativa atual. Suas técnicas exclusivas de construção de subespaços ajudam a tornar a seleção de configurações mais eficiente, de modo que os usuários tenham maior controle computacional e precisão aprimorada nas simulações de química quântica.\n",
        "\n",
        "Se você quiser saber mais sobre o algoritmo, pode [ler o artigo científico associado.](https://arxiv.org/abs/2503.06292)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f761442",
      "metadata": {},
      "source": [
        "<span id=\"description\" />\n",
        "\n",
        "## Descrição\n",
        "\n",
        "O número de configurações de elétrons de um sistema molecular cresce exponencialmente com o tamanho do sistema. No entanto, para determinados estados eletrônicos, como o estado fundamental, é comum que apenas uma pequena fração das configurações contribua significativamente para a energia do estado. Os métodos de interação de configuração selecionada (SCI) exploram essa dispersão para reduzir os custos de computação, identificando e concentrando-se nas configurações mais relevantes. Esse subconjunto de configurações é chamado de subespaço.\n",
        "\n",
        "O HI-VQE aproveita a eficiência inerente dos computadores quânticos para representar sistemas moleculares e auxiliar a pesquisa de subespaços. Ele integra subrotinas clássicas e quânticas para resolver o problema da estrutura eletrônica com alta precisão. Diferentemente dos métodos SCI quânticos existentes, o HI-VQE combina treinamento variacional, construção iterativa de subespaço e triagem de configuração de pré-diagonalização para aumentar a eficiência, reduzindo as medições quânticas, as iterações e os custos de diagonalização clássica. Portanto, o HI-VQE pode ser aplicado a sistemas moleculares maiores, que exigem mais qubits, e reduz o custo para resolver um problema de um determinado tamanho com o mesmo grau de precisão.\n",
        "\n",
        "![Imagem que mostra uma descrição detalhada de cada etapa do algoritmo HI-VQE da Qunova.](https://quantum.cloud.ibm.com/docs/images/guides/qunova-chemistry/description.avif)\n",
        "\n",
        "Para calcular o estado fundamental de um sistema, o HI-VQE usa primeiro o pacote de química clássica PySCF para gerar uma representação molecular a partir de entradas fornecidas pelo usuário, como a geometria molecular e outras informações moleculares. Em seguida, ele entra em um loop híbrido de otimização quântica-clássica, refinando iterativamente um subespaço para representar de forma ideal o estado fundamental e, ao mesmo tempo, minimizar o número de configurações incluídas. O loop continua até que os critérios de convergência, como o tamanho do subespaço ou a estabilidade da energia, sejam atendidos, após o que a função de onda e a energia do estado fundamental computadas são emitidas. Esses resultados podem ser usados para construir superfícies de energia potencial precisas e realizar análises adicionais do sistema.\n",
        "\n",
        "O ciclo de otimização se concentra no ajuste dos parâmetros de um circuito quântico para gerar um subespaço de alta qualidade. O HI-VQE oferece três opções de circuitos quânticos: [`excitation_preserving`](/docs/api/qiskit/qiskit.circuit.library.excitation_preserving), [efficient\\_su2](/docs/api/qiskit/qiskit.circuit.library.efficient_su2) e [LUCJ](https://qiskit-community.github.io/ffsim/explanations/lucj.html). A otimização é inicializada próxima ao estado de referência de Hartree-Fock devido à sua adequação geral. O circuito é então executado em um dispositivo quântico, e as configurações são amostradas a partir do estado quântico resultante antes de serem retornadas como sequências binárias. Devido ao ruído dos dispositivos quânticos, algumas configurações amostradas podem ser fisicamente inválidas, não conservando o número de elétrons ou o spin. O HI-VQE resolve essa questão por meio do processo de recuperação de configuração do pacote [qiskit-addon-sqd](/docs/addons/qiskit-addon-sqd), de modo que os usuários possam corrigir configurações inválidas ou descartá-las.\n",
        "\n",
        "As configurações válidas são então submetidas a uma etapa de triagem opcional para remover as que se prevê que contribuam minimamente. Isso reduz a dimensão do subespaço, diminuindo assim o custo da etapa de diagonalização. Se a triagem for ativada, um Hamiltoniano de subespaço preliminar será construído a partir das configurações válidas e uma diagonalização será executada com critérios de terminação muito flexíveis. Embora a precisão das amplitudes resultantes para cada configuração seja baixa, ela é eficaz para prever quais configurações devem ser deixadas de fora do subespaço nessa iteração, além de ser rápida de calcular.\n",
        "\n",
        "As configurações selecionadas são adicionadas ao subespaço, e o Hamiltoniano do sistema é projetado nesse subespaço. O subespaço é atualizado iterativamente, preservando as configurações mais relevantes entre as iterações. Essa abordagem contrasta com os métodos alternativos porque o circuito quântico não precisa se aproximar do estado fundamental completo em cada etapa.\n",
        "\n",
        "Em seguida, o subespaço Hamiltoniano é classicamente diagonalizado para obter o menor valor próprio e seu vetor próprio correspondente, representando uma aproximação do estado fundamental e sua energia. À medida que a qualidade do subespaço melhora com as iterações, o estado fundamental calculado se aproxima melhor do estado fundamental verdadeiro. Uma etapa de triagem adicional pode ser realizada nesse ponto para remover quaisquer configurações do subespaço que não tenham uma contribuição substancial para o estado fundamental calculado. Essa etapa garante que o subespaço levado para a próxima iteração seja o mais compacto possível. Isso é avaliado com base nas amplitudes retornadas pela diagonalização, pois elas representam a contribuição importante de cada configuração para o estado fundamental calculado.\n",
        "\n",
        "Em seguida, uma verificação de convergência determina se um treinamento adicional melhoraria os resultados. Em caso afirmativo, uma etapa opcional de expansão clássica é executada, os parâmetros do circuito quântico são atualizados para minimizar ainda mais a energia calculada e o processo se repete. A etapa de expansão clássica gera configurações adicionais para o subespaço, complementando as configurações amostradas do dispositivo quântico. Primeiro, ele identifica a configuração com a maior amplitude nos resultados da diagonalização, antes de gerar novas configurações com excitações simples e duplas a partir da configuração identificada. O número desejado dessas configurações é então adicionado ao subespaço.\n",
        "\n",
        "Quando for determinado que as iterações convergiram, o HI-VQE retorna o estado fundamental calculado (na forma de estados no subespaço e suas amplitudes na função de onda do estado fundamental), sua energia e uma medida de variação de energia que indica se o estado calculado forma um estado próprio do Hamiltoniano do sistema.\n",
        "\n",
        "Os usuários podem decidir o circuito quântico usado e o número de disparos realizados para cada circuito quântico, bem como controlar o tamanho do subespaço ou permitir a geração clássica de configurações adicionais para auxiliar as configurações quânticas geradas. Dessa forma, os usuários podem adaptar o comportamento do HI-VQE para atender às aplicações desejadas.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "73390a19",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## Introdução\n",
        "\n",
        "Primeiro, [solicite acesso à função](https://forms.office.com/r/zN3hvMTqJ1).\n",
        "Em seguida, autentique-se usando sua [chave de API IBM Quantum®](http://quantum.cloud.ibm.com/) e, supondo que você já tenha [salvo sua conta](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client) em seu ambiente local, selecione a função Qiskit da seguinte forma:\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",
        "## Exemplo\n",
        "\n",
        "O primeiro exemplo mostra como calcular a energia do estado fundamental de uma molécula NH3 usando o algoritmo HI-VQE.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b03aa968",
      "metadata": {},
      "source": [
        "<span id=\"define-the-molecular-geometry-and-options\" />\n",
        "\n",
        "#### Defina a geometria molecular e as opções\n",
        "\n",
        "A geometria molecular do site NH3 é fornecida com coordenadas cartesianas separadas por \";\" 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": [
        "Opções adicionais podem ser definidas e fornecidas para o sistema molecular no seguinte formato de dicionário.\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": [
        "Execute a função com entradas de geometria e opções.\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": [
        "É uma boa ideia imprimir o ID do trabalho da função para que ele possa ser fornecido nas solicitações de suporte se algo der errado.\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": [
        "Esse exemplo utiliza 16 qubits com 8 orbitais da base sto3g para uma molécula NH3.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ad1c9bcb",
      "metadata": {},
      "source": [
        "Verifique [o status](/docs/guides/functions-get-started#check-job-status) da sua carga de trabalho do Qiskit Function ou obtenha [os resultados](/docs/guides/functions-get-started#retrieve-results) da seguinte maneira:\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": [
        "Após a conclusão do trabalho, os resultados podem ser obtidos com a instância `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 acessar a energia do estado fundamental, use a tecla \"energy\" (energia). A chave \"eigenvector\" fornece os coeficientes de CI com a notação de cadeia de bits correspondente da configuração de elétrons armazenada com \"estados\" dos 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",
        "## Licenciamento\n",
        "\n",
        "Observe que o uso desta função do Qiskit está limitado a problemas que exijam, no máximo, 20 qubits, a menos que seja obtida uma licença que conceda um limite maior.\n",
        "\n",
        "Envie um e-mail para [qiskit.support @ qunovacomputing.com](mailto:qiskit.support@qunovacomputing.com) com dúvidas sobre licenças.\n",
        "\n",
        "<span id=\"example-of-licensed-function-use\" />\n",
        "\n",
        "### Exemplo de uso de função licenciada\n",
        "\n",
        "Os usuários licenciados recebem um token de licença e, em seguida, devem usar uma biblioteca wrapper para enviar seu token de licença à função.\n",
        "A biblioteca wrapper pode ser instalada [a partir de PyPI](https://pypi.org/project/hivqe-qiskit-function-utils/) com `pip install hivqe-qiskit-function-utils`.\n",
        "O exemplo abaixo mostra como essa biblioteca deve ser usada para enviar seu token de licença ao chamar a função.\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",
        "## Desempenho\n",
        "\n",
        "Esta seção mostra os cálculos de referência demonstrados do HI-VQE com um caso de 24 qubits para Li2S, um caso de 40 qubits para uma molécula N2 e um caso de 44 qubits para um 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 da superfície de energia potencial de dissociação para uma molécula de e Li2S a com 24 qubits\n",
        "\n",
        "A curva PES é mostrada com a referência FCI e a estimativa inicial da RHF, juntamente com o erro de energia da referência FCI.\n",
        "\n",
        "![Imagem mostrando que o HI-VQE produz soluções com precisão química de uma curva PES de referência clássica para o sistema Li2S](https://quantum.cloud.ibm.com/docs/images/guides/qunova-chemistry/Li2S_PES.avif).\n",
        "\n",
        "Os cálculos foram realizados com as seguintes geometrias e opções.\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": [
        "Os pontos vermelhos representam os resultados do cálculo do HI-VQE para seis geometrias diferentes, e três geometrias correspondentes a 1.51, 2.40 e 3.80 Angstrom são fornecidas como entrada na célula acima.\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 dissociação para uma molécula de N2 com 40 qubits\n",
        "\n",
        "A molécula de nitrogênio foi identificada como um sistema de multireferência com grandes contribuições de energia de correlação além do estado Hartree-Fock. Realizamos um cálculo de referência para a molécula N2 com base cc-pvdz, ( 20o,14e ) usando a seleção de orbital ativo homo-lumo. O número do espaço ativo completo (CAS) para representar esse problema é 6.009.350.400. Não é possível obter a solução do problema do valor próprio (para energia e estrutura eletrônica) com esse número de estados usando um computador de mesa potente ( 16cpu/64GB ). Com o HI-VQE, os usuários podem pesquisar com eficiência o subespaço dos estados do CAS para encontrar resultados quimicamente precisos e, ao mesmo tempo, economizar significativamente os recursos de computação. Os gráficos a seguir mostram a curva PES do cálculo HI-VQE de 40 qubits da dissociação da molécula N2.\n",
        "\n",
        "![Imagem mostrando que o HI-VQE produz soluções dentro da precisão química de uma curva PES de referência clássica para o 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 dissociação para ferro(II)-porfirina com cinco coordenações com um sistema NO com 44 qubits\n",
        "\n",
        "Outro sistema químico interessante é um complexo de ferro(II)-porfirina ( FeP ) com um ligante de óxido nítrico (NO) coordenado, que representa um sistema de metaloporfirina biologicamente relevante que desempenha funções cruciais em vários processos fisiológicos. Nesse exemplo, o HI-VQE foi utilizado para estimar a curva precisa da superfície de energia potencial da interação intermolecular entre FeP e NO (energia do estado fundamental para geometrias separadas de forma diferente). O sistema combinado tem 450 orbitais e 202 elétrons ( 450o,202e ) com base 6-31g(d ) no total. A seleção do orbital ativo homo-lumo foi utilizada para calcular o caso menor a partir do caso real com ( 22o,22e ). A partir dos resultados de referência a seguir, conseguimos atingir a precisão química (> 1.6 mHa ) com um cálculo de química computacional clássica de última geração da referência CASCI(DMRG) ( 22o,22e ).\n",
        "\n",
        "![Imagem mostrando que o HI-VQE produz soluções dentro da precisão química de uma curva PES de referência clássica para o 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",
        "## Referências\n",
        "\n",
        "* O tamanho da matriz exata é o número de determinantes para a solução exata, como FCI e CASCI.\n",
        "* O cálculo do HI-VQE faz a amostragem e calcula o subespaço dele (ou seja, o tamanho da matriz do HI-VQE).\n",
        "* O tempo total inclui o tempo de execução da QPU e a execução da função Qiskit com a CPU.\n",
        "* A precisão é estimada a partir da diferença de energia da solução exata.\n",
        "\n",
        "| Sistema químico   | Número de qubits | Tamanho exato da matriz | Tamanho da matriz HI-VQE | E(diff) from exact ( mHa ) | Número de iterações | Tempo total | Uso do tempo de execução da 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",
        "## Buscar mensagens de erro\n",
        "\n",
        "Se sua carga de trabalho falhar, o status será `ERROR` e chamar `job.result()` gerará uma exceção:\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",
        "## Obtenha suporte\n",
        "\n",
        "Você pode enviar um e-mail para [qiskit.support @ qunovacomputing.com](mailto:qiskit.support@qunovacomputing.com) para obter ajuda com esta função.\n",
        "\n",
        "Se você quiser ajuda para solucionar um erro específico, forneça a ID do trabalho de função do trabalho que encontrou o erro.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a6a25c8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendações\">\n",
        "  * Solicite acesso à função preenchendo [este formulário](https://forms.office.com/r/zN3hvMTqJ1).\n",
        "  * Consulte a [referência da API](/docs/api/functions/qunova-chemistry) para esta função do Qiskit.\n",
        "  * Experimente o tutorial [Compute dissociation PES curve for FeP-NO with HI-VQE (Calcular curva PES de dissociação para com HI-VQE](/docs/tutorials/qunova-hivqe) ).\n",
        "  * Revisão [Pellow-Jarman, A., et al. (2025).  HIVQE: Solucionador iterativo de autovalores quânticos para cálculos eficientes de química quântica. arXiv pré-impressão arXiv:2503.06292](https://arxiv.org/abs/2503.06292).\n",
        "  * Experimente as [curvas PES de dissociação com](/docs/tutorials/qunova-hivqe) o tutorial Qunova HiVQE.\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
}