From 5743a593a3e6d1c806d3008f4405495b1064c591 Mon Sep 17 00:00:00 2001 From: Brook Wander <73855115+brookwander@users.noreply.github.com> Date: Tue, 16 Jul 2024 13:21:24 -0400 Subject: [PATCH 1/7] adding new notebook for using fairchem models with NEBs without CatTSunami enumeration (#764) * adding new notebook for using fairchem models with NEBs * adding md tutorials * blocking code cells that arent needed or take too long --- ..._walkthrough.md => cattsunami_tutorial.md} | 79 +++--- docs/tutorials/fairchem_models_for_nebs.md | 162 +++++++++++++ .../tutorials/adsorbml_walkthrough.ipynb | 2 +- ...rkbook.ipynb => cattsunami_tutorial.ipynb} | 0 .../tutorial/fairchem_models_for_nebs.ipynb | 229 ++++++++++++++++++ 5 files changed, 444 insertions(+), 28 deletions(-) rename docs/tutorials/{cattsunami_walkthrough.md => cattsunami_tutorial.md} (77%) create mode 100644 docs/tutorials/fairchem_models_for_nebs.md rename src/fairchem/applications/cattsunami/tutorial/{workbook.ipynb => cattsunami_tutorial.ipynb} (100%) create mode 100644 src/fairchem/applications/cattsunami/tutorial/fairchem_models_for_nebs.ipynb diff --git a/docs/tutorials/cattsunami_walkthrough.md b/docs/tutorials/cattsunami_tutorial.md similarity index 77% rename from docs/tutorials/cattsunami_walkthrough.md rename to docs/tutorials/cattsunami_tutorial.md index 025a93e63c..7454f56167 100644 --- a/docs/tutorials/cattsunami_walkthrough.md +++ b/docs/tutorials/cattsunami_tutorial.md @@ -4,14 +4,14 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.16.1 + jupytext_version: 1.16.3 kernelspec: display_name: Python 3 (ipykernel) language: python name: python3 --- -# CatTSunami tutorial +# CatTSunami Tutorial ```{code-cell} ipython3 --- @@ -31,20 +31,17 @@ import matplotlib.pyplot as plt from fairchem.applications.cattsunami.core.autoframe import AutoFrameDissociation from fairchem.applications.cattsunami.core import OCPNEB from ase.io import read -from IPython.display import Image -# Optional -# from x3dase.x3d import X3D +#Optional +from IPython.display import Image +from x3dase.x3d import X3D -# Set random seed +#Set random seed import numpy as np np.random.seed(22) ``` -## Do enumerations in an AdsorbML style for CH dissociation on Ru (001) - -To start, we generate placements for the reactant and product species on the surface. We utilize the random placement approach which was developed for AdsorbML, and use an OCP model to relax our placements on the surface. These placements and their ML-determined energies are used as input to the CatTSunami automatic NEB frame generation approach. - +## Do enumerations in an AdsorbML style ```{code-cell} ipython3 --- @@ -54,16 +51,31 @@ tags: ["skip-execution"] reaction = Reaction(reaction_str_from_db="*CH -> *C + *H", reaction_db_path=DISSOCIATION_REACTION_DB_PATH, adsorbate_db_path = ADSORBATE_PKL_PATH) +``` +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- # Instantiate our adsorbate class for the reactant and product reactant = Adsorbate(adsorbate_id_from_db=reaction.reactant1_idx, adsorbate_db_path=ADSORBATE_PKL_PATH) product1 = Adsorbate(adsorbate_id_from_db=reaction.product1_idx, adsorbate_db_path=ADSORBATE_PKL_PATH) product2 = Adsorbate(adsorbate_id_from_db=reaction.product2_idx, adsorbate_db_path=ADSORBATE_PKL_PATH) +``` +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- # Grab the bulk and cut the slab we are interested in bulk = Bulk(bulk_src_id_from_db="mp-33", bulk_db_path=BULK_PKL_PATH) slab = Slab.from_bulk_get_specific_millers(bulk = bulk, specific_millers=(0,0,1)) +``` +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- # Perform site enumeration # For AdsorbML num_sites = 100, but we use 5 here for brevity. This should be increased for practical use. reactant_configs = AdsorbateSlabConfig(slab = slab[0], adsorbate = reactant, @@ -89,16 +101,6 @@ cpu = True calc = OCPCalculator(checkpoint_path = checkpoint_path, cpu = cpu) ``` -### Run ML local relaxations: - -There are 2 options for how to do this. - 1. Using `OCPCalculator` as the calculator within the ASE framework - 2. By writing objects to lmdb and relaxing them using `main.py` in the ocp repo - -(1) is really only adequate for small stuff and it is what I will show here, but if you plan to run many relaxations, you should definitely use (2). More details about writing lmdbs has been provided [here](https://github.com/Open-Catalyst-Project/ocp/blob/main/tutorials/lmdb_dataset_creation.ipynb) - follow the IS2RS/IS2RE instructions. And more information about running relaxations once the lmdb has been written is [here](https://github.com/Open-Catalyst-Project/ocp/blob/main/TRAIN.md#initial-structure-to-relaxed-structure-is2rs). - -You need to provide the calculator with a path to a model checkpoint file. That can be downloaded [here](../core/model_checkpoints) - ```{code-cell} ipython3 --- tags: ["skip-execution"] @@ -110,7 +112,12 @@ for config in reactant_configs: opt = BFGS(config) opt.run(fmax = 0.05, steps=200) reactant_energies.append(config.get_potential_energy()) +``` +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- # Relax the product systems product1_energies = [] for config in product1_configs: @@ -118,7 +125,12 @@ for config in product1_configs: opt = BFGS(config) opt.run(fmax = 0.05, steps=200) product1_energies.append(config.get_potential_energy()) +``` +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- product2_energies = [] for config in product2_configs: config.calc = calc @@ -128,8 +140,13 @@ for config in product2_configs: ``` ## Enumerate NEBs -Here we use the class we created to handle automatic generation of NEB frames to create frames using the structures we just relaxed as input. -![dissociation_scheme](https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/applications/cattsunami/tutorial/dissociation_scheme.png) + +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- +Image(filename="dissociation_scheme.png") +``` ```{code-cell} ipython3 --- @@ -146,7 +163,12 @@ af = AutoFrameDissociation( r_product2_max=3, #r3 in the above fig r_product2_min=1, #r2 in the above fig ) +``` +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- nframes = 10 frame_sets, mapping_idxs = af.get_neb_frames(calc, n_frames = nframes, @@ -156,7 +178,6 @@ frame_sets, mapping_idxs = af.get_neb_frames(calc, ``` ## Run NEBs -Here we use the custom child class we created to run NEB relaxations using ML. The class we created allows the frame relaxations to be batched, improving efficiency. ```{code-cell} ipython3 --- @@ -189,7 +210,7 @@ tags: ["skip-execution"] # conv = optimizer.run(fmax=fmax, steps=300) # if conv: # converged_idxs.append(idx) - + # print(converged_idxs) ``` @@ -217,14 +238,13 @@ if conv: conv = optimizer.run(fmax=fmax, steps=300) ``` -## (Optional) Visualize the results +## Visualize the results ```{code-cell} ipython3 --- tags: ["skip-execution"] --- -idx_of_interest = 0 -optimized_neb = read(f"n2_dissoc_on_Ru_{idx_of_interest}.traj", ":")[-1*nframes:] +optimized_neb = read(f"ch_dissoc_on_Ru_{converged_idxs[0]}.traj", ":")[-1*nframes:] ``` ```{code-cell} ipython3 @@ -235,7 +255,12 @@ es = [] for frame in optimized_neb: frame.set_calculator(calc) es.append(frame.get_potential_energy()) +``` +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- # Plot the reaction coordinate es = [e - es[0] for e in es] diff --git a/docs/tutorials/fairchem_models_for_nebs.md b/docs/tutorials/fairchem_models_for_nebs.md new file mode 100644 index 0000000000..6e5b454abc --- /dev/null +++ b/docs/tutorials/fairchem_models_for_nebs.md @@ -0,0 +1,162 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.16.3 +kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +--- + +# Tutorial for using Fair Chemistry models to relax NEBs + +```{code-cell} ipython3 +from ase.optimize import BFGS +from ase.io import read + +from fairchem.applications.cattsunami.core.autoframe import interpolate +from fairchem.applications.cattsunami.core import OCPNEB +from fairchem.core.models.model_registry import model_name_to_local_file + +#Optional +from x3dase.x3d import X3D +import matplotlib.pyplot as plt +from pathlib import Path +import os +``` + +## Set up inputs + +Shown here are the values used consistently throughout the paper. + +```{code-cell} ipython3 +fmax = 0.05 # [eV / ang] +delta_fmax_climb = 0.4 # this means that when the fmax is below 0.45 eV/Ang climbing image will be turned on +k = 1 # you may adjust this value as you see fit +cpu = True # set to False if you have a GPU + + +# NOTE: Change the checkpoint path to locally downloaded files as needed +checkpoint_path = model_name_to_local_file('EquiformerV2-31M-S2EF-OC20-All+MD', local_cache='/tmp/ocp_checkpoints/') +``` + +## If you have your own set of NEB frames + +```{code-cell} ipython3 +""" +Load your frames (change to the appropriate loading method) +The approach uses ase, so you must provide a list of ase.Atoms objects +with the appropriate constraints. +""" +path_ = Path(__file__).parents[2] +path_ = os.path.join(path_, "src", "fairchem", "applications", "cattsunami", "tutorial", "sample_traj.traj") +frame_set = read(path_, ":")[0:10] # Change to the path to your atoms of the frame set +``` + +```{code-cell} ipython3 +neb = OCPNEB( + frame_set, + checkpoint_path=checkpoint_path, + k=k, + batch_size=8, # If you get a memory error, try reducing this to 4 + cpu = cpu, +) +optimizer = BFGS( + neb, + trajectory=f"your-neb.traj", +) +conv = optimizer.run(fmax=fmax + delta_fmax_climb, steps=200) +if conv: + neb.climb = True + conv = optimizer.run(fmax=fmax, steps=300) +``` + +## If you have a proposed initial and final frame + +You may use the `interpolate` function we implemented which is very similar to idpp but not sensative to periodic boundary crossings. Alternatively you can adopt whatever interpolation scheme you prefer. The `interpolate` function lacks some of the extra protections implemented in the `interpolate_and_correct_frames` which is used in the CatTSunami enumeration workflow. Care should be taken to ensure the results are reasonable. + +IMPORTANT NOTES: +1. Make sure the indices in the initial and final frame map to the same atoms +2. Ensure you have the proper constraints on subsurface atoms + +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- +""" +Load your initial and frames (change to the appropriate loading method) +The approach uses ase, so you must provide ase.Atoms objects +with the appropriate constraints (i.e. fixed subsurface atoms). +""" +initial_frame = read("path-to-your-initial-atoms.traj") +final_frame = read("path-to-your-final-atoms.traj") +num_frames = 10 # you may change this to whatever you like +``` + +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- +frame_set = interpolate(initial_frame, final_frame, num_frames) + +neb = OCPNEB( + frame_set, + checkpoint_path=checkpoint_path, + k=k, + batch_size=8, # If you get a memory error, try reducing this to 4 + cpu = cpu, +) +optimizer = BFGS( + neb, + trajectory=f"your-neb.traj", +) +conv = optimizer.run(fmax=fmax + delta_fmax_climb, steps=200) +if conv: + neb.climb = True + conv = optimizer.run(fmax=fmax, steps=300) +``` + +## Visualize the results + +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- +optimized_neb = read(f"your-neb.traj", ":")[-1*nframes:] +``` + +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- +es = [] +for frame in optimized_neb: + frame.set_calculator(calc) + es.append(frame.get_potential_energy()) +``` + +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- +# Plot the reaction coordinate + +es = [e - es[0] for e in es] +plt.plot(es) +plt.xlabel("frame number") +plt.ylabel("relative energy [eV]") +plt.title(f"Ea = {max(es):1.2f} eV") +plt.savefig("reaction_coordinate.png") +``` + +```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- +# Make an interative html file of the optimized neb trajectory +x3d = X3D(optimized_neb) +x3d.write("your-neb.html") +``` diff --git a/src/fairchem/applications/AdsorbML/tutorials/adsorbml_walkthrough.ipynb b/src/fairchem/applications/AdsorbML/tutorials/adsorbml_walkthrough.ipynb index d0358a49f1..b7f2bb70db 100644 --- a/src/fairchem/applications/AdsorbML/tutorials/adsorbml_walkthrough.ipynb +++ b/src/fairchem/applications/AdsorbML/tutorials/adsorbml_walkthrough.ipynb @@ -7,7 +7,7 @@ "metadata": {}, "outputs": [], "source": [ - "from ocpmodels.common.relaxation.ase_utils import OCPCalculator\n", + "from faichem.core.common.relaxation.ase_utils import OCPCalculator\n", "import ase.io\n", "from ase.optimize import BFGS\n", "\n", diff --git a/src/fairchem/applications/cattsunami/tutorial/workbook.ipynb b/src/fairchem/applications/cattsunami/tutorial/cattsunami_tutorial.ipynb similarity index 100% rename from src/fairchem/applications/cattsunami/tutorial/workbook.ipynb rename to src/fairchem/applications/cattsunami/tutorial/cattsunami_tutorial.ipynb diff --git a/src/fairchem/applications/cattsunami/tutorial/fairchem_models_for_nebs.ipynb b/src/fairchem/applications/cattsunami/tutorial/fairchem_models_for_nebs.ipynb new file mode 100644 index 0000000000..3e7a3c078e --- /dev/null +++ b/src/fairchem/applications/cattsunami/tutorial/fairchem_models_for_nebs.ipynb @@ -0,0 +1,229 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tutorial for using Fair Chemistry models to relax NEBs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from ase.optimize import BFGS\n", + "from ase.io import read\n", + "\n", + "from fairchem.applications.cattsunami.core.autoframe import interpolate\n", + "from fairchem.applications.cattsunami.core import OCPNEB\n", + "from fairchem.core.models.model_registry import model_name_to_local_file\n", + "\n", + "#Optional\n", + "from x3dase.x3d import X3D\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Set up inputs\n", + "\n", + "Shown here are the values used consistently throughout the paper." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fmax = 0.05 # [eV / ang]\n", + "delta_fmax_climb = 0.4 # this means that when the fmax is below 0.45 eV/Ang climbing image will be turned on\n", + "k = 1 # you may adjust this value as you see fit\n", + "cpu = True # set to False if you have a GPU\n", + "\n", + "\n", + "# NOTE: Change the checkpoint path to locally downloaded files as needed\n", + "checkpoint_path = model_name_to_local_file('EquiformerV2-31M-S2EF-OC20-All+MD', local_cache='/tmp/ocp_checkpoints/')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## If you have your own set of NEB frames" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Load your frames (change to the appropriate loading method)\n", + "The approach uses ase, so you must provide a list of ase.Atoms objects\n", + "with the appropriate constraints.\n", + "\"\"\"\n", + "\n", + "frame_set = read(\"sample_traj.traj\", \":\") # Change to the path to your atoms of the frame set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "neb = OCPNEB(\n", + " frame_set,\n", + " checkpoint_path=checkpoint_path,\n", + " k=k,\n", + " batch_size=8, # If you get a memory error, try reducing this to 4\n", + " cpu = cpu,\n", + ")\n", + "optimizer = BFGS(\n", + " neb,\n", + " trajectory=f\"your-neb.traj\",\n", + ")\n", + "conv = optimizer.run(fmax=fmax + delta_fmax_climb, steps=200)\n", + "if conv:\n", + " neb.climb = True\n", + " conv = optimizer.run(fmax=fmax, steps=300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## If you have a proposed initial and final frame\n", + "\n", + "You may use the `interpolate` function we implemented which is very similar to idpp but not sensative to periodic boundary crossings. Alternatively you can adopt whatever interpolation scheme you prefer. The `interpolate` function lacks some of the extra protections implemented in the `interpolate_and_correct_frames` which is used in the CatTSunami enumeration workflow. Care should be taken to ensure the results are reasonable.\n", + "\n", + "IMPORTANT NOTES: \n", + "1. Make sure the indices in the initial and final frame map to the same atoms\n", + "2. Ensure you have the proper constraints on subsurface atoms\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Load your initial and frames (change to the appropriate loading method)\n", + "The approach uses ase, so you must provide ase.Atoms objects\n", + "with the appropriate constraints (i.e. fixed subsurface atoms).\n", + "\"\"\"\n", + "initial_frame = read(\"path-to-your-initial-atoms.traj\")\n", + "final_frame = read(\"path-to-your-final-atoms.traj\")\n", + "num_frames = 10 # you may change this to whatever you like" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "frame_set = interpolate(initial_frame, final_frame, num_frames)\n", + "\n", + "neb = OCPNEB(\n", + " frame_set,\n", + " checkpoint_path=checkpoint_path,\n", + " k=k,\n", + " batch_size=8, # If you get a memory error, try reducing this to 4\n", + " cpu = cpu,\n", + ")\n", + "optimizer = BFGS(\n", + " neb,\n", + " trajectory=f\"your-neb.traj\",\n", + ")\n", + "conv = optimizer.run(fmax=fmax + delta_fmax_climb, steps=200)\n", + "if conv:\n", + " neb.climb = True\n", + " conv = optimizer.run(fmax=fmax, steps=300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualize the results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "optimized_neb = read(f\"your-neb.traj\", \":\")[-1*nframes:]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "es = []\n", + "for frame in optimized_neb:\n", + " frame.set_calculator(calc)\n", + " es.append(frame.get_potential_energy())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the reaction coordinate\n", + "\n", + "es = [e - es[0] for e in es]\n", + "plt.plot(es)\n", + "plt.xlabel(\"frame number\")\n", + "plt.ylabel(\"relative energy [eV]\")\n", + "plt.title(f\"Ea = {max(es):1.2f} eV\")\n", + "plt.savefig(\"reaction_coordinate.png\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Make an interative html file of the optimized neb trajectory\n", + "x3d = X3D(optimized_neb)\n", + "x3d.write(\"your-neb.html\")" + ] + } + ], + "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.15" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 0cbf4ad30b8901cb4edb106909335dd8a0704479 Mon Sep 17 00:00:00 2001 From: Brook Wander Date: Thu, 18 Jul 2024 16:04:08 +0000 Subject: [PATCH 2/7] updating approach to path to work with ipython --- docs/_toc.yml | 3 ++- docs/tutorials/fairchem_models_for_nebs.md | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/_toc.yml b/docs/_toc.yml index ef87ca09e0..7fb384a973 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -43,7 +43,8 @@ parts: - file: tutorials/intro - file: tutorials/OCP-introduction - file: tutorials/adsorbml_walkthrough - - file: tutorials/cattsunami_walkthrough + - file: tutorials/cattsunami_tutorial + - file: tutorials/fairchem_models_for_nebs - file: tutorials/NRR/NRR_toc sections: - file: tutorials/NRR/NRR_example diff --git a/docs/tutorials/fairchem_models_for_nebs.md b/docs/tutorials/fairchem_models_for_nebs.md index 6e5b454abc..5d6b84e99b 100644 --- a/docs/tutorials/fairchem_models_for_nebs.md +++ b/docs/tutorials/fairchem_models_for_nebs.md @@ -24,7 +24,6 @@ from fairchem.core.models.model_registry import model_name_to_local_file #Optional from x3dase.x3d import X3D import matplotlib.pyplot as plt -from pathlib import Path import os ``` @@ -51,7 +50,8 @@ Load your frames (change to the appropriate loading method) The approach uses ase, so you must provide a list of ase.Atoms objects with the appropriate constraints. """ -path_ = Path(__file__).parents[2] +cwd = os.getcwd() +path_ = os.path.abspath(os.path.join(cwd, os.pardir, os.pardir)) path_ = os.path.join(path_, "src", "fairchem", "applications", "cattsunami", "tutorial", "sample_traj.traj") frame_set = read(path_, ":")[0:10] # Change to the path to your atoms of the frame set ``` From 73828200c3bdad1758d4fe7f638291c83234e209 Mon Sep 17 00:00:00 2001 From: Brook Wander Date: Thu, 18 Jul 2024 17:40:45 +0000 Subject: [PATCH 3/7] adding seed to NRR example which randomly had not configs on last push --- docs/tutorials/NRR/NRR_example.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/tutorials/NRR/NRR_example.md b/docs/tutorials/NRR/NRR_example.md index dfbdae3942..fa19ba342f 100644 --- a/docs/tutorials/NRR/NRR_example.md +++ b/docs/tutorials/NRR/NRR_example.md @@ -34,6 +34,10 @@ import os from glob import glob import pandas as pd from fairchem.data.oc.utils import DetectTrajAnomaly + +#Set random seed +import numpy as np +np.random.seed(22) ``` ```{code-cell} ipython3 From 8f0c4f4799123bebea3836af582640ed8b7f6fdd Mon Sep 17 00:00:00 2001 From: zulissimeta <122578103+zulissimeta@users.noreply.github.com> Date: Thu, 18 Jul 2024 11:24:57 -0700 Subject: [PATCH 4/7] Update docs/tutorials/NRR/NRR_example.md --- docs/tutorials/NRR/NRR_example.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/tutorials/NRR/NRR_example.md b/docs/tutorials/NRR/NRR_example.md index fa19ba342f..1a9197d473 100644 --- a/docs/tutorials/NRR/NRR_example.md +++ b/docs/tutorials/NRR/NRR_example.md @@ -35,7 +35,8 @@ from glob import glob import pandas as pd from fairchem.data.oc.utils import DetectTrajAnomaly -#Set random seed +# Set random seed to ensure adsorbate enumeration yields a valid candidate +# If using a larger number of random samples this wouldn't be necessary import numpy as np np.random.seed(22) ``` From e57a895ae0aa942938a05d9b2a54ce8a19d434a5 Mon Sep 17 00:00:00 2001 From: Brook Wander Date: Thu, 18 Jul 2024 20:19:07 +0000 Subject: [PATCH 5/7] adding file :(|) --- .../cattsunami/tutorial/sample_traj.traj | Bin 0 -> 66657 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/fairchem/applications/cattsunami/tutorial/sample_traj.traj diff --git a/src/fairchem/applications/cattsunami/tutorial/sample_traj.traj b/src/fairchem/applications/cattsunami/tutorial/sample_traj.traj new file mode 100644 index 0000000000000000000000000000000000000000..66031c957e9370e6b1d934fad5cf566e12c96342 GIT binary patch literal 66657 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 literal 0 HcmV?d00001 From 294d44bf533c443c289fd5465afaf843b8e57b3b Mon Sep 17 00:00:00 2001 From: Muhammed Shuaibi Date: Fri, 19 Jul 2024 02:23:25 +0000 Subject: [PATCH 6/7] skip neb execution --- docs/tutorials/fairchem_models_for_nebs.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/tutorials/fairchem_models_for_nebs.md b/docs/tutorials/fairchem_models_for_nebs.md index 5d6b84e99b..85bfc46e13 100644 --- a/docs/tutorials/fairchem_models_for_nebs.md +++ b/docs/tutorials/fairchem_models_for_nebs.md @@ -14,6 +14,9 @@ kernelspec: # Tutorial for using Fair Chemistry models to relax NEBs ```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- from ase.optimize import BFGS from ase.io import read @@ -32,6 +35,9 @@ import os Shown here are the values used consistently throughout the paper. ```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- fmax = 0.05 # [eV / ang] delta_fmax_climb = 0.4 # this means that when the fmax is below 0.45 eV/Ang climbing image will be turned on k = 1 # you may adjust this value as you see fit @@ -45,6 +51,9 @@ checkpoint_path = model_name_to_local_file('EquiformerV2-31M-S2EF-OC20-All+MD', ## If you have your own set of NEB frames ```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- """ Load your frames (change to the appropriate loading method) The approach uses ase, so you must provide a list of ase.Atoms objects @@ -57,6 +66,9 @@ frame_set = read(path_, ":")[0:10] # Change to the path to your atoms of the fra ``` ```{code-cell} ipython3 +--- +tags: ["skip-execution"] +--- neb = OCPNEB( frame_set, checkpoint_path=checkpoint_path, @@ -78,7 +90,7 @@ if conv: You may use the `interpolate` function we implemented which is very similar to idpp but not sensative to periodic boundary crossings. Alternatively you can adopt whatever interpolation scheme you prefer. The `interpolate` function lacks some of the extra protections implemented in the `interpolate_and_correct_frames` which is used in the CatTSunami enumeration workflow. Care should be taken to ensure the results are reasonable. -IMPORTANT NOTES: +IMPORTANT NOTES: 1. Make sure the indices in the initial and final frame map to the same atoms 2. Ensure you have the proper constraints on subsurface atoms From 7acbc3bd7c2937454d096d10bb455f1967f204b3 Mon Sep 17 00:00:00 2001 From: Muhammed Shuaibi Date: Fri, 19 Jul 2024 04:55:23 +0000 Subject: [PATCH 7/7] status check on merge queue --- .github/workflows/build_docs.yml | 1 + .github/workflows/lint.yml | 1 + .github/workflows/test.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/.github/workflows/build_docs.yml b/.github/workflows/build_docs.yml index 276024d2bc..cc51a9ffd4 100644 --- a/.github/workflows/build_docs.yml +++ b/.github/workflows/build_docs.yml @@ -6,6 +6,7 @@ on: workflow_dispatch: pull_request_review: types: [submitted, edited] + merge_group: jobs: build: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 45cd6b1cfb..1016d12cfa 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -6,6 +6,7 @@ on: pull_request: branches: [main] push: + merge_group: jobs: lint: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d751b29d0f..fca9044537 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,6 +7,7 @@ on: branches: [main] push: branches: [main] + merge_group: jobs: test: