Barrier Refinement¶
Once you have an initial estimate of the energy barrier (from path sampling, for example), you can refine it using energy-filtered A* search. The ratchet algorithm repeatedly searches for paths below a ceiling energy, lowering the ceiling each time a better path is found. This progressively tightens the upper bound on the minimum energy barrier.
This guide explains how the ratchet algorithm works and how to use it.
Energy Ceiling Filtering¶
Unlike the minimum distance filter (which rejects structures where atoms are too close), an energy ceiling filter rejects structures whose energy exceeds a specified threshold. This directly constrains the barrier: if A* finds a path where all structures have energy below the ceiling, the path's barrier is guaranteed to be at most the ceiling value.
Energy filtering requires evaluating the energy of each candidate structure during the search, which is more expensive than geometric filtering. We use GRACE, a machine learning potential, to make this tractable. Each energy evaluation takes a few milliseconds, and we cache results to avoid redundant calculations.
The Ratcheting Mechanism¶
The ratchet algorithm works as follows:
- Start with an initial ceiling (from a previous path sampling run, or a rough estimate)
- Run A* search with the energy ceiling filter
- If a path is found, lower the ceiling to the path's barrier (or by a minimum step)
- Repeat until the search fails to find a path
The ceiling only ever decreases, like a ratchet mechanism. Each successful search tightens our upper bound on the true minimum barrier.
When the search fails (no path below the current ceiling), it doesn't mean we've found the optimal barrier. The discretization might be too coarse to represent the true minimum-energy pathway. So the algorithm adapts: it refines the discretization parameters (smaller xi, larger delta) and tries again.
A Simple Example¶
Let's refine the barrier between two zirconium structures. We'll start with a relatively high ceiling and let the ratchet find progressively lower-barrier paths.
from pymatgen.core import Structure, Lattice
from cnf import CNFConstructor, UnitCell
# HCP zirconium
a_hcp, c_hcp = 3.23, 5.15
lattice_hcp = Lattice.hexagonal(a_hcp, c_hcp)
zr_hcp = Structure(
lattice_hcp,
["Zr", "Zr"],
[[0, 0, 0], [1/3, 2/3, 0.5]]
)
# BCC-like zirconium (different structure)
a_bcc = 3.6
lattice_bcc = Lattice.tetragonal(a_bcc, a_bcc * 1.1)
zr_bcc = Structure(
lattice_bcc,
["Zr", "Zr"],
[[0, 0, 0], [0.5, 0.5, 0.5]]
)
print(f"HCP volume: {zr_hcp.volume:.2f} Ang^3")
print(f"BCC-like volume: {zr_bcc.volume:.2f} Ang^3")
# Create UnitCells
start_uc = UnitCell.from_pymatgen_structure(zr_hcp)
end_uc = UnitCell.from_pymatgen_structure(zr_bcc)
# Convert to CNF
xi = 1.5
delta = 30
constructor = CNFConstructor(xi=xi, delta=delta)
start_cnf = constructor.from_pymatgen_structure(zr_hcp).cnf
goal_cnf = constructor.from_pymatgen_structure(zr_bcc).cnf
print(f"\\nStart CNF (HCP): {start_cnf.coords[:7]}...")
print(f"Goal CNF (BCC): {goal_cnf.coords[:7]}...")
HCP volume: 46.53 Ang^3 BCC-like volume: 51.32 Ang^3 \nStart CNF (HCP): (7, 7, 18, 25, 7, 25, 25)... Goal CNF (BCC): (8, 9, 10, 26, 17, 17, 19)...
from cnf.navigation.astar.iterative import ratchet
from cnf.calculation.grace import GraceCalculator
# Create energy calculator
calc = GraceCalculator()
# Compute endpoint energies to set initial ceiling
e_start = calc.calculate_energy(start_cnf)
e_end = calc.calculate_energy(goal_cnf)
max_endpoint = max(e_start, e_end)
# Set initial ceiling 200 meV/atom above the higher endpoint
n_atoms = len(start_cnf.elements)
initial_ceiling = max_endpoint + 0.200 * n_atoms
print(f"Start energy: {e_start:.4f} eV ({e_start/n_atoms:.4f} eV/atom)")
print(f"End energy: {e_end:.4f} eV ({e_end/n_atoms:.4f} eV/atom)")
print(f"Initial ceiling: {initial_ceiling:.4f} eV ({initial_ceiling/n_atoms:.4f} eV/atom)")
[tensorpotential] Info: Environment variable TF_USE_LEGACY_KERAS is automatically set to '1'.
Using cached GRACE model from /Users/maxg/.cache/grace/GRACE-FS-OAM Model license: Academic Software License
2026-03-13 19:23:43.551026: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x16392cab0 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2026-03-13 19:23:43.551038: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2026-03-13 19:23:43.662889: I tensorflow/compiler/mlir/tensorflow/utils/dump_mlir_util.cc:269] disabling MLIR crash reproducer, set env var `MLIR_CRASH_REPRODUCER_DIRECTORY` to enable.
Start energy: -17.0654 eV (-8.5327 eV/atom) End energy: -16.9389 eV (-8.4695 eV/atom) Initial ceiling: -16.5389 eV (-8.2695 eV/atom)
2026-03-13 19:23:44.463343: I ./tensorflow/compiler/jit/device_compiler.h:186] Compiled cluster using XLA! This line is logged at most once for the lifetime of the process. 2026-03-13 19:23:44.467287: E ./tensorflow/compiler/xla/stream_executor/stream_executor_internal.h:124] SetPriority unimplemented for this stream.
result = ratchet(
start_cnfs=[start_cnf],
goal_cnfs=[goal_cnf],
initial_ceiling=initial_ceiling,
energy_calc=calc,
start_uc=start_uc,
end_uc=end_uc,
max_adaptations=2,
max_iterations=2000,
verbosity=1,
)
Starting ratchet refinement Max endpoint energy (discretized): -8.4695 eV/atom Max endpoint energy (original): -8.4438 eV/atom Discretization shift: -25.7 meV/atom Initial ceiling: 200.0 meV/atom above endpoint Ceiling step: 2.0 meV/atom Max adaptations: 2 xi_factor=0.8, delta_factor=1.2 Estimating initial max_iters... Estimating max_iters: attempt 1/5, trying 5000 Path found in 29 iters -> using max_iters=43 ============================================================ Attempt 0 (ceiling=200.0/174.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=197.9/172.3 meV/atom disc/orig, iters=29 Ceiling: 200.0/174.3 → 197.9/172.3 meV/atom disc/orig ============================================================ Attempt 1 (ceiling=197.9/172.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=197.1/171.5 meV/atom disc/orig, iters=29 Ceiling: 197.9/172.3 → 195.9/170.3 meV/atom disc/orig ============================================================ Attempt 2 (ceiling=195.9/170.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=195.8/170.2 meV/atom disc/orig, iters=29 Ceiling: 195.9/170.3 → 193.9/168.3 meV/atom disc/orig ============================================================ Attempt 3 (ceiling=193.9/168.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=193.2/167.6 meV/atom disc/orig, iters=29 Ceiling: 193.9/168.3 → 191.9/166.3 meV/atom disc/orig ============================================================ Attempt 4 (ceiling=191.9/166.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=189.6/163.9 meV/atom disc/orig, iters=29 Ceiling: 191.9/166.3 → 189.6/163.9 meV/atom disc/orig ============================================================ Attempt 5 (ceiling=189.6/163.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=188.5/162.8 meV/atom disc/orig, iters=30 Ceiling: 189.6/163.9 → 187.6/161.9 meV/atom disc/orig ============================================================ Attempt 6 (ceiling=187.6/161.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=185.0/159.4 meV/atom disc/orig, iters=30 Ceiling: 187.6/161.9 → 185.0/159.4 meV/atom disc/orig ============================================================ Attempt 7 (ceiling=185.0/159.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=184.8/159.1 meV/atom disc/orig, iters=33 Ceiling: 185.0/159.4 → 183.0/157.4 meV/atom disc/orig ============================================================ Attempt 8 (ceiling=183.0/157.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=181.7/156.0 meV/atom disc/orig, iters=30 Ceiling: 183.0/157.4 → 181.0/155.4 meV/atom disc/orig ============================================================ Attempt 9 (ceiling=181.0/155.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=32, barrier=179.7/154.1 meV/atom disc/orig, iters=32 Ceiling: 181.0/155.4 → 179.0/153.4 meV/atom disc/orig ============================================================ Attempt 10 (ceiling=179.0/153.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=177.6/151.9 meV/atom disc/orig, iters=29 Ceiling: 179.0/153.4 → 177.0/151.4 meV/atom disc/orig ============================================================ Attempt 11 (ceiling=177.0/151.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=176.7/151.0 meV/atom disc/orig, iters=30 Ceiling: 177.0/151.4 → 175.0/149.4 meV/atom disc/orig ============================================================ Attempt 12 (ceiling=175.0/149.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=174.1/148.5 meV/atom disc/orig, iters=29 Ceiling: 175.0/149.4 → 173.0/147.4 meV/atom disc/orig ============================================================ Attempt 13 (ceiling=173.0/147.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=31, barrier=166.3/140.6 meV/atom disc/orig, iters=31 Ceiling: 173.0/147.4 → 166.3/140.6 meV/atom disc/orig ============================================================ Attempt 14 (ceiling=166.3/140.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=164.7/139.0 meV/atom disc/orig, iters=33 Ceiling: 166.3/140.6 → 164.3/138.6 meV/atom disc/orig ============================================================ Attempt 15 (ceiling=164.3/138.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=164.2/138.6 meV/atom disc/orig, iters=30 Ceiling: 164.3/138.6 → 162.3/136.6 meV/atom disc/orig ============================================================ Attempt 16 (ceiling=162.3/136.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=31, barrier=160.3/134.6 meV/atom disc/orig, iters=31 Ceiling: 162.3/136.6 → 160.3/134.6 meV/atom disc/orig ============================================================ Attempt 17 (ceiling=160.3/134.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=152.7/127.0 meV/atom disc/orig, iters=29 Ceiling: 160.3/134.6 → 152.7/127.0 meV/atom disc/orig ============================================================ Attempt 18 (ceiling=152.7/127.0 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=152.6/127.0 meV/atom disc/orig, iters=29 Ceiling: 152.7/127.0 → 150.7/125.0 meV/atom disc/orig ============================================================ Attempt 19 (ceiling=150.7/125.0 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=147.9/122.3 meV/atom disc/orig, iters=29 Ceiling: 150.7/125.0 → 147.9/122.3 meV/atom disc/orig ============================================================ Attempt 20 (ceiling=147.9/122.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=147.9/122.3 meV/atom disc/orig, iters=29 Ceiling: 147.9/122.3 → 145.9/120.3 meV/atom disc/orig ============================================================ Attempt 21 (ceiling=145.9/120.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=31, barrier=144.8/119.1 meV/atom disc/orig, iters=31 Ceiling: 145.9/120.3 → 143.9/118.3 meV/atom disc/orig ============================================================ Attempt 22 (ceiling=143.9/118.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=138.8/113.2 meV/atom disc/orig, iters=32 Ceiling: 143.9/118.3 → 138.8/113.2 meV/atom disc/orig ============================================================ Attempt 23 (ceiling=138.8/113.2 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=135.4/109.7 meV/atom disc/orig, iters=29 Ceiling: 138.8/113.2 → 135.4/109.7 meV/atom disc/orig ============================================================ Attempt 24 (ceiling=135.4/109.7 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=31, barrier=135.2/109.6 meV/atom disc/orig, iters=33 Ceiling: 135.4/109.7 → 133.4/107.7 meV/atom disc/orig ============================================================ Attempt 25 (ceiling=133.4/107.7 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=133.0/107.3 meV/atom disc/orig, iters=29 Ceiling: 133.4/107.7 → 131.4/105.7 meV/atom disc/orig ============================================================ Attempt 26 (ceiling=131.4/105.7 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=128.3/102.7 meV/atom disc/orig, iters=31 Ceiling: 131.4/105.7 → 128.3/102.7 meV/atom disc/orig ============================================================ Attempt 27 (ceiling=128.3/102.7 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=125.7/100.1 meV/atom disc/orig, iters=29 Ceiling: 128.3/102.7 → 125.7/100.1 meV/atom disc/orig ============================================================ Attempt 28 (ceiling=125.7/100.1 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=125.2/99.5 meV/atom disc/orig, iters=29 Ceiling: 125.7/100.1 → 123.7/98.1 meV/atom disc/orig ============================================================ Attempt 29 (ceiling=123.7/98.1 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=31, barrier=123.5/97.9 meV/atom disc/orig, iters=31 Ceiling: 123.7/98.1 → 121.7/96.1 meV/atom disc/orig ============================================================ Attempt 30 (ceiling=121.7/96.1 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=121.2/95.5 meV/atom disc/orig, iters=30 Ceiling: 121.7/96.1 → 119.7/94.1 meV/atom disc/orig ============================================================ Attempt 31 (ceiling=119.7/94.1 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=118.1/92.4 meV/atom disc/orig, iters=30 Ceiling: 119.7/94.1 → 117.7/92.1 meV/atom disc/orig ============================================================ Attempt 32 (ceiling=117.7/92.1 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=115.8/90.1 meV/atom disc/orig, iters=29 Ceiling: 117.7/92.1 → 115.7/90.1 meV/atom disc/orig ============================================================ Attempt 33 (ceiling=115.7/90.1 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=114.0/88.4 meV/atom disc/orig, iters=29 Ceiling: 115.7/90.1 → 113.7/88.1 meV/atom disc/orig ============================================================ Attempt 34 (ceiling=113.7/88.1 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=113.2/87.5 meV/atom disc/orig, iters=29 Ceiling: 113.7/88.1 → 111.7/86.1 meV/atom disc/orig ============================================================ Attempt 35 (ceiling=111.7/86.1 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=109.5/83.8 meV/atom disc/orig, iters=29 Ceiling: 111.7/86.1 → 109.5/83.8 meV/atom disc/orig ============================================================ Attempt 36 (ceiling=109.5/83.8 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=108.7/83.1 meV/atom disc/orig, iters=31 Ceiling: 109.5/83.8 → 107.5/81.8 meV/atom disc/orig ============================================================ Attempt 37 (ceiling=107.5/81.8 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=104.8/79.2 meV/atom disc/orig, iters=29 Ceiling: 107.5/81.8 → 104.8/79.2 meV/atom disc/orig ============================================================ Attempt 38 (ceiling=104.8/79.2 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=103.3/77.6 meV/atom disc/orig, iters=30 Ceiling: 104.8/79.2 → 102.8/77.2 meV/atom disc/orig ============================================================ Attempt 39 (ceiling=102.8/77.2 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=102.3/76.7 meV/atom disc/orig, iters=30 Ceiling: 102.8/77.2 → 100.8/75.2 meV/atom disc/orig ============================================================ Attempt 40 (ceiling=100.8/75.2 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=95.1/69.5 meV/atom disc/orig, iters=30 Ceiling: 100.8/75.2 → 95.1/69.5 meV/atom disc/orig ============================================================ Attempt 41 (ceiling=95.1/69.5 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=95.1/69.5 meV/atom disc/orig, iters=29 Ceiling: 95.1/69.5 → 93.1/67.5 meV/atom disc/orig ============================================================ Attempt 42 (ceiling=93.1/67.5 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=92.4/66.8 meV/atom disc/orig, iters=29 Ceiling: 93.1/67.5 → 91.1/65.5 meV/atom disc/orig ============================================================ Attempt 43 (ceiling=91.1/65.5 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=89.0/63.4 meV/atom disc/orig, iters=29 Ceiling: 91.1/65.5 → 89.0/63.4 meV/atom disc/orig ============================================================ Attempt 44 (ceiling=89.0/63.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=88.2/62.6 meV/atom disc/orig, iters=31 Ceiling: 89.0/63.4 → 87.0/61.4 meV/atom disc/orig ============================================================ Attempt 45 (ceiling=87.0/61.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=87.0/61.3 meV/atom disc/orig, iters=29 Ceiling: 87.0/61.4 → 85.0/59.4 meV/atom disc/orig ============================================================ Attempt 46 (ceiling=85.0/59.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=85.0/59.3 meV/atom disc/orig, iters=30 Ceiling: 85.0/59.4 → 83.0/57.4 meV/atom disc/orig ============================================================ Attempt 47 (ceiling=83.0/57.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=81.3/55.6 meV/atom disc/orig, iters=29 Ceiling: 83.0/57.4 → 81.0/55.4 meV/atom disc/orig ============================================================ Attempt 48 (ceiling=81.0/55.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=78.8/53.2 meV/atom disc/orig, iters=30 Ceiling: 81.0/55.4 → 78.8/53.2 meV/atom disc/orig ============================================================ Attempt 49 (ceiling=78.8/53.2 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=76.0/50.4 meV/atom disc/orig, iters=29 Ceiling: 78.8/53.2 → 76.0/50.4 meV/atom disc/orig ============================================================ Attempt 50 (ceiling=76.0/50.4 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=72.4/46.7 meV/atom disc/orig, iters=29 Ceiling: 76.0/50.4 → 72.4/46.7 meV/atom disc/orig ============================================================ Attempt 51 (ceiling=72.4/46.7 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=69.5/43.9 meV/atom disc/orig, iters=30 Ceiling: 72.4/46.7 → 69.5/43.9 meV/atom disc/orig ============================================================ Attempt 52 (ceiling=69.5/43.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=67.8/42.2 meV/atom disc/orig, iters=31 Ceiling: 69.5/43.9 → 67.5/41.9 meV/atom disc/orig ============================================================ Attempt 53 (ceiling=67.5/41.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=67.3/41.6 meV/atom disc/orig, iters=30 Ceiling: 67.5/41.9 → 65.5/39.9 meV/atom disc/orig ============================================================ Attempt 54 (ceiling=65.5/39.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=64.5/38.9 meV/atom disc/orig, iters=29 Ceiling: 65.5/39.9 → 63.5/37.9 meV/atom disc/orig ============================================================ Attempt 55 (ceiling=63.5/37.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=63.2/37.5 meV/atom disc/orig, iters=30 Ceiling: 63.5/37.9 → 61.5/35.9 meV/atom disc/orig ============================================================ Attempt 56 (ceiling=61.5/35.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=31, barrier=59.5/33.8 meV/atom disc/orig, iters=34 Ceiling: 61.5/35.9 → 59.5/33.8 meV/atom disc/orig ============================================================ Attempt 57 (ceiling=59.5/33.8 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=59.3/33.7 meV/atom disc/orig, iters=29 Ceiling: 59.5/33.8 → 57.5/31.8 meV/atom disc/orig ============================================================ Attempt 58 (ceiling=57.5/31.8 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=55.9/30.3 meV/atom disc/orig, iters=29 Ceiling: 57.5/31.8 → 55.5/29.8 meV/atom disc/orig ============================================================ Attempt 59 (ceiling=55.5/29.8 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=53.9/28.2 meV/atom disc/orig, iters=30 Ceiling: 55.5/29.8 → 53.5/27.8 meV/atom disc/orig ============================================================ Attempt 60 (ceiling=53.5/27.8 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=31, barrier=53.1/27.5 meV/atom disc/orig, iters=31 Ceiling: 53.5/27.8 → 51.5/25.8 meV/atom disc/orig ============================================================ Attempt 61 (ceiling=51.5/25.8 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=31, barrier=51.0/25.3 meV/atom disc/orig, iters=32 Ceiling: 51.5/25.8 → 49.5/23.8 meV/atom disc/orig ============================================================ Attempt 62 (ceiling=49.5/23.8 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=48.7/23.1 meV/atom disc/orig, iters=29 Ceiling: 49.5/23.8 → 47.5/21.8 meV/atom disc/orig ============================================================ Attempt 63 (ceiling=47.5/21.8 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=45.3/19.6 meV/atom disc/orig, iters=29 Ceiling: 47.5/21.8 → 45.3/19.6 meV/atom disc/orig ============================================================ Attempt 64 (ceiling=45.3/19.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=42.9/17.3 meV/atom disc/orig, iters=30 Ceiling: 45.3/19.6 → 42.9/17.3 meV/atom disc/orig ============================================================ Attempt 65 (ceiling=42.9/17.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=42.4/16.7 meV/atom disc/orig, iters=29 Ceiling: 42.9/17.3 → 40.9/15.3 meV/atom disc/orig ============================================================ Attempt 66 (ceiling=40.9/15.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=39.5/13.9 meV/atom disc/orig, iters=32 Ceiling: 40.9/15.3 → 38.9/13.3 meV/atom disc/orig ============================================================ Attempt 67 (ceiling=38.9/13.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=38.4/12.8 meV/atom disc/orig, iters=30 Ceiling: 38.9/13.3 → 36.9/11.3 meV/atom disc/orig ============================================================ Attempt 68 (ceiling=36.9/11.3 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=34.6/8.9 meV/atom disc/orig, iters=30 Ceiling: 36.9/11.3 → 34.6/8.9 meV/atom disc/orig ============================================================ Attempt 69 (ceiling=34.6/8.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=33.7/8.1 meV/atom disc/orig, iters=29 Ceiling: 34.6/8.9 → 32.6/6.9 meV/atom disc/orig ============================================================ Attempt 70 (ceiling=32.6/6.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=31.0/5.4 meV/atom disc/orig, iters=31 Ceiling: 32.6/6.9 → 30.6/4.9 meV/atom disc/orig ============================================================ Attempt 71 (ceiling=30.6/4.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=30.3/4.7 meV/atom disc/orig, iters=29 Ceiling: 30.6/4.9 → 28.6/2.9 meV/atom disc/orig ============================================================ Attempt 72 (ceiling=28.6/2.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=27.6/2.0 meV/atom disc/orig, iters=29 Ceiling: 28.6/2.9 → 26.6/0.9 meV/atom disc/orig ============================================================ Attempt 73 (ceiling=26.6/0.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=24.0/-1.6 meV/atom disc/orig, iters=29 Ceiling: 26.6/0.9 → 24.0/-1.6 meV/atom disc/orig ============================================================ Attempt 74 (ceiling=24.0/-1.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=21.7/-3.9 meV/atom disc/orig, iters=31 Ceiling: 24.0/-1.6 → 21.7/-3.9 meV/atom disc/orig ============================================================ Attempt 75 (ceiling=21.7/-3.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=21.6/-4.1 meV/atom disc/orig, iters=29 Ceiling: 21.7/-3.9 → 19.7/-5.9 meV/atom disc/orig ============================================================ Attempt 76 (ceiling=19.7/-5.9 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=16.1/-9.6 meV/atom disc/orig, iters=29 Ceiling: 19.7/-5.9 → 16.1/-9.6 meV/atom disc/orig ============================================================ Attempt 77 (ceiling=16.1/-9.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=32, barrier=15.2/-10.4 meV/atom disc/orig, iters=32 Ceiling: 16.1/-9.6 → 14.1/-11.6 meV/atom disc/orig ============================================================ Attempt 78 (ceiling=14.1/-11.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=12.8/-12.9 meV/atom disc/orig, iters=30 Ceiling: 14.1/-11.6 → 12.1/-13.6 meV/atom disc/orig ============================================================ Attempt 79 (ceiling=12.1/-13.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=10.1/-15.6 meV/atom disc/orig, iters=29 Ceiling: 12.1/-13.6 → 10.1/-15.6 meV/atom disc/orig ============================================================ Attempt 80 (ceiling=10.1/-15.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=9.6/-16.0 meV/atom disc/orig, iters=29 Ceiling: 10.1/-15.6 → 8.1/-17.6 meV/atom disc/orig ============================================================ Attempt 81 (ceiling=8.1/-17.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=29, barrier=7.9/-17.7 meV/atom disc/orig, iters=29 Ceiling: 8.1/-17.6 → 6.1/-19.6 meV/atom disc/orig ============================================================ Attempt 82 (ceiling=6.1/-19.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=5.6/-20.0 meV/atom disc/orig, iters=31 Ceiling: 6.1/-19.6 → 4.1/-21.6 meV/atom disc/orig ============================================================ Attempt 83 (ceiling=4.1/-21.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=30, barrier=3.8/-21.9 meV/atom disc/orig, iters=31 Ceiling: 4.1/-21.6 → 2.1/-23.6 meV/atom disc/orig ============================================================ Attempt 84 (ceiling=2.1/-23.6 meV/atom disc/orig, xi=1.50, delta=30, max_iters=43) Consecutive failures: 0, adaptations: 0/2 ============================================================
PATH FOUND: len=32, barrier=0.6/-25.1 meV/atom disc/orig, iters=33 Barrier (0.6 meV/atom) < ceiling step (2.0 meV/atom) Found optimal path - terminating ratchet. ============================================================ Final result: Barrier: 0.6/-25.1 meV/atom disc/orig Path length: 32 steps Total attempts: 84 Parameter adaptations: 0 Energy cache size: 15319 Total time: 82.4s ============================================================
Understanding the Output¶
The ratchet logs show each attempt with its ceiling (in meV/atom above the endpoint), whether a path was found, and how the ceiling changed. When consecutive failures occur, the algorithm adapts the discretization parameters.
The final result contains all paths found during refinement. The best path has the lowest barrier.
print(f"Total attempts: {len(result.results)}")
print(f"Paths found: {len(result.all_paths)}")
if result.best_path:
best = result.best_path
barrier_per_atom = (best.barrier / n_atoms - max_endpoint / n_atoms) * 1000
print(f"Best barrier: {best.barrier:.4f} eV ({barrier_per_atom:.1f} meV/atom above endpoint)")
print(f"Best path length: {len(best)} steps")
Total attempts: 85 Paths found: 85 Best barrier: -16.9378 eV (0.6 meV/atom above endpoint) Best path length: 32 steps
import matplotlib.pyplot as plt
if result.best_path:
best = result.best_path
# Plot energy profile
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(best.energies, 'b-', linewidth=1.5)
ax.axhline(best.barrier, color='r', linestyle='--', alpha=0.7,
label=f'Barrier: {best.barrier:.4f} eV')
ax.axhline(max_endpoint, color='g', linestyle=':', alpha=0.7,
label=f'Max endpoint: {max_endpoint:.4f} eV')
ax.set_xlabel('Step')
ax.set_ylabel('Energy (eV)')
ax.set_title('Energy Profile Along Best Path')
ax.legend()
plt.tight_layout()
plt.show()
Parameter Adaptation¶
When the ratchet fails to find a path at the current ceiling, it doesn't give up. Instead, it adapts the discretization parameters to explore a finer configuration space:
- xi is multiplied by
xi_factor(default 0.8, making it smaller) - delta is multiplied by
delta_factor(default 1.2, making it larger)
Finer discretization means more intermediate configurations are available, potentially revealing lower-barrier pathways that weren't accessible at coarser resolution. The tradeoff is that the search space grows, so we also increase max_iterations after each adaptation.
The max_adaptations parameter limits how many times this refinement can occur. After exhausting all adaptations and still failing, the algorithm terminates.
Ceiling Step Size¶
When a path is found, the ceiling is lowered to the path's barrier. But we also enforce a minimum step size (ceiling_step_mev_per_atom, default 2 meV/atom) to ensure progress even when barriers are similar.
This prevents the algorithm from getting stuck making tiny improvements. If the true barrier is very close to the current ceiling, the minimum step ensures we still make meaningful progress toward finding better paths.
Parallel Ratchet¶
The serial ratchet explores one ceiling at a time. For faster exploration, the parallel ratchet runs multiple independent ratchet processes simultaneously, each starting at a different ceiling level.
This is useful when you don't know what ceiling range contains the true barrier. By starting workers at different ceilings (say, 100 to 2000 meV/atom), you can quickly identify which region is most promising.
from cnf.navigation.astar.iterative import parallel_ratchet
from cnf.calculation.grace import GraceCalcProvider
# Parallel ratchet with 2 workers at different ceilings
parallel_result = parallel_ratchet(
start_uc=start_uc,
end_uc=end_uc,
calc_provider=GraceCalcProvider(),
min_ceiling_mev_per_atom=100.0,
max_ceiling_mev_per_atom=300.0,
n_workers=2,
xi=1.5,
atom_step_length=0.3,
max_adaptations=1,
max_iterations=2000,
verbosity=1,
)
============================================================ Preprocessing: Relaxing Endpoints ============================================================ Using cached GRACE model from /Users/maxg/.cache/grace/GRACE-FS-OAM Model license: Academic Software License
[start] Before: E = -17.0645 eV, vol = 46.53 A^3 [start] After: E = -17.0676 eV, vol = 47.09 A^3 (17 steps) [end] Before: E = -16.8876 eV, vol = 51.32 A^3
[end] After: E = -17.0552 eV, vol = 47.49 A^3 (41 steps) Endpoint info: Atoms: 2 Max endpoint energy: -8.5263 eV/atom xi=1.5, delta=18 Parallel ratchet configuration: Workers: 2 Ceiling range: 100 - 300 meV/atom Ceiling spacing: 200.0 meV/atom Max adaptations per worker: 1 Launching 2 workers (7 TF threads each)... Output directory: None
2026-03-13 19:25:14.094498: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x31dffb990 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2026-03-13 19:25:14.094515: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2026-03-13 19:25:14.153514: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x34b96b4a0 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2026-03-13 19:25:14.153530: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2026-03-13 19:25:14.211103: I tensorflow/compiler/mlir/tensorflow/utils/dump_mlir_util.cc:269] disabling MLIR crash reproducer, set env var `MLIR_CRASH_REPRODUCER_DIRECTORY` to enable. 2026-03-13 19:25:14.267710: I tensorflow/compiler/mlir/tensorflow/utils/dump_mlir_util.cc:269] disabling MLIR crash reproducer, set env var `MLIR_CRASH_REPRODUCER_DIRECTORY` to enable.
2026-03-13 19:25:15.114040: I ./tensorflow/compiler/jit/device_compiler.h:186] Compiled cluster using XLA! This line is logged at most once for the lifetime of the process. 2026-03-13 19:25:15.118745: E ./tensorflow/compiler/xla/stream_executor/stream_executor_internal.h:124] SetPriority unimplemented for this stream. 2026-03-13 19:25:15.167850: I ./tensorflow/compiler/jit/device_compiler.h:186] Compiled cluster using XLA! This line is logged at most once for the lifetime of the process. 2026-03-13 19:25:15.172315: E ./tensorflow/compiler/xla/stream_executor/stream_executor_internal.h:124] SetPriority unimplemented for this stream.
Using cached GRACE model from /Users/maxg/.cache/grace/GRACE-FS-OAM
Model license: Academic Software License
[Ratchet Worker PID 7404] Ready in 0.4s - GraceMLIPCalculator(model=GRACE-FS-OAM)
Starting ratchet refinement
Max endpoint energy (discretized): -8.5263 eV/atom
Max endpoint energy (original): -8.5276 eV/atom
Discretization shift: +1.3 meV/atom
Initial ceiling: 100.0 meV/atom above endpoint
Ceiling step: 2.0 meV/atom
Max adaptations: 1
xi_factor=0.8, delta_factor=1.2
Estimating initial max_iters...
Estimating max_iters: attempt 1/5, trying 5000
Path found in 18 iters -> using max_iters=27
============================================================
Attempt 0 (ceiling=100.0/101.3 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=99.9/101.1 meV/atom disc/orig, iters=18
Ceiling: 100.0/101.3 → 98.0/99.3 meV/atom disc/orig
============================================================
Attempt 1 (ceiling=98.0/99.3 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=97.1/98.4 meV/atom disc/orig, iters=19
Ceiling: 98.0/99.3 → 96.0/97.3 meV/atom disc/orig
============================================================
Attempt 2 (ceiling=96.0/97.3 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=93.6/94.8 meV/atom disc/orig, iters=18
Ceiling: 96.0/97.3 → 93.6/94.8 meV/atom disc/orig
============================================================
Attempt 3 (ceiling=93.6/94.8 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
Worker 0 done (ceiling= 100 meV/atom): barrier=40.0 meV/atom, paths=24, adaptations=1
PATH FOUND: len=18, barrier=89.9/91.2 meV/atom disc/orig, iters=18
Ceiling: 93.6/94.8 → 89.9/91.2 meV/atom disc/orig
============================================================
Attempt 4 (ceiling=89.9/91.2 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=81.4/82.6 meV/atom disc/orig, iters=18
Ceiling: 89.9/91.2 → 81.4/82.6 meV/atom disc/orig
============================================================
Attempt 5 (ceiling=81.4/82.6 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=79.7/80.9 meV/atom disc/orig, iters=19
Ceiling: 81.4/82.6 → 79.4/80.6 meV/atom disc/orig
============================================================
Attempt 6 (ceiling=79.4/80.6 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=78.6/79.9 meV/atom disc/orig, iters=19
Ceiling: 79.4/80.6 → 77.4/78.6 meV/atom disc/orig
============================================================
Attempt 7 (ceiling=77.4/78.6 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=73.6/74.9 meV/atom disc/orig, iters=18
Ceiling: 77.4/78.6 → 73.6/74.9 meV/atom disc/orig
============================================================
Attempt 8 (ceiling=73.6/74.9 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=69.4/70.7 meV/atom disc/orig, iters=21
Ceiling: 73.6/74.9 → 69.4/70.7 meV/atom disc/orig
============================================================
Attempt 9 (ceiling=69.4/70.7 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=68.4/69.7 meV/atom disc/orig, iters=18
Ceiling: 69.4/70.7 → 67.4/68.7 meV/atom disc/orig
============================================================
Attempt 10 (ceiling=67.4/68.7 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=65.6/66.9 meV/atom disc/orig, iters=18
Ceiling: 67.4/68.7 → 65.4/66.7 meV/atom disc/orig
============================================================
Attempt 11 (ceiling=65.4/66.7 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=63.3/64.5 meV/atom disc/orig, iters=19
Ceiling: 65.4/66.7 → 63.3/64.5 meV/atom disc/orig
============================================================
Attempt 12 (ceiling=63.3/64.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=62.5/63.7 meV/atom disc/orig, iters=20
Ceiling: 63.3/64.5 → 61.3/62.5 meV/atom disc/orig
============================================================
Attempt 13 (ceiling=61.3/62.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=20, barrier=60.5/61.7 meV/atom disc/orig, iters=23
Ceiling: 61.3/62.5 → 59.3/60.5 meV/atom disc/orig
============================================================
Attempt 14 (ceiling=59.3/60.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=57.6/58.9 meV/atom disc/orig, iters=19
Ceiling: 59.3/60.5 → 57.3/58.5 meV/atom disc/orig
============================================================
Attempt 15 (ceiling=57.3/58.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=57.2/58.4 meV/atom disc/orig, iters=19
Ceiling: 57.3/58.5 → 55.3/56.5 meV/atom disc/orig
============================================================
Attempt 16 (ceiling=55.3/56.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=20, barrier=54.6/55.9 meV/atom disc/orig, iters=21
Ceiling: 55.3/56.5 → 53.3/54.5 meV/atom disc/orig
============================================================
Attempt 17 (ceiling=53.3/54.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
No path found (28 iterations)
max_iters: 27 → 35
============================================================
Attempt 18 (ceiling=53.3/54.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=35)
Consecutive failures: 1, adaptations: 0/1
============================================================
No path found (36 iterations)
max_iters: 35 → 45
============================================================
Attempt 19 (ceiling=53.3/54.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=45)
Consecutive failures: 2, adaptations: 0/1
============================================================
No path found (46 iterations)
max_iters: 45 → 58
ADAPTING PARAMETERS (1/1)
xi: 1.50 → 1.20
delta: 18 → 22
Regenerated 1 start CNFs, 1 goal CNFs
Re-estimating max_iters for new params...
Estimating max_iters: attempt 1/5, trying 5000
Path found in 22 iters -> using max_iters=33
============================================================
Attempt 20 (ceiling=53.3/54.5 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=22, barrier=53.2/54.5 meV/atom disc/orig, iters=22
Ceiling: 53.3/54.5 → 51.3/52.5 meV/atom disc/orig
============================================================
Attempt 21 (ceiling=51.3/52.5 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=25, barrier=50.8/52.1 meV/atom disc/orig, iters=25
Ceiling: 51.3/52.5 → 49.3/50.5 meV/atom disc/orig
============================================================
Attempt 22 (ceiling=49.3/50.5 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=23, barrier=48.0/49.2 meV/atom disc/orig, iters=23
Ceiling: 49.3/50.5 → 47.3/48.5 meV/atom disc/orig
============================================================
Attempt 23 (ceiling=47.3/48.5 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=24, barrier=47.0/48.2 meV/atom disc/orig, iters=31
Ceiling: 47.3/48.5 → 45.3/46.5 meV/atom disc/orig
max_iters: 33 → 37
============================================================
Attempt 24 (ceiling=45.3/46.5 meV/atom disc/orig, xi=1.20, delta=22, max_iters=37)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=23, barrier=44.4/45.7 meV/atom disc/orig, iters=26
Ceiling: 45.3/46.5 → 43.3/44.5 meV/atom disc/orig
============================================================
Attempt 25 (ceiling=43.3/44.5 meV/atom disc/orig, xi=1.20, delta=22, max_iters=37)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=23, barrier=42.7/43.9 meV/atom disc/orig, iters=23
Ceiling: 43.3/44.5 → 41.3/42.5 meV/atom disc/orig
============================================================
Attempt 26 (ceiling=41.3/42.5 meV/atom disc/orig, xi=1.20, delta=22, max_iters=37)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=25, barrier=40.0/41.2 meV/atom disc/orig, iters=31
Ceiling: 41.3/42.5 → 39.3/40.5 meV/atom disc/orig
============================================================
Attempt 27 (ceiling=39.3/40.5 meV/atom disc/orig, xi=1.20, delta=22, max_iters=37)
Consecutive failures: 0, adaptations: 1/1
============================================================
No path found (38 iterations)
max_iters: 37 → 48
============================================================
Attempt 28 (ceiling=39.3/40.5 meV/atom disc/orig, xi=1.20, delta=22, max_iters=48)
Consecutive failures: 1, adaptations: 1/1
============================================================
No path found (49 iterations)
max_iters: 48 → 62
============================================================
Attempt 29 (ceiling=39.3/40.5 meV/atom disc/orig, xi=1.20, delta=22, max_iters=62)
Consecutive failures: 2, adaptations: 1/1
============================================================
No path found (63 iterations)
max_iters: 62 → 80
TERMINATING: 3 consecutive failures after 1 adaptations
============================================================
Final result:
Barrier: 40.0/41.2 meV/atom disc/orig
Path length: 25 steps
Total attempts: 30
Parameter adaptations: 1
Energy cache size: 3143
Total time: 31.1s
============================================================
=== Worker 0 finished ===
Using cached GRACE model from /Users/maxg/.cache/grace/GRACE-FS-OAM Model license: Academic Software License [Ratchet Worker PID 7403] Ready in 0.4s - GraceMLIPCalculator(model=GRACE-FS-OAM) Starting ratchet refinement Max endpoint energy (discretized): -8.5263 eV/atom Max endpoint energy (original): -8.5276 eV/atom Discretization shift: +1.3 meV/atom Initial ceiling: 300.0 meV/atom above endpoint Ceiling step: 2.0 meV/atom Max adaptations: 1 xi_factor=0.8, delta_factor=1.2 Estimating initial max_iters... Estimating max_iters: attempt 1/5, trying 5000 Path found in 18 iters -> using max_iters=27 ============================================================ Attempt 0 (ceiling=300.0/301.3 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=291.2/292.4 meV/atom disc/orig, iters=18 Ceiling: 300.0/301.3 → 291.2/292.4 meV/atom disc/orig ============================================================ Attempt 1 (ceiling=291.2/292.4 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=281.2/282.5 meV/atom disc/orig, iters=18 Ceiling: 291.2/292.4 → 281.2/282.5 meV/atom disc/orig ============================================================ Attempt 2 (ceiling=281.2/282.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=258.1/259.4 meV/atom disc/orig, iters=18 Ceiling: 281.2/282.5 → 258.1/259.4 meV/atom disc/orig ============================================================ Attempt 3 (ceiling=258.1/259.4 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=245.7/246.9 meV/atom disc/orig, iters=18 Ceiling: 258.1/259.4 → 245.7/246.9 meV/atom disc/orig ============================================================ Attempt 4 (ceiling=245.7/246.9 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=245.3/246.6 meV/atom disc/orig, iters=20 Ceiling: 245.7/246.9 → 243.7/244.9 meV/atom disc/orig ============================================================ Attempt 5 (ceiling=243.7/244.9 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=240.1/241.4 meV/atom disc/orig, iters=18 Ceiling: 243.7/244.9 → 240.1/241.4 meV/atom disc/orig ============================================================ Attempt 6 (ceiling=240.1/241.4 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=223.4/224.7 meV/atom disc/orig, iters=18 Ceiling: 240.1/241.4 → 223.4/224.7 meV/atom disc/orig ============================================================ Attempt 7 (ceiling=223.4/224.7 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=219.8/221.1 meV/atom disc/orig, iters=18 Ceiling: 223.4/224.7 → 219.8/221.1 meV/atom disc/orig ============================================================ Attempt 8 (ceiling=219.8/221.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=201.6/202.9 meV/atom disc/orig, iters=18 Ceiling: 219.8/221.1 → 201.6/202.9 meV/atom disc/orig ============================================================ Attempt 9 (ceiling=201.6/202.9 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=164.5/165.7 meV/atom disc/orig, iters=18 Ceiling: 201.6/202.9 → 164.5/165.7 meV/atom disc/orig ============================================================ Attempt 10 (ceiling=164.5/165.7 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=159.7/160.9 meV/atom disc/orig, iters=18 Ceiling: 164.5/165.7 → 159.7/160.9 meV/atom disc/orig ============================================================ Attempt 11 (ceiling=159.7/160.9 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=154.3/155.5 meV/atom disc/orig, iters=18 Ceiling: 159.7/160.9 → 154.3/155.5 meV/atom disc/orig ============================================================ Attempt 12 (ceiling=154.3/155.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=149.7/151.0 meV/atom disc/orig, iters=18 Ceiling: 154.3/155.5 → 149.7/151.0 meV/atom disc/orig ============================================================ Attempt 13 (ceiling=149.7/151.0 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=19, barrier=141.9/143.1 meV/atom disc/orig, iters=20 Ceiling: 149.7/151.0 → 141.9/143.1 meV/atom disc/orig ============================================================ Attempt 14 (ceiling=141.9/143.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=136.6/137.9 meV/atom disc/orig, iters=18 Ceiling: 141.9/143.1 → 136.6/137.9 meV/atom disc/orig ============================================================ Attempt 15 (ceiling=136.6/137.9 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=134.6/135.9 meV/atom disc/orig, iters=18 Ceiling: 136.6/137.9 → 134.6/135.9 meV/atom disc/orig ============================================================ Attempt 16 (ceiling=134.6/135.9 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=127.9/129.2 meV/atom disc/orig, iters=18 Ceiling: 134.6/135.9 → 127.9/129.2 meV/atom disc/orig ============================================================ Attempt 17 (ceiling=127.9/129.2 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=123.9/125.2 meV/atom disc/orig, iters=18 Ceiling: 127.9/129.2 → 123.9/125.2 meV/atom disc/orig ============================================================ Attempt 18 (ceiling=123.9/125.2 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=121.8/123.1 meV/atom disc/orig, iters=18 Ceiling: 123.9/125.2 → 121.8/123.1 meV/atom disc/orig ============================================================ Attempt 19 (ceiling=121.8/123.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27) Consecutive failures: 0, adaptations: 0/1 ============================================================ PATH FOUND: len=18, barrier=110.3/111.6 meV/atom disc/orig, iters=18 Ceiling: 121.8/123.1 → 110.3/111.6 meV/atom disc/orig
============================================================
Attempt 20 (ceiling=110.3/111.6 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=106.8/108.0 meV/atom disc/orig, iters=18
Ceiling: 110.3/111.6 → 106.8/108.0 meV/atom disc/orig
============================================================
Attempt 21 (ceiling=106.8/108.0 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=105.6/106.9 meV/atom disc/orig, iters=18
Ceiling: 106.8/108.0 → 104.8/106.0 meV/atom disc/orig
============================================================
Attempt 22 (ceiling=104.8/106.0 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=102.7/104.0 meV/atom disc/orig, iters=18
Ceiling: 104.8/106.0 → 102.7/104.0 meV/atom disc/orig
============================================================
Attempt 23 (ceiling=102.7/104.0 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=100.9/102.2 meV/atom disc/orig, iters=19
Ceiling: 102.7/104.0 → 100.7/102.0 meV/atom disc/orig
============================================================
Attempt 24 (ceiling=100.7/102.0 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=89.9/91.2 meV/atom disc/orig, iters=19
Ceiling: 100.7/102.0 → 89.9/91.2 meV/atom disc/orig
============================================================
Attempt 25 (ceiling=89.9/91.2 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=82.0/83.3 meV/atom disc/orig, iters=18
Ceiling: 89.9/91.2 → 82.0/83.3 meV/atom disc/orig
============================================================
Attempt 26 (ceiling=82.0/83.3 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=78.3/79.5 meV/atom disc/orig, iters=18
Ceiling: 82.0/83.3 → 78.3/79.5 meV/atom disc/orig
============================================================
Attempt 27 (ceiling=78.3/79.5 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=73.6/74.9 meV/atom disc/orig, iters=18
Ceiling: 78.3/79.5 → 73.6/74.9 meV/atom disc/orig
============================================================
Attempt 28 (ceiling=73.6/74.9 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=18, barrier=71.8/73.1 meV/atom disc/orig, iters=18
Ceiling: 73.6/74.9 → 71.6/72.9 meV/atom disc/orig
============================================================
Attempt 29 (ceiling=71.6/72.9 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=63.9/65.1 meV/atom disc/orig, iters=19
Ceiling: 71.6/72.9 → 63.9/65.1 meV/atom disc/orig
============================================================
Attempt 30 (ceiling=63.9/65.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=63.2/64.5 meV/atom disc/orig, iters=19
Ceiling: 63.9/65.1 → 61.9/63.1 meV/atom disc/orig
============================================================
Attempt 31 (ceiling=61.9/63.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=61.6/62.9 meV/atom disc/orig, iters=19
Ceiling: 61.9/63.1 → 59.9/61.1 meV/atom disc/orig
============================================================
Attempt 32 (ceiling=59.9/61.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=59.6/60.8 meV/atom disc/orig, iters=19
Ceiling: 59.9/61.1 → 57.9/59.1 meV/atom disc/orig
============================================================
Attempt 33 (ceiling=57.9/59.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=57.6/58.9 meV/atom disc/orig, iters=20
Ceiling: 57.9/59.1 → 55.9/57.1 meV/atom disc/orig
============================================================
Attempt 34 (ceiling=55.9/57.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
PATH FOUND: len=19, barrier=54.6/55.9 meV/atom disc/orig, iters=22
Ceiling: 55.9/57.1 → 53.9/55.1 meV/atom disc/orig
============================================================
Attempt 35 (ceiling=53.9/55.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=27)
Consecutive failures: 0, adaptations: 0/1
============================================================
No path found (28 iterations)
max_iters: 27 → 35
============================================================
Attempt 36 (ceiling=53.9/55.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=35)
Consecutive failures: 1, adaptations: 0/1
============================================================
No path found (36 iterations)
max_iters: 35 → 45
============================================================
Attempt 37 (ceiling=53.9/55.1 meV/atom disc/orig, xi=1.50, delta=18, max_iters=45)
Consecutive failures: 2, adaptations: 0/1
============================================================
No path found (46 iterations)
max_iters: 45 → 58
ADAPTING PARAMETERS (1/1)
xi: 1.50 → 1.20
delta: 18 → 22
Regenerated 1 start CNFs, 1 goal CNFs
Re-estimating max_iters for new params...
Estimating max_iters: attempt 1/5, trying 5000
Path found in 22 iters -> using max_iters=33
============================================================
Attempt 38 (ceiling=53.9/55.1 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=23, barrier=53.4/54.7 meV/atom disc/orig, iters=23
Ceiling: 53.9/55.1 → 51.9/53.1 meV/atom disc/orig
============================================================
Attempt 39 (ceiling=51.9/53.1 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=22, barrier=51.5/52.7 meV/atom disc/orig, iters=24
Ceiling: 51.9/53.1 → 49.9/51.1 meV/atom disc/orig
============================================================
Attempt 40 (ceiling=49.9/51.1 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=23, barrier=49.8/51.1 meV/atom disc/orig, iters=24
Ceiling: 49.9/51.1 → 47.9/49.1 meV/atom disc/orig
============================================================
Attempt 41 (ceiling=47.9/49.1 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=23, barrier=47.5/48.8 meV/atom disc/orig, iters=23
Ceiling: 47.9/49.1 → 45.9/47.1 meV/atom disc/orig
============================================================
Attempt 42 (ceiling=45.9/47.1 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=23, barrier=44.4/45.7 meV/atom disc/orig, iters=27
Ceiling: 45.9/47.1 → 43.9/45.1 meV/atom disc/orig
============================================================
Attempt 43 (ceiling=43.9/45.1 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=23, barrier=41.8/43.1 meV/atom disc/orig, iters=23
Ceiling: 43.9/45.1 → 41.8/43.1 meV/atom disc/orig
============================================================
Attempt 44 (ceiling=41.8/43.1 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
PATH FOUND: len=23, barrier=41.0/42.3 meV/atom disc/orig, iters=23
Ceiling: 41.8/43.1 → 39.8/41.1 meV/atom disc/orig
============================================================
Attempt 45 (ceiling=39.8/41.1 meV/atom disc/orig, xi=1.20, delta=22, max_iters=33)
Consecutive failures: 0, adaptations: 1/1
============================================================
No path found (34 iterations)
max_iters: 33 → 42
============================================================
Attempt 46 (ceiling=39.8/41.1 meV/atom disc/orig, xi=1.20, delta=22, max_iters=42)
Consecutive failures: 1, adaptations: 1/1
============================================================
No path found (43 iterations)
max_iters: 42 → 54
============================================================
Attempt 47 (ceiling=39.8/41.1 meV/atom disc/orig, xi=1.20, delta=22, max_iters=54)
Consecutive failures: 2, adaptations: 1/1
============================================================
No path found (55 iterations)
max_iters: 54 → 70
TERMINATING: 3 consecutive failures after 1 adaptations
============================================================
Final result:
Barrier: 41.0/42.3 meV/atom disc/orig
Path length: 23 steps
Total attempts: 48
Parameter adaptations: 1
Energy cache size: 3162
Total time: 39.6s
============================================================
=== Worker 1 finished ===
Worker 1 done (ceiling= 300 meV/atom): barrier=41.0 meV/atom, paths=42, adaptations=1
============================================================ Parallel Ratchet Complete ============================================================ Best barrier: 40.0 meV/atom Workers succeeded: 2/2 Total paths: 66 Total time: 48.4s
print(f"Workers completed: {len(parallel_result.worker_results)}")
print(f"Total paths found: {parallel_result.metadata['total_paths_found']}")
if parallel_result.best_barrier_mev_per_atom is not None:
print(f"Best barrier: {parallel_result.best_barrier_mev_per_atom:.1f} meV/atom")
Workers completed: 2 Total paths found: 66 Best barrier: 40.0 meV/atom
Saving Results¶
Ratchet results can be saved to JSON. The serial ratchet saves incrementally after each attempt (useful for long runs), while the parallel ratchet saves each worker's trace in a separate subdirectory.
import tempfile
import os
with tempfile.TemporaryDirectory() as tmpdir:
result_saved = ratchet(
start_cnfs=[start_cnf],
goal_cnfs=[goal_cnf],
initial_ceiling=initial_ceiling,
energy_calc=calc,
start_uc=start_uc,
end_uc=end_uc,
max_adaptations=1,
max_iterations=1000,
output_dir=tmpdir,
verbosity=0,
)
saved_path = os.path.join(tmpdir, "refinement_result.json")
print(f"Saved to: {saved_path}")
print(f"File exists: {os.path.exists(saved_path)}")
Saved to: /var/folders/20/rp8b8xzd0tn81qzlh8zmmvg00000gn/T/tmpmsfy76pf/refinement_result.json File exists: True
# Loading a saved result
from cnf.navigation.astar.models import RefinementResult
with tempfile.TemporaryDirectory() as tmpdir:
outpath = os.path.join(tmpdir, "refinement_result.json")
result.to_json(outpath)
loaded = RefinementResult.from_json(outpath)
print(f"Loaded {len(loaded.all_paths)} paths")
if loaded.best_barrier:
print(f"Best barrier: {loaded.best_barrier:.4f} eV")
Loaded 85 paths Best barrier: -16.9378 eV
Summary¶
The ratchet algorithm progressively refines the energy barrier estimate by:
- Running A* searches with an energy ceiling filter
- Lowering the ceiling each time a path is found
- Adapting discretization parameters when searches fail
The serial ratchet explores one ceiling at a time, while the parallel ratchet runs multiple independent searches at different ceilings. Both produce a RefinementResult containing all paths found and their barriers.
The final best barrier is an upper bound on the true minimum energy barrier. Finer discretization and more iterations can potentially find lower barriers, at the cost of longer computation time.