{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "8cfa587b",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Créer une fonction Qiskit pour la simulation chimique\"\n",
        "description: \"Apprenez à déployer et à exécuter le modèle de workflow chimique\"\n",
        "---\n",
        "\n",
        "<span id=\"build-and-run-a-qiskit-function-template-for-electronic-structure-simulation-with-an-implicit-solvent-model\" />\n",
        "\n",
        "# Créer et exécuter un modèle de fonction Qiskit pour la simulation de la structure électronique à l'aide d'un modèle de solvant implicite\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": [
        "Ce modèle, développé en collaboration avec la Cleveland Clinic, consiste en un flux de travail permettant de calculer l'énergie de l'état fondamental et l'énergie libre de solvatation d'une molécule dans un solvant implicite [\\[1\\].](#references) Ces simulations sont basées sur la méthode de diagonalisation quantique basée sur l'échantillon (SQD) [\\[2-6\\]](#references) et sur le modèle de continuum polarisable du formalisme de l'équation intégrale (IEF-PCM) du solvant [\\[7\\]](#references).\n",
        "\n",
        "Pour un guide détaillé, étape par étape, de ce même processus de travail, accompagné d'un exemple concret, consultez le tutoriel «[ Calculs avec solvant implicite à l'aide d' Qiskit Serverless](/docs/tutorials/implicit-solvent-calculations) ».\n",
        "\n",
        "Ce guide utilise le modèle avec une molécule de méthanol comme soluté, dont la structure électronique est simulée explicitement, et de l'eau comme solvant, approximé comme un milieu diélectrique continu. Pour tenir compte des [effets de corrélation électronique](https://onlinelibrary.wiley.com/doi/epdf/10.1002/ijch.202100111) dans le méthanol, tout en maintenant l'équilibre entre le coût de calcul et la précision, nous n'incluons que les orbitales $\\sigma$, $\\sigma^{*}$, et les paires solitaires dans l'espace actif simulé avec SQD IEF-PCM. Cette sélection d'orbitales est effectuée avec la [méthode de l'espace actif de valence atomique (AVAS)](https://github.com/pyscf/pyscf.github.io/blob/master/examples/mcscf/43-avas.py) en utilisant les composantes orbitales atomiques \\[C2s,2p], O2s\\[,2p] et \\[H1s], ce qui donne un espace actif de 14 électrons et 12 orbitales ( 14e,12o ). Les orbitales de référence sont calculées avec la méthode Hartree Fock à coquille fermée en utilisant le jeu de base cc-pvdz.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "25d18ba5",
      "metadata": {},
      "source": [
        "<span id=\"workflow-introduction\" />\n",
        "\n",
        "## Présentation du flux de travail\n",
        "\n",
        "Ce guide interactif montre comment télécharger ce modèle de fonction sur Qiskit Serverless et exécuter une charge de travail d'exemple. Le modèle est structuré comme un modèle Qiskit en quatre étapes :\n",
        "\n",
        "<span id=\"1-collect-input-and-map-the-problem\" />\n",
        "\n",
        "#### 1. Recueillir les informations et cartographier le problème\n",
        "\n",
        "Cette étape prend en entrée la géométrie de la molécule, l'espace actif sélectionné, le modèle de solvatation, les options LUCJ et les options SQD. Il produit ensuite le fichier PySCF Checkpoint, qui contient les données Hartree-Fock (HF) IEF-PCM. Ces données seront utilisées dans la partie SQD du flux de travail. Pour la partie LUCJ du flux de travail, la section d'entrée génère également les données HF en phase gazeuse, qui sont stockées en interne au format PySCF FCIDUMP.\n",
        "\n",
        "Les informations provenant de la simulation HF de la phase gazeuse et la définition de l'espace actif sont prises comme données d'entrée. Il est important de noter qu'il utilise également les informations définies par l'utilisateur dans la section d'entrée concernant la suppression des erreurs, le nombre de tirs, le niveau d'optimisation du transpondeur de circuit et la disposition des qubits.\n",
        "\n",
        "Il génère des intégrales à un électron et à deux électrons dans l'espace actif défini. Les intégrales sont ensuite utilisées pour effectuer des calculs CCSD classiques, qui renvoient à t2 des amplitudes que nous utilisons pour paramétrer le circuit LUCJ.\n",
        "\n",
        "<span id=\"2-optimize-the-circuit\" />\n",
        "\n",
        "#### 2. Optimiser le circuit\n",
        "\n",
        "Le circuit LUCJ est ensuite transposé dans un circuit ISA pour le matériel cible. Un échantillonneur primitif est alors instancié avec un ensemble par défaut d'options d'atténuation des erreurs pour gérer l'exécution.\n",
        "\n",
        "<span id=\"3-execute-the-circuit\" />\n",
        "\n",
        "#### 3. Exécutez le circuit\n",
        "\n",
        "Les calculs de LUCJ renvoient les chaînes de bits pour chaque mesure, ces chaînes de bits correspondant aux configurations électroniques du système étudié. Les chaînes de bits sont ensuite utilisées comme entrée pour le post-traitement.\n",
        "\n",
        "<span id=\"4-post-process-by-using-sqd\" />\n",
        "\n",
        "#### 4. Post-traitement à l'aide de SQD\n",
        "\n",
        "Cette dernière étape prend comme entrée le fichier Checkpoint PySCF contenant les informations IEF-PCM HF, les chaînes de bits représentant les configurations électroniques prédites par LUCJ, et les options SQD définies par l'utilisateur et sélectionnées dans la section d'entrée. En sortie, il produit l'énergie totale SQD IEF-PCM du lot le moins énergétique et l'énergie libre de solvatation correspondante.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4832ef18",
      "metadata": {},
      "source": [
        "<span id=\"options\" />\n",
        "\n",
        "### Options\n",
        "\n",
        "Pour ce modèle, vous devez spécifier les options de génération du circuit LUCJ et les paramètres d'exécution SQD.\n",
        "\n",
        "<span id=\"lucj-options\" />\n",
        "\n",
        "#### Options LUCJ\n",
        "\n",
        "Lorsque le circuit quantique LUCJ est exécuté, un ensemble d'échantillons représentant les états de base de calcul de la distribution de probabilité du système moléculaire est produit. Pour équilibrer la profondeur du circuit LUCJ et son expressivité, les qubits correspondant aux orbitales de spin opposé ont les portes à deux qubits appliquées entre eux lorsque ces qubits sont voisins par l'intermédiaire d'un seul qubit d'ancilla. Pour mettre en œuvre cette approche sur le matériel IBM avec une topologie heavy-hex, les qubits qui représentent les orbitales de spin avec le même spin sont connectés par une topologie de ligne où chaque ligne prend une forme de zig-zag en raison de la connectivité heavy-hex du matériel cible, tandis que les qubits qui représentent les orbitales de spin avec le spin opposé n'ont une connexion que tous les quatre qubits.\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Cliquez pour agrandir et obtenir plus de détails sur les options requises :\">\n",
        "    L'utilisateur doit fournir le tableau `initial_layout` correspondant aux qubits qui satisfont à ce [modèle *en zig-zag*](https://pubs.rsc.org/en/content/articlehtml/2023/sc/d3sc02516k) dans la section `lucj_options` de la fonction SQD IEF-PCM. Dans le cas des simulations SQD IEF-PCM ( 14e,12o )/cc-pvdz du méthanol, nous avons choisi la disposition initiale des qubits correspondant à la diagonale principale de la QPU Eagle R3. Ici, les 12 premiers éléments du tableau `initial_layout` `[0, 14, 18, 19, 20, 33, 39, 40, 41, 53, 60, 61, ...]` correspondent aux orbitales de spin alpha. Les 12 derniers éléments `[... 2, 3, 4, 15, 22, 23, 24, 34, 43, 44, 45, 54]` correspondent à des orbitales de spin bêta.\n",
        "\n",
        "    Il est important que l'utilisateur détermine le `number_of_shots`, qui correspond au nombre de mesures dans le circuit LUCJ. Le nombre de tirs doit être suffisamment important car la première étape de la procédure S-CORE s'appuie sur les échantillons du secteur des particules de droite pour obtenir l'approximation initiale de la distribution du nombre d'occupation de l'état fondamental.\n",
        "\n",
        "    Le nombre de plans dépend fortement du système et du matériel, mais les études SQD [non covalentes](https://arxiv.org/abs/2410.09209), [basées sur les fragments](https://arxiv.org/abs/2411.09861) et les [solvants implicites](https://pubs.acs.org/doi/10.1021/acs.jpcb.5c01030) suggèrent qu'il est possible d'atteindre la précision chimique en suivant ces lignes directrices :\n",
        "\n",
        "    * 20 000 - 200 000 tirs pour les systèmes comportant moins de 16 orbitales moléculaires (32 orbitales de spin)\n",
        "    * 200 000 tirs pour les systèmes comportant 16 à 18 orbitales moléculaires\n",
        "    * 200 000 - 2 000 000 tirs pour les systèmes comportant plus de 18 orbitales moléculaires\n",
        "\n",
        "    Le nombre de calculs requis dépend du nombre d'orbitales de spin dans le système étudié et de la taille de l'espace de Hilbert correspondant à l'espace actif sélectionné au sein de ce système. En général, les cas impliquant des espaces de Hilbert plus petits nécessitent moins d'itérations. Parmi les autres options disponibles de LUCJ, on trouve [le niveau d'optimisation du transpileur de circuits](https://docs.quantum.ibm.com/guides/set-optimization) et [les options de suppression des erreurs](https://docs.quantum.ibm.com/guides/error-mitigation-and-suppression-techniques). Notez que ces options ont également une incidence sur le nombre de tirs requis et sur la précision obtenue.\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e2b46498",
      "metadata": {},
      "source": [
        "<span id=\"sqd-options\" />\n",
        "\n",
        "#### Options SQD\n",
        "\n",
        "Les options importantes dans les simulations SQD sont les suivantes : `sqd_iterations`, `number_of_batches`, et `samples_per_batch`. En général, le nombre inférieur d'échantillons par lot peut être compensé par un plus grand nombre de lots (`number_of_batches`) et un plus grand nombre d'itérations de S-CORE (`sqd_iterations`). Avec plus de lots, nous pouvons échantillonner plus de variations des sous-espaces configurationnels. Étant donné que le lot de plus faible énergie est considéré comme la solution pour l'énergie de l'état fondamental du système, un plus grand nombre de lots peut améliorer les résultats grâce à de meilleures statistiques. Des itérations supplémentaires de S-CORE permettent de récupérer davantage de configurations à partir de la distribution LUCJ originale si le nombre d'échantillons dans le secteur de particules correct est faible. Cela peut permettre de réduire le nombre d'échantillons par lot.\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Cliquez pour afficher plus d'informations sur la configuration des options SQD :\">\n",
        "    Une autre stratégie consiste à utiliser davantage d'échantillons par lot, ce qui garantit que la plupart des échantillons LUCJ initiaux dans l'espace de particules droit sont utilisés au cours de la procédure S-CORE et que les sous-espaces individuels englobent une variété suffisante de configurations d'électrons. Cela permet de réduire le nombre d'étapes S-CORE nécessaires, où seules deux ou trois itérations de SQD sont nécessaires si le nombre d'échantillons par lot est suffisamment important. Cependant, un plus grand nombre d'échantillons par lot entraîne un coût de calcul plus élevé pour chaque étape de diagonalisation. Par conséquent, l'équilibre entre la précision et le coût de calcul dans les simulations SQD peut être atteint en choisissant `sqd_iterations`, `number_of_batches`, et `samples_per_batch` de manière optimale.\n",
        "\n",
        "    L' [étude SQD IEF-PCM](https://pubs.acs.org/doi/10.1021/acs.jpcb.5c01030) montre que lorsque trois itérations de S-CORE sont utilisées, la précision chimique peut être atteinte en suivant ces lignes directrices :\n",
        "\n",
        "    * 600 échantillons par lot dans le méthanol SQD IEF-PCM ( 14e,12o ) simulations\n",
        "    * 1500 échantillons par lot en méthylamine SQD IEF-PCM ( 14e,13o ) simulations\n",
        "    * 6000 échantillons par lot dans les simulations SQD IEF-PCM ( 8e,23o ) de l'eau\n",
        "    * 16 000 échantillons par lot dans les simulations SQD IEF-PCM ( 20e,18o ) pour l'éthanol\n",
        "\n",
        "    Tout comme le nombre requis de tirs dans LUCJ, le nombre requis d'échantillons par lot utilisé dans la procédure S-CORE dépend fortement du système et du matériel. Les exemples ci-dessus peuvent être utilisés pour estimer le point initial du nombre d'échantillons requis par lot. Le tutoriel sur l'évaluation systématique du nombre d'échantillons requis par lot est disponible [ici.](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",
        "## Déployer et exécuter la fonction SQD IEF-PCM du modèle\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6c92ac84",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "<span id=\"authentication\" />\n",
        "\n",
        "### Authentification\n",
        "\n",
        "Utilisez `qiskit-ibm-catalog` pour vous authentifier auprès de `QiskitServerless` avec votre clé API (token), qui se trouve sur le tableau de bord de [IBM Quantum Platform](). Cela permet d'instancier le client sans serveur pour télécharger ou exécuter la fonction sélectionnée :\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",
        "En option, utilisez `save_account()` pour sauvegarder vos informations d'identification dans un environnement local (voir le guide [Configurer votre compte IBM Cloud](/docs/guides/cloud-setup#cloud-save) ). Notez que cela écrit vos informations d'identification dans le même fichier 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",
        "Si le [compte est enregistré](/docs/guides/save-credentials), il n'est pas nécessaire de fournir le jeton pour s'authentifier :\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",
        "### Télécharger le modèle\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3e0e8cc8",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "Pour télécharger une fonction Qiskit personnalisée, vous devez d'abord instancier un objet `QiskitFunction` qui définit le code source de la fonction. Le titre vous permettra d'identifier la fonction une fois qu'elle sera dans le télégraphe. Le principal point d'entrée est le fichier qui contient `if __name__ == \"__main__\"`. Si votre flux de travail nécessite des fichiers sources supplémentaires, vous pouvez définir un répertoire de travail qui sera téléchargé avec le point d'entrée.\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": [
        "Une fois l'instance prête, téléchargez-la sur 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": [
        "Pour vérifier si le programme a été téléchargé avec succès, utilisez `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",
        "## Charger et exécuter le modèle à distance\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "62b37d7a",
      "metadata": {},
      "source": [
        "Le modèle de fonction a été téléchargé, vous pouvez donc l'exécuter à distance avec Qiskit Serverless. Tout d'abord, chargez le modèle par son nom :\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": [
        "Ensuite, exécutez le modèle avec les entrées au niveau du domaine pour SQD-IEF PCM. Cet exemple spécifie une charge de travail à base de méthanol.\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": [
        "Vérifier l'état détaillé du travail :\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": [
        "Pendant l'exécution du travail, vous pouvez récupérer les journaux créés à partir des sorties de `logger.info` . Ils peuvent fournir des informations exploitables sur la progression du flux de travail SQD IEF-PCM. Par exemple, les mêmes connexions orbitales de spin, ou la profondeur de deux qubits du circuit ISA final destiné à être exécuté sur le matériel.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a5b1f190",
      "metadata": {},
      "outputs": [],
      "source": [
        "print(job.logs())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ba179114",
      "metadata": {},
      "source": [
        "L'appel du résultat du travail bloque le reste du programme jusqu'à ce qu'un résultat soit disponible. Une fois le travail effectué, vous pouvez récupérer les résultats. Il s'agit notamment de l'énergie libre de solvatation, ainsi que d'informations sur le lot de l'énergie la plus basse, la valeur de l'énergie la plus basse et d'autres informations utiles telles que la durée totale du solveur.\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": [
        "Notez que les métadonnées des résultats incluent un résumé de l'utilisation des ressources qui vous permet de mieux estimer le temps QPU et CPU requis pour chaque charge de travail (cet exemple a été exécuté sur un appareil factice, les temps d'utilisation réels des ressources peuvent donc différer).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "49d0b26d",
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "source": [
        "Une fois le travail terminé, l'ensemble de la sortie de la journalisation sera disponible.\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",
        "## Référencer ce projet\n",
        "\n",
        "Si vous utilisez le modèle SQD IEF-PCM dans le cadre de vos travaux de recherche, veuillez consulter le [référentiel](https://github.com/qiskit-community/qiskit-function-templates/tree/main/chemistry/sqd_pcm#citing-this-project) pour obtenir des informations détaillées sur la citation.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d7cc1cb2",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Etapes suivantes\n",
        "\n",
        "<Admonition type=\"info\" title=\"Recommandations\">\n",
        "  * Suivez le tutoriel [« Calculs de solvant implicite à l'aide d' Qiskit Serverless »](/docs/tutorials/implicit-solvent-calculations) pour découvrir un exemple concret de ce même processus\n",
        "  * Consultez le guide sur la création d'un modèle de fonction pour [la simulation hamiltonienne](/docs/guides/function-template-hamiltonian-simulation)\n",
        "  * Consultez les fichiers sources de ce modèle sur [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",
        "#### Références\n",
        "\n",
        "\\[1] Danil Kaliakin, Akhil Shajan, Fangchun Liang, and 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](https://arxiv.org/abs/2405.05068), arXiv:2405.05068 \\[quant-ph].\n",
        "\n",
        "\\[3] Jeffery Yu, et al, [Quantum-Centric Algorithm for Sample-Based Krylov Diagonalization](https://arxiv.org/abs/2501.09702), arXiv:2501.09702 \\[quant-ph].\n",
        "\n",
        "\\[4] Keita Kanno, et al, [Quantum-Selected Configuration Interaction : classical diagonalization of Hamiltonians in subspaces selected by quantum computers](https://arxiv.org/abs/2302.11320), arXiv:2302.11320 \\[quant-ph].\n",
        "\n",
        "\\[5] Kenji Sugisaki, et al, [Hamiltonian simulation-based quantum-selected configuration interaction for large-scale electronic structure calculations with a quantum computer](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. [Méthodes de continuum diélectrique pour la chimie quantique. 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. Qiskit addon : sample-based quantum diagonalization, 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 -basé sur des simulations du cadre de la chimie, 2025; [https://github.com/pyscf/pyscf](https://github.com/pyscf/pyscf)\n",
        "\n",
        "\\[10] Kevin J. Sung; et al, FFSIM : simulations plus rapides de circuits quantiques fermioniques, 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
}