Skip to main content

Sequential stability evaluation for solid-state electrolyte candidates: mechanical, vibrational (anharmonic), and thermodynamic gates.

Project description

heatup

Sequential Stability Evaluation for Solid-State Electrolyte Candidates

heatup implements a three-gate sequential stability pipeline for solid-state electrolyte (SSE) candidates discovered by machine-learning-guided active learning. Each gate must pass (or at least not fail) before the next one is evaluated, avoiding expensive computations on materials that are already ruled out by simpler criteria.

Candidate structure
       │
       ▼
┌──────────────────┐
│  Gate 1          │  Born–Huang criterion (elastic tensor eigenvalues)
│  Mechanical      │  Bulk modulus B, Shear modulus G
└────────┬─────────┘
         │ pass / warn
         ▼
┌──────────────────┐
│  Gate 2          │  Anharmonic VDOS from AIMD (VACF method)
│  Vibrational     │  Soft-mode weight at ω ≈ 0
└────────┬─────────┘
         │ pass / warn
         ▼
┌──────────────────┐
│  Gate 3          │  Temperature-dependent convex hull
│  Thermodynamic   │  F(T) = E₀ + F_vib(T),  anharmonic for target
└──────────────────┘
         │
         ▼
    stability_report.json  +  stability_report.pdf

Installation

pip install heatup                        # core only
pip install "heatup[md]"                  # + MACE / ASE for MD triggering
pip install "heatup[generation]"          # + PyXtal for polymorph generation
pip install "heatup[all]"                 # everything

For development:

git clone https://github.com/CibranLopez/HeatUp
cd heatup
pip install -r requirements.txt
pytest

Quick start

Python API

from heatup import run_stability_pipeline

report = run_stability_pipeline(
    sym_dir     = "database/LiZrS2/R3m",
    operating_T = 1200.0,          # K
    device      = "cuda",
)

print(report["overall"])           # "ok" | "warn" | "fail" | "missing"
for flag in report["flags"]:
    print(flag)

Command line

# Single material
heatup database/LiZrS2/R3m --operating-T 1200 --device cuda

# Entire database
heatup batch --database database --operating-T 1200

# Skip PyXtal generation (faster)
heatup batch --no-generate

# Force recompute
heatup database/LiZrS2/R3m --force

Integration with the active-learning pipeline

In 02_validate.ipynb (or equivalent), replace the existing stability call with:

from heatup import run_stability_pipeline

for sym_dir in validated_dirs:
    report = run_stability_pipeline(
        sym_dir                 = sym_dir,
        operating_T             = OPERATING_TEMPERATURE,
        device                  = DEVICE,
        generate_missing_phases = True,
    )
    if report["overall"] == "ok":
        retraining_candidates.append(sym_dir)
    elif report["overall"] == "warn":
        # borderline — human review
        flagged.append((sym_dir, report["flags"]))
    # "fail" → excluded automatically

Directory layout

database/
  <material>/<symmetry>/
    POSCAR
    relaxation/
      energy.json           ← MACE ground-state energy per atom
    elastic/
      elastic_tensor.json   ← 6×6 stiffness tensor + derived moduli
    phonons/
      dos.json              ← harmonic DOS (fallback for Gate 3)
    aimd/
      <T>K/
        output.traj
        simulation-input.json
        anharmonic_phonons/
          vdos.json         ← cached VACF→VDOS (written by this package)
          thermo.json
          free_energy.json
    stability/
      secondary_phases.json
      hull_vs_T.json
      stability_report.json ← gate results + overall verdict
      stability_report.pdf  ← three-panel dashboard

Configuration

All thresholds live in heatup/config.py and can be overridden at runtime:

import heatup.config as cfg

cfg.THERMO_HULL_WARN_EV      = 0.05   # tighter metastability window (50 meV)
cfg.VIB_ZERO_FRAC_FAIL       = 0.05   # stricter soft-mode threshold
cfg.MECH_BULK_WARN_GPa       = 20.0   # demand stiffer electrolytes
cfg.PYXTAL_MAX_ATOMS         = 60     # allow larger unit cells

Gate details

Gate 1 — Mechanical (Born–Huang)

Reads elastic/elastic_tensor.json. All six eigenvalues of the 6×6 Voigt stiffness tensor C must be positive (Born–Huang criterion). The Voigt-averaged bulk modulus B and shear modulus G are checked against configurable thresholds.

Gate 2 — Vibrational (anharmonic VDOS)

Reads aimd/<T>K/anharmonic_phonons/vdos.json. The VDOS is extracted from AIMD trajectories via the velocity autocorrelation function (VACF), averaged across all available MD temperatures, and the fraction of spectral weight within a narrow window around ω = 0 is computed. Significant weight there indicates soft modes surviving at finite temperature — a signature of structural instability or pre-transitional dynamics.

Gate 3 — Thermodynamic (convex hull with T)

Constructs F(T) = E₀ + F_vib(T) for the target material (using the anharmonic VDOS) and for all secondary phases (harmonic approximation). Missing polymorphs are generated automatically with PyXtal. The pymatgen PhaseDiagram engine builds the convex hull at each temperature and the distance above the hull is evaluated at operating_T.

Running the tests

pytest                        # all tests
pytest -k mechanical          # Gate 1 only
pytest -v --tb=long           # verbose
pytest --cov=heatup    # with coverage report

Citation

If you use this package in your research, please cite:

@article{heatup_2025,
  title   = {HeatUp: Sequential Stability Evaluation for Machine-Learning-Guided
             Discovery of Solid-State Electrolytes},
  author  = {López, C. et al.},
  journal = {---},
  year    = {2026},
  note    = {preprint}
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

heatup-0.1.0.tar.gz (96.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

heatup-0.1.0-py3-none-any.whl (99.2 kB view details)

Uploaded Python 3

File details

Details for the file heatup-0.1.0.tar.gz.

File metadata

  • Download URL: heatup-0.1.0.tar.gz
  • Upload date:
  • Size: 96.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for heatup-0.1.0.tar.gz
Algorithm Hash digest
SHA256 55d346832aa8e4f1fb566db232e729ebbec0075e2ed3f1b894abcfeb6450b896
MD5 857eb16d5eaa611c70673e6021538369
BLAKE2b-256 40da1b8e7ab3385135364f33aae2e06b5fc9d598135025b814fa2e679ef79761

See more details on using hashes here.

File details

Details for the file heatup-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: heatup-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 99.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for heatup-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4167b8f7204d46d63e76a8273c09892107db94036cd644cec5ec98cb0b642e37
MD5 cd2a768d44fd46b6b7b585f2e6f59c69
BLAKE2b-256 1044a90e3207f12c10d126a09fe8da47b5672f8b706e84afca7e21b758748ffa

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page