Canonical definition
For a substitutional or interstitial solute X at a grain-boundary site in a host H, the segregation energy per defect is
with the stoichiometric balance and per-atom host chemical potential
Sign convention. E_seg < 0 ⇒ the solute X favors the GB site (segregation is energetically
favorable relative to the bulk reference). E_seg > 0 ⇒ the solute prefers the bulk.
Term-by-term reference
Every symbol is a total energy (smeared VASP energy, not energy_zero — see the
feedback_energy_sigma memory) or an atom count on a specific structure row. Both DFT and
MLIP sides pull the same four energies and the same four atom counts, just from different
energy columns.
| Symbol | Meaning | Source (DFT side) | Source (MLIP side) | Units |
|---|---|---|---|---|
E_seg_GB |
total energy of the doped GB cell (host GB + one X atom on the chosen site) | structure.dft_energy for the segregated row |
mlip_calc.energy for (potential, atoms_hash_of_seg_row) |
eV |
E_pure_GB |
total energy of the pure-host GB cell (same GB construction, no solute) | structure.dft_energy of the pure-GB reference row resolved via the variant's _refs.pkl |
mlip_calc.energy for (potential, atoms_hash_of_pure_GB_row) |
eV |
E_X_bulk |
total energy of the elemental-X-in-host bulk reference (n_host host atoms + 1 X) |
structure.dft_energy of the X-bulk reference row from _refs.pkl |
mlip_calc.energy for that bulk row |
eV |
E_host_bulk |
total energy of the pure-host bulk reference (no defect) | structure.dft_energy of the pure-host bulk row from _refs.pkl |
mlip_calc.energy for that row |
eV |
n_hostseg_GB |
count of host atoms in the doped GB cell | len(structure.atoms) − 1 for the seg row (one slot replaced by X) |
identical (same atoms object) | atoms |
n_hostpure_GB |
count of host atoms in the pure-host GB cell | len(structure.atoms) for the pure-GB ref |
identical | atoms |
n_hostX_bulk |
count of host atoms in the X-bulk reference cell | len(structure.atoms) − 1 for the X-bulk ref |
identical | atoms |
n_hosthost_bulk |
count of host atoms in the pure-host bulk reference | len(structure.atoms) for the host-bulk ref |
identical | atoms |
n_host_diff |
net change in host-atom count between the LHS (E_seg_GB − E_pure_GB) and RHS (E_X_bulk − E_host_bulk) differences; this restores composition balance |
derived per row | derived per row | atoms (signed integer) |
μ_host |
per-atom chemical potential of the host, defined from the pure-host bulk reference: E_host_bulk / n_hosthost_bulk |
derived from the host-bulk DFT energy | derived from the host-bulk MLIP energy (per potential) | eV/atom |
The chemical-potential reference is pure-host bulk (Fe or Ni). It is not the free-atom
reference, not an iso-atom offset, and not the per-(composition, ISPIN) corrected energy used
elsewhere on the ASSYST single-point track — see Why no E_seg_corrected below.
Reference resolution per variant (KP / KS / OMAT fallback rules, Ni-host variant) is documented
on the deep page. Implementation in
build_eseg_dfs.py
(compute_eseg). The four reference rows (pure GB, X bulk, host bulk, and the seg-GB row
itself) are all ingested as ordinary structure rows in the DB and run through the same
single-point / relax pipeline as the segregated structures, so the MLIP side reads exactly the
same four cells the DFT side does.
Why no E_seg_corrected
E_seg is a difference of total energies taken between systems with the same
composition (after accounting for stoichiometry through n_host_diff and
μ_host). The per-(composition, ISPIN) offset corrections used on the ASSYST
single-point track cancel by construction in this formula. We deliberately do
NOT emit E_seg_corrected columns — there is no analogous correction to apply
without changing the science.
BFGS-vs-FIRE fallback rule (best-available)
The corpus was first run with BFGS, fmax = 0.01, max_steps = 10000. A subset of structures (~54k across 50 potentials) hit the BFGS step-cap or otherwise errored — almost all on heavy-radioactive solutes (Po/At/Rn/Fr/Ra, Z = 84–88) that the underlying calculators do not embed.
Those errored structures were retried with FIRE, fmax = 0.01, max_steps = 250.
FIRE recovered the slow-converging cases that BFGS step-capped on (notably the
MatRIS pair on Ni-host structures); the remaining unsupported-element rows
continued to error on the same structures with the same KeyError.
For each potential and each structure_id, the headline metrics use the best-available result:
energy_used = energy_BFGS if status_BFGS == 'done'
else energy_FIRE if status_FIRE == 'done'
else NaN (excluded)
Per-row provenance is preserved in the rollup CSVs via algo_used,
n_best_from_bfgs, n_best_from_fire.
Aggregation
Per-(potential, host, solute, partition) RMSE/MAE/Spearman is computed as a
count-weighted two-step aggregation matching the ASSYST headline pattern
(see headline_rmse_provenance memory). Concretely:
- Per (host, solute, partition) bucket: RMSE / MAE / Spearman ρ over
(E_seg^MLIP - E_seg^DFT)for the structures where the MLIP has a best-availabledoneresult. - Per potential, the top-line E_seg RMSE is the count-weighted mean of (1) across all buckets, weighted by the number of evaluated structures.
Both E_seg RMSE (eV) and E_seg MAE (eV) are emitted in the rollup and selectable as the leaderboard headline.
Partitions
partition |
corpus | comment |
|---|---|---|
gbseg-relaxed-sub |
FeGB/NiGB Relaxed Substitutional | the headline bucket |
gbseg-relaxed-int |
FeGB/NiGB Relaxed Interstitial | |
gbseg-unrelaxed-sub |
Unrelaxed (DFT-geometry) Substitutional | single-point only |
gbseg-unrelaxed-int |
Unrelaxed (DFT-geometry) Interstitial | single-point only |
The gbseg-relaxed-* MLIP relaxation is initialised from the unrelaxed
(as-constructed / DFT-input) geometry, not the DFT-relaxed frame — the
relaxation's initial frame is the unrelaxed structure.
W_sep (gbseg-cleavage) lives on its own page — see GB cleavage.
DFT reference subsets
The reference E_seg numbers in the gbseg corpus come from three independent
DFT sub-campaigns on the Fe-host side and one campaign on the Ni-host side.
The rollup CSV carries the campaign tag in a dft_method column and the
leaderboard's "DFT method" radio filters on it; metrics are NOT pooled
across methods.
dft_method |
host | comment |
|---|---|---|
KP |
Fe (FeGB) | K-point converged DFT. Headline reference — the default radio value. |
KS |
Fe (FeGB) | K-point sparse DFT. Faster, slightly coarser; useful as a sensitivity check. |
OMAT |
Fe (FeGB) | OMAT campaign with O- and F-solute buckets included. |
OMAT_no_OF |
Fe (FeGB) | Synthetic: OMAT recomputed with O- and F-solute buckets dropped. |
Kfine |
Ni (NiGB) | The Ni-host campaign. Selected implicitly via host = "Ni". O+F excluded (same rule as KP/KS). |
Why O+F are excluded from KP, KS, and Kfine
The KP/KS DFT references for O- and F-substitutional structures are systematically inconsistent with the way those species sit in the MLIPs' training sets (SMAX / MPtrj) — the training-set sampling for these species is biased toward oxide/halide chemistries rather than dilute solutes in metallic GBs. Headline KP/KS RMSE numbers therefore exclude O+F so the ranking reflects bulk-metal chemistry the MLIPs are actually competent on.
The same systematic flaw applies on the Ni-host side: the SMAX/MPtrj
training-set coverage of O/F in metallic Ni grain-boundary environments is
just as biased toward oxide/halide chemistries as on the Fe-host side, so
Kfine follows the same rule and omits O+F-solute rows from headline
aggregation (no Kfine_with_OF companion is reported — the framing is
"omit", not "compare").
Why OMAT keeps O+F (and also reports OMAT_no_OF)
OMAT-trained potentials are designed to handle oxide and halide chemistry
properly, so for the OMAT subset we report the full headline (with O+F)
and a companion OMAT_no_OF recomputation that drops the same two
solute columns. The two side-by-side numbers directly quantify how much
of an OMAT-trained MLIP's headline performance comes from (or is hurt by)
the O+F slice.
Both OMAT and OMAT_no_OF are emitted as separate rows in the rollup
CSV with the same (potential, host, solute, partition) keys but distinct
dft_method values. Per-solute rows for non-O/F solutes are numerically
identical between the two variants; only the __all__ aggregate rows
differ.
Outlier removal
A small subset of (potential-independent) DFT E_seg values in the corpus are catastrophic outliers — wrong unit cells, mis-relaxed neighbours, SCF non-convergence — that would dominate any RMSE if left in. We remove them via the Iglewicz & Hoaglin modified z-score test:
A point is flagged when |m_i| > 3.5. Grain: per
(dft_method, host, solute, defect_type) bucket. For buckets smaller
than 12 rows the test is statistically uninformative; those fall back
to a sanity threshold of |E_seg| > 20 eV.
The current denylist removes 1794 DFT structures: KP 422 · KS 603 · OMAT 359 · Kfine 410.
Snapshot date
Every per-potential summary CSV carries a snapshot_date column. The headline
date on the leaderboard is the minimum across all rolled-up potentials — if any
potential's rollup is stale, the headline flags it.
For deeper provenance (LSN, exporter git sha, build_eseg_dfs.py commit), see Provenance and the gbseg wiki hub.
Code
Segregation energy from four MLIP total energies (compute_eseg in build_eseg_dfs.py). The MLIP evaluates the four cells; the formula assembles E_seg:
from build_eseg_dfs import compute_eseg
# E_* are MLIP total energies (eV); n_host_* the host-atom counts of each cell
eseg, n_host_diff = compute_eseg(
e_seg=E_seg, n_host_seg=N_seg, # segregated GB (host GB + 1 solute)
e_pure_gb=E_pureGB, n_host_pure_gb=N_pureGB, # pure-host GB
e_elem_bulk=E_Xbulk, n_host_elem_bulk=N_Xbulk, # solute-in-host bulk reference
e_host_bulk=E_host, n_host_host_bulk=N_host) # pure-host bulk reference
# eseg = segregation energy (eV); negative ⇒ segregation is favourable