Changelog#
Unreleased#
Builds on rgmin 0.5.2 from crates.io.
Controlcarriesftol_relandnoise_floor; the band, minimum-mode, stencil, IDPP, and IRC solvers fill those fields fromControl::default(), which is the 0.5.1 behaviour (no relative energy slack, no noise-floor stop). The golden stencil and band hashes are unchanged.
0.3.2 (2026-10-25)#
Builds on rgmin 0.5.1, whose control accepts a negative
maxmoveas a request for no step cap; the band and minimum-mode sessions over atoms keep rgmin 0.5.0 behaviour.
0.3.1 (2026-10-25)#
The climbing-image hand-off series: the band refinement fits its climb model to a pair-stretch Hessian and the Lanczos block, follows the mode, and hands the climbing image to the minimum-mode refinement once it has kept one index for one band step;
RGSADDLE_REQ_CLIMBING_IMAGEmarks those requests at ABI minor 23, and a host whose config minor is 22 keeps the unflagged requests. The entries below under 0.3.0 that describe the climb model, the hand-off and the kept Krylov block belong to this release.
0.3.0 (2026-10-25)#
Method::Ode12r(RGSADDLE_METHOD_ODE12R= 4, ABI minor 22) steps the band with rgmin’s ODE12r, the adaptive forward Euler of Makri, Ortner and Kermode, J. Chem. Phys. 150, 094109 (2019), https://doi.org/10.1063/1.5064465: one band evaluation per trial, accepted or not, a rejected trial leaving the band where it was, and the stalled-step guard allowing 64 consecutive rejections.ExpBandPrecon(rgsaddle_band_set_exp_precon) applies the exponential metric of Packwood et al., J. Chem. Phys. 144, 164109 (2016), inside the band projection as Eq. (9) and (10) of the same paper write it: each image is driven by-(P^-1 g - t_P (t_P . g)) + (k / mu) ((d+ - d-) . P t_P) t_Pwitht_Pthe tangent normalised in the P-norm, one matrix per interior image, rebuilt when an atom has movedr_nn / 2, the energy scalemuestimated once on the first interior image. The band relaxes to the minimum energy path of the metric’s geometry, where the gradient lies alongP t_Pand the Euclidean perpendicular force does not vanish; the band force that convergence and the report measure is the residual of Eq. (11),-(g - P t_P (t_P . g))per image. An armed climbing image reflects the preconditioned gradient in the P-metric,-(P^-1 g - 2 t_P (t_P . g)), whose fixed point is the saddle. Only a uniform spring is accepted with the metric.tests/makri_vacancy.rsreproduces Table II of Makri, Ortner and Kermode (Cu fcc vacancy, 107 atoms, Morse A 4, epsilon 1, r0 2.55 A, 5 images, cutoff 5.3 A, k 1 eV/A2, exponential metric A 3, rcut2.2 rnn): force evaluations per image to 1e-1 and 1e-3 eV/A are 8.67 and 26.67 for ODE12r (paper 8 and 27), 7.33 and 19.33 for ODE12r with the metric (paper 8 and 19), and 7.67 and 19.67 for the L-BFGS band. The metric count moves with the spring: k 0.3 gives 20.33 and k 3 gives 77.33.A failed dimer surface callback no longer consumes retained Polak–Ribiere rotation history; retrying after a recoverable callback error keeps the same cross-translation state.
Dimer Polak–Ribiere rotational force and direction now survive a translation.
resetandset_modeclear that history and the carried curvature, a mode eliminated by an excluded direction starts the next estimate without the old curvature or the old rotational pair, and a repeated estimate at one geometry starts a fresh rotational sequence. The 45 degree translator memory and the Lanczos stop are unchanged. The dimer stencil hashes on Müller-Brown and the harmonic chain follow the retained rotation; the double well, Lanczos, and band hashes are unchanged. No new C field, soRGSADDLE_ABI_MINORstays 21.Measured with lode-org/optbench c813a679 (
RGSADDLE_LIB=<release librgsaddle.so> uv run optbench run <problem> rgsaddle/<template> --workers 8), stock templates, harness counter, cap 10000. Against origin/main 8fa0eb1:tsopt/LJ38dimer-lbfgsPAR-2 552.7800000000 (199 of 200) to 474.0000000000 (200 of 200);lanczos694.1000000000 (199 of 200) unchanged;tsopt/pt-islandpt-dimer-lbfgs959.3673469388 (47 of 49) to 147.6122448980 (49 of 49);pt-lanczos209.9795918367 (49 of 49) unchanged;lowest-eigenvector/lj38mode-dimer29.7950000000 (200 of 200) andmode-lanczos17.5850000000 (200 of 200) unchanged. The LJ38 51-pair driver (cargo test --release --features capi --test connect_driver -- --ignored --nocapture lj38_fifty_one_par2, cap 250000) stays n 51, failures 0, PAR-2 502.274510 on both.Minimum-mode FIRE keeps timestep 1. From rest a zero power halves that step before the semi-implicit Euler update, so the move is a quarter of the reflected force (Bitzek, Koskinen, Gähler, Moseler, and Gumbsch, Phys. Rev. Lett. 97, 170201 (2006), https://doi.org/10.1103/PhysRevLett.97.170201). That force is not a potential gradient (Goswami, Gunde, and Jónsson, Front. Chem. (2026), https://doi.org/10.3389/fchem.2026.1807063, Eq. 9). When the quarter-force move exceeds
max_move, the per-atom cap truncates it. If the arrival is no longer negative, that truncated move left the negative-curvature neighborhood and is replaced, from the last negative point, by 0.01 times the force, the empty-memory scale of the L-BFGS guard. A capped step that is still negative is kept, and so is every L-BFGS step. The three-step stencil hashes are unchanged. No new C field, soRGSADDLE_ABI_MINORstays 21.optbench
saddle-search/pt-island, templatergsaddle/saddle-dimer-fire, one repetition, harness counter, climb budget 1000, per-search cap 5064, goal 27 saddles with barrier below 1.5 eV, seed(20261015+1)*1000003+attempt, judged by optbencha0ea4b4(connection.py, eOn r2205 per-atom norm). This replacement reaches the goal in 8973 searches and 8076757 force calls: 119 unique saddles,fraction_connected0.772651287194918, PAR-2 10099.934470076898, 27 successes, 8946 v2 failures, goal failure 0, v2 caps 3337. The same template at 57152ee, without the replacement, reaches the goal in 9480 searches and 8582818 force calls: 117 unique saddles,fraction_connected0.7765822784810127, PAR-2 10101.433649789029, 27 successes, 9453 v2 failures, v2 caps 3692.tsopt/pt-islanddimer FIRE is unchanged: 49 successes, 0 failures, 483 force calls, PAR-2 483.1428571429. Five searches of dimer L-BFGS and of Lanczos match that parent byte for byte. The archived c0db2b8 dimer FIRE row is unique 0, connected 0,fraction_connected0.0, PAR-2 10128, n 20000, 20220523 force calls. The archive mean for eOn r2205 is uniquesaddles109.222, fractionconnected0.746017, totalsearches11366.8, forcecalls3.77888e+06; that row has no PAR-2.A Lanczos
rgsaddle_minmode_estimate(MinModeSession::push_estimate) returns, after k actions, a mode in the k + 1 Lanczos vectors. The last vector is the residual direction that the k-th action already produced. In the Lanczos basis an eigenvector’s components are the Lanczos polynomials at its eigenvalue (Parlett, The Symmetric Eigenvalue Problem, SIAM (1998), https://doi.org/10.1137/1.9781611971163, Ch. 7), and they need only the k known rows of the tridiagonal. They are evaluated at an estimate of the lowest eigenvalue: the next Ritz value predicted withalpha_{k+1} = alpha_k, extrapolated with the two previous Ritz values by Aitken’s delta-squared (Aitken, Proc. R. Soc. Edinburgh 46, 289 (1927), https://doi.org/10.1017/S0370164600022070) when they fall with shrinking steps. At the Ritz value the formula is the old Ritz vector. No surface call is added, the reported curvature is still the Ritz value of the k vectors, andestimate_modeandstepare unchanged. The dimer and Lanczos framing is Goswami, Gunde, and Jónsson, Front. Chem. 14 (2026), https://doi.org/10.3389/fchem.2026.1807063, and Goswami, arXiv:2603.10992; the Lanczos stop is Olsen, Kroes, Henkelman, Arnaldsson, and Jónsson, J. Chem. Phys. 121, 9776 (2004), https://doi.org/10.1063/1.1809574. Sella 0.1.1 (Hermes, Sargsyan, Najm, and Zádor, J. Chem. Theory Comput. 15, 6536 (2019), https://doi.org/10.1021/acs.jctc.9b00869) has no Hessian to precondition with on this task, so its Jacobi-Davidson expansion is the Lanczos residual. It tests the Ritz vector of the vectors it has applied the Hessian to, so it takes the same actions as the old estimate; its archived 17.8 is the centre gradient plus about 16.8 actions, without the final centre evaluation the harness adds. On the board geometries the best vector of the k vectors needs 15.895 actions on average (17.895 with those two calls), so no extraction from the k vectors passes 17.8. The estimate was chosen on three sets the board does not score, with the lowest eigenvector of a central-difference Hessian as the reference and overlap 0.99. Mean actions for the old Ritz vector, then this estimate: 200minimization/lj38random clusters relaxed by steepest descent to a gradient norm under 2 with a lowest eigenvalue under -1, 22.800 to 21.185 (180 starts better, 2 worse); the board geometries with Gaussian noise of 0.01 (seed 2026), 22.455 to 21.065 (184 better, none worse); the 49tsopt/pt-islandstarts on their Morse surface, 11.082 to 9.980 (34 better, none worse). On the same three sets the prediction alone gives 21.780, 21.450, and 10.143, and Aitken over the last three Ritz values gives 21.310, 21.200, and 10.347. The finite-difference step (1e-6 against 1e-3), a central stencil, and projecting the six rigid modes each move the board mean by less than 0.03 actions, so they are unchanged. The convergence tolerances and the quit-early test are not read on this path: the host stops the push. Measured with lode-org/optbench c813a679 (RGSADDLE_LIB=<release librgsaddle.so> uv run optbench run <problem> rgsaddle/<template> --workers 8):lowest-eigenvector/lj38mode-lanczosPAR-2 18.81 to 17.585, 200 of 200 both (median 18 to 17, maximum 37 both, harness calls 3762 to 3517).tsopt/LJ38lanczos694.1 (199 of 200) andtsopt/pt-islandpt-lanczos209.97959 (49 of 49) are unchanged start for start; both translate throughstep.Breaking: the band refinement fits its climb model to a pair-stretch Hessian and the Lanczos block, follows its mode, and takes the climbing image once it has kept its index for one band step, at any force. The model is the pair-stretch Hessian of Lindh, Bernhardsson, Karlström, and Malmqvist, Chem. Phys. Lett. 241, 423 (1995), https://doi.org/10.1016/0009-2614(95)00646-L, with the exponential pair weight and diagonal stabilisation of Packwood et al., J. Chem. Phys. 144, 164109 (2016), https://doi.org/10.1063/1.4947024, scaled by the smallest ratio of measured to model curvature over the positive Lanczos directions, and every Lanczos action is then imposed exactly; it takes the place of the
h_0 Istart.MinModeSession::krylov_blockreturns those actions. Withremove_translationthe model, the step and the secant pairs live off the rigid translations, and off the rotations when there is no cell. Each P-RFO step maximizes along the model eigenvector closest to the mode followed a step before. Lanczos runs again once the followed model curvature is abovecurvature_retained(0.3) of the measured one or the mode turned undermin_overlap(0.8), at most everyrefresh_interval(4) steps;refresh_factoris removed. The trust radius halves on an energy ratio outside[1/4, 4]and doubles on one inside(3/4, 4/3)from a step at the radius, in place of Sella’s schedule.MinModeRefinedefaults:trigger_factorinfinite,stable_steps1,alignment_tol0.85 for the start, the newclimb_alignmentoff, the newretry_factor0.5 (a refinement that did not lower the force waits also for half the force it started from),krylov_dim20. A refinement that leaves the image where it began keeps the band optimizer’s history.OcinebConfig::refineturnsclimb_alignmenton andretry_factoroff, soOcinebSessionis the same mechanism with the published exits. The band converges when the climbing image does, so after an early hand-off the other images stay where the band left them; a host that wants the relaxed path sets a finitetrigger_factorormin_mode: None. C ABI minor 23 addsRGSADDLE_REQ_CLIMBING_IMAGE(request flags bit 1): from a band config at minor 23 the refinement’s one-image requests set it, and a batched request carries the climbing image’s band index inimagein place of -1.rgsaddle_ocineb_stepkeeps its point surface request.Measured with lode-org/optbench c813a679 (
RGSADDLE_LIBRARY=<release cdylib> OMP_NUM_THREADS=1 uv run optbench run <problem> rgsaddle/<template> --workers 8, stock templates, full start sets), the release cdylib of main a952e85 before and of this change after.double-ended-saddle-search/lj38ew-ci-nebPAR-2 165.4 to 102.26 (50 of 50 both, median 151.5 to 94, maximum 466 to 330);double-ended-saddle-search/pt-islandew-ci-neb107.98 to 61.31 (59 of 59 both, median 103 to 51, maximum 240 to 290);neb/Pt-heptamersidpp-ci-neb121.77 to 82.77 (13 of 13 both, median 113 to 71, maximum 181 to 109);double-ended-saddle-search/lj38_2ts_separationew-ci-neb5722.24 with 37 of 51 (14 divergences, median 408) to 258.45 with 51 of 51 (median 162, maximum 1110). On lj38 the L-BFGS templates go from 135.34 to 104.98 (ew-ci-neb-lbfgs, 50 of 50, median 69, maximum 1230) and from 165.24 to 115.0 (idpp-ci-neb-lbfgs, 50 of 50, median 68, maximum 1189).The band refinement measures a positive model curvature again before it ends a climb, and a new climbing-image index restores the initial trigger threshold. On LJ38 pair26the climb reached a gate of 0.0068 and then left on a TS-BFGS model curvature above zero while Lanczos measured -2.4 at that image; on pair38the success threshold of the first climb, 0.056, stayed after the band moved its climbing image, and no refinement ran again before the cap.
double-ended-saddle-search/lj38ew-ci-neb-lbfgsPAR-2 149.76 to 135.34 (50 of 50, median 121, maximum 508);idpp-ci-neb-lbfgs274.26 (49 of 50) to 165.24 (50 of 50, median 117, maximum 1857);neb/Pt-heptamerew-ci-neb-lbfgs121.84615 andidpp-ci-neb-lbfgs93.53846 unchanged, 13 of 13. Either change alone was tried on eight LJ38 pairs only (26, 38, 32, 22, 46, 03, 00, 10): the measurement alone takes ew pair26from 484 to 1258 calls and the reset alone to 1988, against 508 with both.The band refinement’s
alignment_toldefault is 0.3, where it was 0.5. On LJ38 pair18and pair32the climb left with overlaps of 0.478 and 0.499 and the band then ran about 140 steps before the next refinement; with 0.3 those pairs take 171 and 192 force calls instead of 824 and 927.double-ended-saddle-search/lj38ew-ci-neb-lbfgsPAR-2 171.32 to 149.76 (50 of 50, median 122, maximum 564);idpp-ci-neb-lbfgs329.6 (48 of 50) to 274.26 (49 of 50, pair38at the cap; pair26now converges);neb/Pt-heptamerew-ci-neb-lbfgs121.84615 andidpp-ci-neb-lbfgs93.53846 unchanged, 13 of 13. An overlap floor of 0 (no alignment exit) gives the same four rows. Leaving at the lowest-force point instead of the best aligned one changes none of the pairs tried.OcinebSessionkeeps itsangle_tolof at least1/sqrt(2).Breaking: the highest interior image climbs also when an endpoint lies higher, as in Henkelman, Uberuaga, and Jónsson, J. Chem. Phys. 113, 9901 (2000), https://doi.org/10.1063/1.1329672, and ASE’s NEB; the band used to keep the spring on every image of a monotonic band, eOn’s rule. Between two minima the energy rises from each, so such an image has the saddle between it and the higher endpoint.
double-ended-saddle-search/lj38pair03ended as a monotonic band with no climbing image and failed as a divergence; it now converges in 478 force calls. The four optbench rows (commands as in the next entries):double-ended-saddle-search/lj38ew-ci-neb-lbfgsPAR-2 261.76 (49 of 50) to 171.32 (50 of 50, median 122, maximum 927),idpp-ci-neb-lbfgs329.6 (48 of 50, pair26and pair38at the cap) unchanged,neb/Pt-heptamerew-ci-neb-lbfgs121.84615 andidpp-ci-neb-lbfgs93.53846 unchanged, 13 of 13. Climbing only the highest image that is above both its band neighbours does not rescue pair03(1124 calls, divergence). An endpoint that is not a minimum can draw the climbing image into itself: the reactant of the four-atom exchange intests/idpp_path.rsis an index-2 point (Hessian eigenvalues near -7.9 and -2.2) and both starts now climb into it, so that test compares the starts on the band without a climbing image (IDPP 178 rows, linear 282), which is what the old rule ran there.Breaking: a climbing band refines its climbing image by the lowest mode, the OCI-NEB of Goswami, Gunde, and Jónsson, Front. Chem. 14, 1807063 (2026), https://doi.org/10.3389/fchem.2026.1807063, Algorithm 1.
BandConfig::min_modeisSome(MinModeRefine::default());Nonekeeps the plain CI-NEB, and AutoNEB’s windows keep it. Once the same image has been highest for three band steps and its largest per-atom force is under half the first evaluation’s, a Lanczos estimate seeded with the band tangent (Olsen, Kroes, Henkelman, Arnaldsson, and Jónsson, J. Chem. Phys. 121, 9776 (2004), https://doi.org/10.1063/1.1809574; eight actions, relative tolerance 0.05) gives the mode, and that image climbs alone by the order-1 P-RFO step of Baker, J. Comput. Chem. 7, 385 (1986), https://doi.org/10.1002/jcc.540070402, on a dense TS-BFGS model with the trust schedule of Sella (Hermes, Sarsfield, and Zádor, J. Chem. Theory Comput. 18, 6974 (2022), https://doi.org/10.1021/acs.jctc.2c00395), bounded per atom bymax_move. The model starts ath_0 Iwithh_0one finite-difference curvature along the force perpendicular to the mode, and holds the Lanczos curvature on the mode with every other direction reflected to a minimum. Lanczos runs again when the force grows past 1.5 times its lowest value since the last estimate or the model’s lowest mode overlaps the previous one by under 0.7. The image returns to the band when its mode overlaps the tangent by under 0.3, when the curvature turns positive, or after 1000 steps, at the aligned point of lowest force, and the trigger re-arms by eqs. 13 to 15. The band reportsConvergedwhen the climbing image’s force is underforce_tol. The defaults are looser than the paper’sλ_rel0.31,κ5 andα_tol0.85 because the P-RFO climb follows its own model mode.BandReport::curvaturecarries the mode curvature on a refinement step, andBandSurface::eval_image(default: one row througheval) evaluates the climbing image alone. C ABI minor 21 addsRGSADDLE_BAND_NO_MIN_MODE(band flag bit 3) for the old behaviour and fillsrgsaddle_report_t.curvatureon band steps (the C++ smoke test checks both); the bit is read at every config minor, andrgsaddle_ocineb_createdoes not read it; during a refinement a per-image host is asked for the climbing image withRGSADDLE_REQ_ONE_IMAGEand a batched host for one geometry withn_images = 1andimage = -1. The CON restart test’s band takes the refinement within its eight steps, and the uninterrupted and resumed runs still match byte for byte.Measured with lode-org/optbench (
RGSADDLE_LIBRARY=<release cdylib> uv run optbench run <problem> rgsaddle/<template> --workers 8, templates as registered at rgsaddle c0db2b8d).double-ended-saddle-search/lj38(50 pairs, cap 2500, L2 force 0.001):idpp-ci-neb-lbfgsPAR-2 1253.92 with 43 solved before, 329.6 with 48 solved now (median 119, pair26and pair38at the cap);ew-ci-neb-lbfgs853.56 with 47 solved before, 261.8 with 49 solved now (median 122, pair03diverges).neb/Pt-heptamer(13 pairs, cap 10000):idpp-ci-neb-lbfgs318.3077 to 93.53846,ew-ci-neb-lbfgs357.23 to 121.84615, 13 of 13 solved in every run. WithOcinebSessionon the same refinement, after the merge of main, the four rows are the same numbers.Minimum-mode translation keeps the L-BFGS pairs and the FIRE velocity while the mode stays inside the 45 degree Householder cone (Goswami, Gunde, and Jónsson, Front. Chem. (2026), https://doi.org/10.3389/fchem.2026.1807063). A turn past that cone drops the memory. The spectral move of the reflector is
|R' - R|_2 = 2 |sin θ|(validation/mode_reset.py). Kästner and Sherwood, J. Chem. Phys. 128, 014106 (2008), https://doi.org/10.1063/1.2815812, keep the secant history across that continuous turn. The dimer’s stock residual (1e-4) stops on eOn’s classic torque window: after one rotation a rotational force under 1 eV/Ų is finished. A tighterrotation_tolstill drives the residual, and Lanczos is unchanged.rotation_angle_toldefaults to five degrees (eOnconverged_angle; the same paper); zero still disables the angle test. A C config stores the caller’s value. While the curvature along the mode is not negative, dimer and Lanczos, under L-BFGS and FIRE, take one full per-atommax_movealong the mode (Henkelman and Jónsson, J. Chem. Phys. 111, 7010 (1999), https://doi.org/10.1063/1.480097; eOnmaxAtomMotionApplied). The stencil golden hashes for the dimer and Lanczos on Müller-Brown and the harmonic chain follow that step; the double well and the band hashes are unchanged.A dense symmetric eigenproblem larger than 128 uses faer’s self-adjoint eigensolver when the
faerfeature is on (the default). Dimension 128 and below stays on cyclic Jacobi, including the LJ38 free block of 108. A build with the feature off still compiles and panics if a block above 128 is reached, which is the same gate connect and SQNM use. The Kani harnesses return before a Sella session, so they do not take that path.Lanczos
rgsaddle_minmode_estimateadvances one Hessian action and keeps the Krylov basis until the geometry or the seed changes. The basis grows to the free dimension, so a host that repeats the call can stop when the mode meets its own test.MinModeSession::estimate_modeandstepstill finish the residual test before a translation. A dimer estimate is unchanged (Olsen, Kroes, Henkelman, Arnaldsson, and Jónsson, J. Chem. Phys. 121, 9776 (2004), https://doi.org/10.1063/1.1809574). No new C symbol:RGSADDLE_ABI_MINORstays 20.Minimum-mode L-BFGS arms the same NEB guards as the band (empty-memory scale 0.01, cap and angle resets). The reflected force is not a potential gradient (Goswami, Gunde, and Jónsson, Front. Chem. (2026), https://doi.org/10.3389/fchem.2026.1807063, Eq. 9). Lanczos stops on the relative change of the lowest Ritz value and returns after one product when that value still agrees with the curvature retained from the previous geometry (Olsen et al., J. Chem. Phys. 121, 9776 (2004), https://doi.org/10.1063/1.1809574). A session that has set
MinModeSession::set_lanczos_rel_tolkeeps eOn’s quit-early at that tolerance instead, including after a Krylov that stopped on its cap. Goswami, AIP Adv. (2025), https://doi.org/10.1063/5.0283639.Cartesian order-1 P-RFO diagonalizes a finite-difference Hessian before the step (Jacobi-Davidson, centre gradient reused, one force call per product) and writes the Ritz pairs into the model with TS-BFGS. Plain BFGS drops a secant with non-positive curvature, so an order-1 search keeps TS-BFGS after that diagonalization. The first build accepts a negative root past the uphill mode once its residual is under
gammaand its curvature is below the identity scale: the relative test then sits under the one-sided difference floor, and the subspace would otherwise grow through every free coordinate. A later build keeps the relative residual and runs only when one of the firstordermodel eigenvalues is positive. When the Euclidean trust radius is larger than one distance unit, the step is the P-RFO alpha whose largest atomic displacement meetsmax(delta, 0.1), and that ceiling follows rho. The stored Euclidean radius stays put, so a hostdeltathat never reaches one distance unit is unchanged. Hermes, Sargsyan, Najm, and Zádor, J. Chem. Theory Comput. (2022), https://doi.org/10.1021/acs.jctc.2c00395. Breaking:CartesianPes::hessianreturnsCartesianHessian.The verify workflow’s Index-1 ABI probe links
validation/index1_probe.cand checks the trace and bench checksums invalidation/golden/index1_abi.json. The fixture is rational, so the trace does not follow libm sine or cosine. The crate is optimized for that probe only (profile.dev.package.rgsaddle.opt-level=3). Previously the step copied one debug binary and timed dimension 300 sixteen times. One of those calls is about three minutes, the run took about an hour on the hosted runner, and the printed timing ratio was not asserted. Thevalidationjob hastimeout-minutes: 20.OcinebSessionhands the climbing image to a minimum-mode search once that image has kept one index for more than the stability count and the band force is under the threshold. Goswami, Gunde, and Jónsson, Front. Chem. 14 (2026), https://doi.org/10.3389/fchem.2026.1807063. The host step is one band move, one alignment of the band tangent with the lowest mode, or one minimum-mode translation. Positive curvature restores the climbing image. A mode that leaves the tangent cone returns the search to the band. The band’s own climbing rule on this session isCiConfig::after_rel(0.5). The solid-state block is refused. C ABI minor 20 addsrgsaddle_ocineb_create,rgsaddle_ocineb_step,rgsaddle_ocineb_positions,rgsaddle_ocineb_reset, andrgsaddle_ocineb_free.Breaking:
OcinebSessionis aBandSessionwhosemin_modeisOcinebConfig::refine, so the session and a default climbing band run one controller, one trigger and re-arm rule (initial_threshold,success_threshold,backoff_threshold,should_trigger) and one P-RFO climb.trigger_factorandtrigger_forcemap to the trigger,angle_toltoalignment_tol,stability_count + 1tostable_steps,max_mmf_stepstomax_steps, andrestore_unhelpfulis kept;OcinebConfig::minmodesupplies only the mode estimate (kind,dr, difference, rotation tolerance and count, Krylov dimension), so itsmethod,force_tolandmax_moveare not read. For a session host: the trigger is on the climbing image’s largest per-atom force rather than the band force; aMinModestep is one P-RFO step on the TS-BFGS model, not aMinModeSessiontranslation; theAlignstep estimates the mode without moving the image; a positive curvature re-arms atbackoff_thresholdwith α 0; the path is not respaced after a walk; and the session converges when the climbing image meets the band’sforce_tol. The point surface answers the climbing image’s one-image evaluations.should_triggerlost itsforce_tolargument, so a climbing image already under the tolerance is handed off and the band converges there. On the three analytic paths oftests/ocineb.rsthe session takes 68, 75 and 68 force calls, where theMinModeSessionhand-off took 462, 361 and 383 (plain CI-NEB 401, 450 and 338). Through the optbench band templates, with a scratch shim stepping that hand-off at the stockOcinebConfig, it scored ondouble-ended-saddle-search/lj38ew-ci-neb-lbfgsPAR-2 4788.02 (4 of 50 solved) with the dimer under FIRE and 3593.36 (18 of 50) with Lanczos under L-BFGS, and onneb/Pt-heptamer1213.0 (13 of 13) and 9497.23 (7 of 13); the band refinement scores 261.76 (49 of 50) and 121.85 (13 of 13), so it is the one kept. A band underset_rtr(C method 2, which the OCI-NEB C entry also builds) now takes the refinement too. The tests that compare against plain CI-NEB (tests/ocineb.rs,tests/idpp_path.rs) and the RTR tests that check every image on the path (tests/double_well_rtr.rs,tests/rtr_capi.rs) setmin_mode: NoneorRGSADDLE_BAND_NO_MIN_MODE;refined_rtr_band_converges_on_the_saddlechecks the refined RTR band. The CON restart test now asserts that its band is refined.idpp_pathandlinear_pathbuild an initial band from the two endpoints. Interior images relax on the image-dependent pair potential of Smidstrup, Pedersen, Stokbro, and Jónsson, J. Chem. Phys. 140, 214106 (2014), https://doi.org/10.1063/1.4878664, with minimum-image distances when a cell is supplied. That relaxation is not a surface call. The endpoints are copied through. C ABI minor 19 addsrgsaddle_idpp_path. The connect driver’s own IDPP seed is unchanged.The Kani workflow installs the verifier and then runs one
cargo kani --no-default-features --features capiper shard.model-checking/kani-github-actiondefaults tocargo-kaniwith no arguments. That command enables the defaultfaerfeature, compilespulp, and Kani 0.68 rejectspulp’s global assembly before the prove step. Every shard failed there, including create, step, and pes. The sella harnesses do not turn on a feature the other shards lack.pulpis reached only throughfaer(faer,faer-traits,gemm-common,qd). Sella’s dense spectrum is cyclic Jacobi through dimension 128. A larger block uses faer insideexact_eighwhen the feature is on, and panics if that call is reached with the feature off. The null and short-length guards return beforefrom_raw_parts, so they do not enter a Sella session or the connect and SQNM spectra. Withoutfaerthose spectra still compile and panic if reached, so a harness that entered them would fail.--ignore-global-asmis not used. A normalcargo buildandcargo testkeepfaerthrough the default feature.The tangent norm floor recorded in
scripts/constants.jsonisnorm > 1e-10insrc/stencil/triad.rs::normalize_tangent.src/tangent.rs::compute_tangentcalls that function. The floor is unchanged.The verify workflow checks the Lean stencil contracts, the SymPy and Sollya scripts, Kani null and short-length guards, and an MPFR comparison of the climbing image, the improved tangent, and the forward-difference curvature. The MPFR test asserts only the dot-product bound in Higham (2002), https://doi.org/10.1137/1.9780898718027, Section 3.1. Libm bits on three targets are printed and do not fail the job.
connectfirst climbs from the highest image of an IDPP band. Goswami, Gunde, and Jónsson, Front. Chem. 14 (2026), https://doi.org/10.3389/fchem.2026.1807063, climb the highest image; Goswami, arXiv:2603.14737, is the energy-weighted band this search is measured against. The initial path is the image-dependent pair potential of Smidstrup, Pedersen, Stokbro, and Jónsson, J. Chem. Phys. 140, 214106 (2014), https://doi.org/10.1063/1.4878664; that relaxation is not a surface call. The seed is the improved tangent of Henkelman and Jónsson, J. Chem. Phys. 113, 9978 (2000), https://doi.org/10.1063/1.1323224. The climb is Lanczos min-mode following (Malek and Mousseau, Phys. Rev. E 62, 7723 (2000), https://doi.org/10.1103/PhysRevE.62.7723; Olsen, Kroes, Henkelman, Arnaldsson, and Jónsson, J. Chem. Phys. 121, 9776 (2004), https://doi.org/10.1063/1.1809574) with relative tolerance 0.05 and at most eight actions, translated by L-BFGS (Liu and Nocedal, Math. Program. 45, 503 (1989), https://doi.org/10.1007/BF01589116) on the effective force of Henkelman and Jónsson, J. Chem. Phys. 111, 7010 (1999), https://doi.org/10.1063/1.480097. A segment is accepted when the Euclidean force is at most the tolerance, the tracked curvature is negative, and two Lanczos actions in the orthogonal complement are not clearly negative. The dense Hessian is not built for that acceptance. Otherwise the search is COMPASS (Sommer-Jörgensen and Goedecker, J. Chem. Phys. 160, 064110 (2024), https://doi.org/10.1063/5.0186903) with the SQNM update (Schaefer, Ghasemi, Roy, and Goedecker, J. Chem. Phys. 142, 034112 (2015), https://doi.org/10.1063/1.4905665). A split minimizes the new nodes before the next segment, in the sense of OPTIM NEWCONNECT (Carr, Trygubenko, and Wales, J. Chem. Phys. 122, 234903 (2005), https://doi.org/10.1063/1.1931587) and peleDoubleEndedConnect. That chain’s point is kept when a counted, rigid-projected Hessian has index 1. C ABI minor 18 addsrgsaddle_connect. Pythonconnectuses the same one-image energy-and-gradient callback and releases the GIL for the search.On the unshifted LJ38 two-transition pairs (cap 250000, L2 force 0.001), a release run of this climb on all 51 pairs scores n 51, failures 0, minimum 210, median 442, mean 502.27, maximum 1242, PAR-2 502.274510. Finite differences that decide a step or the index are inside that count; the IDPP relaxation and the verification Hessian are not. The 51-pair profile is min-mode calls 25357 and band calls 259, with no SQNM steps, Hessian checks, quenches, or repeated searches. Two of the min-mode calls on each pair are the complement estimate. Five interior images are evaluated, and an endpoint is evaluated only when the improved tangent needs it (259 band calls in total). pair00is energy -170.079076703090 in 210 calls, verified index 1. pair39is energy -167.855473185910 in 560 calls, verified index 1, and is not the index-3 geometry at -167.541922837218. The same harness with the COMPASS chain alone, before this climb, scored PAR-2 5170.705882 (n 51, failures 0, minimum 1541, median 4175, maximum 23944): SQNM 235802 calls over 125227 steps and 161 segments, Hessian 12084 calls over 53 checks (a central difference is two evaluations per coordinate, 228 for 114 coordinates), quenches 15767 calls over 330 minimizations, and 53 searches. The new score is below EON r2549 Lanczos improved PAR-2 502.7843137254902.
The same release binary runs the current band templates on pairs 0 through 19: five interior images, a linear path, L-BFGS memory 100, the L2 gate, max move 0.05, and the climbing image armed at half the first force. The search stops when the climbing image’s raw Euclidean gradient is at most 0.001 or the band gate is met. Uniform springs (k 5): n 20, failures 12, success minimum 17677, success median 61132, success mean 63753.88, success maximum 141597, PAR-2 325501.55. Nine failures have rigid-projected index 0, 2, 3, 4, or 7, and three hit the cap. Energy-weighted springs frozen from the linear images, with constants from 0.97 to 9.7: n 20, failures 2, success minimum 969, success median 2424, success mean 11782.61, success maximum 59039, PAR-2 60604.35. pair18returns index 7 and pair19returns index 12. The spring-constant pass is counted, and the band evaluates those images again. The verification Hessian is not counted. Meeting the force tolerance leaves the Hessian index free, which is the
wrong_stationaryending. Each success median is the entry at index nsuccess/2 of the sorted success counts.A solid-state band test with an answer known outside the band. The case is the Bain path from bcc to fcc of LJ (epsilon 1 eV, sigma 1 A), switched to zero over [2.0, 2.2] A, on the two-atom tetragonal cell.
validation/bain_lj_reference.pyscans the energy per atom over c/a on a 2.5e-4 grid with the volume relaxed. bcc and fcc are minima. The saddle sits at c/a 1.09331985, 0.0590356373 eV/atom above bcc, and has index 1 over the six cell strains.tests/c/solid_bain_lj.crunsrgsaddle_band_create_solidwith FIRE, 7 interior images and the climbing image armed at 0.5. It converges to a largest component under 1e-4 in 446 iterations and 3131 surface rows, at c/a 1.09331984 and 0.0590356373 eV/atom. The saddle is unstable to the k = (1/2, 0, 1/2) shuffle. A band on a 5x5x4 supercell (200 atoms) reaches the tetragonal saddle and then leaves it once rounding seeds that mode. It converges on a lower path with a 0.0266 eV/atom barrier, so the scan is a reference for the two-atom cell and not for that supercell. Climbing from the first evaluation withmax_move0.1 drives the two-atom band into the compressed bct side, where E(c/a) has no maximum. Withmax_move0.02 it converges in 327 iterations.Breaking: the default climbing image arms once the band settles.
BandConfig::default()usesCiConfig::after(0.5): climbing starts when the largest force component falls under 0.5 (eOnci_after), where it used to start once the force halved.CiConfig::after,after_relandalwaysname the three rules;alwayskeeps climbing from the first evaluation. C ABI minor 17 addsRGSADDLE_BAND_CI_AFTERso a C host can use an absolute threshold withci_trigger_factor = 0.A band step returns
SaddleError::NonFinite("band force norm")when the squared norm of the projected force overflows, andSaddleError::Stalled(CRGSADDLE_STALLED, ABI minor 17) when the solver leaves the band unchanged while the largest force component is aboveforce_tol. Both leave the band where it was. Before this a host loop on such a band spun on cached evaluations.The band offers rgmin’s quick-min variants.
BandConfig::quickmin_optionstakesQuickMinOptions::rgmin(default),::eonor::per_atom,BandSession::set_quickmin_optionsreplaces it, and from Crgsaddle_band_set_quickmin_varianttakesRGSADDLE_QUICKMIN_RGMIN,_EONor_PER_ATOMon a band made withRGSADDLE_METHOD_QUICKMIN. rgmin is pinned at d76539d.BandConfig::time_step(andBandSession::set_time_step,rgsaddle_band_set_time_step) sets the initial FIRE and quick-min time step, 1 by default; the eOn quick-min variant keeps it fixed. Band force calls to a largest component under 0.001 (7 interior images, CI from the start): EAM Al vacancy hop (601 atoms) FIRE 478, L-BFGS 233, quick-min rgmin 744, per-atom 569, eOn 779 at dt 0.1 and 625 at 0.25; Morse Pt heptamer process (336 atoms) FIRE 324, L-BFGS 79, quick-min rgmin 240 (163 at dt 0.1), per-atom 310, eOn 170 at dt 0.1 and 184 at 0.25. The eOn variant does not converge in 5000 steps at dt 0.5 or 1.The dimer measures its rotated dimer when the trial angle sits on its 1e-4 rad floor and the fit asks for an extrapolation weight past 8. With forward differences the fit divides a slope mismatch of
dr/2 T[n,n,theta]by the trial angle; on a bent double well the extrapolated actions reported a curvature of -14.07 where the Hessian spectrum is [4.62, 10.05] (validation/dimer_extrapolation.py,tests/minmode_switch.rs).Measured on eOn’s Morse Pt heptamer saddle search (336 atoms,
displacement.con, 3 repeats, identical counts). WithMinModeSessionclimbing by itself, the switched translation takes the dimer under FIRE from 63 steps and 138 force calls to 51 and 112, Lanczos under FIRE from 139 to 112 calls, the dimer under L-BFGS from 29 to 28 and Lanczos under L-BFGS from 30 to 29. Every run ends at -1462.00876 eV with curvature -1.010. eOn’s ownmin_mode_method = xtscisearch stays at 39 calls, because eOn asks rgsaddle only for the rotation and translates with its own optimizer.`Stencil::point` runs a minimiser, the dimer, Lanczos, ART, and eigen following. Dimer and Lanczos construct `MinModeSession`, and the golden hashes match. `Stencil::band` returns the `feat/band-methods-zoom` seam. `Chain::evaluate` writes fixed one-image blocks by index. The C ABI adds `rgsaddlestencil*\` and thread-local `rgsaddlelasterror\` without a minor bump. Python `Stencil.point` and `rgsaddle.ase.Point` call the C++ wrapper. Goswami, Gunde, and Jónsson, Front. Chem. (2026), https://doi.org/10.3389/fchem.2026.1807063, Eq. 9.
`Surface` is the batched row trait. A type that implements it also implements `PointSurface` and `BandSurface`. `FromPoint` and `FromBand` lift an existing surface. Callers of the old traits are unchanged, and the golden hashes match.
The band tangent, the spring coupling, and the climbing rules `reflect`, `perp`, and `ascend` go through one `Triad`. Goswami, Gunde, and Jónsson, Front. Chem. (2026), https://doi.org/10.3389/fchem.2026.1807063, Eq. 9, is the shared reflection. The golden position and energy hashes are unchanged.
Golden hashes of raw little-endian f64 positions and energies, after a fixed step count, for neb, ci-neb, dneb, weighted-neb, dimer, Lanczos, and AutoNEB. Fixtures are the double well, Müller-Brown, and a three-atom harmonic chain. Threads 1, 2, 3, and 8 match.
Breaking: the python cargo feature and the pyo3 dependency are removed.
The Python package is a nanobind extension built with scikit-build-core and Corrosion. PyO3 and maturin are gone. The eight
IntEnumcontrols keep the names and values of the previous module.NumericalError,last_errorandraise_statusmaprgsaddle_status_t.rgsaddle.ase.SurfaceAdapterevaluates an ASE image list as C ABI request rows. Session types stay off the Python surface.Breaking: struct literals of
Index1Config,SparseHessianOpts, andLowestEigenpairsno longer compile outside this crate, because each is#[non_exhaustive].Index1Configalso gainedsparse_pattern. Migrate it withwith_update,with_mode,with_trust_radius,with_force_tol,with_fd_dr, andwith_sparse_pattern.Index1Config::default()is unchanged and the CPR seed stays off. BuildSparseHessianOptswithDefaultandwith_difference,with_step,with_memory_budget, andwith_skin. ReadLowestEigenpairsby its fields. The default step is1e-4, the same width asfd_dr.matvecpanics on a length mismatch with the same message asapply_hessian.sparse_hessianrecovers a cutoff Hessian by a direct Curtis-Powell-Reid partition.distance2_colouringis greedy in smallest-last order. A block of colours is one batched surface call, sized bySparseHessianOpts::memory_budgetrather than by the thread count, and the blocks are written back in colour order. Each geometry is its own chunk.from_positionsbuilds the pattern with a linkcell cutoff walk plussearch_skin, which ismax(2 * step, skin).lowest_eigenpairsis a thick-restart Lanczos with a residual stop, an iteration cap, and the residuals in the result. Its inner product is a fixed-order dot, serial below 65,536 elements. Powell and Toint (1979) cover the symmetric direct read and the substitution. Star colouring (Coleman and Moré 1984) stays a later option.AutoNEB stays in Rust on
BandConfig::autoneb. The C ABI stays at minor 16.AutoNEB records a trajectory only when
record_samplesis set. The default stores nothing and takes no sample lock. One stored call is onef64per degree of freedom.AutoNEB follows the ASE window and spring rescaling. The fill from two endpoints sets every segment to
k * (n_simul + 1), and each insertion doubles the cut segment. The search stops after the climbing window unlessfull_bandis set. On the double well that default used 1.42 times as many force calls as one fixed CI-NEB. Müller-Brown from B to C used 0.46 times as many, and the two-barrier path from A to B has mean ratio 0.95.AutoNEB reuses one band session while the window indices do not change, so the L-BFGS pairs survive the climb on that window. A new index set starts empty. Known endpoint energies are not evaluated again.
AutoNEB image evaluation keeps one thread pool for the search. Each evaluation is a fixed set of contiguous blocks, stored by image index after every block has finished. One thread evaluates the batch in a single call. There is no SIMD path. The warm-step speedup is capped by
n_simulfree images.AutoNEB temporarily refuses a weighted or Onsager-Machlup spring. Zoom-NEB will recompute those springs when an image is inserted.
AutoNEB grows a band from the supplied images. It inserts where the peak-weighted energy gap or the segment length is worst, relaxes that local window, and arms the climbing image on the last stage. The inserted image is the minimum-image midpoint.
xts_minmode_estimateis the xtsci name ofrgsaddle_minmode_estimate. A null session still fails closed.xts_band_stepis the xtsci name ofrgsaddle_band_step. The arguments and the status codes are the same.C ABI minor 16.
RGSADDLE_METHOD_QUICKMINruns quick-min on the band.rgsaddle_band_create_solidbuilds a solid-state band andrgsaddle_band_step_solidsteps it: onergsaddle_solid_surface_request_tcarries each image’s positions and cell in and its energy, gradient and Cauchy stress out.rgsaddle_band_cellsandrgsaddle_band_solid_jacobianread the cells and the Jacobian back.BandConfig::quickminselects the same step. A min-mode session returns null for that method code. FIRE stays the default.The band can carry the generalized solid-state cell block. The tangent acts on the atomic displacement plus the averaged, Jacobian-scaled strain, and the cell force is minus the cell volume times the Cauchy stress plus hydrostatic pressure, divided by the Jacobian.
BandSurface::eval_cellssupplies the stress. The Jacobian is fixed from the mean endpoint volume.SolidStateis non-exhaustive: build it withSolidState::new,with_pressureandwith_weight.validation/ssneb_jacobian.pyderives the units, the strain-stress pairing and the rotation-free lower triangle.Minimum-mode translation follows the curvature. While the curvature along the mode is not negative the effective gradient is minus the parallel part and the perpendicular force is dropped. A negative curvature keeps the perpendicular force and reflects the parallel part. The dimer and Lanczos share that step.
validation/minmode_switch.pyderives both branches on a quadratic model, and the LeanMinModecontract states the switched force (switchedForceand theswitched_force_*theorems).C ABI minor 5.
rgsaddle_band_restartrestarts the band optimizer and keeps the endpoint energies and the last evaluation.rgsaddle_band_resetis the surface-change boundary and drops both.rgsaddle_band_evaluationreturns the energies, gradients and projected force at the current band, orRGSADDLE_NO_EVALUATION. The report’sevaluationsfield takes the place ofreservedand counts the surface rows of a step.C ABI minor 5, min-mode reuse.
rgsaddle_minmode_set_positionmoves a session, with the host’s gradient when it has one,rgsaddle_minmode_set_modereplaces the seed, andrgsaddle_minmode_estimaterefreshes the lowest mode without a translation.rgsaddle_minmode_config_tgainsrotation_angle_tol(radians; 0 turns the angle test off) anddifference(RGSADDLE_DIFFERENCE_FORWARDor_CENTRAL), read only from configs whose version minor is 5 or newer; the RustMinModeConfigcarries the same fields.C ABI minor 14 adds the Sella minimum and saddle sessions, the reaction-path (IRC), SAMD, constraint and internal-coordinate PES sessions, the kappa dimer, Niggli reduction, and
rgsaddle_band_set_force_gate,rgsaddle_minmode_set_force_gate,rgsaddle_band_set_highsandrgsaddle_minmode_set_highs.C ABI minor 15:
rgsaddle_sella_saddle_seed_modeseeds a Cartesian Sella saddle session’s Hessian with a mode and its curvature, with no surface call.The band and min-mode sessions build on rgmin main (pinned by revision until an rgmin release carries it). They call
Solver::forget_evaluationwhen their oracle changes at a fixed point, and the band’s L-BFGS memory comes from its config.Arm eOn’s L-BFGS resets on the band: a two-loop step that reaches the per-atom cap or faces away from the force drops the stored pairs and steps along the force, and an empty memory scales that step by 0.01.
Climb the highest interior image only while it lies above both fixed endpoints, as eOn does. A monotonic band keeps the spring force on every image and reports no climbing image.
Remove the mean Cartesian force from each multi-atom band image, as eOn does when every atom is free.
BandConfig::remove_translationand theRGSADDLE_BAND_KEEP_TRANSLATIONband flag keep the mean for hosts with fixed atoms.Retain main’s band and minimum-mode solver contracts alongside the Sella, reaction-path, constraint, cell and dynamics interfaces.
Require curvature measured at a moved stationary point before minimum-mode convergence.
Update the restricted atomic step radius with the largest atom displacement.
Preserve the complete cell when reading molecular frames.
Expose typed C++ and Python controls and the official ABI 1.15 contract.
Include the retained numerical trajectories, callback-count checks and symbolic, interval and Lean proofs.