{ "cells": [ { "cell_type": "markdown", "id": "dade1d90", "metadata": {}, "source": [ "# Argon density from MD: `xnn` vs the original NequIP\n", "\n", "This notebook computes the **mass density of liquid Argon** by running **NPT\n", "molecular dynamics through ASE** with a trained NequIP potential, and compares the\n", "`xnn` result against the **original** `nequip` package in **two complementary\n", "ways**:\n", "\n", "* **Track (a): same potential.** The trained original-NequIP weights are *copied*\n", " into the `xnn` model, so both codes represent the **identical** potential-energy\n", " surface. Any density difference then reflects only the `xnn`-vs-`nequip`\n", " inference / MD code path; it should be numerically zero. (Sections **3a/4a/5a**.)\n", "* **Track (b): independently trained.** `xnn` is trained **from scratch** on the\n", " same data with **no weight copying**, giving two *independent* potentials. Now we\n", " compare the density as two practitioners would if each fit their own model.\n", " (Sections **3b/4b/5b**.)\n", "\n", "Pipeline for each track: train → wrap in an **ASE calculator** (energy + forces +\n", "**stress**) → run **NPT** MD ($T=85$ K, $P=1$ bar) → measure $\\rho=M/V$.\n" ] }, { "cell_type": "markdown", "id": "01a20010", "metadata": {}, "source": [ "## 0. Setup\n", "\n", "Train in `float32` (speed); run MD in `float64` (smooth forces/stress). On the\n", "`nequip` side the float64 MD model is rebuilt with the `StressForceOutput`\n", "builder (stress via the autograd strain trick, the same convention as the xnn\n", "`ForceStressOutput`).\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "1eb0feb9", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:30:32.105619Z", "iopub.status.busy": "2026-07-20T05:30:32.105495Z", "iopub.status.idle": "2026-07-20T05:30:34.863003Z", "shell.execute_reply": "2026-07-20T05:30:34.861918Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "xnn: 0.1.0 | nequip (original): 0.6.2 | device: cuda\n" ] } ], "source": [ "# silence the expected warnings\n", "import logging\n", "import warnings\n", "\n", "logging.disable(logging.WARNING)\n", "warnings.filterwarnings(\"ignore\", category=UserWarning)\n", "warnings.filterwarnings(\n", " \"ignore\",\n", " category=FutureWarning,\n", " message=\"You are using `torch.load` with `weights_only=False`\",\n", ")\n", "\n", "import time\n", "import numpy as np\n", "import torch\n", "import matplotlib.pyplot as plt\n", "import ase.io\n", "import ase.units as u\n", "\n", "torch.set_default_dtype(torch.float32)\n", "torch.manual_seed(0)\n", "DEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", "CUTOFF, SPECIES = 6.0, [18]\n", "DATA = \"../../../datasets/argon_md\" # shared across the examples\n", "import xnn, nequip\n", "print(\"xnn:\", xnn.__version__, \"| nequip (original):\", nequip.__version__, \"| device:\", DEVICE)" ] }, { "cell_type": "markdown", "id": "134d142c", "metadata": {}, "source": [ "## 1. Load data and build both data pipelines\n", "\n", "As in notebook 02 we drop the few fully vaporised (edgeless) frames that the\n", "original `nequip` pipeline rejects, so both models train on exactly the same\n", "configurations.\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "fa366047", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:30:34.865585Z", "iopub.status.busy": "2026-07-20T05:30:34.865487Z", "iopub.status.idle": "2026-07-20T05:30:43.348005Z", "shell.execute_reply": "2026-07-20T05:30:43.347114Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "193 configs | E0={18: 0.0} | lambda=17.78 | train 174 / val 19\n" ] } ], "source": [ "from xnn.common.data import AtomicDataset, load_dataset\n", "from nequip.data import AtomicData\n", "from nequip.data.dataloader import DataLoader as NequipDataLoader\n", "from nequip.data.transforms import TypeMapper\n", "\n", "E0 = {18: 0.0} # argon isolated-atom reference energy\n", "train_structs = load_dataset(\"argon_md\", split=\"train\")\n", "ds_all = AtomicDataset(train_structs, CUTOFF)\n", "train_structs = [s for i, s in enumerate(train_structs) if ds_all[i].num_edges > 0]\n", "\n", "TM = TypeMapper(chemical_symbols=[\"Ar\"])\n", "xnn_train = AtomicDataset(train_structs, CUTOFF)\n", "LAMBDA = float(sum(xnn_train[i].num_edges for i in range(len(xnn_train))) /\n", " sum(xnn_train[i].num_nodes for i in range(len(xnn_train))))\n", "\n", "def to_nequip(s):\n", " d = AtomicData.from_points(\n", " pos=torch.tensor(s[\"pos\"], dtype=torch.get_default_dtype()), r_max=CUTOFF,\n", " atomic_numbers=torch.tensor(s[\"atomic_numbers\"]),\n", " cell=torch.tensor(s[\"cell\"], dtype=torch.get_default_dtype()),\n", " pbc=torch.tensor([True]*3),\n", " total_energy=torch.tensor([s[\"energy\"]], dtype=torch.get_default_dtype()),\n", " forces=torch.tensor(s[\"forces\"], dtype=torch.get_default_dtype()))\n", " return TM(d)\n", "nequip_train = [to_nequip(s) for s in train_structs]\n", "\n", "# one shared train/val split used by both models\n", "g = torch.Generator().manual_seed(0)\n", "perm = torch.randperm(len(train_structs), generator=g).tolist()\n", "n_val = max(1, int(0.1 * len(train_structs)))\n", "val_idx, train_idx = perm[:n_val], perm[n_val:]\n", "print(f\"{len(train_structs)} configs | E0={E0} | lambda={LAMBDA:.2f} | \"\n", " f\"train {len(train_idx)} / val {len(val_idx)}\")" ] }, { "cell_type": "markdown", "id": "28cd6257", "metadata": {}, "source": [ "## 2. Train the two models\n", "\n", "Both use the same architecture (2 layers, $\\ell_{\\max}=2$, parity on, 32 features),\n", "the same data/loss/optimiser/schedule and the same split. The original NequIP is\n", "trained with a native loop; `xnn` with `xnn.train.Trainer`.\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "df6db368", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:30:43.349694Z", "iopub.status.busy": "2026-07-20T05:30:43.349618Z", "iopub.status.idle": "2026-07-20T05:37:19.546409Z", "shell.execute_reply": "2026-07-20T05:37:19.545658Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "original NequIP trained 60 epochs in 198 s (final val 8.343e-04)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 0 | train loss 3.6288e-01 | val loss 3.7798e-02\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 1 | train loss 4.9241e-02 | val loss 1.5605e-02\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 2 | train loss 1.8588e-02 | val loss 4.4899e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 3 | train loss 9.5509e-03 | val loss 3.6420e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 4 | train loss 6.1855e-03 | val loss 2.7919e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 5 | train loss 5.2465e-03 | val loss 2.2140e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 6 | train loss 4.1427e-03 | val loss 1.9851e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 7 | train loss 3.6030e-03 | val loss 1.8246e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 8 | train loss 3.2110e-03 | val loss 1.6442e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 9 | train loss 3.1187e-03 | val loss 1.5455e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 10 | train loss 2.9046e-03 | val loss 1.4301e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 11 | train loss 2.3641e-03 | val loss 1.2929e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 12 | train loss 2.1076e-03 | val loss 1.1495e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 13 | train loss 2.0274e-03 | val loss 1.0907e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 14 | train loss 1.7220e-03 | val loss 1.0513e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 15 | train loss 1.5868e-03 | val loss 9.2525e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 16 | train loss 1.3331e-03 | val loss 8.8467e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 17 | train loss 1.3430e-03 | val loss 8.4702e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 18 | train loss 1.1285e-03 | val loss 7.3788e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 19 | train loss 1.1061e-03 | val loss 7.7804e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 20 | train loss 1.0787e-03 | val loss 8.8947e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 21 | train loss 1.1766e-03 | val loss 9.7970e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 22 | train loss 1.8866e-03 | val loss 2.1431e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 23 | train loss 3.4263e-03 | val loss 1.3791e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 24 | train loss 1.4766e-03 | val loss 9.2782e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 25 | train loss 1.1075e-03 | val loss 6.0596e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 26 | train loss 8.3735e-04 | val loss 5.7174e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 27 | train loss 7.2720e-04 | val loss 5.1935e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 28 | train loss 7.4156e-04 | val loss 5.0725e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 29 | train loss 6.6129e-04 | val loss 5.3169e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 30 | train loss 6.1436e-04 | val loss 4.6864e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 31 | train loss 6.7768e-04 | val loss 4.5371e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 32 | train loss 5.7206e-04 | val loss 4.2696e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 33 | train loss 5.6367e-04 | val loss 4.3627e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 34 | train loss 5.7012e-04 | val loss 4.5689e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 35 | train loss 5.1004e-04 | val loss 5.0294e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 36 | train loss 5.7943e-04 | val loss 4.9394e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 37 | train loss 5.5498e-04 | val loss 5.3048e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 38 | train loss 5.9436e-04 | val loss 4.6755e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 39 | train loss 5.0584e-04 | val loss 4.1662e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 40 | train loss 4.9227e-04 | val loss 4.8870e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 41 | train loss 5.1791e-04 | val loss 4.4306e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 42 | train loss 5.9441e-04 | val loss 5.3874e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 43 | train loss 6.0274e-04 | val loss 5.1357e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 44 | train loss 5.8813e-04 | val loss 3.7734e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 45 | train loss 5.5201e-04 | val loss 5.5437e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 46 | train loss 5.7821e-04 | val loss 3.9892e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 47 | train loss 4.6334e-04 | val loss 3.5020e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 48 | train loss 4.4652e-04 | val loss 3.5890e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 49 | train loss 4.2921e-04 | val loss 3.6605e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 50 | train loss 4.2998e-04 | val loss 3.5059e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 51 | train loss 4.2649e-04 | val loss 3.3998e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 52 | train loss 4.3563e-04 | val loss 4.0290e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 53 | train loss 5.3040e-04 | val loss 4.2361e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 54 | train loss 4.7765e-04 | val loss 4.3638e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 55 | train loss 5.4106e-04 | val loss 3.9131e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 56 | train loss 4.7348e-04 | val loss 4.0023e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 57 | train loss 7.9512e-04 | val loss 1.3709e-03\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 58 | train loss 9.3599e-04 | val loss 5.8063e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "epoch 59 | train loss 6.0065e-04 | val loss 4.0889e-04\n", "xnn (independent) trained 60 epochs in 196 s\n" ] } ], "source": [ "from nequip.model import model_from_config\n", "from xnn.common.config import from_dict\n", "from xnn.common.train import Trainer\n", "from torch.utils.data import Subset\n", "\n", "HP = dict(r_max=CUTOFF, num_layers=2, l_max=2, parity=True, num_features=32,\n", " num_basis=8, PolynomialCutoff_p=6, invariant_layers=2, invariant_neurons=64,\n", " avg_num_neighbors=LAMBDA, use_sc=True, resnet=False)\n", "EW, FW, LR, WD, BS, EPOCHS = 1.0, 100.0, 0.01, 5e-7, 10, 60\n", "\n", "# ---------- 2.1 train the ORIGINAL NequIP (native loop) ----------\n", "torch.manual_seed(0)\n", "nequip_model = model_from_config(dict(\n", " model_builders=[\"SimpleIrrepsConfig\", \"EnergyModel\", \"PerSpeciesRescale\", \"ForceOutput\"],\n", " chemical_symbols=[\"Ar\"], per_species_rescale_shifts=[E0[18]],\n", " per_species_rescale_scales=[1.0], **HP), initialize=True).to(DEVICE)\n", "\n", "tr_loader = NequipDataLoader([nequip_train[i] for i in train_idx], batch_size=BS, shuffle=True)\n", "va_loader = NequipDataLoader([nequip_train[i] for i in val_idx], batch_size=BS, shuffle=False)\n", "opt = torch.optim.Adam(nequip_model.parameters(), lr=LR, weight_decay=WD)\n", "sched = torch.optim.lr_scheduler.ReduceLROnPlateau(opt, patience=10)\n", "def nequip_loss(out, b):\n", " n = (b.ptr[1:] - b.ptr[:-1]).to(out[\"total_energy\"].dtype)\n", " return EW * (((out[\"total_energy\"].squeeze(-1) - b.total_energy.squeeze(-1)) / n) ** 2).mean() \\\n", " + FW * ((out[\"forces\"] - b.forces) ** 2).mean()\n", "\n", "t0 = time.time()\n", "for epoch in range(EPOCHS):\n", " nequip_model.train()\n", " for b in tr_loader:\n", " b = b.to(DEVICE)\n", " loss = nequip_loss(nequip_model(AtomicData.to_AtomicDataDict(b)), b)\n", " opt.zero_grad(); loss.backward(); opt.step()\n", " nequip_model.eval(); vl = 0.0\n", " for b in va_loader:\n", " b = b.to(DEVICE)\n", " vl += float(nequip_loss(nequip_model(AtomicData.to_AtomicDataDict(b)), b))\n", " sched.step(vl / len(va_loader))\n", "print(f\"original NequIP trained {EPOCHS} epochs in {time.time()-t0:.0f} s \"\n", " f\"(final val {vl/len(va_loader):.3e})\")\n", "\n", "# ---------- 2.2 train xnn INDEPENDENTLY (Trainer) ----------\n", "# non-default flags only; everything else = stock NequIP defaults (configs/model/nequip.yaml)\n", "core = from_dict({\n", " \"model\": {\"name\": \"nequip\", \"cutoff\": CUTOFF, \"n_features\": HP[\"num_features\"],\n", " \"n_interactions\": HP[\"num_layers\"], \"species\": SPECIES, \"l_max\": HP[\"l_max\"],\n", " \"avg_num_neighbors\": LAMBDA, \"atomic_energies\": [E0[18]]},\n", " \"data\": {\"batch_size\": BS},\n", " \"optim\": {\"lr\": LR, \"weight_decay\": WD, \"epochs\": EPOCHS, \"energy_weight\": EW,\n", " \"force_weight\": FW, \"scheduler\": \"plateau\"},\n", " \"device\": DEVICE, \"seed\": 0, \"output_dir\": \"runs/argon_md_indep\",\n", "})\n", "t0 = time.time()\n", "trainer = Trainer(core, Subset(xnn_train, train_idx), Subset(xnn_train, val_idx))\n", "trainer.fit()\n", "print(f\"xnn (independent) trained {EPOCHS} epochs in {time.time()-t0:.0f} s\")\n", "xnn_indep_base = trainer.model.model # independently trained xnn NequIP" ] }, { "cell_type": "markdown", "id": "97b307cc", "metadata": {}, "source": [ "### Common MD utilities\n", "\n", "Switch to `float64` for the dynamics. The trained original-NequIP weights are\n", "loaded into a fresh **float64** model built with `StressForceOutput` (adds the\n", "stress needed by the barostat; the energy/force weights are unchanged). We define\n", "the ASE calculators, the NPT driver and the density helper used by both tracks.\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "6fdbfa17", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:37:19.548291Z", "iopub.status.busy": "2026-07-20T05:37:19.548213Z", "iopub.status.idle": "2026-07-20T05:37:20.409365Z", "shell.execute_reply": "2026-07-20T05:37:20.408357Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "initial density = 1.7910 g/cm³ | target T=85.0 K, P=1.0 bar | exp ~1.41 g/cm³\n" ] } ], "source": [ "torch.set_default_dtype(torch.float64)\n", "from xnn.common.models import build_model, ForceStressOutput\n", "from ase import Atoms\n", "from ase.calculators.calculator import Calculator, all_changes\n", "from ase.md.nptberendsen import NPTBerendsen\n", "from ase.md.velocitydistribution import MaxwellBoltzmannDistribution, Stationary\n", "from xnn.common.deploy import XNNCalculator\n", "\n", "# rebuild the original model in float64 with stress output, and load the weights\n", "nequip_md_model = model_from_config(dict(\n", " model_builders=[\"SimpleIrrepsConfig\", \"EnergyModel\", \"PerSpeciesRescale\", \"StressForceOutput\"],\n", " chemical_symbols=[\"Ar\"], per_species_rescale_shifts=[E0[18]],\n", " per_species_rescale_scales=[1.0], **HP), initialize=True)\n", "sd = {k: v.double() for k, v in nequip_model.state_dict().items()}\n", "nequip_md_model.load_state_dict(sd, strict=False) # only misses a dummy buffer\n", "nequip_md_model = nequip_md_model.to(DEVICE).eval()\n", "\n", "xnn_indep_base = xnn_indep_base.double().eval()\n", "\n", "class NequIPASECalculator(Calculator):\n", " '''Minimal ASE calculator wrapping an in-memory original-NequIP model.'''\n", " implemented_properties = [\"energy\", \"forces\", \"stress\"]\n", " def __init__(self, model, cutoff, device=\"cuda\", **kw):\n", " super().__init__(**kw); self.model, self.cutoff, self.device = model, cutoff, device\n", " def calculate(self, atoms=None, properties=(\"energy\",), system_changes=all_changes):\n", " super().calculate(atoms, properties, system_changes)\n", " # atoms.copy() drops this calculator (nequip's from_ase rejects unknown calcs)\n", " d = TM(AtomicData.from_ase(atoms.copy(), r_max=self.cutoff))\n", " b = next(iter(NequipDataLoader([d], batch_size=1))).to(self.device)\n", " out = self.model(AtomicData.to_AtomicDataDict(b))\n", " self.results[\"energy\"] = float(out[\"total_energy\"].sum().detach())\n", " self.results[\"forces\"] = out[\"forces\"].detach().cpu().numpy()\n", " s = out[\"stress\"][0].detach().cpu().numpy()\n", " self.results[\"stress\"] = np.array([s[0,0], s[1,1], s[2,2], s[1,2], s[0,2], s[0,1]])\n", "\n", "T_K, P_BAR, DT = 85.0, 1.0, 5 * u.fs\n", "N_EQUIL, N_PROD = 300, 700\n", "AMU_A3_TO_G_CM3 = 1.6605390666\n", "a0 = train_structs[0] # dense initial configuration (400 atoms)\n", "\n", "def density(atoms):\n", " return atoms.get_masses().sum() / atoms.get_volume() * AMU_A3_TO_G_CM3\n", "\n", "def compare_calcs(make_x, make_n):\n", " at = Atoms(numbers=a0[\"atomic_numbers\"], positions=a0[\"pos\"], cell=a0[\"cell\"], pbc=True)\n", " ax = at.copy(); ax.calc = make_x(); an = at.copy(); an.calc = make_n()\n", " return (abs(ax.get_potential_energy() - an.get_potential_energy()),\n", " np.abs(ax.get_forces() - an.get_forces()).max(),\n", " np.abs(ax.get_stress() - an.get_stress()).max())\n", "\n", "def run_npt(make_calc, label):\n", " at = Atoms(numbers=a0[\"atomic_numbers\"], positions=a0[\"pos\"], cell=a0[\"cell\"], pbc=True)\n", " at.calc = make_calc()\n", " MaxwellBoltzmannDistribution(at, temperature_K=T_K, rng=np.random.default_rng(0)); Stationary(at)\n", " dyn = NPTBerendsen(at, timestep=DT, temperature_K=T_K, pressure_au=P_BAR * u.bar,\n", " taut=100 * u.fs, taup=1000 * u.fs, compressibility_au=2e-4 / u.bar)\n", " rho = np.empty(N_EQUIL + N_PROD); temp = np.empty_like(rho)\n", " t0 = time.time()\n", " for k in range(N_EQUIL + N_PROD):\n", " dyn.run(1); rho[k] = density(at); temp[k] = at.get_temperature()\n", " print(f\"{label}: {N_EQUIL+N_PROD} steps in {time.time()-t0:.0f} s | \"\n", " f\"rho_eq = {rho[N_EQUIL:].mean():.4f} g/cm³\")\n", " return rho, temp\n", "\n", "rho0 = density(Atoms(numbers=a0[\"atomic_numbers\"], positions=a0[\"pos\"], cell=a0[\"cell\"], pbc=True))\n", "RHO_EXP = 1.41\n", "print(f\"initial density = {rho0:.4f} g/cm³ | target T={T_K} K, P={P_BAR} bar | exp ~{RHO_EXP} g/cm³\")" ] }, { "cell_type": "markdown", "id": "6ac4e991", "metadata": {}, "source": [ "# Track (a): same potential (weights copied NequIP → xnn)\n", "\n", "## 3a. Copy the trained original-NequIP weights into `xnn`\n", "\n", "Every learnable weight of the trained original NequIP (Bessel frequencies,\n", "chemical embedding, both conv layers, the two readout linears, and the\n", "per-species scale/shift) is copied into a fresh `xnn` NequIP, so both codes\n", "carry the **identical** potential. We then confirm the two ASE calculators return\n", "the same energy, forces and stress to machine precision.\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "af050a3d", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:37:20.411551Z", "iopub.status.busy": "2026-07-20T05:37:20.411475Z", "iopub.status.idle": "2026-07-20T05:37:22.215033Z", "shell.execute_reply": "2026-07-20T05:37:22.214278Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "track (a) calculators on one Argon config (SAME potential):\n", " dE = 1.78e-15 eV | dF = 4.44e-16 eV/Å | dσ = 2.17e-17 eV/ų -> identical\n" ] } ], "source": [ "def copy_nequip_into_xnn(xbase, nq_model, n_layers):\n", " seq = nq_model.model.func\n", " with torch.no_grad():\n", " xbase.edge_feat.rbf.freqs.copy_(seq.radial_basis.basis.bessel_weights)\n", " xbase.chemical_embedding.load_state_dict(\n", " {k: v.to(xbase.atom_ref.weight.dtype)\n", " for k, v in seq.chemical_embedding.linear.state_dict().items()})\n", " for i in range(n_layers):\n", " sd = {k: v.to(xbase.atom_ref.weight.dtype)\n", " for k, v in getattr(seq, f\"layer{i}_convnet\").conv.state_dict().items()}\n", " xbase.layers[i].conv.load_state_dict(sd)\n", " xbase.conv_to_output_hidden.load_state_dict(\n", " {k: v.double() for k, v in seq.conv_to_output_hidden.linear.state_dict().items()})\n", " xbase.output_hidden_to_scalar.load_state_dict(\n", " {k: v.double() for k, v in seq.output_hidden_to_scalar.linear.state_dict().items()})\n", " psr = seq.per_species_rescale\n", " for k, z in enumerate(SPECIES):\n", " xbase.atom_ref.weight[z] = float(psr.shifts[k])\n", " xbase.atom_scale[z] = float(psr.scales[k])\n", "\n", "xnn_shared_base = build_model(core.model) # fresh xnn model (float64)\n", "copy_nequip_into_xnn(xnn_shared_base, nequip_md_model, HP[\"num_layers\"])\n", "xnn_shared = ForceStressOutput(xnn_shared_base, compute_forces=True,\n", " compute_stress=True).to(DEVICE).double().eval()\n", "\n", "def xnn_a(): return XNNCalculator(xnn_shared, cutoff=CUTOFF, device=DEVICE)\n", "def nequip_a(): return NequIPASECalculator(nequip_md_model, CUTOFF, DEVICE)\n", "\n", "dE, dF, dS = compare_calcs(xnn_a, nequip_a)\n", "print(\"track (a) calculators on one Argon config (SAME potential):\")\n", "print(f\" dE = {dE:.2e} eV | dF = {dF:.2e} eV/Å | dσ = {dS:.2e} eV/ų -> identical\")" ] }, { "cell_type": "markdown", "id": "a579e0b9", "metadata": {}, "source": [ "## 4a. NPT MD: same potential through both codes\n", "\n", "Same initial positions and velocities; the only difference is the calculator.\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "98881a14", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:37:22.216907Z", "iopub.status.busy": "2026-07-20T05:37:22.216830Z", "iopub.status.idle": "2026-07-20T05:41:00.735352Z", "shell.execute_reply": "2026-07-20T05:41:00.734423Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_1120725/3128521420.py:54: DeprecationWarning: Use thermalize_momenta\n", " MaxwellBoltzmannDistribution(at, temperature_K=T_K, rng=np.random.default_rng(0)); Stationary(at)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "xnn (a): 1000 steps in 121 s | rho_eq = 1.4557 g/cm³\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "nequip (a): 1000 steps in 98 s | rho_eq = 1.4557 g/cm³\n" ] } ], "source": [ "rho_xa, T_xa = run_npt(xnn_a, \"xnn (a)\")\n", "rho_na, T_na = run_npt(nequip_a, \"nequip (a)\")" ] }, { "cell_type": "markdown", "id": "9849fbf9", "metadata": {}, "source": [ "## 5a. Result (a): the densities are identical\n", "\n", "Because both calculators evaluate the same PES, the equilibrium densities agree to\n", "numerical noise; the trajectories overlap until chaotic float divergence.\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "1b40184d", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:41:00.737773Z", "iopub.status.busy": "2026-07-20T05:41:00.737651Z", "iopub.status.idle": "2026-07-20T05:41:00.741490Z", "shell.execute_reply": "2026-07-20T05:41:00.740737Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "track (a) rho_xnn = 1.4557 rho_nequip = 1.4557 |diff| = 6.88e-15 g/cm³\n" ] } ], "source": [ "da_x, da_n = rho_xa[N_EQUIL:].mean(), rho_na[N_EQUIL:].mean()\n", "print(f\"track (a) rho_xnn = {da_x:.4f} rho_nequip = {da_n:.4f} \"\n", " f\"|diff| = {abs(da_x-da_n):.2e} g/cm³\")" ] }, { "cell_type": "markdown", "id": "65d9175b", "metadata": {}, "source": [ "# Track (b): independently trained models (no weight copying)\n", "\n", "## 3b. Two independent potentials\n", "\n", "Here `xnn` is the model trained from scratch in Section 2.2 (**never** copied\n", "from NequIP), and NequIP is its independently trained counterpart. The two\n", "calculators now differ at the level of independent training (small, not machine\n", "precision).\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "aa57fdb2", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:41:00.743601Z", "iopub.status.busy": "2026-07-20T05:41:00.743390Z", "iopub.status.idle": "2026-07-20T05:41:00.860457Z", "shell.execute_reply": "2026-07-20T05:41:00.859594Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "track (b) calculators on one Argon config (INDEPENDENT models):\n", " dE = 2.662e+00 eV | dF = 1.036e-01 eV/Å | dσ = 3.787e-04 eV/ų (training-level differences)\n" ] } ], "source": [ "xnn_indep = ForceStressOutput(xnn_indep_base, compute_forces=True,\n", " compute_stress=True).to(DEVICE).double().eval()\n", "\n", "def xnn_b(): return XNNCalculator(xnn_indep, cutoff=CUTOFF, device=DEVICE)\n", "def nequip_b(): return NequIPASECalculator(nequip_md_model, CUTOFF, DEVICE)\n", "\n", "dE, dF, dS = compare_calcs(xnn_b, nequip_b)\n", "print(\"track (b) calculators on one Argon config (INDEPENDENT models):\")\n", "print(f\" dE = {dE:.3e} eV | dF = {dF:.3e} eV/Å | dσ = {dS:.3e} eV/ų \"\n", " \"(training-level differences)\")" ] }, { "cell_type": "markdown", "id": "e6c24c72", "metadata": {}, "source": [ "## 4b. NPT MD: two independent potentials\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "8a49cdf4", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:41:00.861871Z", "iopub.status.busy": "2026-07-20T05:41:00.861790Z", "iopub.status.idle": "2026-07-20T05:44:29.799250Z", "shell.execute_reply": "2026-07-20T05:44:29.798246Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_1120725/3128521420.py:54: DeprecationWarning: Use thermalize_momenta\n", " MaxwellBoltzmannDistribution(at, temperature_K=T_K, rng=np.random.default_rng(0)); Stationary(at)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "xnn (b): 1000 steps in 114 s | rho_eq = 1.4330 g/cm³\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "nequip (b): 1000 steps in 95 s | rho_eq = 1.4557 g/cm³\n" ] } ], "source": [ "rho_xb, T_xb = run_npt(xnn_b, \"xnn (b)\")\n", "rho_nb, T_nb = run_npt(nequip_b, \"nequip (b)\")" ] }, { "cell_type": "markdown", "id": "bcd85b9c", "metadata": {}, "source": [ "## 5b. Result (b): two independent density predictions\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "f8853b82", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:44:29.801628Z", "iopub.status.busy": "2026-07-20T05:44:29.801548Z", "iopub.status.idle": "2026-07-20T05:44:29.805407Z", "shell.execute_reply": "2026-07-20T05:44:29.804765Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "track (b) rho_xnn = 1.4330 ± 0.010 rho_nequip = 1.4557 ± 0.004\n", " |diff| = 2.27e-02 g/cm³ (within thermal fluctuations; exp ~1.41)\n" ] } ], "source": [ "db_x, db_n = rho_xb[N_EQUIL:].mean(), rho_nb[N_EQUIL:].mean()\n", "sb_x, sb_n = rho_xb[N_EQUIL:].std(), rho_nb[N_EQUIL:].std()\n", "print(f\"track (b) rho_xnn = {db_x:.4f} ± {sb_x:.3f} rho_nequip = {db_n:.4f} ± {sb_n:.3f}\")\n", "print(f\" |diff| = {abs(db_x-db_n):.2e} g/cm³ \"\n", " f\"(within thermal fluctuations; exp ~{RHO_EXP})\")" ] }, { "cell_type": "markdown", "id": "99da642e", "metadata": {}, "source": [ "## 6. Overview: both tracks\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "44e952a6", "metadata": { "execution": { "iopub.execute_input": "2026-07-20T05:44:29.807908Z", "iopub.status.busy": "2026-07-20T05:44:29.807797Z", "iopub.status.idle": "2026-07-20T05:44:30.378072Z", "shell.execute_reply": "2026-07-20T05:44:30.377168Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAGuCAYAAABBQrUvAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAA4gBJREFUeJzs3Xd4U+X7BvA7o02TjnTTlg52QcoG2UM2MpVRUBBEREARUBy4APELKKi4RfYUUJStIBuByt4bWlqg0L138/7+6K+R2JW2aU/S3J/r6iU98z5J2zw+55z3yIQQAkRERERERERERJVILnUAIiIiIiIiIiKyPmxKERERERERERFRpWNTioiIiIiIiIiIKh2bUkREREREREREVOnYlCIiIiIiIiIiokrHphQREREREREREVU6NqWIiIiIiIiIiKjSsSlFRERERERERESVjk0pIiIiIiIiIiKqdGxKUZWQm5uLhg0bYubMmaVeNzs7G7Vr18b8+fMrIBlJzdfXF2PGjKn0dTds2ACZTIaEhIQyrW8p+yQiqop69eqF0aNHG0wLCgpCv379jFq/U6dOmDBhgtH769ChA7p06VKaiEYZPnw4atSoYfLtSskcjqmi3q+KInXe8rxnISEhkMlkOHfunEkzmds+iawZm1JUJSxevBiRkZF44403Sr2ujY0NPvroI8ydOxePHj2qgHTWx93dHePGjauy+zOVJ554AjKZDAsWLJA6SpGysrKwcOFCNG7cGBqNBrVr18b777+P5OTkEtfNzc3FggULUL9+fahUKlSrVg1jx46tkN+zhIQErFy5En369IGtrS1kMhlycnIKXXbIkCGQyWQFvtzd3U2eK9+GDRugUCgQFRVVYfv4r4ULF0Imk0Eul8PPzw+fffZZpe2byJLt2rUL+/fvx0cffVTmbcyZMwdLly7FxYsXTZiMKlPLli3RvXv3KrevqqhPnz6QyWR49dVXpY5SqH/++Qfjxo1DYGAgNBoN6tWrh1dffRUPHz40av0HDx5g5syZaNq0Kezt7eHj44PevXvjr7/+qpC8ly5dQt++feHk5ARHR0f06NEDp0+fLrBceY+rLPIbhoXlqSi//vqrvlasVq0apk+fDp1OV2n7twZsSpHF0+l0+PTTTzFq1ChotdoybWPEiBGwsbHBt99+a+J0JLV79+5h5cqVUsco4OjRo7h6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sX37duTk5Oin79mzB1euXMHhw4exatUqAICbmxscHR31y5w9exYrVqzA1atXsWfPHly7dq3AcvnbOXLkCJYvX47w8HD9+kePHsWiRYvw3XffYffu3aUqEJ955hnMnTsXaWmF3yZ/7949rF27FuvXr0dcXJzBvPPnzxeae/v27QaX9u/evRs3bhT+FN2nnnoKixYtwtatW/H000/rX6OqSK3IRXv5RWQnRkodhYioyhFCYM+ePVi2bBnOnz9vMG/RokVITEzEr7/+iuPHjwMAAgICIJPJAOTdcrVlyxZs3LgRiYmJBrd0Pb7cokWLkJSUhE2bNuGXX34xuPppyZIlWLRoEZYtW6b/PDRW79698cknnxQ5/9ixY1iyZAn++usvg8/4onJnZmZi8eLFBq/Nt99+W+T233nnHXz77bc4duwYDh8+jOvXrxe63K+//oqnn35a/72xr81/cxp7fIsWLUJCQgI2btyIrVu3Frgqq7j1KiJLYdvctm0bhBD4+uuvsWjRImRnZ6NLly44cuSIyU8ssikloaEpa9E3ZpnUMaiKiI2NxerVq/WXrBIRldfmzZvRrl07HDlyBJ988gk6d+6sb0ytX78ew4YNw+eff65v1Dx+S9369evRs2dP/P333xg7dixee+01nDp1qtDlRowYgc8//xx79+5F8+bN9WdV4+PjERYWhmvXrmHOnDl47rnnjM7eqFEjdO3aFYsWLSowb+/evejRowcOHTqEnTt3okmTJrh79y4AYOPGjejWrRuOHDmCF1980SD3smXLcPnyZf121qxZgzNnzpSYxd7eHllZWUZntzQaWTbW2c6D6kGI1FGoimBNQ/SvwYMHY/r06Th27Bh69uyJ7777Tj9v2rRpGDhwIHbv3q2/Le7xW+r69++PTz75BLt370a/fv0Mbul6fLlp06Zh0KBB2LNnDz799FOMHj1av1xERATCwsIQEhKCHj16YOfOnUZnnzFjBjZu3IiwsLAC8yZMmIAZM2bg7NmzmD17NoYNG6afN2jQIHz88ccFcqenp+P999/XL5ebm4vp06eXmMPOzg4KhaLIz+JTp06hUaNG+u+NfW3+m9PY45s2bRr69++PPXv2YNasWRg8eLDR61VElsK2+ejRIwghcPfuXYSFhUEIAYVCgcDAQKNqn9Lg0/cklKtQQ5VdsItJVBZyuRz29vaQy9lr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Zs2axcSJEykqKqJfv37ce++9pKenhzusiLN06VJuvfXW/bafe+653H///WGIKHLtvVryQyNGjOCRRx4JQ0SRKxQK8c9//pNPPvmE8vJyOnbsyBVXXKFG5y3AihUruPHGG/n3v/8dsYWQcFqwYAGvv/46W7duJScnh3HjxnHmmWeGO6ywCgQCvPjii3z22WfY7XYuuOACxo8fj8ViCXdoEeexxx7jk08+2W/7Cy+8wIknnhiGiCLTli1buOKKKw5431NPPcWpp57azBFFtqKiIl588UUWLVpEdHQ0J5xwAjfeeKP+39UCPPnkk2zbto2JEyeGO5SIEwgEePPNN5k2bRo+n4/evXtz6623hjW3VFFKRERERERERESanVbfExERERERERGRZqeilIiIiIiIiIiINDsVpUREREREREREpNmpKCUiIiIiIiIiIs1ORSkREREREREREWl2KkqJiIiIiIiIiEizU1FKRERERERERESanT3cAYiINLfZs2cTExPDSSed1OzPPX36dMrKygA4//zziY6OPuZjzp8/n61btwIwYsQIMjIyjvmYIiIi0rL5/X7+85//cNZZZ5GUlNSsz11ZWcmnn34KQLt27Rg+fPgxH9MwDP79738DEBMTw3nnnXfMxxSRlk8jpUSkTZs1axZLly5ttO2ZZ57hjTfeCEs8999/P48//jhTpkyhrq6uSY65ePFipkyZwqWXXsqKFSua5JgiIiLScvh8PiZNmkRFRUXDtpqaGi699FI2bdrU7PHs2LGDSy+9lEmTJjFnzpwmOaZhGEyZMoXnnnuOm266qUmOKSItn4pSItKmPfnkk7z11luNtp1++ukMGDAgTBHRkMQlJyc3yfFuvvlmJk2a1CTHEhERkZbH4/Fw6aWXNoyMBnA6nYwbN67J8omj8fLLL/O73/2uSY5ltVqZNGkSN954Y5McT0RaB03fE5E269tvv2XXrl2EQqGGos3YsWMZPHgwMTExDY+bOXMmycnJ5ObmsnTpUnw+H2eccQZRUVGUlpYyb948EhISGDJkCHZ7449NwzBYvHgx+fn5dO7cmRNOOOGI49z7/Dk5OSxdupRgMMiwYcNwuVyNHrd+/XrWrVtHVlYW/fv3x2azHcVZERERkdbmww8/BGDatGmsXbuW1NRUzjjjDC644IKGqXt1dXVMnTqVsWPHUlhYyJo1a8jJyaF///4ArFixgs2bN9O7d2+6deu233NUVVUxb948QqEQ/fv3p127dkcU477Pv3v3btauXUuHDh32y40CgQDz58+noqKCfv36kZOTcxRnRETaChWlRKTNWrJkCYWFhdTU1DBlyhQAhg0bxjPPPEP79u0beko9+uijVFZWUlhYyAknnMCKFStwOp3ce++9PPLII/Tp04fvvvuO7t278+WXX2KxWAAoLCzk/PPPp6SkhN69e7N8+XK6du3KlClTcLvdhx3no48+Sm1tLTt27CAvL49169bhdDqZMWMGWVlZANx0001MmjSJ0047jaKiIqxWK1OnTiUtLa1pT5qIiIi0OHv7N82YMYPExES6devGwIEDufTSS1m4cCEDBw6ktLSUSy+9lDPOOIOSkhI6dOjAF198wQ033EBZWRnLly8nKyuLGTNmMHHiRK699tqG40+ZMoXx48eTl5dHbGws8+bN449//CO33XbbYce49/nPOecc1q9fT9euXZk1axbXXHMNL774IgC7du3ijDPOwOVy0aVLF1atWsVll13GH//4x6Y9YSLSaqgoJSJt1o033sjHH39M165def755w/52O3bt7N8+XIyMjIoLy8nNzeXBx98kGXLlpGSkkJhYSEdOnTg888/Z8yYMQBce+215OXl8eqrr2K1Wqmvr2fUqFE8+uijPPHEE0cU6+LFi1myZAl5eXl4vV5GjBjBfffdx1tvvcXOnTv529/+xurVq+nVq1fD45uqJ5WIiIi0bK+88goffvghTzzxRMPIp337S+2rU6dOzJgxA4vFwmuvvcavfvUrbrjhBpYtWwbA888/z+9///uGotT27du5/PLL+eijjxg5ciQAS5cu5dRTT2XUqFHk5eUdUaxer5fVq1fjdDpZvHgxgwcP5uKLL2b48OG8+eabpKSkMG/ePCwWC4Zh8NFHHx3dSRGRNkE9pUREgAsuuKBh1bqkpCR69uzJRRddREpKCgAZGRl06tSJ9evXA1BUVMQnn3xCt27d+OCDD3jvvfeYOnVqQyJ4pM4999yGpC8qKorbbruN9957D8MwcDqd2Gw2li9f3vD4AQMGkJube6wvW0RERNqYCRMmNIzqHjJkSMO2vYYMGUJBQQHV1dUATJo0icTERMrKynjvvfeYPHkyGzZsIDU1lW+++eaIn//222/H6XQCZr4yatSohlX1oqOjKS0tJT8/HwCLxcL5559/9C9WRFo9jZQSEYH9llJ2uVwH3Ob1egEaGo3OmzeP7777rtHjBg8efMTP37Fjx0Y/d+rUibq6OoqLi0lPT+fvf/87d955J3feeScjRozgyiuvbBixJSIiIrLXvvnL3v6UB9rm9Xpxu91s3bqVQCDA+++/3+g4Q4cOJT09/Yif/0A5zbZt2wC4/vrrWbJkCT169KBXr16ceeaZ3HLLLbRv3/6In0dE2gYVpUREjkJ8fDwAv/3tbzn11FOP+Xjl5eX7/Wyz2RqSyPHjx3PttdeyatUq/vvf/3Leeefx9ttv84tf/OKYn1tEREQiV3x8PPHx8U22ku+BcprU1FQAYmNj+b//+z9qa2uZM2cOL730EgMGDGDjxo3ExcU1yfOLSOui6Xsi0qa53e6G0U1NqUePHnTs2JGXX355v/t27tx5xMebNm1aozg/+OADBg0ahMPhoKKigtraWiwWC3369OG+++5j6NChzJ8//5heg4iIiLQOexdQOR45zdlnn82GDRv48ssvG22vrq7G4/Ec8fH2Li4D5op+n3/+OUOHDgW+z5FiYmI488wzeeGFFygqKmLLli1H/wJEpFXTSCkRadMGDhzI888/z2uvvYbb7Wbs2LFNclyLxcIbb7zBT3/6UyorKxk7dizl5eV88sknnHPOOdx7771HdLxAIMCoUaO48sor+e677/jHP/7B559/DpgJ3AUXXMDFF19Mjx49WLt2LXPnzuXBBx9sktciIiIiLVtUVBR5eXk89dRTXHTRRWRkZDBw4MAmOfbw4cO56aabOP/887n11lvp2rUr69ev54MPPuCTTz5pGB1+uN59911CoRC9e/fm9ddfJzMzk2uuuQaAV199la+//pqxY8eSnJzMu+++S58+fRoWchGRyKORUiLSpt12223ce++9zJs3jylTplBVVcXpp5/OgAEDGh4zYsQI+vXr12i/0aNH06dPn0bbzj77bHr27Nlov9WrVzNw4EDmzJlDRUUFjz322I8WpJYvX86kSZMarZ43fvx47rrrLlatWoXFYmH27NkMHz4cgLy8PGbNmkVCQgLffPMNFouFb7/9lmHDhgEwf/78JhtyLyIiIi3TRx99RLdu3fj000/5+uuvcTqdjBs3juTkZMAcfTRu3LhGRaS4uDjGjRtHbGxsw7akpCTGjRvX0FsK4KWXXuKDDz5omFaXlpbGnDlz6Nat2yFjmjp1KjNnzmy07X//+x85OTksWLCAn/zkJ8yePbuh8flDDz3EQw89xO7du5k3bx4//elPmT17Ng6HA8MwmDRpEt9+++2xnioRaUUshmEY4Q5CRCRS/O53v2PTpk0ATJw4keTkZEaPHs3AgQN54oknjuqYL730ErNmzQLg97///X7FNBEREZGmlJ+fz9133w1A3759+d3vfkd+fj45OTmsWbOm0UW8wxUKhbjssssASElJ4aWXXmrSmEWkZVJRSkQkzI61KCUiIiISbsdalBKRyKSeUiIiYTZixAg6d+4c7jBEREREjtqBpg+KiPwYjZQSEREREREREZFmp0bnIiIiIiIiIiLS7FSUEhERERERERGRZqeilIiIiIiIiIiINDsVpUREREREREREpNmpKCUiIiIiIiIiIs1ORSkREREREREREWl2KkqJiIiIiIiIiEizU1FKRERERERERESanYpSIiIiIiIiIiLS7P4fbcJxEVzbxq0AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " xnn original NequIP |diff|\n", "--------------------------------------------------------------\n", "(a) same PES 1.4557 1.4557 6.9e-15\n", "(b) independent 1.4330 1.4557 2.3e-02\n", "experiment 1.41\n" ] } ], "source": [ "t_ps = np.arange(N_EQUIL + N_PROD) * (DT / u.fs) / 1000.0\n", "xc = N_EQUIL * (DT / u.fs) / 1000.0\n", "fig, ax = plt.subplots(1, 2, figsize=(12, 4.4), sharey=True)\n", "ax[0].plot(t_ps, rho_xa, label=\"xnn\", lw=1)\n", "ax[0].plot(t_ps, rho_na, label=\"original NequIP\", lw=1, ls=\"--\")\n", "ax[0].set_title(f\"(a) same potential |Δρ|={abs(da_x-da_n):.1e} g/cm³\")\n", "ax[1].plot(t_ps, rho_xb, label=\"xnn (independent)\", lw=1)\n", "ax[1].plot(t_ps, rho_nb, label=\"original NequIP (independent)\", lw=1, ls=\"--\")\n", "ax[1].set_title(f\"(b) independently trained |Δρ|={abs(db_x-db_n):.1e} g/cm³\")\n", "for a in ax:\n", " a.axvline(xc, color=\"gray\", ls=\":\", lw=1)\n", " a.axhline(RHO_EXP, color=\"k\", ls=\"-.\", lw=1, label=f\"exp ≈ {RHO_EXP}\")\n", " a.set_xlabel(\"time [ps]\"); a.legend(fontsize=8)\n", "ax[0].set_ylabel(\"density [g/cm³]\")\n", "plt.tight_layout(); plt.savefig(\"argon_density_md.png\", dpi=120); plt.show()\n", "\n", "print(f\"{'':<20}{'xnn':>12}{'original NequIP':>18}{'|diff|':>12}\")\n", "print(\"-\" * 62)\n", "print(f\"{'(a) same PES':<20}{da_x:>12.4f}{da_n:>18.4f}{abs(da_x-da_n):>12.1e}\")\n", "print(f\"{'(b) independent':<20}{db_x:>12.4f}{db_n:>18.4f}{abs(db_x-db_n):>12.1e}\")\n", "print(f\"{'experiment':<20}{RHO_EXP:>12.2f}\")" ] }, { "cell_type": "markdown", "id": "98129fd4", "metadata": {}, "source": [ "## Summary\n", "\n", "Computing the Argon density from **ASE NPT MD** two ways:\n", "\n", "* **Track (a): same potential.** Copying the trained original-NequIP weights into\n", " `xnn` makes the two calculators return identical energy/forces/stress (machine\n", " precision), and the NPT densities are **identical** to numerical noise. This\n", " isolates and confirms the `xnn` inference/MD path reproduces the original\n", " NequIP exactly.\n", "* **Track (b): independently trained.** Training `xnn` from scratch (no copying)\n", " gives an independent potential; its density agrees with the independently\n", " trained original NequIP to **within the thermal fluctuations**, and both sit\n", " near the experimental liquid-Ar density (~1.41 g/cm³). This is the realistic\n", " \"two practitioners, two fits\" agreement.\n", "\n", "Together: `xnn` is not only bit-for-bit equivalent to the original NequIP for a\n", "fixed PES (a), but as a modelling tool it produces the same physical property when\n", "trained independently (b).\n", "\n", "*Notes.* Berendsen barostat for simplicity (use `ase.md.npt.NPT` for rigorous\n", "ensembles); longer runs tighten the estimate; the stress is the autograd virial\n", "of the energy+force-trained model on both sides (`ForceStressOutput` in xnn,\n", "`StressForceOutput` upstream).\n" ] } ], "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.13.12" } }, "nbformat": 4, "nbformat_minor": 5 }