--- myst: html_meta: "description": "Detailed release notes for eOn v2.12.0, covering quill migration, namespace eonc, PotRegistry, SafeMath, and FPE hardening." "keywords": "eOn release notes, quill, namespace eonc, PotRegistry, SafeMath, FPE" --- # Release notes ## [v2.12.0] - 2026-03-08 ### Removed #### _potcalls.log text logger The per-instance `FileScoped` text logger that emitted `QUILL_LOG_TRACE_L3` on every `get_ef()` call has been removed. The dead static counters `Potential::fcalls`, `fcallsTotal`, `wu_fcallsTotal`, and `totalUserTime` are also removed. Output is now `_potcalls.json` with structured per-instance records (see PotRegistry below). ### Added #### PotRegistry A thread-safe, enum-indexed singleton (`PotRegistry`) tracks per-instance potential lifecycle: creation time, destruction time, force call count, and a unique ID. Per-type aggregate counters use relaxed atomics for lock-free `force_calls`, `created`, and `alive` tracking. Per-instance records are mutex-protected and appended on destruction. Force call delta tracking is restored in SafeHyperJob, TADJob, ParallelReplicaJob, ReplicaExchangeJob, NudgedElasticBandJob, BasinHoppingJob, HessianJob, PrefactorJob, and MonteCarloJob using `PotRegistry::get().total_force_calls()`. Unit tests: 6 test cases, 38 assertions covering lifecycle, force calls, delta tracking, reset, JSON output, multi-type, and instance records. #### SafeMath.h Guarded arithmetic functions (`safe_div`, `safe_recip`, `safe_acos`, `safe_sqrt`, `safe_atan_ratio`) and an Eigen-aware `safe_normalized` template. These prevent SIGFPE from division-by-zero and domain errors without changing results for valid inputs. #### Quill logging backend Replaced spdlog/fmt with quill for lock-free asynchronous logging. The new `EonLogger.h` API provides `eonc::log::Scoped` (RAII console logger) and `eonc::log::FileScoped` (RAII file logger) helpers, reducing boilerplate from 14 lines to 1. ### Changed #### namespace eonc All client classes, enums, and helper namespaces are wrapped under `namespace eonc`. The `helper_functions` namespace is renamed to `helpers`. Backward-compatible `using` aliases are provided at global scope. `using namespace std` is removed from all client headers. #### Other changes - Replace cxxopts with argum for CLI parsing (C++20). ([#320](https://github.com/TheochemUI/eOn/issues/320)) - Replace per-site `scoped_interpreter` guards with lazy singleton `eonc::ensure_interpreter()` in `PyGuard.h`. ([#324](https://github.com/TheochemUI/eOn/issues/324)) - Updated metatomic ecosystem: torch 2.10, metatomic-torch 0.1.9+, metatensor-torch 0.8.4+, vesin/vesin-torch 0.5.2+, metatrain 2026.2.1+. - Updated vesin to v0.5.2: per-dimension periodicity (`bool[3]`) and VesinDevice struct syntax. - Switched all logging macros from bare `LOG_*` to `QUILL_LOG_*` with `QUILL_DISABLE_NON_PREFIXED_MACROS` to prevent macro collisions. - Optimized quill backend: reduced sleep duration (100us -> 10us), larger transit buffer (256 -> 2048), faster flush interval (200ms -> 100ms). ### Fixed - Fix ASE_POT compilation errors and rename `-DASE_POT` to `-DWITH_ASE_POT`. ([#321](https://github.com/TheochemUI/eOn/issues/321)) - Fix `[IDimerRot]` column misalignment. ([#322](https://github.com/TheochemUI/eOn/issues/322)) - Suppress FPE trapping during libtorch operations in MetatomicPotential. ([#323](https://github.com/TheochemUI/eOn/issues/323)) - Change `uncertainty_threshold` default from `0.1` to `-1` (disabled). ([#325](https://github.com/TheochemUI/eOn/issues/325)) - Fixed quill migration test failures: logger initialization, ConfigParser defaults, MSVC `-DNOMINMAX`. ([#327](https://github.com/TheochemUI/eOn/issues/327)) - Guard unprotected floating-point divisions and `.normalize()` calls across 12 source files using `eonc::safemath` utilities. - Make POSIX FPE signal handler async-signal-safe. - Use `-isystem` for pip-installed metatomic/vesin includes to suppress third-party warnings.