diff --git a/envs/environment-cpu.yml b/envs/environment-cpu.yml index f3719b2..7dc4eae 100644 --- a/envs/environment-cpu.yml +++ b/envs/environment-cpu.yml @@ -7,7 +7,7 @@ channels: - pytorch - conda-forge/label/libint_dev dependencies: - - python==3.10.* + - python==3.9.* # Standard data analysis tools - pandas==1.* @@ -20,6 +20,9 @@ dependencies: # Quantum chemistry - psi4==1.8.* + # Interatomic forcefields + - dscribe==2.1.* + # Use Conda PyTorch to avoid OpenMP disagreement with other libraries - pytorch==2.0.* - cpuonly diff --git a/jitterbug/model/base.py b/jitterbug/model/base.py index dc00870..48cd9b7 100644 --- a/jitterbug/model/base.py +++ b/jitterbug/model/base.py @@ -16,11 +16,13 @@ def train(self, data: list[Atoms]) -> object: """ raise NotImplementedError() - def mean_hessian(self, model: object) -> list[np.ndarray]: + def mean_hessian(self, model: object) -> np.ndarray: """Produce the most-likely Hessian given the model Args: - model: Model trained by this + model: Model trained by this class + Returns: + The most-likely Hessian given the model """ def sample_hessians(self, model: object, num_samples: int) -> list[np.ndarray]: diff --git a/jitterbug/model/mbtr.py b/jitterbug/model/mbtr.py new file mode 100644 index 0000000..f1e940c --- /dev/null +++ b/jitterbug/model/mbtr.py @@ -0,0 +1,96 @@ +"""Learn a potential energy surface with the MBTR representation + +MBTR is an easy route for learning a forcefield because it represents +a molecule as a single vector, which means we can case the learning +problem as a simple "molecule->energy" learning problem. Other methods, +such as SOAP, provided atomic-level features that must require an +extra step "molecule->atoms->energy/atom->energy". +""" +from shutil import rmtree + +from ase.calculators.calculator import Calculator, all_changes +from ase.vibrations import Vibrations +from ase import Atoms +from sklearn.linear_model import LinearRegression +from dscribe.descriptors import MBTR +import numpy as np + +from jitterbug.model.base import EnergyModel + + +class MBTRCalculator(Calculator): + """A learnable forcefield based on GPR and fingerprints computed using DScribe""" + + implemented_properties = ['energy', 'forces'] + default_parameters = { + 'descriptor': MBTR( + species=["H", "C", "N", "O"], + geometry={"function": "inverse_distance"}, + grid={"min": 0, "max": 1, "n": 100, "sigma": 0.1}, + weighting={"function": "exp", "scale": 0.5, "threshold": 1e-3}, + periodic=False, + normalization="l2", + ), + 'model': LinearRegression(), + 'intercept': 0., # Normalizing parameters + 'scale': 0. + } + + def calculate(self, atoms=None, properties=('energy', 'forces'), system_changes=all_changes): + # Compute the energy using the learned model + desc = self.parameters['descriptor'].create_single(atoms) + energy_no_int = self.parameters['model'].predict(desc[None, :]) + self.results['energy'] = energy_no_int[0] * self.parameters['scale'] + self.parameters['intercept'] + + # If desired, compute forces numerically + if 'forces' in properties: + # calculate_numerical_forces use that the calculation of the input atoms, + # even though it is a method of a calculator and not of the input atoms :shrug: + temp_atoms: Atoms = atoms.copy() + temp_atoms.calc = self + self.results['forces'] = self.calculate_numerical_forces(temp_atoms) + + def train(self, train_set: list[Atoms]): + """Train the embedded forcefield object + + Args: + train_set: List of Atoms objects containing at least the energy + """ + + # Determine the mean energy and subtract it off + energies = np.array([atoms.get_potential_energy() for atoms in train_set]) + self.parameters['intercept'] = energies.mean() + energies -= self.parameters['intercept'] + self.parameters['scale'] = energies.std() + energies /= self.parameters['scale'] + + # Compute the descriptors and use them to fit the model + desc = self.parameters['descriptor'].create(train_set) + self.parameters['model'].fit(desc, energies) + + +class MBTREnergyModel(EnergyModel): + """Use the MBTR representation to model the potential energy surface + + Args: + calc: Calculator used to fit the potential energy surface + reference: Reference structure at which we compute the Hessian + """ + + def __init__(self, calc: MBTRCalculator, reference: Atoms): + super().__init__() + self.calc = calc + self.reference = reference + + def train(self, data: list[Atoms]) -> MBTRCalculator: + self.calc.train(data) + return self.calc + + def mean_hessian(self, model: MBTRCalculator) -> np.ndarray: + self.reference.calc = model + try: + vib = Vibrations(self.reference, name='mbtr-temp') + vib.run() + return vib.get_vibrations().get_hessian_2d() + finally: + rmtree('mbtr-temp', ignore_errors=True) diff --git a/notebooks/proof-of-concept/1_compute-random-offsets.ipynb b/notebooks/proof-of-concept/1_compute-random-offsets.ipynb index 8bde676..10ae373 100644 --- a/notebooks/proof-of-concept/1_compute-random-offsets.ipynb +++ b/notebooks/proof-of-concept/1_compute-random-offsets.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "c6a28419-6831-4197-8973-00c5591e19cb", "metadata": { "tags": [] @@ -38,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "c6be56c5-a460-4acd-9b89-8c3d9c812f5f", "metadata": { "tags": [ @@ -51,7 +51,7 @@ "method = 'hf'\n", "basis = 'def2-svpd'\n", "threads = min(os.cpu_count(), 12)\n", - "step_size: float = 0.005 # Perturbation amount, used as maximum L2 norm" + "step_size: float = 0.01 # Perturbation amount, used as maximum L2 norm" ] }, { @@ -64,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "0b6794cd-477f-45a1-b96f-2332804ddb20", "metadata": {}, "outputs": [], @@ -83,12 +83,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "ad9fd725-b1ba-4fec-ae41-959be0e540b3", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Atoms(symbols='O2N4C8H10', pbc=False, forces=..., calculator=SinglePointCalculator(...))" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "atoms = read(Path('data') / 'exact' / f'{run_name}.xyz')\n", "atoms" @@ -113,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "23502eea-0974-4248-8f19-e85447069c61", "metadata": { "tags": [] @@ -126,7 +137,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "bf1366fc-d9a7-4a98-b9c9-cb3a0209b406", "metadata": { "tags": [] @@ -146,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "d4f21e81-5ec3-4877-a4d1-402077be2ee8", "metadata": { "tags": [] @@ -168,12 +179,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "0915595d-133a-43df-84fc-4ff6a3b538ea", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Memory set to 3.815 GiB by Python driver.\n", + " Threads set to 12 by Python driver.\n" + ] + } + ], "source": [ "calc = Psi4(method=method, basis=basis, num_threads=threads, memory='4096MB')" ] @@ -188,12 +209,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "e2a28593-2634-4bb7-ae5b-8f557937bda1", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Need to run 2701 calculations for full accuracy.\n" + ] + } + ], "source": [ "n_atoms = len(atoms)\n", "to_compute = 3 * n_atoms + 3 * n_atoms * (3 * n_atoms + 1) // 2 + 1\n", @@ -202,12 +231,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "8bf40523-dcaa-4046-a9c6-74e35178e87f", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Already done 427. 2274 left to do.\n" + ] + } + ], "source": [ "with connect(db_path) as db:\n", " done = len(db)\n", @@ -219,7 +256,31 @@ "execution_count": null, "id": "a6fa1b33-defc-4b35-895d-052eb64453fb", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/2701 [00:00" ] @@ -280,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 13, "id": "00a10907-667a-413c-851d-d47f0eff092b", "metadata": {}, "outputs": [], @@ -298,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 14, "id": "d48893fd-df0d-4fa8-bfbe-0d04b71fbf1a", "metadata": { "tags": [] @@ -312,7 +312,7 @@ " [1.08009177e-03, 3.94902961e-03, 4.15881408e+00]])" ] }, - "execution_count": 125, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -323,7 +323,7 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 15, "id": "9b311dea-5744-4211-81cb-40aa1183301e", "metadata": { "tags": [] @@ -337,7 +337,7 @@ " [8.59920621e-03, 6.10182117e-01, 2.73150623e+01]])" ] }, - "execution_count": 126, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -348,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 16, "id": "addd7bef-854a-4b9f-96e9-2aa01b652495", "metadata": { "tags": [] @@ -356,7 +356,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAADJCAYAAAA3tRlxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABZXklEQVR4nO29e7RdVXk3/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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", + "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": [ "
" ] @@ -389,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 128, + "execution_count": 17, "id": "abbbbfd6-7d17-4b93-880a-3352903b56c4", "metadata": { "tags": [] @@ -401,7 +401,7 @@ }, { "cell_type": "code", - "execution_count": 129, + "execution_count": 18, "id": "fdd80af3-8c18-40d8-b971-4a473bc91498", "metadata": {}, "outputs": [ @@ -411,7 +411,7 @@ "7.268532902551082" ] }, - "execution_count": 129, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -422,7 +422,7 @@ }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 19, "id": "6b1af348-4bc9-4ced-9a12-44b3e49abe9c", "metadata": { "tags": [] @@ -434,7 +434,7 @@ "5.5067174465850215" ] }, - "execution_count": 130, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -462,7 +462,7 @@ }, { "cell_type": "code", - "execution_count": 131, + "execution_count": 20, "id": "bce41a81-6c88-4b0c-9d8d-0891d1832fd6", "metadata": { "tags": [] @@ -483,7 +483,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "fe39ce86-1806-4367-8c86-e3ef58f81f84", "metadata": { "tags": [] @@ -493,7 +493,7 @@ "name": "stderr", "output_type": "stream", "text": [ - " 62%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 10/16 [00:00<00:00, 16.03it/s]" + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 16/16 [00:04<00:00, 3.98it/s]\n" ] } ], @@ -519,12 +519,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "1c6706a9-a27f-448f-81d4-957939bb2ca8", "metadata": { "tags": [] }, - "outputs": [], + "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", @@ -572,7 +583,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.9.17" } }, "nbformat": 4, diff --git a/notebooks/proof-of-concept/3_approximate-hessians-with-mbtr.ipynb b/notebooks/proof-of-concept/3_approximate-hessians-with-mbtr.ipynb new file mode 100644 index 0000000..5fd8f8c --- /dev/null +++ b/notebooks/proof-of-concept/3_approximate-hessians-with-mbtr.ipynb @@ -0,0 +1,745 @@ +{ + "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 1457 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 4min 28s, sys: 7.75 s, total: 4min 35s\n", + "Wall time: 23.4 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': 2.1017480113324872e-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: 8.96e-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 47.7 s, sys: 33.7 ms, total: 47.7 s\n", + "Wall time: 47.7 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.90039475e+01, 2.26533979e+01, 2.14746706e-02],\n", + " [2.26533979e+01, 8.32193023e+01, 1.32040896e-02],\n", + " [2.14746706e-02, 1.32040896e-02, 3.78143259e+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": "iVBORw0KGgoAAAANSUhEUgAAAXYAAADJCAYAAAA3tRlxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABHNUlEQVR4nO19e5hcxXXnr7unZzQzGo3e6IGQooiHBMgIhADFGGODjTFgb3AgCWsQdhw/1l7sPDbxxg4P7y67m+A43vUmBgOObb6NnYCd4MeCHzxkC4EFCAUjS7yEnqM30ug1M91d+0fVqa6uW1W3bnePNNNzft+nb9T31uvee27dU+f86pycEEKAwWAwGC2D/IkeAIPBYDCaC57YGQwGo8XAEzuDwWC0GHhiZzAYjBYDT+wMBoPRYuCJncFgMFoMPLEzGAxGi4EndgaDwWgx8MTOYDAYLQae2BkMxojAihUr8P73v/9ED6MlwBN7BqxYsQK5XC7x74orrjgu/d92220455xzjktfjNGLVatWoVAoHDe5bBb+9m//Fl//+teHvZ+x8AFpO9EDGG244oorcP/999cc6+joOEGjYTCSuO+++/CpT30KX/va17B582accsopw9rf0NAQisViw+309vY2YTQMAIBgROOmm24S73vf+5znHnvsMVEsFsWTTz6pj/31X/+1mDJliti+fbsQQogf/ehH4rd+67dEb2+vmDx5snjve98rXnnllZp2tmzZIq6//noxadIk0dXVJc477zyxevVqcf/99wsANf/uv//+4bpUxijFoUOHRE9Pj/j1r38trr/+enH77bfrc4899pgAIL7//e+LxYsXi46ODrFs2TKxbt06Xeb+++8Xvb294rvf/a449dRTRUdHh7jsssvE5s2bdZlbb71VvOUtbxH33nuv+I3f+A2Ry+VEpVIRb7zxhrjmmmtEd3e36OnpEb/zO78j+vr6hBBCrF+/XnR2dooHHnhAt/Pggw+Kjo4O3b/9fl1yySXik5/8pLjlllvExIkTxfTp08VXv/pVcejQIbFixQoxfvx4MX/+fPHDH/5Q1ymVSuJDH/qQmDdvnhg3bpw47bTTxJe+9KWasdvv0WOPPSaEEGLr1q3iuuuuExMnThSTJ08W11xzjXj99deb8lyON3hiz4DQxC6EEH/6p38q5s6dK958802xdu1a0dHRIR566CF9/p//+Z/Fgw8+KDZu3Cief/55cfXVV4uzzz5blMtlIYQQ/f39Yv78+eLiiy8WK1euFC+//LL49re/LVatWiWOHDki/viP/1iceeaZYseOHWLHjh3iyJEjw33JjFGGe++9VyxdulQIIcTDDz8s5s2bJyqVihCiOrEvXLhQPProo2LdunXiqquuEvPmzRODg4NCCDmxF4tFsXTpUrFq1SqxZs0asWzZMrF8+XLdx6233iq6u7vFu9/9bvHcc8+JF154QVQqFbFkyRLx1re+VaxZs0asXr1anHvuueKSSy7R9b7yla+I3t5esWnTJrFt2zYxefJk8Td/8zf6vGti7+npEV/4whfExo0bxRe+8AWRz+fFe97zHnH33XeLjRs3io9//ONiypQp4vDhw0IIIQYHB8Vf/uVfimeeeUa89tpr4lvf+pbo6uoS3/72t4UQ8h277rrrxBVXXKHfo4GBAXH48GFx6qmnig996ENi3bp14qWXXhK///u/L04//XQxMDAwHI9qWMETewbcdNNNolAoiO7u7pp/d9xxhxBCiIGBAbFkyRJx3XXXiTPPPFP8wR/8QbC9Xbt2CQDi3/7t34QQQnz1q18VPT09Yu/evc7ypCkxGD4sX75ca6hDQ0Ni6tSp4sc//rEQojqx/+M//qMuv3fvXtHZ2aknPloZrl69WpdZv369ACCefvppIYSUw2KxKHbt2qXLPProo6JQKNRo9r/61a8EAPHMM8/oY+9973vFxRdfLN75zneKyy+/XH90hHBP7G9961v171KpJLq7u8UHP/hBfWzHjh0CgHjqqae89+QTn/iEuPbaa739CCE/iKeffnrNeAYGBkRnZ6d45JFHvG2PVLCNPSMuvfRS/N3f/V3NscmTJwMA2tvb8a1vfQuLFy/G3Llz8aUvfamm3KuvvorPf/7zWL16Nfbs2YNKpQIA2Lx5M8466yysXbsWS5Ys0e0xGFmwYcMGPPPMM3jooYcAAG1tbbj++utx33334bLLLtPlLrroIv3/yZMn4/TTT8f69ev1sba2NixdulT/PuOMMzBx4kSsX78ey5YtAwDMnTsX06ZN02XWr1+POXPmYM6cOfrYokWLdL3zzz8fgLT/n3baacjn83jxxReRy+WC17R48WL9/0KhgClTpuDss8/Wx0466SQAwK5du/Sxv//7v8fXvvY1vPHGGzh6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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.132369908274389" + ] + }, + "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, 101, 198, 295, 392, ...\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 [15:54<00:00, 59.66s/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/pyproject.toml b/pyproject.toml index 5189da8..03604e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ authors = [ ] description = 'Faster Hessians through machine learning' readme = "README.md" -requires-python = ">=3.10" +requires-python = ">=3.9" license = { file = "LICENSE" } keywords = ["HPC", "AI", "Workflows", "Quantum Chemistry", "Chemical Engineering"] classifiers = [ diff --git a/tests/models/test_mbtr.py b/tests/models/test_mbtr.py new file mode 100644 index 0000000..c500156 --- /dev/null +++ b/tests/models/test_mbtr.py @@ -0,0 +1,31 @@ +"""Test for a MBTR-based energy model""" +import numpy as np + +from jitterbug.model.mbtr import MBTRCalculator, MBTREnergyModel + + +def test_model(train_set): + # Create then fit the model + calc = MBTRCalculator() + calc.train(train_set) + + # Predict the energy (we should be close!) + test_atoms = train_set[0].copy() + test_atoms.calc = calc + energy = test_atoms.get_potential_energy() + assert np.isclose(energy, train_set[0].get_potential_energy()) + + # See if force calculation works + forces = test_atoms.get_forces() + assert forces.shape == (3, 3) # At least make sure we get the right shape, values are iffy + + +def test_hessian(train_set): + """See if we can compute the Hessian""" + calc = MBTRCalculator() + model = MBTREnergyModel(calc, train_set[0]) + + # Run the fitting + hess_model = model.train(train_set) + hess = model.mean_hessian(hess_model) + assert hess.shape == (9, 9)