Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
090fb20
Fix NequIP stability report path, trajectory metadata parsing, and hi…
chiang-yuan Jun 20, 2026
a59e0da
Resolve streamlit use_container_width deprecation warnings
chiang-yuan Jun 20, 2026
39ec509
Add NequIP stability and eos_bulk post-processed parquet files
chiang-yuan Jun 20, 2026
f20a3fe
Replace coarse benchmarks/ ignore rule with fine-grained pattern ignores
chiang-yuan Jun 20, 2026
a043916
feat(flows): modularize combustion flow in package & use HF download
chiang-yuan Jun 20, 2026
2d09081
refactor(registry): register combustion and stability tasks for NequI…
chiang-yuan Jun 20, 2026
625b555
feat(benchmarks): integrate combustion flow and reporting check in su…
chiang-yuan Jun 20, 2026
7331d4a
docs(combustion): update import paths and call signatures in run.ipyn…
chiang-yuan Jun 20, 2026
44b124f
docs: update docstrings, readme, and quickstart guide to reflect mode…
chiang-yuan Jun 20, 2026
d185a5c
docs: add guide on how to configure and submit benchmark jobs on HPC
chiang-yuan Jun 20, 2026
feaf982
style: fix ruff linter and formatting errors in benchmarks notebooks
chiang-yuan Jun 20, 2026
1c3709d
test(combustion): add unit tests for combustion flow and process Nequ…
chiang-yuan Jun 30, 2026
10ef31e
update streamlit api
chiang-yuan Jun 30, 2026
cc970f0
feat(flows): configure retries and timeouts for hydrogen combustion flow
chiang-yuan Jul 2, 2026
3eb96aa
refactor(report): clean up benchmarks directory paths
chiang-yuan Jul 2, 2026
b1ee4bd
refactor(report): make --model required and remove legacy behavior
chiang-yuan Jul 2, 2026
1613b12
fix(deps): add numba constraint for Python 3.12 compatibility
chiang-yuan Jul 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,15 @@
*.extxyz
*.traj
*.db
datasets/
# Fine-grained benchmark ignore rules to avoid missing scripts/processed results
benchmarks/
!benchmarks/c2db/*.parquet
!benchmarks/**/*_processed.parquet
!benchmarks/stability/*-heating.parquet
!benchmarks/stability/*-compression.parquet
!benchmarks/combustion/**/*.json
!benchmarks/diatomics/**/*.json
Comment on lines 6 to +12

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

These negated patterns will not re-include files under benchmarks/.

Once benchmarks/ is ignored, Git stops descending into it, so the later !benchmarks/... rules never make the combustion/parquet artifacts trackable. That breaks the new artifact contract used by report generation.

Suggested fix
 benchmarks/
+!benchmarks/
+!benchmarks/**/
 !benchmarks/c2db/*.parquet
 !benchmarks/**/*_processed.parquet
 !benchmarks/stability/*-heating.parquet
 !benchmarks/stability/*-compression.parquet
 !benchmarks/combustion/**/*.json
 !benchmarks/diatomics/**/*.json

Based on learnings, the broad benchmarks/ ignore is intentional; the issue here is that Git will not unignore descendants of an ignored parent unless the directories are reopened first.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
benchmarks/
!benchmarks/c2db/*.parquet
!benchmarks/**/*_processed.parquet
!benchmarks/stability/*-heating.parquet
!benchmarks/stability/*-compression.parquet
!benchmarks/combustion/**/*.json
!benchmarks/diatomics/**/*.json
benchmarks/
!benchmarks/
!benchmarks/**/
!benchmarks/c2db/*.parquet
!benchmarks/**/*_processed.parquet
!benchmarks/stability/*-heating.parquet
!benchmarks/stability/*-compression.parquet
!benchmarks/combustion/**/*.json
!benchmarks/diatomics/**/*.json
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.gitignore around lines 6 - 12, The broad benchmarks/ ignore is fine, but
the negated artifact patterns cannot take effect unless Git is first allowed
back into the parent directories. Update the .gitignore rules so the benchmarks
hierarchy is reopened before the specific !benchmarks/... exceptions, ensuring
the combustion/parquet JSON and parquet artifacts remain trackable while
preserving the intended ignore default.

Source: Learnings



# Byte-compiled / optimized / DLL files
__pycache__/
Expand Down
17 changes: 17 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,23 @@ If you have pretrained MLIP models that you would like to contribute to the MLIP

Please reuse, extend, or chain the general tasks defined and add new folder and script under `/benchmarks`.

## Running and Submitting Benchmark Jobs

To submit a benchmark job for a registered model (e.g. on HPC resources like NERSC Perlmutter):

1. **Configure submit.py**:
In `benchmarks/submit.py`, configure:
- `calculator = "MODEL_NAME"` (using the key defined in `mlip_arena/models/registry.yaml`).
- `SLURM_CONFIG`: configure your charge account, queue/partition, walltime, and environment setup commands.
2. **Select Flow**:
In the main execution block at the bottom of `benchmarks/submit.py`, uncomment the benchmark flows you wish to run (e.g. `stability`, `combustion`, `asymptotic_behaviors`, `distribution_shifts`).
3. **Execute Job**:
Run the submission script from the `benchmarks/` directory:
```bash
python submit.py
```
This initializes a Dask cluster over SLURM workers, schedules and executes tasks on compute nodes, and generates post-processed summary files upon completion.

## Documentation Development

We use [Mintlify](https://mintlify.com/) for our documentation website under the `docs/` folder.
Expand Down
37 changes: 37 additions & 0 deletions benchmarks/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# MLIP Arena Benchmarks

This directory contains scripts and configurations for running benchmarks on machine learning interatomic potentials (MLIPs).

## Running and Submitting Benchmark Jobs

To run or submit benchmark jobs at scale (such as on HPC environments like NERSC Perlmutter), follow these steps:

### 1. Register the Model
Ensure your model is registered under `mlip_arena/models/registry.yaml` with the appropriate metadata (such as class, family, module name, and the list of supported `cpu-tasks` and `gpu-tasks`).

### 2. Configure the Submission Script
Open [benchmarks/submit.py](./submit.py) and configure the following parameters:

- **Model/Calculator selection**: Set the `calculator` variable to the name of your model registered in the registry.
```python
calculator = "NequIP-OAM-L"
```
- **SLURM Cluster Config**: In the `SLURM_CONFIG` dictionary, set details corresponding to your HPC account:
- `account`: HPC charge account.
- `qos`/`partition`: Target queue.
- `walltime`: Job time limit.
- `job_script_prologue`: Bash commands to activate your environment (e.g. `source activate /path/to/conda/env`).

### 3. Select Benchmark Tasks
At the bottom of [benchmarks/submit.py](./submit.py), uncomment the flow execution blocks you want to run:
- `asymptotic_behaviors`: Homonuclear diatomics, EOS bulk, E-V scan.
- `distribution_shifts`: NVE trajectory entropy.
- `stability`: Linear heating and compression.
- `combustion`: Hydrogen combustion MD simulation.

### 4. Execute Submission
Run the submission script from this directory:
```bash
python submit.py
```
This script will spin up a Dask cluster over SLURM workers, schedule tasks across the GPU/CPU nodes, execute them, write trajectory/metric logs, and run `report.py` to aggregate the results.
32 changes: 13 additions & 19 deletions benchmarks/bzo/dft.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,11 @@
],
"source": [
"import numpy as np\n",
"from ase.build import bulk\n",
"from ase.io import read\n",
"\n",
"from mlip_arena.tasks import MD, OPT, PHONON\n",
"from mlip_arena.tasks.utils import get_calculator\n",
"from mlip_arena.tasks import OPT, PHONON\n",
"\n",
"atoms = read('BZO_cubic_prim.xyz')"
"atoms = read(\"BZO_cubic_prim.xyz\")"
]
},
{
Expand Down Expand Up @@ -114,13 +112,13 @@
"\n",
"replicas = (2, 2, 2)\n",
"\n",
"atoms = read('BZO_cubic_prim.xyz')\n",
"atoms = read(\"BZO_cubic_prim.xyz\")\n",
"atoms.set_cell(cell=[4.0, 4.0, 4.0], scale_atoms=True)\n",
"atoms.set_constraint()\n",
"\n",
"calc = Vasp(\n",
" kpts=(3, 3, 3),\n",
" xc='PBE',\n",
" xc=\"PBE\",\n",
" encut=500,\n",
" ediff=1e-7,\n",
" ibrion=-1,\n",
Expand All @@ -133,8 +131,8 @@
" lwave=False,\n",
" lcharg=False,\n",
" lmaxmix=4,\n",
" command='vasp_std',\n",
" directory='pbe',\n",
" command=\"vasp_std\",\n",
" directory=\"pbe\",\n",
")\n",
"\n",
"atoms = OPT(\n",
Expand Down Expand Up @@ -173,17 +171,13 @@
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"\n",
"phonon = result['phonon']\n",
"phonon.save(settings={'force_constants': True}, filename='pbe/phonopy_params.yaml')\n",
"phonon = result[\"phonon\"]\n",
"phonon.save(settings={\"force_constants\": True}, filename=\"pbe/phonopy_params.yaml\")\n",
"\n",
"with plt.style.context(\"default\"):\n",
"\n",
"\n",
" phonon.plot_band_structure_and_dos()\n",
" \n",
" plt.savefig('pbe/band_structure.png', dpi=300)\n",
"\n",
" plt.savefig(\"pbe/band_structure.png\", dpi=300)\n",
" plt.show()"
]
},
Expand Down Expand Up @@ -275,7 +269,7 @@
" eigvec = eigvecs[:, mode].real.reshape(-1, 3)\n",
"\n",
" # atoms = read('BZO_cubic_prim.xyz')\n",
" cloned = atoms.copy() #* replicas\n",
" cloned = atoms.copy() # * replicas\n",
" norm_eigvec = eigvec / np.linalg.norm(eigvec, axis=1).max() * 0.5\n",
" cloned.positions += norm_eigvec\n",
" cloned.set_constraint()\n",
Expand All @@ -284,7 +278,7 @@
"\n",
" if freq >= 0:\n",
" continue\n",
" \n",
"\n",
" # view(atoms * (5, 5, 5), viewer='x3d')\n",
"\n",
" plot_atoms(cloned * (2, 2, 2))\n",
Expand Down Expand Up @@ -317,7 +311,7 @@
"norm_eigvec = eigvec / np.linalg.norm(eigvec, axis=1).max() * 0.5\n",
"print(norm_eigvec)\n",
"\n",
"np.save(f'pbe/mode-{mode}.npy', eigvec)"
"np.save(f\"pbe/mode-{mode}.npy\", eigvec)"
]
},
{
Expand Down
4 changes: 3 additions & 1 deletion benchmarks/bzo/run.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
"metadata": {},
"outputs": [],
"source": [
"from mlip_arena.tasks.utils import get_calculator\n",
"from ase.io import read\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from mlip_arena.models import MLIPEnum\n",
Expand Down Expand Up @@ -94,7 +96,7 @@
" ncol=len(axes[0].get_legend_handles_labels()[0]),\n",
" # fontsize=6\n",
")\n",
"plt.show()\n"
"plt.show()"
]
},
{
Expand Down
53 changes: 18 additions & 35 deletions benchmarks/c2db/analysis.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"DATA_DIR = Path(\".\")\n",
"\n",
"db = connect(DATA_DIR / \"c2db.db\")\n",
"random_indices = random.sample(range(1, len(db) + 1), 1000)\n"
"random_indices = random.sample(range(1, len(db) + 1), 1000)"
]
},
{
Expand All @@ -36,9 +36,7 @@
"\n",
"from mlip_arena.models import MLIPEnum\n",
"\n",
"for row, model in tqdm(\n",
" itertools.product(db.select(filter=lambda r: r[\"id\"] in random_indices), MLIPEnum)\n",
"):\n",
"for row, model in tqdm(itertools.product(db.select(filter=lambda r: r[\"id\"] in random_indices), MLIPEnum)):\n",
" uid = row[\"uid\"]\n",
"\n",
" if Path(f\"{model.name}.parquet\").exists():\n",
Expand Down Expand Up @@ -73,7 +71,7 @@
"\n",
" df.to_parquet(f\"{model.name}.parquet\", index=False)\n",
" except Exception:\n",
" pass\n"
" pass"
]
},
{
Expand All @@ -97,7 +95,7 @@
"\n",
"stabilities = np.array(stabilities)\n",
"\n",
"(stabilities == True).sum(), (stabilities == False).sum(), (stabilities == None).sum()"
"(stabilities).sum(), (not stabilities).sum(), (stabilities is None).sum()"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
import json
from pathlib import Path

path = Path('benchmarks/c2db/analysis.ipynb')
print('exists', path.exists(), 'size', path.stat().st_size)
nb = json.loads(path.read_text())

for i, cell in enumerate(nb.get('cells', [])):
    src = ''.join(cell.get('source', []))
    if 'stabilities' in src or 'None' in src or 'confusion' in src or 'f1' in src:
        print(f'\n--- cell {i} ({cell.get("cell_type")}) ---')
        print(src)
PY

Repository: atomind-ai/mlip-arena

Length of output: 7572


Fix the NumPy mask logic. not stabilities is invalid for an ndarray, and stabilities is None is a scalar check, so this can either raise immediately or collapse the filter to a single index. The same pattern in the confusion-matrix/F1 cells will also select the wrong rows.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@benchmarks/c2db/analysis.ipynb` at line 98, The mask logic in the analysis
notebook is incorrect because `not stabilities` is not valid for NumPy arrays
and `stabilities is None` is only a scalar check, so the row selection can fail
or collapse to a single value. Update the affected cells that build the
stability/confusion-matrix/F1 filters to use proper elementwise NumPy/pandas
masking on `stabilities` instead of Python boolean operators, and make sure the
expressions referenced by the stability-related summaries select rows by
per-element truth values rather than object identity.

]
},
{
Expand Down Expand Up @@ -142,11 +140,10 @@
"]\n",
"\n",
"with plt.style.context(\"default\"):\n",
"\n",
" SMALL_SIZE = 8\n",
" MEDIUM_SIZE = 10\n",
" BIGGER_SIZE = 12\n",
" \n",
"\n",
" plt.rcParams.update(\n",
" {\n",
" \"font.size\": SMALL_SIZE,\n",
Expand Down Expand Up @@ -179,33 +176,25 @@
" continue\n",
"\n",
" df = pd.read_parquet(fpath)\n",
" df[\"eigval_min\"] = df[\"eigenvalues\"].apply(\n",
" lambda x: x.min() if np.isreal(x).all() else thres\n",
" )\n",
" df[\"freq_min\"] = df[\"frequencies\"].apply(\n",
" lambda x: x.min() if np.isreal(x).all() else thres\n",
" )\n",
" df[\"dyn_stab\"] = ~np.logical_or(\n",
" df[\"eigval_min\"] < thres, df[\"freq_min\"] < thres\n",
" )\n",
" df[\"eigval_min\"] = df[\"eigenvalues\"].apply(lambda x: x.min() if np.isreal(x).all() else thres)\n",
" df[\"freq_min\"] = df[\"frequencies\"].apply(lambda x: x.min() if np.isreal(x).all() else thres)\n",
" df[\"dyn_stab\"] = ~np.logical_or(df[\"eigval_min\"] < thres, df[\"freq_min\"] < thres)\n",
"\n",
" arg = np.argsort(uids)\n",
" uids_sorted = np.array(uids)[arg]\n",
" stabilities_sorted = stabilities[arg]\n",
"\n",
" sorted_df = (\n",
" df[df[\"uid\"].isin(uids_sorted)].set_index(\"uid\").reindex(uids_sorted)\n",
" )\n",
" mask = ~(stabilities_sorted == None)\n",
" sorted_df = df[df[\"uid\"].isin(uids_sorted)].set_index(\"uid\").reindex(uids_sorted)\n",
" mask = ~(stabilities_sorted is None)\n",
"\n",
" y_true = stabilities_sorted[mask].astype(\"int\")\n",
" y_pred = sorted_df[\"dyn_stab\"][mask].fillna(-1).astype(\"int\")\n",
Comment on lines +188 to 191

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

python3 - <<'PY'
import json, pathlib, re

path = pathlib.Path("benchmarks/c2db/analysis.ipynb")
nb = json.loads(path.read_text())

for i, cell in enumerate(nb.get("cells", [])):
    if cell.get("cell_type") != "code":
        continue
    src = "".join(cell.get("source", []))
    if "stabilities_sorted" in src or "stabilities" in src:
        print(f"\n=== cell {i} ===")
        for j, line in enumerate(src.splitlines(), 1):
            if "stabilities_sorted" in line or "stabilities" in line or "mask =" in line:
                print(f"{j:03d}: {line}")
PY

Repository: atomind-ai/mlip-arena

Length of output: 767


🏁 Script executed:

python3 - <<'PY'
import json, pathlib
path = pathlib.Path("benchmarks/c2db/analysis.ipynb")
nb = json.loads(path.read_text())

for idx in [4, 5]:
    cell = nb["cells"][idx]
    print(f"\n=== cell {idx} ===")
    for j, line in enumerate("".join(cell.get("source", [])).splitlines(), 1):
        print(f"{j:03d}: {line}")
PY

Repository: atomind-ai/mlip-arena

Length of output: 6197


Use a real boolean mask here. stabilities_sorted is None / stabilities is None is always False for these NumPy arrays, so ~False becomes -1 and the metric code ends up indexing a single row instead of filtering. Remove the mask or replace it with an elementwise missing-value check; same issue in the second block.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@benchmarks/c2db/analysis.ipynb` around lines 188 - 191, The mask logic in the
benchmarking notebook is using identity checks (`stabilities_sorted is None` /
`stabilities is None`) that always evaluate to a scalar, so the subsequent `~`
produces the wrong index behavior. Update the metric preparation in the blocks
around `y_true`/`y_pred` to use a real elementwise boolean filter or remove the
mask entirely if it is not needed, and make the same correction in the second
matching block that uses `stabilities`.

" cm = confusion_matrix(y_true, y_pred, labels=[1, 0, -1])\n",
"\n",
" ax = axs[plot_idx]\n",
" ConfusionMatrixDisplay(\n",
" cm, display_labels=[\"stable\", \"unstable\", \"missing\"]\n",
" ).plot(ax=ax, cmap=\"Blues\", colorbar=False)\n",
" ConfusionMatrixDisplay(cm, display_labels=[\"stable\", \"unstable\", \"missing\"]).plot(\n",
" ax=ax, cmap=\"Blues\", colorbar=False\n",
" )\n",
"\n",
" ax.set_title(model.name)\n",
" ax.set_xlabel(\"Predicted\")\n",
Expand All @@ -223,7 +212,7 @@
"\n",
" # plt.tight_layout()\n",
" plt.savefig(\"c2db-confusion_matrices.pdf\", bbox_inches=\"tight\")\n",
" plt.show()\n"
" plt.show()"
]
},
{
Expand All @@ -250,12 +239,8 @@
" continue\n",
" df = pd.read_parquet(fpath)\n",
"\n",
" df[\"eigval_min\"] = df[\"eigenvalues\"].apply(\n",
" lambda x: x.min() if np.isreal(x).all() else thres\n",
" )\n",
" df[\"freq_min\"] = df[\"frequencies\"].apply(\n",
" lambda x: x.min() if np.isreal(x).all() else thres\n",
" )\n",
" df[\"eigval_min\"] = df[\"eigenvalues\"].apply(lambda x: x.min() if np.isreal(x).all() else thres)\n",
" df[\"freq_min\"] = df[\"frequencies\"].apply(lambda x: x.min() if np.isreal(x).all() else thres)\n",
" df[\"dyn_stab\"] = ~np.logical_or(df[\"eigval_min\"] < thres, df[\"freq_min\"] < thres)\n",
"\n",
" arg = np.argsort(uids)\n",
Expand All @@ -269,7 +254,7 @@
"\n",
" sorted_df = sorted_df.loc[uids]\n",
" # mask = ~np.logical_or(sorted_df['dyn_stab'].isna().values, stabilities == None)\n",
" mask = ~(stabilities == None)\n",
" mask = ~(stabilities is None)\n",
"\n",
" y_true = stabilities[mask].astype(\"int\")\n",
" y_pred = sorted_df[\"dyn_stab\"][mask].fillna(-1).astype(\"int\")\n",
Expand Down Expand Up @@ -361,9 +346,7 @@
"\n",
" # Plot each metric with assigned color\n",
" for metric, pos in positions.items():\n",
" ax.bar(\n",
" pos, summary_df[metric], width=bar_width, label=metric, color=colors[metric]\n",
" )\n",
" ax.bar(pos, summary_df[metric], width=bar_width, label=metric, color=colors[metric])\n",
"\n",
" ax.set_xlabel(\"Model\")\n",
" ax.set_ylabel(\"F1 Score\")\n",
Expand Down
15 changes: 11 additions & 4 deletions benchmarks/combustion/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
# MD reactivity with hydrogen combustion (A.7)
# MD Reactivity with Hydrogen Combustion (A.7)

The workflow and analysis are defined in a single Prefect flow, which can be imported by
The workflow and analysis are defined in a single Prefect flow, which can be imported by:

```python
from mlip_arena.tasks.combustion.flow import hydrogen_combustion
from mlip_arena.flows.combustion import hydrogen_combustion

# Run the flow
hydrogen_combustion(
run_dir=run_dir,
calculator=model, # MLIPEnum name, model name string, or ASE calculator object
)
```
. See [run.ipynb](./run.ipynb) for detials.

See the [run.ipynb](./run.ipynb) notebook for details.
Comment on lines 5 to +15

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Make the example self-contained.

run_dir and model are both referenced but never introduced here, so the snippet won’t run as written. Add the missing setup or replace them with explicit example values.

🛠 Suggested fix
+from pathlib import Path
+
+run_dir = Path("./combustion")
+model = "NequIP-OAM-L"
+
 from mlip_arena.flows.combustion import hydrogen_combustion
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@benchmarks/combustion/README.md` around lines 5 - 15, The example code in the
combustion README references undefined variables run_dir and model without
defining them first, making the snippet non-runnable. Add variable
initialization before the hydrogen_combustion function call to make the example
self-contained. Either define run_dir as a directory path string and model as an
MLIPEnum name or model name string, or replace these undefined references with
explicit example values that demonstrate proper usage.

3 changes: 3 additions & 0 deletions benchmarks/combustion/nequip/NequIP-OAM-L_H256O128.json
Git LFS file not shown
6 changes: 3 additions & 3 deletions benchmarks/combustion/run.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@
"from pathlib import Path\n",
"\n",
"from mlip_arena.models import REGISTRY\n",
"from mlip_arena.tasks.combustion.flow import hydrogen_combustion\n",
"from mlip_arena.flows.combustion import hydrogen_combustion\n",
"\n",
"model = \"MACE-MPA\"\n",
"run_dir = Path(\".\").parent / REGISTRY[model][\"family\"]\n",
"\n",
"hydrogen_combustion.with_options(persist_result=True)(\n",
" model=model, # can be MLIPEnum name or ASE calculator object\n",
" run_dir=run_dir,\n",
" calculator=model, # can be MLIPEnum name or ASE calculator object\n",
")"
]
},
Expand Down Expand Up @@ -96,7 +96,7 @@
" persist_result=True,\n",
" task_runner=DaskTaskRunner(address=client.scheduler.address),\n",
" log_prints=True,\n",
")(model=model, run_dir=run_dir)"
")(run_dir=run_dir, calculator=model)"
]
}
],
Expand Down
2 changes: 1 addition & 1 deletion benchmarks/diatomics/run.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"homonuclear_diatomics.with_options(\n",
" task_runner=ThreadPoolTaskRunner(max_workers=4),\n",
")(\n",
" model=\"NequIP-OAM-L\" # can be replaced with any other model name from mlip_arean.models.MLIPEnum or a custom ASE calculator instance\n",
" model=\"NequIP-OAM-L\" # can be replaced with any other model name from mlip_arean.models.MLIPEnum or a custom ASE calculator instance\n",
")"
]
},
Expand Down
Loading
Loading