Skip to content

feat(saddle): opt-in partitioned rational function optimization (P-RFO) refinement after a dimer or climbing image band - #867

Merged
HaoZeke merged 4 commits into
TheochemUI:developfrom
HaoZeke:eOn-0kg0
Nov 1, 2026
Merged

HaoZeke merged 4 commits into
TheochemUI:developfrom
HaoZeke:eOn-0kg0

Conversation

@HaoZeke

@HaoZeke HaoZeke commented Nov 1, 2026

Copy link
Copy Markdown
Collaborator

Summary

This adds opt-in partitioned rational function optimization (P-RFO) refinement of a converged saddle, through the rgsaddle Sella session.
It closes gap 5 of section 4 of the eOn audit.

  • [Saddle Search] prfo_refine, prfo_refine_force and prfo_refine_max_iterations are off by default.
  • After a dimer or Lanczos search ends with status good and a negative curvature, the saddle, its lowest mode and that curvature go to the session.
    The session seeds that mode, steps with the transition-state Broyden-Fletcher-Goldfarb-Shanno (TS-BFGS) update, and stops at prfo_refine_force in max-atom force.
  • A climbing image nudged elastic band (NEB) refines a copy of its climbing image along the band tangent.
    It writes sp_refined.con, adds four results.dat keys and leaves the band unchanged.
  • Only free atoms move, and there is no rigid-body projection.
    If the refinement ends at a larger force, the starting saddle is kept.
  • The code needs rgsaddle application binary interface (ABI) 1.15 for the mode seed, which the pinned rgsaddle (06c55c5, 0.2.2) provides, and it is guarded at compile time and at run time like the band host.
    The pin is unchanged.

Measurements

One run per configuration on one machine, one thread per run.
Each cell gives force calls, the max-atom force in eV/Å of the written saddle (evaluated again with a point job) and the wall time.
"Tightened" converges the search itself to 1e-5 eV/Å.

The table gives the search, refined and tightened runs with rgsaddle 0.3.2 and the proposed rgsaddle P-RFO eigensolve series (7987cfb, eda59ac).
That series builds on main at 276a984 and is not in an rgsaddle release.

Case Free atoms Search Refined to 1e-5 Tightened
Dimer, benchmarks/data/one_pt_saddle_search 1 39, 2.4e-4, 0.06 s 43, 1.1e-7, 0.06 s 54, 8.9e-6, 0.06 s
Dimer, Pt heptamer test system 7 130, 2.9e-4, 0.11 s 163, 2.4e-6, 0.16 s 136, 4.0e-6, 0.11 s
Dimer, 13-atom Lennard-Jones (LJ13) test cluster 13 158, 3.5e-4, 0.02 s 201, 9.9e-6, 0.27 s 176, 4.3e-6, 0.02 s
NEB, benchmarks/data/neb_morse_pt 175 277, 1.7e-4, 3.1 s 465, 7.4e-6, 1207 s 427, 1.8e-6, 3.2 s
NEB, examples/neb-al 401 240, 2.2e-4, 0.87 s not finished after 3600 s 373, 3.4e-6, 0.90 s

At the pinned rgsaddle the dimer searches take more calls, 180 for the heptamer and 836 for LJ13.
Refinement there reaches the target on the three dimers.
Neither band refinement finished.
The 175-atom one was stopped unfinished after 8074 s of wall time.
A run capped at 3 steps takes 41 s on the 175-atom band and 1583 s on the 401-atom band.

  • Refinement pays off only on the one-free-atom case.
    With 7 and 13 free atoms, tightening the dimer is cheaper.
  • On the bands, tightening the band is far cheaper than refining its climbing image.
    The time per step is set by the TS-BFGS update, which diagonalizes the whole Hessian model with a cyclic Jacobi solver in rgmin after every force call.
    The eigensolve series does not change that path: plain 276a984 takes the same steps and calls, with 1295 s on the 175-atom band.
  • The floating-point overflow notice that a refinement can log is harmless: the client masks the trap and continues.
    At the pin it comes from an rgmin Jacobi rotation parameter too large to square, and at 0.3.2 also from faer's norm, which overflows a discarded accumulator by design.
    With the series library, outputs with the trap turned off are the same.
  • The docs state the version dependence, the cost on large free sets and the notice.

Default path

At defaults the develop and tip clients write identical results.dat (apart from timing and build identity), saddle.con, mode.dat, neb.con, neb.dat and sp.con on all five cases, at the pin and with the 0.3.2 series library.
A unit test also checks that prfo_refine = false matches a configuration without the keys.

Checks

  • meson test --suite eon with the pinned rgsaddle: 76 passed, 0 failed, including the new test_prfo_refine.
  • The same against rgsaddle 0.3.2 with the series: 75 passed, 1 failed.
    The failure is the plain band case NEB LJ matches SVN reference in test_jobs, which develop fails the same way against rgsaddle 0.3.2, with or without the series.
  • clang-format 20.1.7 (the pre-commit pin) on every changed C++ file is clean.

Docs

The saddle search page has a how-to, a reference list and the measurements at both rgsaddle versions, and the NEB page describes the climbing image refinement and its cost on bands.
They cite the eOn papers of Goswami and coworkers first, then Baker (1986) and Hermes, Sargsyan, Najm and Zádor (2022).
A newsfragment records the option.

…ction optimization

[Saddle Search] gains prfo_refine, prfo_refine_force and prfo_refine_max_iterations.
They are off by default, and a job without them takes the same path as before.
After a dimer or Lanczos search ends with status good and a negative curvature, the saddle, its lowest mode and that curvature go to the rgsaddle Sella order-1 session.
The session steps with partitioned rational function optimization (P-RFO) and the TS-BFGS update (a Broyden-Fletcher-Goldfarb-Shanno variant for transition states) until the max-atom force reaches prfo_refine_force.
Only free atoms move, on an empty constraint chart, so a periodic cell or a slab with fixed atoms keeps every coordinate.
The host caches the last evaluation on the session's own unwrapped vector, because Matter wraps positions into the cell.
If the last point has a larger max-atom force than the start, the start is kept.
After a refinement the min mode is estimated once more, so mode.dat and the eigenvalue test belong to the refined point.
The refinement needs rgsaddle application binary interface (ABI) 1.15, which adds the mode seed.
A client without it refuses the option.
The keys go to the server allowlist, the configuration schema and the published JSON (JavaScript Object Notation) schema.
With [Saddle Search] prfo_refine on, a converged nudged elastic band (NEB) hands a copy of its climbing image to the partitioned rational function optimization (P-RFO) refinement.
Its mode is the band tangent, and one forward difference of the forces gives its curvature.
A band without a climbing image, or with a curvature that is not negative, logs a warning and skips the refinement.
The band, neb.con and sp.con stay as the band left them.
The refined saddle goes to sp_refined.con.
results.dat gains force_calls_prfo_refine, prfo_refine_converged, prfo_refine_max_force and prfo_refine_energy, and total_force_calls counts the refinement.
…imer and band

The LJ13 dimer and climbing image band converge at 0.01 eV/Angstrom and refine to 1e-5 eV/Angstrom.
The refined saddles are checked for a smaller max-atom force, the same energy and a negative final eigenvalue.
The band test also checks that neb.con matches the run without refinement and that the force calls add up.
A third case checks that prfo_refine = false writes the same results.dat, saddle.con, mode.dat and neb.con as a configuration without the keys.
The saddle search page gains a section on refining a converged saddle with partitioned rational function optimization (P-RFO).
It has a how-to for a dimer saddle, a reference list of the rules, and the measured force calls, forces and wall times with and without refinement.
The measurements cover the pinned rgsaddle 0.2.2 and rgsaddle 0.3.2 with its proposed P-RFO eigensolve series.
Both the dimer searches and the cost of each refinement step depend on the rgsaddle version.
The reference names the eigensolver that dominates the time per step on a large band.
It also explains the overflow notice that the rgsaddle eigensolvers can raise.
The nudged elastic band (NEB) page describes the climbing image refinement, sp_refined.con and the new results.dat keys, and compares its cost with converging the band itself.
The pages cite the eOn papers of Goswami and coworkers first, then Baker (1986) and Hermes, Sargsyan, Najm and Zador (2022).
The newsfragment records the option and the measurements.
@codecov

codecov Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 31.34328% with 46 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
client/NudgedElasticBandJob.cpp 10.00% 27 Missing ⚠️
client/PrfoRefine.cpp 0.00% 14 Missing ⚠️
client/MinModeSaddleSearch.cpp 54.54% 5 Missing ⚠️

📢 Thoughts on this report? Let us know!

@HaoZeke
HaoZeke merged commit cd9b18b into TheochemUI:develop Nov 1, 2026
48 of 49 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant