From b3288b6f6263195804ebbda62d7e5cbf04b18b72 Mon Sep 17 00:00:00 2001 From: Hatem Helal Date: Thu, 26 Sep 2024 13:51:13 +0100 Subject: [PATCH 1/3] Update python version used in pre-commit + autoupdate --- .pre-commit-config.yaml | 4 +- docs/batching.ipynb | 1332 +++++++++++++++++++-------------------- docs/tour.ipynb | 5 +- 3 files changed, 670 insertions(+), 671 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8f3fd0d..0e0f3ee 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,5 @@ default_language_version: - python: python3.10 + python: python3.11 repos: - repo: https://github.com/pre-commit/pre-commit-hooks @@ -11,7 +11,7 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.5.0 + rev: v0.6.8 hooks: - id: ruff types_or: [python, jupyter] diff --git a/docs/batching.ipynb b/docs/batching.ipynb index e252e82..c74b34e 100644 --- a/docs/batching.ipynb +++ b/docs/batching.ipynb @@ -1,690 +1,690 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "heJBXjlM5u4d" - }, - "source": [ - "# Batching\n", - "\n", - "Training neural networks over batches of data is an essential component of efficiently\n", - "utilising massively parallel hardware accelerators. We can recast a standard electronic\n", - "minimisation problem as a batched one by using the JAX vectorising map\n", - "[aka jax.vmap](https://jax.readthedocs.io/en/latest/_autosummary/jax.vmap.html#jax-vmap).\n", - "By doing this we can parallelise the electronic structure optimisation over multiple\n", - "conformations of the same molecule. Just like in training neural networks, this will\n", - "allow for more efficient utilisation of the accelerator which unlocks\n", - "exploring the\n", - "[potential energy surfaces](https://en.wikipedia.org/wiki/Potential_energy_surface)\n", - "using quantum-mechanical simulations.\n", - "\n", - "We demonstrate this idea by calculating the molecular Hydrogen dissociation curve using\n", - "a batch of hydrogen molecules where the bond length (H-H distance) is varied. To setup\n", - "the batch we build a `Hamiltonian` for each bond length and stack the built modules to\n", - "create a batched-Hamiltonian. This example uses the `sto-3g` basis set and the simple\n", - "local density approximation of density functional theory but this batching formulation isn't\n", - "limited to these choices for how the Hamiltonian is represented.\n", - "\n", - ":::{note}\n", - "The following code cell will install MESS into the Google Colab runtime.\n", - "Select the 🚀 in the toolbar above to try this out!\n", - ":::" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "T36emVKN5u4f", - "outputId": "59faa045-366f-40e5-cb87-835710a24506", - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "import sys\n", - "\n", - "if 'google.colab' in sys.modules:\n", - " !pip install git+https://github.com/valence-labs/mess.git\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "id": "SO_reL0J5u4f", - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "import jax\n", - "import jax.numpy as jnp\n", - "import numpy as np\n", - "import optax\n", - "import seaborn as sns\n", - "from tqdm.notebook import tqdm\n", - "\n", - "from mess import Hamiltonian, basisset\n", - "from mess.structure import Structure, nuclear_energy\n", - "\n", - "sns.set_theme(style=\"whitegrid\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "id": "DW8PTjUV5u4g" - }, - "outputs": [], - "source": [ - "def h2_hamiltonian(r: float, basis_name: str = \"sto-3g\", xc_method=\"lda\"):\n", - " mol = Structure(\n", - " atomic_number=np.array([1, 1]),\n", - " position=np.array([[0.0, 0.0, 0.0], [r, 0.0, 0.0]]),\n", - " )\n", - " basis = basisset(mol, basis_name=basis_name)\n", - " return Hamiltonian(basis, xc_method=xc_method)\n", - "\n", - "\n", - "num_confs = 64\n", - "rs = np.linspace(0.6, 10, num_confs)\n", - "H = [h2_hamiltonian(r) for r in rs]\n", - "num_orbitals = H[0].basis.num_orbitals\n", - "H = jax.tree.map(lambda *xs: jnp.stack(xs), *H)" - ] + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "heJBXjlM5u4d" + }, + "source": [ + "# Batching\n", + "\n", + "Training neural networks over batches of data is an essential component of efficiently\n", + "utilising massively parallel hardware accelerators. We can recast a standard electronic\n", + "minimisation problem as a batched one by using the JAX vectorising map\n", + "[aka jax.vmap](https://jax.readthedocs.io/en/latest/_autosummary/jax.vmap.html#jax-vmap).\n", + "By doing this we can parallelise the electronic structure optimisation over multiple\n", + "conformations of the same molecule. Just like in training neural networks, this will\n", + "allow for more efficient utilisation of the accelerator which unlocks\n", + "exploring the\n", + "[potential energy surfaces](https://en.wikipedia.org/wiki/Potential_energy_surface)\n", + "using quantum-mechanical simulations.\n", + "\n", + "We demonstrate this idea by calculating the molecular Hydrogen dissociation curve using\n", + "a batch of hydrogen molecules where the bond length (H-H distance) is varied. To setup\n", + "the batch we build a `Hamiltonian` for each bond length and stack the built modules to\n", + "create a batched-Hamiltonian. This example uses the `sto-3g` basis set and the simple\n", + "local density approximation of density functional theory but this batching formulation isn't\n", + "limited to these choices for how the Hamiltonian is represented.\n", + "\n", + ":::{note}\n", + "The following code cell will install MESS into the Google Colab runtime.\n", + "Select the 🚀 in the toolbar above to try this out!\n", + ":::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, - { - "cell_type": "markdown", - "metadata": { - "id": "PCJU9aUZ5u4g" - }, - "source": [ - "Next is where the magic happens using the vectorising transformation from JAX. \n", - "The `energy` function evaluates the energy of a single `Hamiltonian` for the unconstrained\n", - "trial matrix $Z$. The `@jax.vmap` converts this simple function to work on the batched\n", - "Hamiltonian we constructed earlier. For an extra performance boost we use the\n", - "[jax.jit](https://jax.readthedocs.io/en/latest/_autosummary/jax.jit.html#jax-jit)\n", - "function transformation to compile this function." - ] + "id": "T36emVKN5u4f", + "outputId": "59faa045-366f-40e5-cb87-835710a24506", + "tags": [ + "hide-cell" + ] + }, + "outputs": [], + "source": [ + "import sys\n", + "\n", + "if \"google.colab\" in sys.modules:\n", + " !pip install git+https://github.com/valence-labs/mess.git" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "SO_reL0J5u4f", + "tags": [ + "hide-cell" + ] + }, + "outputs": [], + "source": [ + "import jax\n", + "import jax.numpy as jnp\n", + "import numpy as np\n", + "import optax\n", + "import seaborn as sns\n", + "from tqdm.notebook import tqdm\n", + "\n", + "from mess import Hamiltonian, basisset\n", + "from mess.structure import Structure, nuclear_energy\n", + "\n", + "sns.set_theme(style=\"whitegrid\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "DW8PTjUV5u4g" + }, + "outputs": [], + "source": [ + "def h2_hamiltonian(r: float, basis_name: str = \"sto-3g\", xc_method=\"lda\"):\n", + " mol = Structure(\n", + " atomic_number=np.array([1, 1]),\n", + " position=np.array([[0.0, 0.0, 0.0], [r, 0.0, 0.0]]),\n", + " )\n", + " basis = basisset(mol, basis_name=basis_name)\n", + " return Hamiltonian(basis, xc_method=xc_method)\n", + "\n", + "\n", + "num_confs = 64\n", + "rs = np.linspace(0.6, 10, num_confs)\n", + "H = [h2_hamiltonian(r) for r in rs]\n", + "num_orbitals = H[0].basis.num_orbitals\n", + "H = jax.tree.map(lambda *xs: jnp.stack(xs), *H)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PCJU9aUZ5u4g" + }, + "source": [ + "Next is where the magic happens using the vectorising transformation from JAX. \n", + "The `energy` function evaluates the energy of a single `Hamiltonian` for the unconstrained\n", + "trial matrix $Z$. The `@jax.vmap` converts this simple function to work on the batched\n", + "Hamiltonian we constructed earlier. For an extra performance boost we use the\n", + "[jax.jit](https://jax.readthedocs.io/en/latest/_autosummary/jax.jit.html#jax-jit)\n", + "function transformation to compile this function." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "fathV1mX5u4g" + }, + "outputs": [], + "source": [ + "@jax.jit\n", + "@jax.vmap\n", + "def energy(Z, H):\n", + " C = H.orthonormalise(Z)\n", + " P = H.basis.density_matrix(C)\n", + " return H(P)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bBR3UoGl5u4h" + }, + "source": [ + "Next we setup an initial guess and a gradient descent optimiser\n", + "([adam](https://optax.readthedocs.io/en/latest/api/optimizers.html#optax.adam) from the optax library)\n", + "that will solve the batched energy minimisation problem.\n", + "\n", + "The initial guess is somewhat arbitrary and there are certainly better methods that one\n", + "could use for initialisation." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "IYxZ_pSW5u4h" + }, + "outputs": [], + "source": [ + "Z = jnp.tile(jnp.eye(num_orbitals), (num_confs, 1, 1))\n", + "optimiser = optax.adam(learning_rate=0.1)\n", + "state = optimiser.init(Z)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wlfrg3_E5u4h" + }, + "source": [ + "Finally we are ready to run the optimisation. We define a simple loss function that\n", + "simply takes the sum over the energy for each molecular conformation in the batch.\n", + "In simple terms, the optimisation will follow the gradient to make this sum as small as\n", + "possible. We use the transformation\n", + "[jax.value_and_grad](https://jax.readthedocs.io/en/latest/_autosummary/jax.value_and_grad.html)\n", + "as a function decorator on this loss function to evaluate the loss and the corresponding\n", + "gradient. Note that the gradient is computed using automatic differentiation." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "5ababf5717a549dc863348050f74c1f6", + "b5338eaae29d4e1aadbc9a9134ad68d4", + "54407ee1c19b42f6b657a9efa3cb4865", + "7b1d2cd1741849d3a893adb1daa2dda3", + "5751062bfa9e412488c6737d0bb8f0af", + "e850c38a03494ae0adb59cf9b46ce032", + "dd786da37bf644eda8fed98a45eb542d", + "ae081d5f46e24d2399b3605d49395a4e", + "f4b476b1a61d47a3b522dcbfeef40d71", + "872620e1c557417da9ae41c71c4ac591", + "60b9c5965cba421e931e9e6398600c3c" + ] }, + "id": "gHrwOzIk5u4h", + "outputId": "4632c7b9-f141-455d-ba70-eeefd9d2795b" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "id": "fathV1mX5u4g" + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5ababf5717a549dc863348050f74c1f6", + "version_major": 2, + "version_minor": 0 }, - "outputs": [], - "source": [ - "@jax.jit\n", - "@jax.vmap\n", - "def energy(Z, H):\n", - " C = H.orthonormalise(Z)\n", - " P = H.basis.density_matrix(C)\n", - " return H(P)" + "text/plain": [ + " 0%| | 0/128 [00:00" ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "history = jnp.stack(history)\n", + "ax = sns.lineplot(history)\n", + "ax.set_xlabel(\"Iteration\")\n", + "ax.set_ylabel(\"Batched Loss (Hartree)\");" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fR9Wupzf5u4i" + }, + "source": [ + "The loss is decreasing so looks good!\n", + "\n", + "Finally we can evaluate the total energy by once again using our now good friend the\n", + "vectorising map to compute the `nuclear_energy` for each conformation. This is added\n", + "to the electronic energy we minimised above. Finally we can plot the dissociation\n", + "curve which looks like something you can find in your nearest chemistry textbook." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 462 }, + "id": "z5iXpTTI5u4i", + "outputId": "16d150cd-69dd-40f1-bde4-2c1490ab33ef" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "id": "IYxZ_pSW5u4h" - }, - "outputs": [], - "source": [ - "Z = jnp.tile(jnp.eye(num_orbitals), (num_confs, 1, 1))\n", - "optimiser = optax.adam(learning_rate=0.1)\n", - "state = optimiser.init(Z)" + "data": { + "image/png": "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Q1QjscsgIiKqVbx7joiIiMgKDE1EREREVmBoIiIiIrICQxMRERGRFRiaiIiIiKzA0ERERERkBYYmIiIiIiswNBERERFZgaGJiIiIyAoMTURERERWYGgiIiIisgJDExEREZEVGJqIiIiIrCARBEEQu4j64tSpUxAEAQqFQuxS6i1BEKDX6yGXyyGRSMQux+Ww/cXF9hcX219cjmx/nU4HiUSCLl26PPA6N7u+q4vj/0SOJ5FIGEpFxPYXF9tfXGx/cTmy/SUSiVWf4expIiIiIrIC5zQRERERWYGhiYiIiMgKDE1EREREVmBoIiIiIrICQxMRERGRFRiaiIiIiKzA0ERERERkBYYmIiIiIiswNBERERFZgaGJiIiIyAoMTURERERWYGgiIiIisgJDEzmFnTt34sUXX0S/fv3QqVMnjB49Gps3bwb3m659JSUl6NevH6Kjo3Hu3Dmxy3EpP/zwA8aMGYP27dujR48emDZtGjQajdhl1Xt79+5FXFwcOnfujD59+uDll19GRkaG2GXVS+np6XjrrbcwevRoxMTEYNSoUZVet2nTJgwdOhTt27fHY489hv3799dKfQxN5BS++eYbeHh4YN68eVi5ciX69euHN998E59//rnYpbmcL774AkajUewyXM7KlSvx3nvvYcSIEfjqq6/w7rvvIjQ0lL8XDpaQkICZM2ciKioKn3/+ORYsWICkpCQ899xzDKwOcOXKFfz2229o3rw5IiMjK73ml19+wZtvvonhw4dj9erV6NSpE2bOnIkzZ844vkCByAnk5eVVOLZw4UKhS5cugtFoFKEi15ScnCx06tRJWL9+vdCqVSvhzz//FLskl5CSkiLExMQIBw4cELsUl/Pmm28KgwYNEkwmk+XY0aNHhVatWgknTpwQsbL66d6/z//5z38KI0eOrHDNkCFDhDlz5pQ79uSTTwrTpk1zeH3saSKnEBgYWOFYmzZtUFxcjNLSUhEqck2LFi3ChAkT0KJFC7FLcSlbt25FaGgo+vfvL3YpLsdgMMDLywsSicRyzMfHBwA4PcABpNIHx5KMjAykpaVh+PDh5Y6PGDECR48ehU6nc2R5HJ4j5/XHH38gKCgI3t7eYpfiEuLj43H58mW89NJLYpfics6ePYtWrVrhiy++QK9evdCuXTtMmDABZ8+eFbu0em/cuHFISUnBd999B5VKhYyM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", + "text/plain": [ + "
" ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "E_n = jax.vmap(nuclear_energy)(H.basis.structure)\n", + "E_total = energy(Z, H) + E_n\n", + "\n", + "ax = sns.lineplot(x=rs, y=E_total)\n", + "ax.set_xlabel(\"$H_2$ bond length (a.u.)\")\n", + "ax.set_ylabel(\"Total Energy (Hartree)\");" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "A100", + "machine_shape": "hm", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.10.13" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "54407ee1c19b42f6b657a9efa3cb4865": { + "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_ae081d5f46e24d2399b3605d49395a4e", + "max": 128, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f4b476b1a61d47a3b522dcbfeef40d71", + "value": 128 + } }, - { - "cell_type": "markdown", - "metadata": { - "id": "wlfrg3_E5u4h" - }, - "source": [ - "Finally we are ready to run the optimisation. We define a simple loss function that\n", - "simply takes the sum over the energy for each molecular conformation in the batch.\n", - "In simple terms, the optimisation will follow the gradient to make this sum as small as\n", - "possible. We use the transformation\n", - "[jax.value_and_grad](https://jax.readthedocs.io/en/latest/_autosummary/jax.value_and_grad.html)\n", - "as a function decorator on this loss function to evaluate the loss and the corresponding\n", - "gradient. Note that the gradient is computed using automatic differentiation." - ] + "5751062bfa9e412488c6737d0bb8f0af": { + "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 + } }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 49, - "referenced_widgets": [ - "5ababf5717a549dc863348050f74c1f6", - "b5338eaae29d4e1aadbc9a9134ad68d4", - "54407ee1c19b42f6b657a9efa3cb4865", - "7b1d2cd1741849d3a893adb1daa2dda3", - "5751062bfa9e412488c6737d0bb8f0af", - "e850c38a03494ae0adb59cf9b46ce032", - "dd786da37bf644eda8fed98a45eb542d", - "ae081d5f46e24d2399b3605d49395a4e", - "f4b476b1a61d47a3b522dcbfeef40d71", - "872620e1c557417da9ae41c71c4ac591", - "60b9c5965cba421e931e9e6398600c3c" - ] - }, - "id": "gHrwOzIk5u4h", - "outputId": "4632c7b9-f141-455d-ba70-eeefd9d2795b" - }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "5ababf5717a549dc863348050f74c1f6", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0/128 [00:00" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "history = jnp.stack(history)\n", - "ax = sns.lineplot(history)\n", - "ax.set_xlabel(\"Iteration\")\n", - "ax.set_ylabel(\"Batched Loss (Hartree)\");" - ] + "7b1d2cd1741849d3a893adb1daa2dda3": { + "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_872620e1c557417da9ae41c71c4ac591", + "placeholder": "​", + "style": "IPY_MODEL_60b9c5965cba421e931e9e6398600c3c", + "value": " 128/128 [00:03<00:00, 76.15it/s]" + } }, - { - "cell_type": "markdown", - "metadata": { - "id": "fR9Wupzf5u4i" - }, - "source": [ - "The loss is decreasing so looks good!\n", - "\n", - "Finally we can evaluate the total energy by once again using our now good friend the\n", - "vectorising map to compute the `nuclear_energy` for each conformation. This is added\n", - "to the electronic energy we minimised above. Finally we can plot the dissociation\n", - "curve which looks like something you can find in your nearest chemistry textbook." - ] + "872620e1c557417da9ae41c71c4ac591": { + "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 + } }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 462 - }, - "id": "z5iXpTTI5u4i", - "outputId": "16d150cd-69dd-40f1-bde4-2c1490ab33ef" - }, - "outputs": [ - { - "data": { - "image/png": "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Q1QjscsgIiKqVbx7joiIiMgKDE1EREREVmBoIiIiIrICQxMRERGRFRiaiIiIiKzA0ERERERkBYYmIiIiIiswNBERERFZgaGJiIiIyAoMTURERERWYGgiIiIisgJDExEREZEVGJqIiIiIrCARBEEQu4j64tSpUxAEAQqFQuxS6i1BEKDX6yGXyyGRSMQux+Ww/cXF9hcX219cjmx/nU4HiUSCLl26PPA6N7u+q4vj/0SOJ5FIGEpFxPYXF9tfXGx/cTmy/SUSiVWf4expIiIiIrIC5zQRERERWYGhiYiIiMgKDE1EREREVmBoIiIiIrICQxMRERGRFRiaiIiIiKzA0ERERERkBYYmIiIiIiswNBERERFZgaGJiIiIyAoMTURERERWYGgiIiIisgJDEzmFnTt34sUXX0S/fv3QqVMnjB49Gps3bwb3m659JSUl6NevH6Kjo3Hu3Dmxy3EpP/zwA8aMGYP27dujR48emDZtGjQajdhl1Xt79+5FXFwcOnfujD59+uDll19GRkaG2GXVS+np6XjrrbcwevRoxMTEYNSoUZVet2nTJgwdOhTt27fHY489hv3799dKfQxN5BS++eYbeHh4YN68eVi5ciX69euHN998E59//rnYpbmcL774AkajUewyXM7KlSvx3nvvYcSIEfjqq6/w7rvvIjQ0lL8XDpaQkICZM2ciKioKn3/+ORYsWICkpCQ899xzDKwOcOXKFfz2229o3rw5IiMjK73ml19+wZtvvonhw4dj9erV6NSpE2bOnIkzZ844vkCByAnk5eVVOLZw4UKhS5cugtFoFKEi15ScnCx06tRJWL9+vdCqVSvhzz//FLskl5CSkiLExMQIBw4cELsUl/Pmm28KgwYNEkwmk+XY0aNHhVatWgknTpwQsbL66d6/z//5z38KI0eOrHDNkCFDhDlz5pQ79uSTTwrTpk1zeH3saSKnEBgYWOFYmzZtUFxcjNLSUhEqck2LFi3ChAkT0KJFC7FLcSlbt25FaGgo+vfvL3YpLsdgMMDLywsSicRyzMfHBwA4PcABpNIHx5KMjAykpaVh+PDh5Y6PGDECR48ehU6nc2R5HJ4j5/XHH38gKCgI3t7eYpfiEuLj43H58mW89NJLYpfics6ePYtWrVrhiy++QK9evdCuXTtMmDABZ8+eFbu0em/cuHFISUnBd999B5VKhYyM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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "E_n = jax.vmap(nuclear_energy)(H.basis.structure)\n", - "E_total = energy(Z, H) + E_n\n", - "\n", - "ax = sns.lineplot(x=rs, y=E_total)\n", - "ax.set_xlabel(\"$H_2$ bond length (a.u.)\")\n", - "ax.set_ylabel(\"Total Energy (Hartree)\");" - ] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "gpuType": "A100", - "machine_shape": "hm", - "provenance": [] + "ae081d5f46e24d2399b3605d49395a4e": { + "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 + } }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" + "b5338eaae29d4e1aadbc9a9134ad68d4": { + "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_e850c38a03494ae0adb59cf9b46ce032", + "placeholder": "​", + "style": "IPY_MODEL_dd786da37bf644eda8fed98a45eb542d", + "value": "Loss -77.213536: 100%" + } }, - "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.10.13" + "dd786da37bf644eda8fed98a45eb542d": { + "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": "" + } }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "54407ee1c19b42f6b657a9efa3cb4865": { - "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_ae081d5f46e24d2399b3605d49395a4e", - "max": 128, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_f4b476b1a61d47a3b522dcbfeef40d71", - "value": 128 - } - }, - "5751062bfa9e412488c6737d0bb8f0af": { - "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 - } - }, - "5ababf5717a549dc863348050f74c1f6": { - "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_b5338eaae29d4e1aadbc9a9134ad68d4", - "IPY_MODEL_54407ee1c19b42f6b657a9efa3cb4865", - "IPY_MODEL_7b1d2cd1741849d3a893adb1daa2dda3" - ], - "layout": "IPY_MODEL_5751062bfa9e412488c6737d0bb8f0af" - } - }, - "60b9c5965cba421e931e9e6398600c3c": { - "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": "" - } - }, - "7b1d2cd1741849d3a893adb1daa2dda3": { - "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_872620e1c557417da9ae41c71c4ac591", - "placeholder": "​", - "style": "IPY_MODEL_60b9c5965cba421e931e9e6398600c3c", - "value": " 128/128 [00:03<00:00, 76.15it/s]" - } - }, - "872620e1c557417da9ae41c71c4ac591": { - "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 - } - }, - "ae081d5f46e24d2399b3605d49395a4e": { - "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 - } - }, - "b5338eaae29d4e1aadbc9a9134ad68d4": { - "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_e850c38a03494ae0adb59cf9b46ce032", - "placeholder": "​", - "style": "IPY_MODEL_dd786da37bf644eda8fed98a45eb542d", - "value": "Loss -77.213536: 100%" - } - }, - "dd786da37bf644eda8fed98a45eb542d": { - "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": "" - } - }, - "e850c38a03494ae0adb59cf9b46ce032": { - "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 - } - }, - "f4b476b1a61d47a3b522dcbfeef40d71": { - "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": "" - } - } - } + "e850c38a03494ae0adb59cf9b46ce032": { + "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 + } + }, + "f4b476b1a61d47a3b522dcbfeef40d71": { + "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": "" + } } - }, - "nbformat": 4, - "nbformat_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/docs/tour.ipynb b/docs/tour.ipynb index 70cd534..19510a7 100644 --- a/docs/tour.ipynb +++ b/docs/tour.ipynb @@ -41,9 +41,8 @@ "source": [ "import sys\n", "\n", - "if 'google.colab' in sys.modules:\n", - " !pip install git+https://github.com/valence-labs/mess.git\n", - "\n" + "if \"google.colab\" in sys.modules:\n", + " !pip install git+https://github.com/valence-labs/mess.git" ] }, { From c94787f4022aa49dde3d999690fb1a04db4cd331 Mon Sep 17 00:00:00 2001 From: Hatem Helal Date: Thu, 26 Sep 2024 13:56:41 +0100 Subject: [PATCH 2/3] set python version in GH action --- .github/workflows/pre-commit.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml index c42378b..554b3bf 100644 --- a/.github/workflows/pre-commit.yaml +++ b/.github/workflows/pre-commit.yaml @@ -11,4 +11,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: "pip" - uses: pre-commit/action@v3.0.1 From 8be95f7dbcd6005f40323aff6597e538d25a4116 Mon Sep 17 00:00:00 2001 From: Hatem Helal Date: Thu, 26 Sep 2024 14:07:15 +0100 Subject: [PATCH 3/3] install mess from pypi --- docs/batching.ipynb | 2 +- docs/optim.ipynb | 2 +- docs/tour.ipynb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/batching.ipynb b/docs/batching.ipynb index c74b34e..15aef1a 100644 --- a/docs/batching.ipynb +++ b/docs/batching.ipynb @@ -50,7 +50,7 @@ "import sys\n", "\n", "if \"google.colab\" in sys.modules:\n", - " !pip install git+https://github.com/valence-labs/mess.git" + " !pip install mess-jax" ] }, { diff --git a/docs/optim.ipynb b/docs/optim.ipynb index 7fa1453..34aa98d 100644 --- a/docs/optim.ipynb +++ b/docs/optim.ipynb @@ -54,7 +54,7 @@ "import sys\n", "\n", "if \"google.colab\" in sys.modules:\n", - " !pip install git+https://github.com/valence-labs/mess.git\n", + " !pip install mess-jax\n", "\n", "!pip install pyquante2@git+https://github.com/rpmuller/pyquante2@pure\" " ] diff --git a/docs/tour.ipynb b/docs/tour.ipynb index 19510a7..d72d53f 100644 --- a/docs/tour.ipynb +++ b/docs/tour.ipynb @@ -42,7 +42,7 @@ "import sys\n", "\n", "if \"google.colab\" in sys.modules:\n", - " !pip install git+https://github.com/valence-labs/mess.git" + " !pip install mess-jax" ] }, {