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:

  1. Per (host, solute, partition) bucket: RMSE / MAE / Spearman ρ over (E_seg^MLIP - E_seg^DFT) for the structures where the MLIP has a best-available done result.
  2. 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