From 865cd712ac70fedc003f3aadd3da1d54d0c4c209 Mon Sep 17 00:00:00 2001 From: Logan Ward Date: Tue, 3 Oct 2023 10:04:23 -0400 Subject: [PATCH] Separate exact, sampling and approximation --- .../0_get-exact-answer.ipynb | 0 .../0_random-directions-same-distance.ipynb} | 61 +- ..._random-directions-variable-distance.ipynb | 322 ++++++++ .../1_explore-sampling-methods/README.md | 7 + .../0_fit-taylor-series.ipynb | 588 ++++++++++++++ .../1_fit-forcefield-using-mbtr.ipynb | 744 +++++++++++++++++ .../2_testing-fitting-strategies/README.md | 8 + notebooks/data/README.md | 3 + .../data/structures/README.md | 0 .../data/structures/caffeine.json | 0 .../data/structures/water.json | 0 .../2_approximate-hessians.ipynb | 591 -------------- .../3_approximate-hessians-with-mbtr.ipynb | 745 ------------------ 13 files changed, 1710 insertions(+), 1359 deletions(-) rename notebooks/{proof-of-concept => }/0_get-exact-answer.ipynb (100%) rename notebooks/{proof-of-concept/1_compute-random-offsets.ipynb => 1_explore-sampling-methods/0_random-directions-same-distance.ipynb} (81%) create mode 100644 notebooks/1_explore-sampling-methods/1_random-directions-variable-distance.ipynb create mode 100644 notebooks/1_explore-sampling-methods/README.md create mode 100644 notebooks/2_testing-fitting-strategies/0_fit-taylor-series.ipynb create mode 100644 notebooks/2_testing-fitting-strategies/1_fit-forcefield-using-mbtr.ipynb create mode 100644 notebooks/2_testing-fitting-strategies/README.md create mode 100644 notebooks/data/README.md rename notebooks/{proof-of-concept => }/data/structures/README.md (100%) rename notebooks/{proof-of-concept => }/data/structures/caffeine.json (100%) rename notebooks/{proof-of-concept => }/data/structures/water.json (100%) delete mode 100644 notebooks/proof-of-concept/2_approximate-hessians.ipynb delete mode 100644 notebooks/proof-of-concept/3_approximate-hessians-with-mbtr.ipynb diff --git a/notebooks/proof-of-concept/0_get-exact-answer.ipynb b/notebooks/0_get-exact-answer.ipynb similarity index 100% rename from notebooks/proof-of-concept/0_get-exact-answer.ipynb rename to notebooks/0_get-exact-answer.ipynb diff --git a/notebooks/proof-of-concept/1_compute-random-offsets.ipynb b/notebooks/1_explore-sampling-methods/0_random-directions-same-distance.ipynb similarity index 81% rename from notebooks/proof-of-concept/1_compute-random-offsets.ipynb rename to notebooks/1_explore-sampling-methods/0_random-directions-same-distance.ipynb index d6ac780..647ef5a 100644 --- a/notebooks/proof-of-concept/1_compute-random-offsets.ipynb +++ b/notebooks/1_explore-sampling-methods/0_random-directions-same-distance.ipynb @@ -18,8 +18,7 @@ }, "outputs": [], "source": [ - "from ase.calculators.mopac import MOPAC\n", - "from ase.calculators.psi4 import Psi4\n", + "from jitterbug.utils import make_calculator\n", "from ase.io import write, read\n", "from ase.db import connect\n", "from ase import Atoms\n", @@ -40,7 +39,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "c6be56c5-a460-4acd-9b89-8c3d9c812f5f", + "id": "52252ee2-315c-48bb-8cba-07620e6e2faa", "metadata": { "tags": [ "parameters" @@ -48,13 +47,9 @@ }, "outputs": [], "source": [ - "molecule_name = 'caffeine'\n", - "method = 'pm7'\n", - "mopac_methods = ['pm7'] # Use MOPAC for these methods\n", - "basis = None # Set to None for MOPAC methods\n", + "starting_geometry = '../data/exact/water_b3lyp_def2-svpd.xyz'\n", "threads = min(os.cpu_count(), 12)\n", - "step_size: float = 0.01 # Perturbation amount, used as maximum L2 norm\n", - "assert (method in mopac_methods) == (basis is None), 'Use a basis of None for MOPAC computations'" + "step_size: float = 0.005 # Perturbation amount, used as maximum L2 norm" ] }, { @@ -72,7 +67,8 @@ "metadata": {}, "outputs": [], "source": [ - "run_name = f'{molecule_name}_{method}_{basis}'" + "run_name = Path(starting_geometry).name[:-4]\n", + "name, method, basis = run_name.split(\"_\")" ] }, { @@ -95,7 +91,7 @@ { "data": { "text/plain": [ - "Atoms(symbols='O2N4C8H10', pbc=False, forces=..., calculator=SinglePointCalculator(...))" + "Atoms(symbols='OH2', pbc=False, forces=..., calculator=SinglePointCalculator(...))" ] }, "execution_count": 4, @@ -104,7 +100,7 @@ } ], "source": [ - "atoms = read(Path('data') / 'exact' / f'{run_name}.xyz')\n", + "atoms = read(starting_geometry)\n", "atoms" ] }, @@ -134,8 +130,8 @@ }, "outputs": [], "source": [ - "out_dir = Path('data') / 'approx'\n", - "out_dir.mkdir(exist_ok=True)" + "out_dir = Path('data') / 'random-dir-same-dist'\n", + "out_dir.mkdir(exist_ok=True, parents=True)" ] }, { @@ -147,7 +143,7 @@ }, "outputs": [], "source": [ - "db_path = out_dir / f'{run_name}-random-d={step_size:.2e}.db'" + "db_path = out_dir / f'{run_name}_d={step_size:.2e}.db'" ] }, { @@ -187,12 +183,17 @@ "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Threads set to 1 by Python driver.\n" + ] + } + ], "source": [ - "if method not in mopac_methods:\n", - " calc = Psi4(method=method, basis=basis, num_threads=threads, memory='4096MB')\n", - "else:\n", - " calc = MOPAC(method=method, command='mopac PREFIX.mop > /dev/null')" + "calc = make_calculator(method, basis, threads=threads)" ] }, { @@ -215,7 +216,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Need to run 2701 calculations for full accuracy.\n" + "Need to run 55 calculations for full accuracy.\n" ] } ], @@ -237,7 +238,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Already done 1. 2700 left to do.\n" + "Already done 1. 54 left to do.\n" ] } ], @@ -257,7 +258,21 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2701/2701 [03:10<00:00, 19.27it/s]" + " 0%| | 0/55 [00:00 1e-7).sum()} are nonzero')" + ] + }, + { + "cell_type": "markdown", + "id": "aa509659-701d-4001-8cc7-980c9d999976", + "metadata": {}, + "source": [ + "Compare the forces estimated at a zero displacement to the true value" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "70d80f87-9983-4bd5-a6ae-b9c966b0d838", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "actual_forces = data[0].get_forces()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f548b145-0aa8-47f7-802b-6b7232a74bd3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pred_forces = -hess_model.coef_[:actual_forces.size].reshape((-1, 3))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d7cd7762-6e12-4dcd-b564-67a33b18d9e0", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Maximum force: 3.88e+08 eV/Angstrom\n" + ] + } + ], + "source": [ + "print(f'Maximum force: {np.abs(pred_forces).max():.2e} eV/Angstrom')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "425b77a9-7fd7-40da-af6f-eaed197c9ab6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = plt.subplots(1, 2, figsize=(4, 2))\n", + "\n", + "for ax, l, h in zip(axs, ['Actual', 'Estimated'], [actual_forces, pred_forces]):\n", + " ax.matshow(h, vmin=-0.05, vmax=0.05, aspect='auto', cmap='RdBu')\n", + "\n", + " ax.set_xticklabels([])\n", + " ax.set_yticklabels([])\n", + " \n", + " ax.set_title(l, fontsize=10)\n", + "\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "46a0f2f8-f863-4de3-bd97-97ebd92676d4", + "metadata": {}, + "source": [ + "Get the mean Hessian" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "00a10907-667a-413c-851d-d47f0eff092b", + "metadata": {}, + "outputs": [], + "source": [ + "approx_hessian = model.mean_hessian(hess_model)" + ] + }, + { + "cell_type": "markdown", + "id": "f4de2e78-00c2-427f-b9bd-eb3ca881564b", + "metadata": {}, + "source": [ + "Compare to exact answer" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d48893fd-df0d-4fa8-bfbe-0d04b71fbf1a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1.42193910e+01, 2.19101005e+01, -2.39586674e-04],\n", + " [ 2.19101005e+01, 7.86328494e+01, -3.46912831e-05],\n", + " [-2.39586674e-04, -3.46912831e-05, 2.52655314e+00]])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "exact_hess[:3, :3]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "9b311dea-5744-4211-81cb-40aa1183301e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-9.51409195e+08, -1.07310180e+09, -4.31182646e+08],\n", + " [-1.07310180e+09, 9.04030821e+08, -4.53419942e+07],\n", + " [-4.31182646e+08, -4.53419942e+07, 1.25376691e+08]])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "approx_hessian[:3, :3]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "addd7bef-854a-4b9f-96e9-2aa01b652495", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = plt.subplots(1, 2, figsize=(4, 2))\n", + "\n", + "for ax, l, h in zip(axs, ['Exact', 'Approximate'], [exact_hess, approx_hessian]):\n", + " ax.matshow(h, vmin=-100, vmax=100, cmap='RdBu')\n", + "\n", + " ax.set_xticklabels([])\n", + " ax.set_yticklabels([])\n", + " \n", + " ax.set_title(l, fontsize=10)\n", + "\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "b516bb4e-d27d-4ad6-ad4b-b873c81670ff", + "metadata": {}, + "source": [ + "Get the zero point energy" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "abbbbfd6-7d17-4b93-880a-3352903b56c4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "approx_vibs = VibrationsData.from_2d(data[0], approx_hessian)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "fdd80af3-8c18-40d8-b971-4a473bc91498", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "11471.629752113282" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "approx_vibs.get_zero_point_energy()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "6b1af348-4bc9-4ced-9a12-44b3e49abe9c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4.746888516975277" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "exact_zpe" + ] + }, + { + "cell_type": "markdown", + "id": "ab6a6645-bf0e-4ed7-874e-6a345063e0b5", + "metadata": {}, + "source": [ + "The two differ, but I'm not sure how important the difference is." + ] + }, + { + "cell_type": "markdown", + "id": "6489882c-acaf-4a07-bbe9-d643f7c5c882", + "metadata": {}, + "source": [ + "## Plot as a Function of Data\n", + "See what happens as we add more data to the training" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "bce41a81-6c88-4b0c-9d8d-0891d1832fd6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Plotting at 16 steps: 5, 252, 499, 746, 993, ...\n" + ] + } + ], + "source": [ + "steps = np.linspace(5, len(data), 16, dtype=int)\n", + "print(f'Plotting at {len(steps)} steps: {\", \".join(map(str, steps[:5]))}, ...')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "fe39ce86-1806-4367-8c86-e3ef58f81f84", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 16/16 [00:20<00:00, 1.28s/it]\n" + ] + } + ], + "source": [ + "zpes = []\n", + "for count in tqdm(steps):\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " hess_model = model.train(data[:count])\n", + " \n", + " approx_hessian = model.mean_hessian(hess_model)\n", + " approx_vibs = VibrationsData.from_2d(data[0], approx_hessian)\n", + " zpes.append(approx_vibs.get_zero_point_energy())" + ] + }, + { + "cell_type": "markdown", + "id": "c179c3ae-695f-44ad-b548-10002c4ff30b", + "metadata": {}, + "source": [ + "Plot it" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "1c6706a9-a27f-448f-81d4-957939bb2ca8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(3.5, 2))\n", + "\n", + "ax.plot(steps, zpes)\n", + "\n", + "ax.set_xlim([0, steps.max()])\n", + "ax.plot(ax.get_xlim(), [exact_zpe]*2, 'k--')\n", + "\n", + "ax.set_xlabel('Energies')\n", + "ax.set_ylabel('ZPE (eV)')\n", + "\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "e8788f74-c208-4939-aa9b-3bbdfd8310ee", + "metadata": {}, + "source": [ + "We consistently underestimate the ZPE. Is it because we have too few oscillators?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "384af4b3-5eb3-4eac-b176-160f19944853", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/2_testing-fitting-strategies/1_fit-forcefield-using-mbtr.ipynb b/notebooks/2_testing-fitting-strategies/1_fit-forcefield-using-mbtr.ipynb new file mode 100644 index 0000000..30793bc --- /dev/null +++ b/notebooks/2_testing-fitting-strategies/1_fit-forcefield-using-mbtr.ipynb @@ -0,0 +1,744 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "201346ec-3f5a-4235-b8ef-4a0051373865", + "metadata": {}, + "source": [ + "# Generate Approximate Hessians\n", + "Like the previous notebook, fit an approximate model and use that to compute the Hessian. Instead of treating the Hessian parameters as separate, we try here to fit a forcefield using the data." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ebbbc7f5-3007-420f-861a-9f65f84436be", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "from matplotlib import pyplot as plt\n", + "from jitterbug.model.mbtr import MBTREnergyModel, MBTRCalculator\n", + "from sklearn.model_selection import GridSearchCV\n", + "from sklearn.kernel_ridge import KernelRidge\n", + "from dscribe.descriptors import MBTR\n", + "from ase.vibrations import VibrationsData\n", + "from ase.db import connect\n", + "from pathlib import Path\n", + "from tqdm import tqdm\n", + "import numpy as np\n", + "import warnings" + ] + }, + { + "cell_type": "markdown", + "id": "85a147c1-2758-465b-bc54-dc373d73a0f3", + "metadata": {}, + "source": [ + "Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "99bd4c92-9a7b-4e88-ac45-dbf30fbfc9e0", + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "db_path = '../1_explore-sampling-methods/data/random-dir-variable-dist/water_b3lyp_def2-svpd_d=5.00e-03.db'" + ] + }, + { + "cell_type": "markdown", + "id": "8505d400-8427-45b9-b626-3f9ca557d0c8", + "metadata": {}, + "source": [ + "Derived" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a8be3c37-bf1f-4ba4-ba8f-afff6d6bed7d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "run_name, sampling_options = Path(db_path).name[:-3].rsplit(\"_\", 1)\n", + "exact_path = Path('../data/exact/') / f'{run_name}-ase.json'\n", + "sampling_name = Path(db_path).parent.name\n", + "out_name = '_'.join([run_name, sampling_name, sampling_options])" + ] + }, + { + "cell_type": "markdown", + "id": "de1f6aac-b93e-45a7-98e6-ffd5205916a6", + "metadata": {}, + "source": [ + "## Read in the Data\n", + "Get all computations for the desired calculation and the exact solution" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "797b96d8-050c-4bdf-9815-586cfb5bc311", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loaded 55 structures\n" + ] + } + ], + "source": [ + "with connect(db_path) as db:\n", + " data = [a.toatoms() for a in db.select('')]\n", + "print(f'Loaded {len(data)} structures')" + ] + }, + { + "cell_type": "markdown", + "id": "cb1a8e03-b045-49a4-95fd-61636a48fbad", + "metadata": {}, + "source": [ + "Read in the exact Hessian" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7389208d-9323-492c-8fc5-d05a372206c6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "with open(exact_path) as fp:\n", + " exact_vibs = VibrationsData.read(fp)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a9965595-532c-4067-ba24-7620bd977007", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "exact_hess = exact_vibs.get_hessian_2d()\n", + "exact_zpe = exact_vibs.get_zero_point_energy()" + ] + }, + { + "cell_type": "markdown", + "id": "04c60da8-4a1d-4ae3-b45d-b77e71fd598f", + "metadata": {}, + "source": [ + "## Fit a Hessian with All Data\n", + "Fit a model which explains the energy data by fitting a Hessian matrix using compressed sensing (i.e., Lasso)." + ] + }, + { + "cell_type": "markdown", + "id": "fe72ad76-2772-4094-a9b7-065be9a356d4", + "metadata": {}, + "source": [ + "Make the MBTR calculator using half the available data" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5a5b4a37-bd58-4855-bc3e-85d4258a25c8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 18.3 s, sys: 444 ms, total: 18.8 s\n", + "Wall time: 1.59 s\n" + ] + } + ], + "source": [ + "%%time\n", + "mbtr = MBTRCalculator(\n", + " model=GridSearchCV(\n", + " KernelRidge(kernel='rbf', alpha=1e-6), {\n", + " 'alpha': np.logspace(-10, -7, 8),\n", + " 'gamma': np.logspace(-5, 5, 32)\n", + " }),\n", + " descriptor=MBTR(\n", + " species=[\"H\", \"C\", \"N\", \"O\"],\n", + " geometry={\"function\": \"distance\"},\n", + " grid={\"min\": 0, \"max\": 6, \"n\": 64, \"sigma\": 0.05},\n", + " weighting={\"function\": \"exp\", \"scale\": 0.1, \"threshold\": 1e-3},\n", + " periodic=False,\n", + " )\n", + ")\n", + "with warnings.catch_warnings():\n", + " warnings.simplefilter('ignore')\n", + " mbtr.train(data[:len(data) // 2])" + ] + }, + { + "cell_type": "markdown", + "id": "503240dd-b52c-4111-a024-ec44766940e5", + "metadata": {}, + "source": [ + "Plot the model performance" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c0038a85-5a70-4a4e-b830-c3c54e5a8efc", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pred_energy= [mbtr.get_potential_energy(x) * 1000 for x in data[len(data) // 2:]]\n", + "true_energy = [x.get_potential_energy() * 1000 for x in data[len(data) // 2:]]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "fba09717-7b2b-40a7-a6d3-543c40080d02", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, '$E-E_0$, True (meV)')" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(3.5, 3.5))\n", + "\n", + "base_energy = data[0].get_potential_energy() * 1000 # in meV\n", + "ax.scatter(np.subtract(pred_energy, base_energy), np.subtract(true_energy, base_energy), s=2)\n", + "\n", + "ax.set_xlim(ax.get_ylim())\n", + "ax.set_ylim(ax.get_ylim())\n", + "ax.plot(ax.get_xlim(), ax.get_xlim(), 'k--')\n", + "\n", + "ax.set_xlabel('$E-E_0$, ML (meV)')\n", + "ax.set_ylabel('$E-E_0$, True (meV)')" + ] + }, + { + "cell_type": "markdown", + "id": "71e8e883-2c4b-4929-a000-297233dabe96", + "metadata": {}, + "source": [ + "Build the ASE-compatible calculator" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "d6a7d756-37d3-44e0-b5e2-348d07c9d296", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "model = MBTREnergyModel(reference=data[0], calc=mbtr)\n", + "with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " hess_model = model.train(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "372a4089-88cb-47ae-a917-190bc26287ff", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'alpha': 1e-10, 'gamma': 0.03534981105030106}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hess_model.parameters['model'].best_params_" + ] + }, + { + "cell_type": "markdown", + "id": "aa509659-701d-4001-8cc7-980c9d999976", + "metadata": {}, + "source": [ + "Compare the forces estimated at a zero displacement to the true value" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "70d80f87-9983-4bd5-a6ae-b9c966b0d838", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "actual_forces = data[0].get_forces()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "f548b145-0aa8-47f7-802b-6b7232a74bd3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pred_forces = hess_model.get_forces(data[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d7cd7762-6e12-4dcd-b564-67a33b18d9e0", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Maximum force: 1.46e-03 eV/Angstrom\n" + ] + } + ], + "source": [ + "print(f'Maximum force: {np.abs(pred_forces).max():.2e} eV/Angstrom')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "425b77a9-7fd7-40da-af6f-eaed197c9ab6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = plt.subplots(1, 2, figsize=(4, 2))\n", + "\n", + "for ax, l, h in zip(axs, ['Actual', 'Estimated'], [actual_forces, pred_forces]):\n", + " ax.matshow(h, vmin=-0.05, vmax=0.05, aspect='auto', cmap='RdBu')\n", + "\n", + " ax.set_xticklabels([])\n", + " ax.set_yticklabels([])\n", + " \n", + " ax.set_title(l, fontsize=10)\n", + "\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "46a0f2f8-f863-4de3-bd97-97ebd92676d4", + "metadata": {}, + "source": [ + "Get the mean Hessian" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "00a10907-667a-413c-851d-d47f0eff092b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 204 ms, sys: 3 µs, total: 204 ms\n", + "Wall time: 203 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "approx_hessian = model.mean_hessian(hess_model)" + ] + }, + { + "cell_type": "markdown", + "id": "f4de2e78-00c2-427f-b9bd-eb3ca881564b", + "metadata": {}, + "source": [ + "Compare to exact answer" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d48893fd-df0d-4fa8-bfbe-0d04b71fbf1a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 6.69634496e+01, -6.52252610e-03, 1.55513525e-08],\n", + " [-6.52252610e-03, 4.33040064e+01, 1.54795588e-06],\n", + " [ 1.55513525e-08, 1.54795588e-06, 5.49449873e-03]])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "exact_hess[:3, :3]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "9b311dea-5744-4211-81cb-40aa1183301e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 6.69440158e+01, -6.20564720e-03, 0.00000000e+00],\n", + " [-6.20564720e-03, 4.27768994e+01, 0.00000000e+00],\n", + " [ 0.00000000e+00, 0.00000000e+00, 4.91597802e-03]])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "approx_hessian[:3, :3]" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "addd7bef-854a-4b9f-96e9-2aa01b652495", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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39PUZ86dvmXLFjl58qTExMRIZWWldO7c+aL9OvekrM/ni5jW2HbjTtLnn38uTz75pBQUFMiQIUMkGAzKq6++KuvXr7/o9zQ0NMiAAQNk8eLF5733z19g0YLLHV20a9cuefLJJ+W9996TwYMHy9SpU62CO3LkiJSVlckLL7wgt956q+Tk5Jy3seXm5kppaakcPXq0yfbj4+PlzJkzLb4ciD719fXy8ccfS0FBgZSWllqvLVu2SEZGRkRgFRcXW38/duyYlJeXS8+ePSPaKikpsf69fft2OX78eMQ85+rVq5fs379fKioqrGl//PGHhEIhycnJEZGzOzv5+fny/PPPy/Tp02Xy5Mny999/u7L8jdauXStDhw6Vxx57TPr37y9ZWVnn7XE3tR3ddNNNsmPHDrnmmmskKysr4hWNV+sQ7JcpHA5LZWVlxKuqqkrOnDkjU6ZMkdtvv12mT58uhYWFsm3bNikoKBARkQ4dOkjHjh3l3XfflZ07d8oPP/wgTz31VETb999/v3Tq1Enuuece+eWXX2T37t2ydOlSWbdunYiIZGZmyp49e6S0tFSqqqokHA63+vLDm1auXCnHjh2Thx56SPr06RPxuvfee2XRokXWvC+//LJ8//33sm3bNsnPz5e0tLSI67rj4uJk5syZsn79etm0aZNMnz5dBg8ebB2GacqoUaMkNzdXJk+eLJs2bZINGzbI1KlTZcSIEdZhnUcffVTS09PlhRdekNdff11UVZ555hlX10NWVpaUlJTIqlWrpLy8XObMmSO//vprxDyZmZmydetW2b59u1RVVUldXZ1MnjxZ0tLSZPz48bJ27VrZs2eP/PjjjzJr1iw5cOCAq31sFW17iD+6TJs27bxLpUREe/TooS+99JJed911WlVVZc3/5Zdfanx8vG7evFlVVb/77jvNyclRv9+vubm5umbNGhURXb58ufWZvXv36oQJEzQpKUkTExM1Ly/POml1+vRpnTBhgqakpHC5IyKMHTtW77rrribf27hxo4qIFhQUqIjoihUrtHfv3hofH68DBw7U0tJSa97Gyx2XLl2q3bp10/j4eL3lllt079691jwXOol/scsdP/roIw0EAlpeXm7NX1JSovHx8frVV1+patMnT2fNmhXxHRkZGRFX0qhqxDZ0+vRpzc/P1+TkZE1JSdEZM2boc889F9Hfw4cP6223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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = plt.subplots(1, 2, figsize=(4, 2))\n", + "\n", + "for ax, l, h in zip(axs, ['Exact', 'Approximate'], [exact_hess, approx_hessian]):\n", + " ax.matshow(h, vmin=-100, vmax=100, cmap='RdBu')\n", + "\n", + " ax.set_xticklabels([])\n", + " ax.set_yticklabels([])\n", + " \n", + " ax.set_title(l, fontsize=10)\n", + "\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "b516bb4e-d27d-4ad6-ad4b-b873c81670ff", + "metadata": {}, + "source": [ + "Get the zero point energy" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "abbbbfd6-7d17-4b93-880a-3352903b56c4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "approx_vibs = VibrationsData.from_2d(data[0], approx_hessian)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "fdd80af3-8c18-40d8-b971-4a473bc91498", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.5785552396972465" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "approx_vibs.get_zero_point_energy()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "6b1af348-4bc9-4ced-9a12-44b3e49abe9c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.5812977845446157" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "exact_zpe" + ] + }, + { + "cell_type": "markdown", + "id": "ab6a6645-bf0e-4ed7-874e-6a345063e0b5", + "metadata": {}, + "source": [ + "The two differ, but I'm not sure how important the difference is." + ] + }, + { + "cell_type": "markdown", + "id": "29a44b3d-cd3e-44af-9bc2-3e0164b22a38", + "metadata": {}, + "source": [ + "Save it to disk" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "40fd3d44-df72-4b9d-b7b0-f09fabe74c0d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "out_dir = Path('data/mbtr')\n", + "out_dir.mkdir(exist_ok=True, parents=True)\n", + "with open(f'data/mbtr/{out_name}.json', 'w') as fp:\n", + " approx_vibs.write(fp)" + ] + }, + { + "cell_type": "markdown", + "id": "6489882c-acaf-4a07-bbe9-d643f7c5c882", + "metadata": {}, + "source": [ + "## Plot as a Function of Data\n", + "See what happens as we add more data to the training" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "bce41a81-6c88-4b0c-9d8d-0891d1832fd6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Plotting at 16 steps: 5, 8, 11, 15, 18, ...\n" + ] + } + ], + "source": [ + "steps = np.linspace(5, len(data), 16, dtype=int)\n", + "print(f'Plotting at {len(steps)} steps: {\", \".join(map(str, steps[:5]))}, ...')" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "fe39ce86-1806-4367-8c86-e3ef58f81f84", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 16/16 [00:34<00:00, 2.16s/it]\n" + ] + } + ], + "source": [ + "zpes = []\n", + "for count in tqdm(steps):\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " hess_model = model.train(data[:count])\n", + " \n", + " approx_hessian = model.mean_hessian(hess_model)\n", + " approx_vibs = VibrationsData.from_2d(data[0], approx_hessian)\n", + " zpes.append(approx_vibs.get_zero_point_energy())" + ] + }, + { + "cell_type": "markdown", + "id": "c179c3ae-695f-44ad-b548-10002c4ff30b", + "metadata": {}, + "source": [ + "Plot it" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "1c6706a9-a27f-448f-81d4-957939bb2ca8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(3.5, 2))\n", + "\n", + "ax.plot(steps, zpes)\n", + "\n", + "ax.set_xlim([0, steps.max()])\n", + "ax.plot(ax.get_xlim(), [exact_zpe]*2, 'k--')\n", + "\n", + "ax.set_xlabel('Energies')\n", + "ax.set_ylabel('ZPE (eV)')\n", + "\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "e8788f74-c208-4939-aa9b-3bbdfd8310ee", + "metadata": {}, + "source": [ + "We consistently underestimate the ZPE. Is it because we have too few oscillators?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "384af4b3-5eb3-4eac-b176-160f19944853", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/2_testing-fitting-strategies/README.md b/notebooks/2_testing-fitting-strategies/README.md new file mode 100644 index 0000000..b5e8ad6 --- /dev/null +++ b/notebooks/2_testing-fitting-strategies/README.md @@ -0,0 +1,8 @@ +# Exploring Fitting Strategies + +Explore strategies for constructing an approximate Hessian given the training data +produced from [one of our sampling strategies](../1_explore-sampling-methods/). +Each notebook writes data to a separate subdirectory with at least one ASE VibrationData +object in JSON format named after the molecule being studied, the accuracy level, +and the source of the sampling data. + diff --git a/notebooks/data/README.md b/notebooks/data/README.md new file mode 100644 index 0000000..30c396e --- /dev/null +++ b/notebooks/data/README.md @@ -0,0 +1,3 @@ +# Input Structures and Exact Answers + +The `structures` directory holds input geometries for molecules in PubChem's JSON format. diff --git a/notebooks/proof-of-concept/data/structures/README.md b/notebooks/data/structures/README.md similarity index 100% rename from notebooks/proof-of-concept/data/structures/README.md rename to notebooks/data/structures/README.md diff --git a/notebooks/proof-of-concept/data/structures/caffeine.json b/notebooks/data/structures/caffeine.json similarity index 100% rename from notebooks/proof-of-concept/data/structures/caffeine.json rename to notebooks/data/structures/caffeine.json diff --git a/notebooks/proof-of-concept/data/structures/water.json b/notebooks/data/structures/water.json similarity index 100% rename from notebooks/proof-of-concept/data/structures/water.json rename to notebooks/data/structures/water.json diff --git a/notebooks/proof-of-concept/2_approximate-hessians.ipynb b/notebooks/proof-of-concept/2_approximate-hessians.ipynb deleted file mode 100644 index 948b05e..0000000 --- a/notebooks/proof-of-concept/2_approximate-hessians.ipynb +++ /dev/null @@ -1,591 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "201346ec-3f5a-4235-b8ef-4a0051373865", - "metadata": {}, - "source": [ - "# Generate Approximate Hessians\n", - "Use the random displacement data to get the full Hessian matrix. We assume that many parameters of the Hessian matrix are zero, and therefore that we can fit the Hessian matrix with a reduced number of points using [sparse linear regression](https://scikit-learn.org/stable/modules/linear_model.html#lasso)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "ebbbc7f5-3007-420f-861a-9f65f84436be", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from matplotlib import pyplot as plt\n", - "from jitterbug.model.linear import HarmonicModel\n", - "from sklearn.linear_model import LinearRegression, ElasticNetCV\n", - "from ase.vibrations import VibrationsData\n", - "from ase.db import connect\n", - "from pathlib import Path\n", - "from tqdm import tqdm\n", - "import numpy as np\n", - "import warnings" - ] - }, - { - "cell_type": "markdown", - "id": "85a147c1-2758-465b-bc54-dc373d73a0f3", - "metadata": {}, - "source": [ - "Configuration" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "99bd4c92-9a7b-4e88-ac45-dbf30fbfc9e0", - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "molecule_name = 'caffeine'\n", - "method = 'pm7'\n", - "basis = None\n", - "step_size: float = 0.005 # Perturbation amount, used as maximum L2 norm\n", - "regressor = LinearRegression" - ] - }, - { - "cell_type": "markdown", - "id": "8505d400-8427-45b9-b626-3f9ca557d0c8", - "metadata": {}, - "source": [ - "Derived" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "a8be3c37-bf1f-4ba4-ba8f-afff6d6bed7d", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "run_name = f'{molecule_name}_{method}_{basis}'\n", - "out_dir = Path('data') / 'approx'\n", - "db_path = out_dir / f'{run_name}-random-d={step_size:.2e}.db'" - ] - }, - { - "cell_type": "markdown", - "id": "de1f6aac-b93e-45a7-98e6-ffd5205916a6", - "metadata": {}, - "source": [ - "## Read in the Data\n", - "Get all computations for the desired calculation and the exact solution" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "797b96d8-050c-4bdf-9815-586cfb5bc311", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loaded 751 structures\n" - ] - } - ], - "source": [ - "with connect(db_path) as db:\n", - " data = [a.toatoms() for a in db.select('')]\n", - "print(f'Loaded {len(data)} structures')" - ] - }, - { - "cell_type": "markdown", - "id": "cb1a8e03-b045-49a4-95fd-61636a48fbad", - "metadata": {}, - "source": [ - "Read in the exact Hessian" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "7389208d-9323-492c-8fc5-d05a372206c6", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "with open(f'data/exact/{run_name}-ase.json') as fp:\n", - " exact_vibs = VibrationsData.read(fp)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "a9965595-532c-4067-ba24-7620bd977007", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "exact_hess = exact_vibs.get_hessian_2d()\n", - "exact_zpe = exact_vibs.get_zero_point_energy()" - ] - }, - { - "cell_type": "markdown", - "id": "04c60da8-4a1d-4ae3-b45d-b77e71fd598f", - "metadata": {}, - "source": [ - "## Fit a Hessian with All Data\n", - "Fit a model which explains the energy data by fitting a Hessian matrix using compressed sensing (i.e., Lasso)." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "d6a7d756-37d3-44e0-b5e2-348d07c9d296", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "model = HarmonicModel(reference=data[0], regressor=regressor)\n", - "hess_model = model.train(data)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "35baa4a3-5e0e-4067-92ea-f29b3c080477", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Trained a model with 2700 terms. 2700 are nonzero\n" - ] - } - ], - "source": [ - "print(f'Trained a model with {len(hess_model.coef_)} terms. {(np.abs(hess_model.coef_) > 1e-7).sum()} are nonzero')" - ] - }, - { - "cell_type": "markdown", - "id": "aa509659-701d-4001-8cc7-980c9d999976", - "metadata": {}, - "source": [ - "Compare the forces estimated at a zero displacement to the true value" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "70d80f87-9983-4bd5-a6ae-b9c966b0d838", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "actual_forces = data[0].get_forces()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "f548b145-0aa8-47f7-802b-6b7232a74bd3", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "pred_forces = -hess_model.coef_[:actual_forces.size].reshape((-1, 3))" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "d7cd7762-6e12-4dcd-b564-67a33b18d9e0", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Maximum force: 5.57e+00 eV/Angstrom\n" - ] - } - ], - "source": [ - "print(f'Maximum force: {np.abs(pred_forces).max():.2e} eV/Angstrom')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "425b77a9-7fd7-40da-af6f-eaed197c9ab6", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, axs = plt.subplots(1, 2, figsize=(4, 2))\n", - "\n", - "for ax, l, h in zip(axs, ['Actual', 'Estimated'], [actual_forces, pred_forces]):\n", - " ax.matshow(h, vmin=-0.05, vmax=0.05, aspect='auto', cmap='RdBu')\n", - "\n", - " ax.set_xticklabels([])\n", - " ax.set_yticklabels([])\n", - " \n", - " ax.set_title(l, fontsize=10)\n", - "\n", - "fig.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "id": "46a0f2f8-f863-4de3-bd97-97ebd92676d4", - "metadata": {}, - "source": [ - "Get the mean Hessian" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "00a10907-667a-413c-851d-d47f0eff092b", - "metadata": {}, - "outputs": [], - "source": [ - "approx_hessian = model.mean_hessian(hess_model)" - ] - }, - { - "cell_type": "markdown", - "id": "f4de2e78-00c2-427f-b9bd-eb3ca881564b", - "metadata": {}, - "source": [ - "Compare to exact answer" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "d48893fd-df0d-4fa8-bfbe-0d04b71fbf1a", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1.96495560e+01, 2.28518485e+01, 1.08009177e-03],\n", - " [2.28518485e+01, 8.36964299e+01, 3.94902961e-03],\n", - " [1.08009177e-03, 3.94902961e-03, 4.15881408e+00]])" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "exact_hess[:3, :3]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "9b311dea-5744-4211-81cb-40aa1183301e", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[3.26945590e+01, 4.95882374e+00, 8.59920621e-03],\n", - " [4.95882374e+00, 3.93490213e+01, 6.10182117e-01],\n", - " [8.59920621e-03, 6.10182117e-01, 2.73150623e+01]])" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "approx_hessian[:3, :3]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "addd7bef-854a-4b9f-96e9-2aa01b652495", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAADJCAYAAAA3tRlxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABZXklEQVR4nO29e7RdVXk3/Ftr7cu55OTkTgiEROQaIAgCSipSBBRv6Peh0JZXCGpr9dUPbe1obbWgvqN839tibd/XYVERtTpGrUV9B1bKRUGx4SKXkCKRcE8ICSEh5JxczmXvPb8/5nzmeuaz5lp77XNOknN25m8MRjhrzzXXXGuvtfZvPvP3/J5IKaUQEBAQENA1iA/2AAICAgICphbhxR4QEBDQZQgv9oCAgIAuQ3ixBwQEBHQZwos9ICAgoMsQXuwBAQEBXYbwYg8ICAjoMoQXe0BAQECXIbzYAwICAroM4cUeEBAwLbB69Wq8973vPdjD6AqEF3sHWL16NaIoyvx30UUXHZDjX3vttXjd6153QI4VMHOxZs0aJElywO7LqcI//MM/4Fvf+tZ+P86h8ANSOdgDmGm46KKLcNNNNznb6vX6QRpNQEAW3/zmN/GJT3wC3/jGN7Bx40YcddRR+/V44+PjqFark+5ncHBwCkYTAABQAaVx5ZVXqve85z3ez+666y5VrVbVL3/5S7vt7/7u79T8+fPViy++qJRS6tZbb1W/8zu/owYHB9W8efPUO9/5TvXUU085/WzatElddtllau7cuaqvr0+9/vWvV/fdd5+66aabFADnv5tuuml/nWrADMXu3bvVwMCA+u1vf6suu+wy9fnPf95+dtdddykA6ic/+YlauXKlqtfr6qyzzlLr1q2zbW666SY1ODiofvSjH6ljjz1W1et1dcEFF6iNGzfaNtdcc4069dRT1Y033qhe85rXqCiKVKvVUs8//7y6+OKLVX9/vxoYGFDvf//71datW5VSSq1fv1719vaq733ve7afm2++WdXrdXt8+Xyde+656uMf/7i6+uqr1Zw5c9SiRYvUDTfcoHbv3q1Wr16tZs2apY4++mj105/+1O7TaDTUBz/4QbV8+XLV09OjjjvuOPXlL3/ZGbt8ju666y6llFIvvPCCuvTSS9WcOXPUvHnz1MUXX6yeffbZKfleDjTCi70DFL3YlVLqz/7sz9SyZcvUq6++qtauXavq9br64Q9/aD//t3/7N3XzzTerDRs2qEceeUS9+93vVqeccopqNptKKaWGh4fV0Ucfrc455xx1zz33qCeffFJ9//vfV2vWrFF79+5Vf/qnf6pOOukktWXLFrVlyxa1d+/e/X3KATMMN954ozrjjDOUUkrdcsstavny5arVaiml0hf7iSeeqG6//Xa1bt069a53vUstX75cjY2NKaX0i71araozzjhDrVmzRj344IPqrLPOUqtWrbLHuOaaa1R/f79629veph5++GH16KOPqlarpU477TT1pje9ST344IPqvvvuU6effro699xz7X5f+cpX1ODgoHruuefU5s2b1bx589Tf//3f2899L/aBgQH1xS9+UW3YsEF98YtfVHEcq7e//e3qa1/7mtqwYYP66Ec/qubPn6/27NmjlFJqbGxM/fVf/7V64IEH1DPPPKO++93vqr6+PvX9739fKaWfsUsvvVRddNFF9jkaHR1Ve/bsUccee6z64Ac/qNatW6cef/xx9Qd/8Afq+OOPV6Ojo/vjq9qvCC/2DnDllVeqJElUf3+/898XvvAFpZRSo6Oj6rTTTlOXXnqpOumkk9SHP/zhwv62bdumAKj/+q//UkopdcMNN6iBgQG1Y8cOb3tiSgEBeVi1apVlqOPj42rBggXqjjvuUEqlL/Z/+Zd/se137Nihent77YuPZob33XefbbN+/XoFQN1///1KKX0fVqtVtW3bNtvm9ttvV0mSOMz+N7/5jQKgHnjgAbvtne98pzrnnHPU+eefry688EL7o6OU/8X+pje9yf7daDRUf3+/+sAHPmC3bdmyRQFQ9957b+41+djHPqYuueSS3OMopX8Qjz/+eGc8o6Ojqre3V9122225fU9XhBh7hzjvvPPw1a9+1dk2b948AECtVsN3v/tdrFy5EsuWLcOXv/xlp93TTz+Nz33uc7jvvvuwfft2tFotAMDGjRtx8sknY+3atTjttNNsfwEBneCJJ57AAw88gB/+8IcAgEqlgssuuwzf/OY3ccEFF9h2Z599tv3/efPm4fjjj8f69evttkqlgjPOOMP+fcIJJ2DOnDlYv349zjrrLADAsmXLsHDhQttm/fr1WLp0KZYuXWq3rVixwu535plnAtDx/+OOOw5xHOOxxx5DFEWF57Ry5Ur7/0mSYP78+TjllFPstsMOOwwAsG3bNrvtn/7pn/CNb3wDzz//PPbt24exsbG2ooOHHnoITz31FAYGBpztIyMjePrppwv3nY4IL/YO0d/fj2OOOSb38zVr1gAAXnnlFbzyyivo7++3n7373e/G0qVL8fWvfx1LlixBq9XCySefjLGxMQBAb2/v/h18QFfjxhtvRKPRwBFHHGG3KaVQrVaxc+fOwn3lC9b3wuXb+H1Nx/HtI7c/+uij2LNnD+I4xtatW7FkyZLCcclF2SiKnG3UN5Gkf/3Xf8WnPvUpXH/99Tj77LMxMDCAv/3bv8X9999feJxWq4XXv/71+N73vpf5jP+AzRQEueMU4umnn8anPvUpfP3rX8cb3/hGXHHFFfaG27FjB9avX4/PfvazOP/883HiiSdmHraVK1di7dq1eOWVV7z912o1NJvN/X4eATMPjUYD3/nOd3D99ddj7dq19r9HH30Uy5Ytc15Y9913n/3/nTt3YsOGDTjhhBOcvh588EH79xNPPIFXX33VaSOxYsUKbNy4EZs2bbLbHn/8cezatQsnnngiAE12Vq9ejb/6q7/CVVddhcsvvxz79u2bkvMn3HPPPVi1ahU+9rGP4bTTTsMxxxyTYdy+5+j000/Hk08+iUWLFuGYY45x/puJap3wYu8Qo6Oj2Lp1q/Pf9u3b0Ww28YEPfABvfetbcdVVV+Gmm27CY489huuvvx4AMHfuXMyfPx9f+9rX8NRTT+HnP/85/uRP/sTp+/d///exePFivPe978V//ud/4plnnsHNN9+Me++9FwCwfPlyPPvss1i7di22b9+O0dHRA37+AdMTP/nJT7Bz50586EMfwsknn+z89773vQ833nijbfuFL3wBP/vZz/DYY49h9erVWLBggaPrrlar+MQnPoH7778fDz/8MK666iq88Y1vtGEYHy644AKsXLkSl19+OR5++GE88MADuOKKK3DuuefasM4f//EfY+nSpfjsZz+LL33pS1BK4dOf/vSUXodjjjkGDz74IG677TZs2LABn/vc5/DrX//aabN8+XKsW7cOTzzxBLZv347x8XFcfvnlWLBgAd7znvfgnnvuwbPPPotf/OIXuPrqq/HCCy9M6RgPCA5uiH9m4corr8xIpQCo448/Xn3+859Xhx9+uNq+fbtt/+Mf/1jVajX1yCOPKKWUuuOOO9SJJ56o6vW6Wrlypbr77rsVAPWj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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, axs = plt.subplots(1, 2, figsize=(4, 2))\n", - "\n", - "for ax, l, h in zip(axs, ['Exact', 'Approximate'], [exact_hess, approx_hessian]):\n", - " ax.matshow(h, vmin=-100, vmax=100, cmap='RdBu')\n", - "\n", - " ax.set_xticklabels([])\n", - " ax.set_yticklabels([])\n", - " \n", - " ax.set_title(l, fontsize=10)\n", - "\n", - "fig.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "id": "b516bb4e-d27d-4ad6-ad4b-b873c81670ff", - "metadata": {}, - "source": [ - "Get the zero point energy" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "abbbbfd6-7d17-4b93-880a-3352903b56c4", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "approx_vibs = VibrationsData.from_2d(data[0], approx_hessian)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "fdd80af3-8c18-40d8-b971-4a473bc91498", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "7.268532902551082" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "approx_vibs.get_zero_point_energy()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "6b1af348-4bc9-4ced-9a12-44b3e49abe9c", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5.5067174465850215" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "exact_zpe" - ] - }, - { - "cell_type": "markdown", - "id": "ab6a6645-bf0e-4ed7-874e-6a345063e0b5", - "metadata": {}, - "source": [ - "The two differ, but I'm not sure how important the difference is." - ] - }, - { - "cell_type": "markdown", - "id": "6489882c-acaf-4a07-bbe9-d643f7c5c882", - "metadata": {}, - "source": [ - "## Plot as a Function of Data\n", - "See what happens as we add more data to the training" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "bce41a81-6c88-4b0c-9d8d-0891d1832fd6", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Plotting at 16 steps: 5, 54, 104, 154, 203, ...\n" - ] - } - ], - "source": [ - "steps = np.linspace(5, len(data), 16, dtype=int)\n", - "print(f'Plotting at {len(steps)} steps: {\", \".join(map(str, steps[:5]))}, ...')" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "fe39ce86-1806-4367-8c86-e3ef58f81f84", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 16/16 [00:04<00:00, 3.98it/s]\n" - ] - } - ], - "source": [ - "zpes = []\n", - "for count in tqdm(steps):\n", - " with warnings.catch_warnings():\n", - " warnings.simplefilter(\"ignore\")\n", - " hess_model = model.train(data[:count])\n", - " \n", - " approx_hessian = model.mean_hessian(hess_model)\n", - " approx_vibs = VibrationsData.from_2d(data[0], approx_hessian)\n", - " zpes.append(approx_vibs.get_zero_point_energy())" - ] - }, - { - "cell_type": "markdown", - "id": "c179c3ae-695f-44ad-b548-10002c4ff30b", - "metadata": {}, - "source": [ - "Plot it" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "1c6706a9-a27f-448f-81d4-957939bb2ca8", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(3.5, 2))\n", - "\n", - "ax.plot(steps, zpes)\n", - "\n", - "ax.set_xlim([0, steps.max()])\n", - "ax.plot(ax.get_xlim(), [exact_zpe]*2, 'k--')\n", - "\n", - "ax.set_xlabel('Energies')\n", - "ax.set_ylabel('ZPE (eV)')\n", - "\n", - "fig.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "id": "e8788f74-c208-4939-aa9b-3bbdfd8310ee", - "metadata": {}, - "source": [ - "We consistently underestimate the ZPE. Is it because we have too few oscillators?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "384af4b3-5eb3-4eac-b176-160f19944853", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.9.17" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/proof-of-concept/3_approximate-hessians-with-mbtr.ipynb b/notebooks/proof-of-concept/3_approximate-hessians-with-mbtr.ipynb deleted file mode 100644 index 11c646e..0000000 --- a/notebooks/proof-of-concept/3_approximate-hessians-with-mbtr.ipynb +++ /dev/null @@ -1,745 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "201346ec-3f5a-4235-b8ef-4a0051373865", - "metadata": {}, - "source": [ - "# Generate Approximate Hessians\n", - "Like the previous notebook, fit an approximate model and use that to compute the Hessian. Instead of treating the Hessian parameters as separate, we try here to fit a forcefield using the data." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "ebbbc7f5-3007-420f-861a-9f65f84436be", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from matplotlib import pyplot as plt\n", - "from jitterbug.model.mbtr import MBTREnergyModel, MBTRCalculator\n", - "from sklearn.linear_model import LinearRegression, ElasticNetCV\n", - "from sklearn.model_selection import GridSearchCV\n", - "from sklearn.kernel_ridge import KernelRidge\n", - "from dscribe.descriptors import MBTR\n", - "from ase.vibrations import VibrationsData\n", - "from ase.db import connect\n", - "from pathlib import Path\n", - "from tqdm import tqdm\n", - "import numpy as np\n", - "import warnings" - ] - }, - { - "cell_type": "markdown", - "id": "85a147c1-2758-465b-bc54-dc373d73a0f3", - "metadata": {}, - "source": [ - "Configuration" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "99bd4c92-9a7b-4e88-ac45-dbf30fbfc9e0", - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "molecule_name = 'caffeine'\n", - "method = 'hf'\n", - "basis = 'def2-svpd'\n", - "step_size: float = 0.01 # Perturbation amount, used as maximum L2 norm" - ] - }, - { - "cell_type": "markdown", - "id": "8505d400-8427-45b9-b626-3f9ca557d0c8", - "metadata": {}, - "source": [ - "Derived" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "a8be3c37-bf1f-4ba4-ba8f-afff6d6bed7d", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "run_name = f'{molecule_name}_{method}_{basis}'\n", - "out_dir = Path('data') / 'approx'\n", - "db_path = out_dir / f'{run_name}-random-d={step_size:.2e}.db'" - ] - }, - { - "cell_type": "markdown", - "id": "de1f6aac-b93e-45a7-98e6-ffd5205916a6", - "metadata": {}, - "source": [ - "## Read in the Data\n", - "Get all computations for the desired calculation and the exact solution" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "797b96d8-050c-4bdf-9815-586cfb5bc311", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loaded 2701 structures\n" - ] - } - ], - "source": [ - "with connect(db_path) as db:\n", - " data = [a.toatoms() for a in db.select('')]\n", - "print(f'Loaded {len(data)} structures')" - ] - }, - { - "cell_type": "markdown", - "id": "cb1a8e03-b045-49a4-95fd-61636a48fbad", - "metadata": {}, - "source": [ - "Read in the exact Hessian" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "7389208d-9323-492c-8fc5-d05a372206c6", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "with open(f'data/exact/{run_name}-ase.json') as fp:\n", - " exact_vibs = VibrationsData.read(fp)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "a9965595-532c-4067-ba24-7620bd977007", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "exact_hess = exact_vibs.get_hessian_2d()\n", - "exact_zpe = exact_vibs.get_zero_point_energy()" - ] - }, - { - "cell_type": "markdown", - "id": "04c60da8-4a1d-4ae3-b45d-b77e71fd598f", - "metadata": {}, - "source": [ - "## Fit a Hessian with All Data\n", - "Fit a model which explains the energy data by fitting a Hessian matrix using compressed sensing (i.e., Lasso)." - ] - }, - { - "cell_type": "markdown", - "id": "fe72ad76-2772-4094-a9b7-065be9a356d4", - "metadata": {}, - "source": [ - "Make the MBTR calculator using half the available data" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "5a5b4a37-bd58-4855-bc3e-85d4258a25c8", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 6min 33s, sys: 22.4 s, total: 6min 56s\n", - "Wall time: 35.2 s\n" - ] - } - ], - "source": [ - "%%time\n", - "mbtr = MBTRCalculator(\n", - " model=GridSearchCV(\n", - " KernelRidge(kernel='rbf', alpha=1e-6), {\n", - " 'alpha': np.logspace(-10, -7, 8),\n", - " 'gamma': np.logspace(-5, 5, 32)\n", - " }),\n", - " descriptor=MBTR(\n", - " species=[\"H\", \"C\", \"N\", \"O\"],\n", - " geometry={\"function\": \"distance\"},\n", - " grid={\"min\": 0, \"max\": 6, \"n\": 64, \"sigma\": 0.05},\n", - " weighting={\"function\": \"exp\", \"scale\": 0.1, \"threshold\": 1e-3},\n", - " periodic=False,\n", - " )\n", - ")\n", - "with warnings.catch_warnings():\n", - " warnings.simplefilter('ignore')\n", - " mbtr.train(data[:len(data) // 2])" - ] - }, - { - "cell_type": "markdown", - "id": "503240dd-b52c-4111-a024-ec44766940e5", - "metadata": {}, - "source": [ - "Plot the model performance" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "c0038a85-5a70-4a4e-b830-c3c54e5a8efc", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "pred_energy= [mbtr.get_potential_energy(x) * 1000 for x in data[len(data) // 2:]]\n", - "true_energy = [x.get_potential_energy() * 1000 for x in data[len(data) // 2:]]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "fba09717-7b2b-40a7-a6d3-543c40080d02", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, '$E-E_0$, True (meV)')" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(3.5, 3.5))\n", - "\n", - "base_energy = data[0].get_potential_energy() * 1000 # in meV\n", - "ax.scatter(np.subtract(pred_energy, base_energy), np.subtract(true_energy, base_energy), s=2)\n", - "\n", - "ax.set_xlim(ax.get_ylim())\n", - "ax.set_ylim(ax.get_ylim())\n", - "ax.plot(ax.get_xlim(), ax.get_xlim(), 'k--')\n", - "\n", - "ax.set_xlabel('$E-E_0$, ML (meV)')\n", - "ax.set_ylabel('$E-E_0$, True (meV)')" - ] - }, - { - "cell_type": "markdown", - "id": "71e8e883-2c4b-4929-a000-297233dabe96", - "metadata": {}, - "source": [ - "Build the ASE-compatible calculator" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "d6a7d756-37d3-44e0-b5e2-348d07c9d296", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "model = MBTREnergyModel(reference=data[0], calc=mbtr)\n", - "with warnings.catch_warnings():\n", - " warnings.simplefilter(\"ignore\")\n", - " hess_model = model.train(data)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "372a4089-88cb-47ae-a917-190bc26287ff", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'alpha': 1e-10, 'gamma': 9.284145445194744e-05}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hess_model.parameters['model'].best_params_" - ] - }, - { - "cell_type": "markdown", - "id": "aa509659-701d-4001-8cc7-980c9d999976", - "metadata": {}, - "source": [ - "Compare the forces estimated at a zero displacement to the true value" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "70d80f87-9983-4bd5-a6ae-b9c966b0d838", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "actual_forces = data[0].get_forces()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "f548b145-0aa8-47f7-802b-6b7232a74bd3", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "pred_forces = hess_model.get_forces(data[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "d7cd7762-6e12-4dcd-b564-67a33b18d9e0", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Maximum force: 9.25e-03 eV/Angstrom\n" - ] - } - ], - "source": [ - "print(f'Maximum force: {np.abs(pred_forces).max():.2e} eV/Angstrom')" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "425b77a9-7fd7-40da-af6f-eaed197c9ab6", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, axs = plt.subplots(1, 2, figsize=(4, 2))\n", - "\n", - "for ax, l, h in zip(axs, ['Actual', 'Estimated'], [actual_forces, pred_forces]):\n", - " ax.matshow(h, vmin=-0.05, vmax=0.05, aspect='auto', cmap='RdBu')\n", - "\n", - " ax.set_xticklabels([])\n", - " ax.set_yticklabels([])\n", - " \n", - " ax.set_title(l, fontsize=10)\n", - "\n", - "fig.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "id": "46a0f2f8-f863-4de3-bd97-97ebd92676d4", - "metadata": {}, - "source": [ - "Get the mean Hessian" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "00a10907-667a-413c-851d-d47f0eff092b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 40.6 s, sys: 15.1 ms, total: 40.6 s\n", - "Wall time: 40.6 s\n" - ] - } - ], - "source": [ - "%%time\n", - "approx_hessian = model.mean_hessian(hess_model)" - ] - }, - { - "cell_type": "markdown", - "id": "f4de2e78-00c2-427f-b9bd-eb3ca881564b", - "metadata": {}, - "source": [ - "Compare to exact answer" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "d48893fd-df0d-4fa8-bfbe-0d04b71fbf1a", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1.96495560e+01, 2.28518485e+01, 1.08009177e-03],\n", - " [2.28518485e+01, 8.36964299e+01, 3.94902961e-03],\n", - " [1.08009177e-03, 3.94902961e-03, 4.15881408e+00]])" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "exact_hess[:3, :3]" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "9b311dea-5744-4211-81cb-40aa1183301e", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1.99647797e+01, 2.29521229e+01, 6.85504347e-03],\n", - " [2.29521229e+01, 8.39212309e+01, 1.31434717e-02],\n", - " [6.85504347e-03, 1.31434717e-02, 4.35586953e+00]])" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "approx_hessian[:3, :3]" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "addd7bef-854a-4b9f-96e9-2aa01b652495", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "image/png": "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PYfXX38d7e3tZdv7+vrwxhtveOsOR/CLPSHa2towZ84c5/4VK1YAAHbv3o3du3ejra1N7bvkkkswY8YM3HXXXZg2bRqKxSIWLFiAgYEBAEBLS8vQdp5R17jnnnuQz+cxffp0tU0IgcbGRuzZs8db13zB2l64+jad13QcWx1z+4svvoje3l5ks1l0dXVh2rRp3n6ZQdlMJlO2jdomI+knP/kJPvOZz+DOO+/EmWeeifb2dvzDP/wDnnnmGe9xisUiTj31VNx3330V+/QP2EgByx1riDfeeAOf+cxncNddd+GMM87ANddcowi3a9curF27Fl/+8pfxvve9D/Pmzat42BYuXIjVq1dj9+7d1vabmppQKBSG/DwYIw/5fB4//OEPceedd2L16tXq58UXX8TMmTPLXlgrV65Uf+/Zswfr16/H3Llzy9patWqV+n/dunXYu3dvWRkT8+fPx6ZNm7B582a17ZVXXsG+ffswb948AJGxs3TpUnzpS1/Cddddh6uuugoHDx6syfkTli9fjiVLluCGG27AySefjDlz5lRY3Lbn6JRTTsFrr72GSZMmYc6cOWU/I1Gtwy/2hOjv70dXV1fZz86dO1EoFHD11VfjggsuwHXXXYdly5bhpZdewp133gkAGDduHCZMmIDvfe97eP311/G73/0On/3sZ8va/vM//3NMmTIFH/rQh/Af//EfePPNN3H//ffj6aefBgDMmjULb731FlavXo2dO3eiv7//kJ8/Y3jioYcewp49e/DRj34UCxYsKPv58Ic/jHvuuUeVve222/Db3/4WL730EpYuXYrOzs4yXXdjYyM+9alP4ZlnnsHzzz+P6667DmeccYZyw9hw3nnnYeHChbjqqqvw/PPP49lnn8U111yDc845R7l1PvGJT2DGjBn48pe/jK997WsQQuDzn/98Ta/DnDlzsGrVKjzyyCNYv349vvKVr+APf/hDWZlZs2ZhzZo1WLduHXbu3InBwUFcddVV6OzsxGWXXYbly5fjrbfewpNPPombbroJb7/9dk37eEhweF38IwvXXntthVQKgDjuuOPErbfeKqZOnSp27typyv/iF78QTU1N4oUXXhBCCPHYY4+JefPmiebmZrFw4ULxxBNPCADigQceUHU2bNggLr/8cjFmzBjR2toqFi1apIJWfX194vLLLxdjx45luSOjDBdffLG4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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, axs = plt.subplots(1, 2, figsize=(4, 2))\n", - "\n", - "for ax, l, h in zip(axs, ['Exact', 'Approximate'], [exact_hess, approx_hessian]):\n", - " ax.matshow(h, vmin=-100, vmax=100, cmap='RdBu')\n", - "\n", - " ax.set_xticklabels([])\n", - " ax.set_yticklabels([])\n", - " \n", - " ax.set_title(l, fontsize=10)\n", - "\n", - "fig.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "id": "b516bb4e-d27d-4ad6-ad4b-b873c81670ff", - "metadata": {}, - "source": [ - "Get the zero point energy" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "abbbbfd6-7d17-4b93-880a-3352903b56c4", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "approx_vibs = VibrationsData.from_2d(data[0], approx_hessian)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "fdd80af3-8c18-40d8-b971-4a473bc91498", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5.41561627027977" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "approx_vibs.get_zero_point_energy()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "6b1af348-4bc9-4ced-9a12-44b3e49abe9c", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5.5067174465850215" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "exact_zpe" - ] - }, - { - "cell_type": "markdown", - "id": "ab6a6645-bf0e-4ed7-874e-6a345063e0b5", - "metadata": {}, - "source": [ - "The two differ, but I'm not sure how important the difference is." - ] - }, - { - "cell_type": "markdown", - "id": "29a44b3d-cd3e-44af-9bc2-3e0164b22a38", - "metadata": {}, - "source": [ - "Save it to disk" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "40fd3d44-df72-4b9d-b7b0-f09fabe74c0d", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "with open(f'data/approx/{run_name}_d={step_size:.2e}_mbtr.json', 'w') as fp:\n", - " approx_vibs.write(fp)" - ] - }, - { - "cell_type": "markdown", - "id": "6489882c-acaf-4a07-bbe9-d643f7c5c882", - "metadata": {}, - "source": [ - "## Plot as a Function of Data\n", - "See what happens as we add more data to the training" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "bce41a81-6c88-4b0c-9d8d-0891d1832fd6", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Plotting at 16 steps: 5, 184, 364, 544, 723, ...\n" - ] - } - ], - "source": [ - "steps = np.linspace(5, len(data), 16, dtype=int)\n", - "print(f'Plotting at {len(steps)} steps: {\", \".join(map(str, steps[:5]))}, ...')" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "fe39ce86-1806-4367-8c86-e3ef58f81f84", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 16/16 [19:55<00:00, 74.72s/it]\n" - ] - } - ], - "source": [ - "zpes = []\n", - "for count in tqdm(steps):\n", - " with warnings.catch_warnings():\n", - " warnings.simplefilter(\"ignore\")\n", - " hess_model = model.train(data[:count])\n", - " \n", - " approx_hessian = model.mean_hessian(hess_model)\n", - " approx_vibs = VibrationsData.from_2d(data[0], approx_hessian)\n", - " zpes.append(approx_vibs.get_zero_point_energy())" - ] - }, - { - "cell_type": "markdown", - "id": "c179c3ae-695f-44ad-b548-10002c4ff30b", - "metadata": {}, - "source": [ - "Plot it" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "1c6706a9-a27f-448f-81d4-957939bb2ca8", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(3.5, 2))\n", - "\n", - "ax.plot(steps, zpes)\n", - "\n", - "ax.set_xlim([0, steps.max()])\n", - "ax.plot(ax.get_xlim(), [exact_zpe]*2, 'k--')\n", - "\n", - "ax.set_xlabel('Energies')\n", - "ax.set_ylabel('ZPE (eV)')\n", - "\n", - "fig.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "id": "e8788f74-c208-4939-aa9b-3bbdfd8310ee", - "metadata": {}, - "source": [ - "We consistently underestimate the ZPE. Is it because we have too few oscillators?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "384af4b3-5eb3-4eac-b176-160f19944853", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.9.17" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -}