From 099a73ba3135854519986351090884c9b9dc0cb8 Mon Sep 17 00:00:00 2001 From: Hatem Helal Date: Thu, 2 May 2024 14:47:44 +0100 Subject: [PATCH] update optimisation example with colab run --- docs/optim.ipynb | 624 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 589 insertions(+), 35 deletions(-) diff --git a/docs/optim.ipynb b/docs/optim.ipynb index 91d004a..9c5c3ea 100644 --- a/docs/optim.ipynb +++ b/docs/optim.ipynb @@ -4,6 +4,7 @@ "cell_type": "code", "execution_count": 1, "metadata": { + "id": "BCKG3v5OdEXP", "tags": [ "remove-input" ] @@ -15,20 +16,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "id": "IZAXXQnAdEXS" + }, "source": [ "# Electronic Energy Minimisation\n", "\n", - "A central problem of electronic structure simulations is finding the ground state \n", + "A central problem of electronic structure simulations is finding the ground state\n", "configuration of many interacting electrons. Within MESS this is handled by:\n", "\n", "* building a `Hamiltonian` by selecting how to model the quantum-mechanical interactions\n", " with the `xc_method` argument.\n", "* minimisation of the total energy subject to the constraint of orthonormal orbitals.\n", "\n", - "On the second point, there are many possible approaches to solving this constrained \n", - "optimisation problem. In the following we setup minimising the total energy with the \n", - "[Adam optimiser](https://optax.readthedocs.io/en/latest/api/optimizers.html#adam) \n", + "On the second point, there are many possible approaches to solving this constrained\n", + "optimisation problem. In the following we setup minimising the total energy with the\n", + "[Adam optimiser](https://optax.readthedocs.io/en/latest/api/optimizers.html#adam)\n", "from the [optax library](https://optax.readthedocs.io/en/latest/index.html).\n", "\n", "\n", @@ -42,11 +45,79 @@ "cell_type": "code", "execution_count": 2, "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vll7CYI9dEXT", + "outputId": "8a42fedc-e48e-48b3-c67a-8871b04897b9", "tags": [ "hide-cell" ] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting git+https://github.com/graphcore-research/mess.git\n", + " Cloning https://github.com/graphcore-research/mess.git to /tmp/pip-req-build-d9if0aqh\n", + " Running command git clone --filter=blob:none --quiet https://github.com/graphcore-research/mess.git /tmp/pip-req-build-d9if0aqh\n", + " Resolved https://github.com/graphcore-research/mess.git to commit e849e178ac3b169ceb4550e0bf7141e019d5105e\n", + " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", + " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", + " Installing backend dependencies ... \u001b[?25l\u001b[?25hdone\n", + " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + "Collecting pyquante2@ git+https://github.com/rpmuller/pyquante2@pure (from mess==0.0.0)\n", + " Cloning https://github.com/rpmuller/pyquante2 (to revision pure) to /tmp/pip-install-jn1k7mb6/pyquante2_4c59b410fc6b4bcd8e77d894edf16dc0\n", + " Running command git clone --filter=blob:none --quiet https://github.com/rpmuller/pyquante2 /tmp/pip-install-jn1k7mb6/pyquante2_4c59b410fc6b4bcd8e77d894edf16dc0\n", + " Running command git checkout -b pure --track origin/pure\n", + " Switched to a new branch 'pure'\n", + " Branch 'pure' set up to track remote branch 'pure' from 'origin'.\n", + " Resolved https://github.com/rpmuller/pyquante2 to commit 822a1755c83f1730b1b063bc4ab2580a23342c02\n", + " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: equinox in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (0.11.4)\n", + "Requirement already satisfied: jax[cpu] in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (0.4.26)\n", + "Requirement already satisfied: jaxtyping in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (0.2.28)\n", + "Requirement already satisfied: more-itertools in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (10.1.0)\n", + "Requirement already satisfied: optax in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (0.2.2)\n", + "Requirement already satisfied: optimistix in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (0.0.6)\n", + "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (2.0.3)\n", + "Requirement already satisfied: periodictable in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (1.7.0)\n", + "Requirement already satisfied: pyarrow in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (14.0.2)\n", + "Requirement already satisfied: pyscf in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (2.5.0)\n", + "Requirement already satisfied: py3Dmol in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (2.1.0)\n", + "Requirement already satisfied: basis-set-exchange in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (0.9.1)\n", + "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from mess==0.0.0) (1.12)\n", + "Requirement already satisfied: jsonschema in /usr/local/lib/python3.10/dist-packages (from basis-set-exchange->mess==0.0.0) (4.19.2)\n", + "Requirement already satisfied: argcomplete in /usr/local/lib/python3.10/dist-packages (from basis-set-exchange->mess==0.0.0) (3.3.0)\n", + "Requirement already satisfied: regex in /usr/local/lib/python3.10/dist-packages (from basis-set-exchange->mess==0.0.0) (2023.12.25)\n", + "Requirement already satisfied: unidecode in /usr/local/lib/python3.10/dist-packages (from basis-set-exchange->mess==0.0.0) (1.3.8)\n", + "Requirement already satisfied: typing-extensions>=4.5.0 in /usr/local/lib/python3.10/dist-packages (from equinox->mess==0.0.0) (4.11.0)\n", + "Requirement already satisfied: numpy>=1.20.0 in /usr/local/lib/python3.10/dist-packages (from jaxtyping->mess==0.0.0) (1.25.2)\n", + "Requirement already satisfied: typeguard==2.13.3 in /usr/local/lib/python3.10/dist-packages (from jaxtyping->mess==0.0.0) (2.13.3)\n", + "Requirement already satisfied: ml-dtypes>=0.2.0 in /usr/local/lib/python3.10/dist-packages (from jax[cpu]->mess==0.0.0) (0.2.0)\n", + "Requirement already satisfied: opt-einsum in /usr/local/lib/python3.10/dist-packages (from jax[cpu]->mess==0.0.0) (3.3.0)\n", + "Requirement already satisfied: scipy>=1.9 in /usr/local/lib/python3.10/dist-packages (from jax[cpu]->mess==0.0.0) (1.11.4)\n", + "Requirement already satisfied: jaxlib==0.4.26 in /usr/local/lib/python3.10/dist-packages (from jax[cpu]->mess==0.0.0) (0.4.26+cuda12.cudnn89)\n", + "Requirement already satisfied: absl-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from optax->mess==0.0.0) (1.4.0)\n", + "Requirement already satisfied: chex>=0.1.86 in /usr/local/lib/python3.10/dist-packages (from optax->mess==0.0.0) (0.1.86)\n", + "Requirement already satisfied: lineax>=0.0.4 in /usr/local/lib/python3.10/dist-packages (from optimistix->mess==0.0.0) (0.0.5)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->mess==0.0.0) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->mess==0.0.0) (2023.4)\n", + "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas->mess==0.0.0) (2024.1)\n", + "Requirement already satisfied: pyparsing in /usr/local/lib/python3.10/dist-packages (from periodictable->mess==0.0.0) (3.1.2)\n", + "Requirement already satisfied: h5py>=2.7 in /usr/local/lib/python3.10/dist-packages (from pyscf->mess==0.0.0) (3.9.0)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from pyscf->mess==0.0.0) (67.7.2)\n", + "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->mess==0.0.0) (1.3.0)\n", + "Requirement already satisfied: toolz>=0.9.0 in /usr/local/lib/python3.10/dist-packages (from chex>=0.1.86->optax->mess==0.0.0) (0.12.1)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->mess==0.0.0) (1.16.0)\n", + "Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema->basis-set-exchange->mess==0.0.0) (23.2.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema->basis-set-exchange->mess==0.0.0) (2023.12.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema->basis-set-exchange->mess==0.0.0) (0.35.0)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema->basis-set-exchange->mess==0.0.0) (0.18.0)\n" + ] + } + ], "source": [ "import sys\n", "\n", @@ -58,20 +129,12 @@ "cell_type": "code", "execution_count": 3, "metadata": { + "id": "j7HdZdtPdEXU", "tags": [ "hide-cell" ] }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ubuntu/miniforge3/envs/jax/lib/python3.10/site-packages/pyscf/dft/libxc.py:771: UserWarning: Since PySCF-2.3, B3LYP (and B3P86) are changed to the VWN-RPA variant, corresponding to the original definition by Stephens et al. (issue 1480) and the same as the B3LYP functional in Gaussian. To restore the VWN5 definition, you can put the setting \"B3LYP_WITH_VWN5 = True\" in pyscf_conf.py\n", - " warnings.warn('Since PySCF-2.3, B3LYP (and B3P86) are changed to the VWN-RPA variant, '\n" - ] - } - ], + "outputs": [], "source": [ "import jax\n", "import jax.numpy as jnp\n", @@ -79,19 +142,124 @@ "import seaborn as sns\n", "from tqdm.notebook import tqdm\n", "\n", - "from mess import Hamiltonian, basisset, molecule\n", + "from mess import Hamiltonian, basisset\n", "from mess.structure import nuclear_energy\n", + "from mess.interop import from_pyquante\n", "\n", "sns.set_theme(style=\"whitegrid\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To start with we show how to build a molecule by using the samples that are packaged as part of the\n", + "[pyquante](https://github.com/rpmuller/pyquante2) project. We use use methane which you can rotate below:" + ] + }, { "cell_type": "code", "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 514 + }, + "id": "ltyJE6ZZdEXV", + "outputId": "8285c552-2da8-4109-a937-ad04e73598e0" + }, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", + "text/html": [ + "
\n", + "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Structure(atomic_number=i64[5](numpy), position=f64[5,3](numpy))" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mol = from_pyquante(\"ch4\")\n", + "mol" + ] + }, + { + "cell_type": "markdown", "metadata": {}, + "source": [ + "Next we build up the components of our simulation:\n", + "* basis set: describes the linear combination of Gaussian orbitals used to represent the molecular orbitals and from this\n", + " representation we can derive the electron density.\n", + "* Hamiltonian: describing the total energy of the many electrons interacting in the field generated by the nuclear cores.\n", + " We use the widely used PBE exchange-correlation approximation of density functional theory.\n", + "* gradient descent optimiser: we use the [Adam optimiser](https://optax.readthedocs.io/en/latest/api/optimizers.html#adam)\n", + " from the [optax library](https://optax.readthedocs.io/en/latest/index.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "hFRWuoNGfKNL" + }, "outputs": [], "source": [ - "mol = molecule(\"water\")\n", "basis = basisset(mol, \"6-31g\")\n", "H = Hamiltonian(basis, xc_method=\"pbe\")\n", "optimiser = optax.adam(learning_rate=0.1)" @@ -99,17 +267,21 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "id": "SO_LWgGedEXV" + }, "source": [ "Next we define a function that evaluates the total energy given an arbitrary matrix $Z$\n", - "which applies the orthonormal constraint. This efffectively converts the minimisation \n", + "which applies the orthonormal constraint. This efffectively converts the minimisation\n", "problem into an unconstrained optimisation one." ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, + "execution_count": 6, + "metadata": { + "id": "OsjjbSp1dEXV" + }, "outputs": [], "source": [ "E_n = nuclear_energy(mol)\n", @@ -125,7 +297,9 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "id": "cVdMvXmqdEXW" + }, "source": [ "We use a somewhat arbitrary initial guess and use the Adam optimiser to minimise\n", "the total energy. The function transformation\n", @@ -136,18 +310,38 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "49d87f6d687d4d1792867df58dfc7285", + "efff16ef036d40609e61cbb5f5ec352a", + "dfcc15267aa94fc2bff1ccc028577c03", + "5e99c509239d4323bcefb5915794efd1", + "a60c8533198943339de7463e9f4237a6", + "01d8f31284b1483b882967252735b3a0", + "579afa25b87e4afa9e0d25f7c93eac32", + "b517275d3b904f83bf7b64d432055f4f", + "290bc4e3d2e3417ebbe793747a6e4982", + "f3ee123f9f674af9bc331fd57c6719cd", + "471677018d09444c868f0e8fc83b8e00" + ] + }, + "id": "me721aF3dEXW", + "outputId": "6ed7b1b8-0289-464b-fd69-7739dc3b1ffe" + }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "9d7698b2a8a6412184f8bfe5e67e5562", + "model_id": "49d87f6d687d4d1792867df58dfc7285", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/128 [00:00" ] @@ -199,9 +402,14 @@ } ], "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "A100", + "machine_shape": "hm", + "provenance": [] + }, "kernelspec": { - "display_name": "jax", - "language": "python", + "display_name": "Python 3", "name": "python3" }, "language_info": { @@ -215,8 +423,354 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "01d8f31284b1483b882967252735b3a0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "290bc4e3d2e3417ebbe793747a6e4982": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "471677018d09444c868f0e8fc83b8e00": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "49d87f6d687d4d1792867df58dfc7285": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_efff16ef036d40609e61cbb5f5ec352a", + "IPY_MODEL_dfcc15267aa94fc2bff1ccc028577c03", + "IPY_MODEL_5e99c509239d4323bcefb5915794efd1" + ], + "layout": "IPY_MODEL_a60c8533198943339de7463e9f4237a6" + } + }, + "579afa25b87e4afa9e0d25f7c93eac32": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5e99c509239d4323bcefb5915794efd1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f3ee123f9f674af9bc331fd57c6719cd", + "placeholder": "​", + "style": "IPY_MODEL_471677018d09444c868f0e8fc83b8e00", + "value": " 200/200 [00:03<00:00, 164.82it/s]" + } + }, + "a60c8533198943339de7463e9f4237a6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b517275d3b904f83bf7b64d432055f4f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dfcc15267aa94fc2bff1ccc028577c03": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b517275d3b904f83bf7b64d432055f4f", + "max": 200, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_290bc4e3d2e3417ebbe793747a6e4982", + "value": 200 + } + }, + "efff16ef036d40609e61cbb5f5ec352a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_01d8f31284b1483b882967252735b3a0", + "placeholder": "​", + "style": "IPY_MODEL_579afa25b87e4afa9e0d25f7c93eac32", + "value": "Total energy: -40.437987 (Hartree): 100%" + } + }, + "f3ee123f9f674af9bc331fd57c6719cd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + } } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 0 }