{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "8cfa587b",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Crie uma função Qiskit para simulação química\"\n",
        "description: \"Aprenda a implantar e executar o modelo de fluxo de trabalho de química\"\n",
        "---\n",
        "\n",
        "<span id=\"build-and-run-a-qiskit-function-template-for-electronic-structure-simulation-with-an-implicit-solvent-model\" />\n",
        "\n",
        "# Crie e execute um modelo de função do Qiskit para simulação de estrutura eletrônica com um modelo de solvente implícito\n",
        "\n",
        "{/* cspell:ignore pvdz, fcisolver, avas, ncas, nelecas, ecore, chkfile, fcivec, hcore, ncore, myci, sqdvec, myeps, mymethod, mysolvmethod, myavas, mcscf, MCSCF, chkfile, prqs */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f9bfec87",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f3a337d1",
      "metadata": {},
      "source": [
        "Esse modelo, desenvolvido em colaboração com a Cleveland Clinic, consiste em um fluxo de trabalho para calcular a energia do estado fundamental e a energia livre de solvatação de uma molécula em um solvente implícito [\\[1\\]](#references). Essas simulações são baseadas no método de diagonalização quântica baseada em amostra (SQD) [\\[2-6\\]](#references) e no modelo de continuum polarizável do formalismo de equação integral (IEF-PCM) do solvente [\\[7\\]](#references).\n",
        "\n",
        "Para um guia passo a passo desse mesmo fluxo de trabalho com um exemplo prático, consulte o tutorial “[Cálculos com solvente implícito usando o Qiskit Serverless](/docs/tutorials/implicit-solvent-calculations) ”.\n",
        "\n",
        "Esse guia utiliza o modelo com uma molécula de metanol como soluto, cuja estrutura eletrônica é simulada explicitamente, e a água como solvente, aproximada como um meio dielétrico contínuo. Para levar em conta os [efeitos de correlação de elétrons](https://onlinelibrary.wiley.com/doi/epdf/10.1002/ijch.202100111) no metanol e, ao mesmo tempo, manter o equilíbrio entre o custo computacional e a precisão, incluímos apenas os orbitais $\\sigma$, $\\sigma^{*}$ e o par solitário no espaço ativo simulado com o SQD IEF-PCM. Essa seleção de orbital é feita com o [método de espaço ativo de valência atômica (AVAS)](https://github.com/pyscf/pyscf.github.io/blob/master/examples/mcscf/43-avas.py) usando os componentes de orbital atômico \\[C2s,2p], \\[O2s,2p] e \\[H1s], o que resulta no espaço ativo de 14 elétrons e 12 orbitais ( 14e,12o ). Os orbitais de referência são calculados com Hartree Fock de casca fechada usando o conjunto de base cc-pvdz.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "25d18ba5",
      "metadata": {},
      "source": [
        "<span id=\"workflow-introduction\" />\n",
        "\n",
        "## Introdução ao fluxo de trabalho\n",
        "\n",
        "Este guia interativo mostra como carregar esse modelo de função no Qiskit Serverless e executar uma carga de trabalho de exemplo. O modelo é estruturado como um padrão Qiskit com quatro etapas:\n",
        "\n",
        "<span id=\"1-collect-input-and-map-the-problem\" />\n",
        "\n",
        "#### 1. Colete informações e identifique o problema\n",
        "\n",
        "Essa etapa usa a geometria da molécula, o espaço ativo selecionado, o modelo de solvatação, as opções LUCJ e as opções SQD como entrada. Em seguida, ele produz o arquivo PySCF Checkpoint, que contém os dados Hartree-Fock (HF) IEF-PCM. Esses dados serão usados na parte SQD do fluxo de trabalho. Para a parte LUCJ do fluxo de trabalho, a seção de entrada também gera os dados HF da fase gasosa, que são armazenados internamente no formato PySCF FCIDUMP.\n",
        "\n",
        "As informações da simulação de fase de gás HF e a definição do espaço ativo são usadas como entrada. É importante ressaltar que ele também usa as informações definidas pelo usuário da seção de entrada referentes à supressão de erros, ao número de disparos, ao nível de otimização do transpilador de circuitos e ao layout do qubit.\n",
        "\n",
        "Ele gera integrais de um elétron e de dois elétrons dentro do espaço ativo definido. As integrais são então usadas para realizar cálculos CCSD clássicos, que retornam amplitudes t2 que usamos para parametrizar o circuito LUCJ.\n",
        "\n",
        "<span id=\"2-optimize-the-circuit\" />\n",
        "\n",
        "#### 2. Otimize o circuito\n",
        "\n",
        "O circuito LUCJ é então transpilado em um circuito ISA para o hardware de destino. Uma primitiva Sampler é então instanciada com um conjunto padrão de opções de atenuação de erros para gerenciar a execução.\n",
        "\n",
        "<span id=\"3-execute-the-circuit\" />\n",
        "\n",
        "#### 3. Execute o circuito\n",
        "\n",
        "Os cálculos LUCJ retornam as cadeias de bits para cada medição, onde essas cadeias de bits correspondem às configurações de elétrons do sistema estudado. As cadeias de bits são então usadas como entrada para o pós-processamento.\n",
        "\n",
        "<span id=\"4-post-process-by-using-sqd\" />\n",
        "\n",
        "#### 4. Pós-processamento usando SQD\n",
        "\n",
        "Essa etapa final usa como entrada o arquivo PySCF Checkpoint que contém as informações do HF IEF-PCM, as cadeias de bits que representam as configurações de elétrons previstas pelo LUCJ e as opções de SQD definidas pelo usuário selecionadas na seção de entrada. Como resultado, ele produz a energia total SQD IEF-PCM do lote de menor energia e a energia livre de solvatação correspondente.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4832ef18",
      "metadata": {},
      "source": [
        "<span id=\"options\" />\n",
        "\n",
        "### Opções\n",
        "\n",
        "Para esse modelo, você deve especificar as opções para gerar o circuito LUCJ e os parâmetros de execução do SQD.\n",
        "\n",
        "<span id=\"lucj-options\" />\n",
        "\n",
        "#### Opções LUCJ\n",
        "\n",
        "Quando o circuito quântico LUCJ é executado, é produzido um conjunto de amostras que representam os estados da base computacional da distribuição de probabilidade do sistema molecular. Para equilibrar a profundidade do circuito LUCJ e sua expressividade, os qubits correspondentes aos orbitais de spin com o spin oposto têm as portas de dois qubits aplicadas entre eles quando esses qubits são vizinhos por meio de um único qubit ancilla. Para implementar essa abordagem no hardware IBM com uma topologia heavy-hex, os qubits que representam os orbitais de spin com o mesmo spin são conectados por meio de uma topologia de linha em que cada linha assume uma forma de zigue-zague devido à conectividade heavy-hex do hardware de destino, enquanto os qubits que representam os orbitais de spin com o spin oposto só têm uma conexão a cada quatro qubits.\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Clique para expandir e obter mais detalhes sobre as opções necessárias:\">\n",
        "    O usuário deve fornecer a matriz `initial_layout` correspondente aos qubits que satisfazem esse [padrão *de ziguezague*](https://pubs.rsc.org/en/content/articlehtml/2023/sc/d3sc02516k) na seção `lucj_options` da função SQD IEF-PCM. No caso das simulações SQD IEF-PCM ( 14e,12o )/cc-pvdz do metanol, escolhemos o layout inicial do qubit correspondente à diagonal principal do Eagle R3 QPU. Aqui, os primeiros 12 elementos da matriz `initial_layout` `[0, 14, 18, 19, 20, 33, 39, 40, 41, 53, 60, 61, ...]` correspondem aos orbitais de spin alfa. Os últimos 12 elementos `[... 2, 3, 4, 15, 22, 23, 24, 34, 43, 44, 45, 54]` correspondem a orbitais de spin beta.\n",
        "\n",
        "    É importante ressaltar que o usuário precisa determinar o `number_of_shots`, que corresponde ao número de medições no circuito LUCJ. O número de disparos precisa ser suficientemente grande porque a primeira etapa do procedimento S-CORE depende das amostras no setor de partículas correto para obter a aproximação inicial da distribuição do número de ocupação do estado fundamental.\n",
        "\n",
        "    O número de disparos é altamente dependente do sistema e do hardware, mas estudos de SQD [não covalentes](https://arxiv.org/abs/2410.09209), [baseados em fragmentos](https://arxiv.org/abs/2411.09861) e [com solvente implícito](https://pubs.acs.org/doi/10.1021/acs.jpcb.5c01030) sugerem que é possível alcançar a precisão química seguindo essas diretrizes:\n",
        "\n",
        "    * 20.000 - 200.000 disparos para sistemas com menos de 16 orbitais moleculares (32 orbitais de spin)\n",
        "    * 200.000 disparos para sistemas com 16 a 18 orbitais moleculares\n",
        "    * 200.000 - 2.000.000 de disparos para sistemas com mais de 18 orbitais moleculares\n",
        "\n",
        "    O número necessário de cálculos é influenciado pelo número de orbitais de spin no sistema estudado e pelo tamanho do espaço de Hilbert correspondente ao espaço ativo selecionado dentro do sistema estudado. Geralmente, instâncias com espaços de Hilbert menores requerem menos tentativas. Outras opções disponíveis do LUCJ são [o nível de otimização do transpiler de circuitos](https://docs.quantum.ibm.com/guides/set-optimization) e [as opções de supressão de erros](https://docs.quantum.ibm.com/guides/error-mitigation-and-suppression-techniques). Observe que essas opções também afetam o número necessário de disparos e a precisão resultante.\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e2b46498",
      "metadata": {},
      "source": [
        "<span id=\"sqd-options\" />\n",
        "\n",
        "#### Opções SQD\n",
        "\n",
        "As opções importantes nas simulações de SQD incluem `sqd_iterations`, `number_of_batches` e `samples_per_batch`. Em geral, o número menor de amostras por lote pode ser compensado com mais lotes (`number_of_batches`) e mais iterações do S-CORE (`sqd_iterations`). Com mais lotes, podemos obter amostras de mais variações dos subespaços configuracionais. Como o lote de menor energia é considerado a solução para a energia do estado fundamental do sistema, mais lotes podem melhorar os resultados por meio de estatísticas melhores. As iterações adicionais do S-CORE permitem que mais configurações sejam recuperadas da distribuição LUCJ original se o número de amostras no setor de partículas correto for baixo. Isso pode permitir que o número de amostras por lote seja reduzido.\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Clique para expandir e obter mais informações sobre como configurar as opções SQD:\">\n",
        "    Uma estratégia alternativa é usar mais amostras por lote, o que garante que a maioria das amostras LUCJ iniciais no espaço de partículas correto seja usada durante o procedimento S-CORE, e que os subespaços individuais encapsulem uma variedade suficiente de configurações de elétrons. Por sua vez, isso reduz o número de etapas necessárias do S-CORE, em que apenas duas ou três iterações do SQD são necessárias se o número de amostras por lote for grande o suficiente. No entanto, mais amostras por lote resultam em um custo computacional mais alto de cada etapa de diagonalização. Portanto, o equilíbrio entre a precisão e o custo computacional nas simulações de SQD pode ser alcançado escolhendo-se `sqd_iterations`, `number_of_batches` e `samples_per_batch` de forma otimizada.\n",
        "\n",
        "    O [estudo SQD IEF-PCM](https://pubs.acs.org/doi/10.1021/acs.jpcb.5c01030) mostra que, quando três iterações do S-CORE são usadas, a precisão química pode ser alcançada seguindo essas diretrizes:\n",
        "\n",
        "    * 600 amostras por lote em simulações de metanol SQD IEF-PCM ( 14e,12o )\n",
        "    * 1500 amostras por lote em simulações de metilamina SQD IEF-PCM ( 14e,13o )\n",
        "    * 6.000 amostras por lote em simulações de água SQD IEF-PCM ( 8e,23o )\n",
        "    * 16.000 amostras por lote em simulações de etanol SQD IEF-PCM ( 20e,18o )\n",
        "\n",
        "    Assim como o número necessário de disparos no LUCJ, o número necessário de amostras por lote usado no procedimento S-CORE é altamente dependente do sistema e do hardware. Os exemplos acima podem ser usados para estimar o ponto inicial para o benchmark do número necessário de amostras por lote. O tutorial sobre o benchmark sistemático do número necessário de amostras por lote pode ser encontrado [aqui](https://qiskit.github.io/qiskit-addon-sqd/how_tos/choose_subspace_dimension.html).\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "998a0f25",
      "metadata": {},
      "source": [
        "<span id=\"deploy-and-execute-the-template-sqd-ief-pcm-function\" />\n",
        "\n",
        "## Implemente e execute a função SQD IEF-PCM do modelo\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6c92ac84",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "<span id=\"authentication\" />\n",
        "\n",
        "### Autenticação\n",
        "\n",
        "Use `qiskit-ibm-catalog` para se autenticar em `QiskitServerless` com sua chave de API (token), que pode ser encontrada no painel da [IBM Quantum Platform](). Isso permite a instanciação do cliente sem servidor para fazer upload ou executar a função selecionada:\n",
        "\n",
        "```python\n",
        "from qiskit_ibm_catalog import QiskitServerless\n",
        "\n",
        "serverless = QiskitServerless(\n",
        "    channel=\"ibm_quantum_platform\",\n",
        "    instance=\"INSTANCE_CRN\",\n",
        "    # For `token`, use the 44-character API_KEY you created\n",
        "    # and saved from the IBM Quantum Platform Home dashboard\n",
        "    token=\"YOUR_API_KEY\"\n",
        ")\n",
        "```\n",
        "\n",
        "Opcionalmente, use `save_account()` para salvar suas credenciais em um ambiente local (consulte o guia [Configurar sua conta IBM Cloud](/docs/guides/cloud-setup#cloud-save) ). Observe que isso grava suas credenciais no mesmo arquivo que [`QiskitRuntimeService.save_account()`](/docs/api/qiskit-ibm-runtime/qiskit-runtime-service#save_account):\n",
        "\n",
        "```python\n",
        "QiskitServerless.save_account(token=\"YOUR_API_KEY\",\n",
        "    channel=\"ibm_quantum_platform\", instance=\"INSTANCE_CRN\")\n",
        "```\n",
        "\n",
        "Se a [conta estiver salva](/docs/guides/save-credentials), não há necessidade de fornecer o token para autenticação:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "9276e2d4",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_catalog import QiskitServerless\n",
        "\n",
        "serverless = QiskitServerless()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e1f99d80",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "<span id=\"upload-the-template\" />\n",
        "\n",
        "### Carregue o modelo\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3e0e8cc8",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "Para carregar uma função personalizada do Qiskit, você deve primeiro instanciar um objeto `QiskitFunction` que define o código-fonte da função. O título permitirá que você identifique a função quando ela estiver no cluster remoto. O ponto de entrada principal é o arquivo que contém `if __name__ == \"__main__\"`. Se o seu fluxo de trabalho exigir arquivos de origem adicionais, você poderá definir um diretório de trabalho que será carregado junto com o ponto de entrada.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "77b2b9b6",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "QiskitFunction(sqd_pcm_template)\n"
          ]
        }
      ],
      "source": [
        "from qiskit_ibm_catalog import QiskitFunction\n",
        "\n",
        "template = QiskitFunction(\n",
        "    title=\"sqd_pcm_template\",\n",
        "    entrypoint=\"sqd_pcm_entrypoint.py\",\n",
        "    # all files in `working_dir` will be uploaded\n",
        "    working_dir=\"./source_files/\",\n",
        "    dependencies=[\n",
        "        \"ffsim==0.0.54\",\n",
        "        \"pyscf==2.9.0\",\n",
        "        \"qiskit_addon_sqd==0.10.0\",\n",
        "    ],\n",
        ")\n",
        "print(template)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "72854f5a",
      "metadata": {},
      "source": [
        "Quando a instância estiver pronta, faça o upload dela para o serverless:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "59e7fdb5",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "QiskitFunction(sqd_pcm_template)"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "serverless.upload(template)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ac7d8764",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "Para verificar se o upload do programa foi bem-sucedido, use `serverless.list()`:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "03a91030",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[QiskitFunction(sqd_pcm_template),\n",
              " QiskitFunction(hamiltonian_simulation_template)]"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "serverless.list()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "99408586",
      "metadata": {},
      "source": [
        "<span id=\"load-and-run-the-template-remotely\" />\n",
        "\n",
        "## Carregue e execute o modelo remotamente\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "62b37d7a",
      "metadata": {},
      "source": [
        "O modelo de função foi carregado, para que você possa executá-lo remotamente com o Qiskit Serverless. Primeiro, carregue o modelo pelo nome:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "854d12cf",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "QiskitFunction(sqd_pcm_template)\n"
          ]
        }
      ],
      "source": [
        "template = serverless.load(\"sqd_pcm_template\")\n",
        "print(template)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fa2dc721",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "Em seguida, execute o modelo com as entradas em nível de domínio para SQD-IEF PCM. Este exemplo especifica uma carga de trabalho baseada em metanol.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a1719ab1",
      "metadata": {},
      "outputs": [],
      "source": [
        "molecule = {\n",
        "    \"atom\": \"\"\"\n",
        "    O -0.04559 -0.75076 -0.00000;\n",
        "    C -0.04844 0.65398 -0.00000;\n",
        "    H 0.85330 -1.05128 -0.00000;\n",
        "    H -1.08779 0.98076 -0.00000;\n",
        "    H 0.44171 1.06337 0.88811;\n",
        "    H 0.44171 1.06337 -0.88811\n",
        "    \"\"\",  # Must be specified\n",
        "    \"basis\": \"cc-pvdz\",  # default is \"sto-3g\"\n",
        "    \"spin\": 0,  # default is 0\n",
        "    \"charge\": 0,  # default is 0\n",
        "    \"verbosity\": 0,  # default is 0\n",
        "    \"number_of_active_orb\": 12,  # Must be specified\n",
        "    \"number_of_active_alpha_elec\": 7,  # Must be specified\n",
        "    \"number_of_active_beta_elec\": 7,  # Must be specified\n",
        "    \"avas_selection\": [\n",
        "        \"%d O %s\" % (k, x) for k in [0] for x in [\"2s\", \"2px\", \"2py\", \"2pz\"]\n",
        "    ]\n",
        "    + [\"%d C %s\" % (k, x) for k in [1] for x in [\"2s\", \"2px\", \"2py\", \"2pz\"]]\n",
        "    + [\"%d H 1s\" % k for k in [2, 3, 4, 5]],  # default is None\n",
        "}\n",
        "\n",
        "solvent_options = {\n",
        "    # See https://manual.q-chem.com/5.4/topic_pcm-em.html for all methods\n",
        "    \"method\": \"IEF-PCM\",  # other available methods are COSMO, C-PCM, SS(V)PE\n",
        "    \"eps\": 78.3553,  # value for water\n",
        "}\n",
        "\n",
        "lucj_options = {\n",
        "    \"initial_layout\": [\n",
        "        0,\n",
        "        14,\n",
        "        18,\n",
        "        19,\n",
        "        20,\n",
        "        33,\n",
        "        39,\n",
        "        40,\n",
        "        41,\n",
        "        53,\n",
        "        60,\n",
        "        61,\n",
        "        2,\n",
        "        3,\n",
        "        4,\n",
        "        15,\n",
        "        22,\n",
        "        23,\n",
        "        24,\n",
        "        34,\n",
        "        43,\n",
        "        44,\n",
        "        45,\n",
        "        54,\n",
        "    ],\n",
        "    \"dynamical_decoupling_choice\": True,\n",
        "    \"twirling_choice\": True,\n",
        "    \"number_of_shots\": 200000,\n",
        "    \"optimization_level\": 2,\n",
        "}\n",
        "\n",
        "sqd_options = {\n",
        "    \"sqd_iterations\": 3,\n",
        "    \"number_of_batches\": 10,\n",
        "    \"samples_per_batch\": 1000,\n",
        "    \"max_davidson_cycles\": 200,\n",
        "}\n",
        "\n",
        "backend_name = \"ibm_sherbrooke\""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "01c0667c",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "39f8fb70-79b2-43ca-b723-84e6b6135821\n"
          ]
        }
      ],
      "source": [
        "job = template.run(\n",
        "    backend_name=backend_name,\n",
        "    molecule=molecule,\n",
        "    solvent_options=solvent_options,\n",
        "    lucj_options=lucj_options,\n",
        "    sqd_options=sqd_options,\n",
        ")\n",
        "print(job.job_id)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a9101a94",
      "metadata": {},
      "source": [
        "Verifique o status detalhado do trabalho:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "4385a34f",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "time = 2.35, status = DONE\n"
          ]
        }
      ],
      "source": [
        "import time\n",
        "\n",
        "t0 = time.time()\n",
        "status = job.status()\n",
        "if status == \"QUEUED\":\n",
        "    print(f\"time = {time.time()-t0:.2f}, status = QUEUED\")\n",
        "while True:\n",
        "    status = job.status()\n",
        "    if status == \"QUEUED\":\n",
        "        continue\n",
        "    print(f\"time = {time.time()-t0:.2f}, status = {status}\")\n",
        "    if status == \"DONE\" or status == \"ERROR\":\n",
        "        break"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4adc5293",
      "metadata": {},
      "source": [
        "Enquanto o trabalho estiver em execução, você poderá obter os registros criados a partir das saídas do site `logger.info` . Eles podem fornecer informações acionáveis sobre o progresso do fluxo de trabalho SQD IEF-PCM. Por exemplo, as mesmas conexões orbitais de spin ou a profundidade de dois qubits do circuito ISA final destinado à execução no hardware.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a5b1f190",
      "metadata": {},
      "outputs": [],
      "source": [
        "print(job.logs())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ba179114",
      "metadata": {},
      "source": [
        "A chamada para o resultado do trabalho bloqueia o restante do programa até que um resultado esteja disponível. Depois que o trabalho for concluído, você poderá recuperar os resultados. Isso inclui a energia livre de solvatação, bem como informações sobre o lote de energia mais baixa, o valor de energia mais baixo e outras informações úteis, como a duração total do solver.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "3500adce",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'total_energy_hist': array([[-115.14768518, -115.1368396 , -114.19181692, -115.13745429,\n",
              "         -115.1445012 , -114.19673326, -115.1547003 , -114.20563866,\n",
              "         -115.13748344, -115.14764974],\n",
              "        [-115.15768392, -115.15850126, -115.15857275, -115.15770916,\n",
              "         -115.15801684, -115.15822125, -115.15833521, -115.15844051,\n",
              "         -115.15735538, -115.15862354],\n",
              "        [-115.15795148, -115.15847925, -115.15856677, -115.15811156,\n",
              "         -115.15815602, -115.15785171, -115.1583672 , -115.1585533 ,\n",
              "         -115.15833528, -115.15808791]]),\n",
              " 'spin_squared_value_hist': array([[5.37327508e-03, 1.32981759e-02, 1.36214922e-02, 8.84413615e-03,\n",
              "         7.26723578e-03, 1.94875195e-02, 3.03153152e-03, 6.07543106e-03,\n",
              "         1.04951849e-02, 5.36529204e-03],\n",
              "        [6.39397528e-04, 1.36814350e-04, 9.09054260e-05, 5.99361358e-04,\n",
              "         3.64261739e-04, 2.54905866e-04, 2.32540370e-04, 1.53181990e-04,\n",
              "         7.23519739e-04, 6.80737671e-05],\n",
              "        [4.53776416e-04, 1.63043449e-04, 1.05317263e-04, 3.82912836e-04,\n",
              "         3.41047803e-04, 5.18620393e-04, 2.06819142e-04, 1.17086537e-04,\n",
              "         2.32357159e-04, 4.26071537e-04]]),\n",
              " 'solvation_free_energy_hist': array([[-0.00725018, -0.00743955, -0.01132905, -0.0073377 , -0.00722221,\n",
              "         -0.01136705, -0.00719279, -0.01072829, -0.00733404, -0.00725961],\n",
              "        [-0.00719252, -0.00718315, -0.00718074, -0.00719325, -0.00717703,\n",
              "         -0.00718391, -0.00718354, -0.00717928, -0.00719887, -0.0071801 ],\n",
              "        [-0.00719351, -0.00718255, -0.00718198, -0.00718429, -0.00718349,\n",
              "         -0.00718329, -0.0071882 , -0.00718363, -0.00718549, -0.00718814]]),\n",
              " 'occupancy_hist': [[array([0.99712298, 0.99278936, 0.99083163, 0.97328469, 0.98959809,\n",
              "          0.98922134, 0.720333  , 0.25683194, 0.01939338, 0.02840332,\n",
              "          0.00946988, 0.0327204 ]),\n",
              "   array([0.99712298, 0.99278936, 0.99083163, 0.97328469, 0.98959809,\n",
              "          0.98922134, 0.720333  , 0.25683194, 0.01939338, 0.02840332,\n",
              "          0.00946988, 0.0327204 ])],\n",
              "  [array([0.9959042 , 0.9922607 , 0.99018862, 0.99265843, 0.98927447,\n",
              "          0.9900833 , 0.99403876, 0.00989025, 0.01120814, 0.01137717,\n",
              "          0.01152871, 0.01158725]),\n",
              "   array([0.9959042 , 0.9922607 , 0.99018862, 0.99265843, 0.98927447,\n",
              "          0.9900833 , 0.99403876, 0.00989025, 0.01120814, 0.01137717,\n",
              "          0.01152871, 0.01158725])],\n",
              "  [array([0.99590079, 0.99222193, 0.99016753, 0.99265045, 0.98927264,\n",
              "          0.99007179, 0.99407207, 0.00986684, 0.01125181, 0.01141439,\n",
              "          0.01150733, 0.01160243]),\n",
              "   array([0.99590079, 0.99222193, 0.99016753, 0.99265045, 0.98927264,\n",
              "          0.99007179, 0.99407207, 0.00986684, 0.01125181, 0.01141439,\n",
              "          0.01150733, 0.01160243])]],\n",
              " 'lowest_energy_batch': 2,\n",
              " 'lowest_energy_value': -115.1585667736213,\n",
              " 'solvation_free_energy': -0.007181981952470838,\n",
              " 'sci_solver_total_duration': 493.997501373291,\n",
              " 'metadata': {'resources_usage': {'RUNNING: MAPPING': {'CPU_TIME': 6.080063343048096},\n",
              "   'RUNNING: OPTIMIZING_FOR_HARDWARE': {'CPU_TIME': 1.999896764755249},\n",
              "   'RUNNING: WAITING_FOR_QPU': {'CPU_TIME': 6.2850868701934814},\n",
              "   'RUNNING: EXECUTING_QPU': {'QPU_TIME': 21.639373540878296},\n",
              "   'RUNNING: POST_PROCESSING': {'CPU_TIME': 495.40831995010376}},\n",
              "  'num_iterations_executed': 3}}"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "result = job.result()\n",
        "\n",
        "result"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "94a2c921",
      "metadata": {},
      "source": [
        "Observe que os metadados do resultado incluem um resumo do uso de recursos que permite estimar melhor o tempo de QPU e CPU necessário para cada carga de trabalho (este exemplo foi executado em um dispositivo fictício, portanto, os tempos reais de uso de recursos podem ser diferentes).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "49d0b26d",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "Depois que o trabalho for concluído, toda a saída de registro estará disponível.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "id": "ddcba564",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "2025-06-27 08:42:41,358\tINFO job_manager.py:531 -- Runtime env is setting up.\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:45,015: Starting runtime service\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:45,621: Backend: ibm_sherbrooke\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:46,809: Initializing molecule object\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:51,599: Performing CCSD\n",
            "Parsing /tmp/ray/session_2025-06-27_08-42-13_898146_1/runtime_resources/working_dir_files/_ray_pkg_4bc93dcc58c04b91/output_sqd_pcm/2025-06-27_08-42-45.fcidump.txt\n",
            "Overwritten attributes  get_ovlp get_hcore  of <class 'pyscf.scf.hf_symm.SymAdaptedRHF'>\n",
            "/usr/local/lib/python3.11/site-packages/pyscf/gto/mole.py:1293: UserWarning: Function mol.dumps drops attribute energy_nuc because it is not JSON-serializable\n",
            "  warnings.warn(msg)\n",
            "/usr/local/lib/python3.11/site-packages/pyscf/gto/mole.py:1293: UserWarning: Function mol.dumps drops attribute intor_symmetric because it is not JSON-serializable\n",
            "  warnings.warn(msg)\n",
            "converged SCF energy = -115.049680672847\n",
            "E(CCSD) = -115.1519910037652  E_corr = -0.1023103309180226\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:51,694: Same spin orbital connections: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11)]\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:51,694: Opposite spin orbital connections: [(0, 0), (4, 4), (8, 8)]\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:53,718: Optimization level: 2, ops: OrderedDict([('rz', 2438), ('sx', 1496), ('ecr', 766), ('x', 185), ('measure', 24), ('barrier', 1)]), depth: 391\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:53,736: Two-qubit gate depth: 94\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:53,737: Submitting sampler job\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:54,273: Job ID: d1f5j3lqbivc73ebqpj0\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:42:54,313: Job Status: QUEUED\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,813: Starting configuration recovery iteration 0\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,841: Batch 0 subspace dimension: 531441\n",
            "2025-06-27 08:43:24,844\tINFO worker.py:1588 -- Using address 172.17.16.124:6379 set in the environment variable RAY_ADDRESS\n",
            "2025-06-27 08:43:24,847\tINFO worker.py:1723 -- Connecting to existing Ray cluster at address: 172.17.16.124:6379...\n",
            "2025-06-27 08:43:24,876\tINFO worker.py:1908 -- Connected to Ray cluster. View the dashboard at \u001b[1m\u001b[32mhttp://172.17.16.124:8265 \u001b[39m\u001b[22m\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,945: Batch 1 subspace dimension: 519841\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,950: Batch 2 subspace dimension: 543169\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,955: Batch 3 subspace dimension: 532900\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,960: Batch 4 subspace dimension: 534361\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,964: Batch 5 subspace dimension: 531441\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,969: Batch 6 subspace dimension: 540225\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,974: Batch 7 subspace dimension: 524176\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,979: Batch 8 subspace dimension: 537289\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:43:24,983: Batch 9 subspace dimension: 540225\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:09,006: Lowest energy batch: 6\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:09,007: Lowest energy value: -115.15470029849135\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:09,007: Corresponding g_solv value: -0.0071927910374866375\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:09,007: -----------------------------------\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:09,007: Starting configuration recovery iteration 1\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,564: Batch 0 subspace dimension: 413449\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,572: Batch 1 subspace dimension: 399424\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,578: Batch 2 subspace dimension: 438244\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,583: Batch 3 subspace dimension: 422500\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,589: Batch 4 subspace dimension: 409600\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,596: Batch 5 subspace dimension: 404496\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,601: Batch 6 subspace dimension: 410881\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,605: Batch 7 subspace dimension: 442225\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,611: Batch 8 subspace dimension: 409600\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:48:40,618: Batch 9 subspace dimension: 405769\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:49:54,917: Lowest energy batch: 9\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:49:54,917: Lowest energy value: -115.15862353596414\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:49:54,917: Corresponding g_solv value: -0.0071800982859467006\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:49:54,918: -----------------------------------\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:49:54,918: Starting configuration recovery iteration 2\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,501: Batch 0 subspace dimension: 399424\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,508: Batch 1 subspace dimension: 412164\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,514: Batch 2 subspace dimension: 432964\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,519: Batch 3 subspace dimension: 400689\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,524: Batch 4 subspace dimension: 432964\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,529: Batch 5 subspace dimension: 418609\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,533: Batch 6 subspace dimension: 418609\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,538: Batch 7 subspace dimension: 425104\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,543: Batch 8 subspace dimension: 404496\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:50:25,548: Batch 9 subspace dimension: 429025\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:51:37,900: Lowest energy batch: 2\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:51:37,900: Lowest energy value: -115.1585667736213\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:51:37,901: Corresponding g_solv value: -0.007181981952470838\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:51:37,901: -----------------------------------\n",
            "sqd_pcm_entrypoint.run_function:INFO:2025-06-27 08:51:37,901: SCI_solver totally takes: 493.997501373291 seconds\n",
            "\n"
          ]
        }
      ],
      "source": [
        "print(job.logs())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bf0750f3",
      "metadata": {},
      "source": [
        "<span id=\"cite-this-project\" />\n",
        "\n",
        "## Cite este projeto\n",
        "\n",
        "Caso utilize o modelo SQD IEF-PCM em sua pesquisa, consulte o [repositório](https://github.com/qiskit-community/qiskit-function-templates/tree/main/chemistry/sqd_pcm#citing-this-project) para obter informações detalhadas sobre como citá-lo.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d7cc1cb2",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"info\" title=\"Recomendações\">\n",
        "  * Siga o tutorial [“Cálculos de solvente implícito usando Qiskit Serverless ”](/docs/tutorials/implicit-solvent-calculations) para ver um exemplo prático desse mesmo fluxo de trabalho\n",
        "  * Consulte o guia sobre como criar um modelo de função para [simulação hamiltoniana](/docs/guides/function-template-hamiltonian-simulation)\n",
        "  * Confira os arquivos de origem desse modelo em [GitHub](https://github.com/qiskit-community/qiskit-function-templates/tree/main/chemistry/sqd_pcm)\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "aabba015",
      "metadata": {},
      "source": [
        "<span id=\"references\" />\n",
        "\n",
        "#### Referências\n",
        "\n",
        "\\[1] Danil Kaliakin, Akhil Shajan, Fangchun Liang e Kenneth M. Merz Jr. [Implicit Solvent Sample-Based Quantum Diagonalization](https://pubs.acs.org/doi/10.1021/acs.jpcb.5c01030), The Journal of Physical Chemistry B, 2025, DOI: 10.1021/acs.jpcb.5c01030\n",
        "\n",
        "\\[2] Javier Robledo-Moreno, et al, [Chemistry Beyond Exact Solutions on a Quantum-Centric Supercomputer (Química além das soluções exatas em um supercomputador centrado em quantum](https://arxiv.org/abs/2405.05068) ), arXiv:2405.05068 \\[quant-ph].\n",
        "\n",
        "\\[3] Jeffery Yu, et al, [Algoritmo centrado em quantum para diagonalização de Krylov baseada em amostra](https://arxiv.org/abs/2501.09702), arXiv:2501.09702 \\[quant-ph].\n",
        "\n",
        "\\[4] Keita Kanno, et al, [Interação de configuração selecionada por quantum: diagonalização clássica de Hamiltonianos em subespaços selecionados por computadores quânticos](https://arxiv.org/abs/2302.11320), arXiv:2302.11320 \\[quant-ph].\n",
        "\n",
        "\\[5] Kenji Sugisaki, et al, [Interação de configuração quântica selecionada baseada em simulação hamiltoniana para cálculos de estrutura eletrônica em larga escala com um computador quântico](https://arxiv.org/abs/2412.07218), arXiv:2412.07218 \\[quant-ph].\n",
        "\n",
        "\\[6] Mathias Mikkelsen, Yuya O. Nakagawa, [Quantum-selected configuration interaction with time-evolved state](https://arxiv.org/abs/2412.13839), arXiv:2412.13839 \\[quant-ph].\n",
        "\n",
        "\\[7] Herbert, John M. [Dielectric continuum methods for quantum chemistry. WIREs Computational Molecular Science](https://wires.onlinelibrary.wiley.com/doi/10.1002/wcms.1519), 2021, 11, 1759-0876.\n",
        "\n",
        "\\[8] Saki, A. A.; Barison, S.; Fuller, B.; Garrison, J. R.; Glick, J. R.; Johnson, C.; Mezzacapo, A.; Robledo-Moreno, J.; Rossmannek, M.; Schweigert, P. et al. Complemento Qiskit: diagonalização quântica baseada em amostra, 2024; [https://github.com/Qiskit/qiskit-addon-sqd](https://github.com/Qiskit/qiskit-addon-sqd)\n",
        "\n",
        "\\[9] Asun, Q.; Zhang, X.; Banerjee, S.; Bao, P.; Barbry, M.; Blunt, N. S.; Bogdanov, N. A.; Booth, G. H.; Chen, J.; Cui, Z.-H. PySCF: Python -simulações baseadas na estrutura química, 2025; [https://github.com/pyscf/pyscf](https://github.com/pyscf/pyscf)\n",
        "\n",
        "\\[10] Kevin J. Sung; et al, FFSIM: simulações mais rápidas de circuitos quânticos fermiônicos, 2024. [https://github.com/qiskit-community/ffsim](https://github.com/qiskit-community/ffsim)\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
}