Corpus & scope

The track runs over the Materials-Project grain-boundary set — the coincidence-site-lattice (CSL) boundaries of the elemental metals whose MP parents carry a DFT grain-boundary energy (the Zheng et al. 2020 GB database, matched to each MP parent id). The scored corpus is 327 grain boundaries across fcc (160), bcc (139) and hcp (28) parents, each with a DFT reference γ, run against 59 potentials — a 59 × 327 grid. Every boundary keeps its full crystallographic identity (Σ, rotation axis/angle, GB plane, tilt/twist) in mp_gb_ref, and the DFT value dft_gb_energy is the benchmark reference.

Crucially, each boundary is rebuilt at the potential's own equilibrium lattice constant, not at a fixed DFT cell: the bulk is relaxed to that model's a0 (reusing the relax-cell campaign's bulk records), and the CSL boundary is constructed at that a0. Two models are therefore never compared on geometrically-identical cells — they are compared on the same physical boundary, each at its own equilibrium, exactly as an MLIP would encounter it in practice.

The leaderboard's coverage grid is not the full 59 × 327: every metric is computed on the paired subset — the (potential × GB) cells where both registries below (shifted and zero-shift) converged and passed the γ-sanity window. A potential's leaderboard n is this paired count for the active protocol, not the raw 327; read it alongside accuracy the same way you would read n on any finite sample.

What the benchmark computes

For each (potential, grain boundary) the pipeline builds the boundary with pymatgen and relaxes it under two independent starting registries, then derives a third, hybrid protocol from the two. In prose:

Each result is committed the instant it finishes, so a wall-time kill loses at most one in-flight boundary. A short-lived minimal-grain rebuild (expand_times = 1) was trialled to shrink the σ7 tail but under-converged and is quarantined (build_variant = 'small_cell_underconverged'), excluded from every rollup; only the correct 15 Å-grain build feeds the exports.

Accuracy against DFT

Because a real DFT reference exists, accuracy is absolute, and every potential is directly rankable — there is no consensus caveat and no coverage-based default sort. Two metric modes are available, selected on the leaderboard, and both are scored per protocol (shifted / zero / hybrid):

γ vs DFT (the default metric mode):

Excess volume vs DFT (the second metric mode): each relaxed boundary's excess volume (Å) is scored against the DFT excess volume from the same reference set. The comparison is restricted to boundaries the DFT side flags as trustworthy — ev_quality == 'reference' — and to a sanity window |ev| ≤ 5 Å on the MLIP value, dropping the rare relaxation blow-ups (every reference DFT excess volume already sits well inside ±5 Å, so no boundary is lost on the DFT side). The DFT excess volume itself is always the legacy GGA Ω₀ reference geometry (never an r2SCAN recomputation, and never a fitted Ω₀ substituted for a boundary flagged unreliable_residual_strain). Under this window the headline is EV MAE (Å), alongside a signed EV bias and an EV-vs-DFT correlation — the excess-volume analogue of MAE/r for γ.

Caveats

See the leaderboard → · ← Methodology overview

Code

Pymatgen grain-boundary energy for one boundary under both registries — build the CSL GB at the model's own a₀ (≈15 Å per grain), relax from the naive [0,0] registry (zero), separately scan the in-plane rigid shift and relax the minimum-energy registry (shifted), then score γ (and excess volume) against MP DFT for each (mp_gb/gamma_worker.py in the campaign, wrapping pure_gb_study via gb_compute.study_one_gb; the hybrid protocol is a row-wise pick between the two, not a separate calculation):

from pymatgen.core.interface import GrainBoundaryGenerator
from mp_gb.gamma_builder import orthogonalize_inplane          # squares 60°/120° in-plane cells
from benchmark.gb_compute import study_one_gb
calc = ...   # any ASE calculator for your MLIP (e.g. mace_mp(model="medium", device="cuda"))

def build(ab):   # pymatgen CSL GB at this in-plane shift, ~15 Å grains, at the model's own a₀
    gb = GrainBoundaryGenerator(bulk).gb_from_parameters(
        rotation_axis=[1, 1, 1], rotation_angle=38.21, plane=[1, 1, 1],
        expand_times=3, vacuum_thickness=0.0, ab_shift=ab, rm_ratio=0.7)
    return orthogonalize_inplane(gb)

# zero — relax the naive [0,0] registry directly, no scan
zero = study_one_gb(build((0, 0)), calc, relax=True)
g_zero, ev_zero = zero["gb_energy"], zero["excess_volume"]

# shifted — static scan of a 20x20 γ-surface, then relax the minimum-energy registry
grid = [(a / 20, b / 20) for a in range(20) for b in range(20)]
ab_min = min(grid, key=lambda ab: study_one_gb(build(ab), calc)["gb_energy"])
shifted = study_one_gb(build(ab_min), calc, relax=True)
g_shift, ev_shift = shifted["gb_energy"], shifted["excess_volume"]

# hybrid — shifted for twist boundaries, zero for tilt (mirrors MP's own DFT protocol)
g_hybrid = g_shift if gb_type == "twist" else g_zero

print(g_hybrid, g_hybrid - dft_gb_energy, ev_zero - dft_excess_volume)