mod activation¶
- module activation¶
History-conditioned escape feedback, after Goedecker’s minima hopping. Activation: climbing out of a basin along its softest direction.
Barkema and Mousseau, Phys. Rev. Lett. 77, 4358 (1996), and Malek and Mousseau, Phys. Rev. E 62, 7723 (2000).
A single displacement along the softest mode does not leave a basin. It is the right direction and the wrong distance: the mode points at the low saddle, but relaxing from a point still inside the basin returns to the minimum it came from. Measured on LJ38 with the escape controller driving a straight displacement, 576 quenches in 959 came back to the basin they left and 10 found anything new.
Goedecker’s answer is molecular dynamics, which carries kinetic energy over the saddle. The answer that needs only gradients is to climb: push along the mode, relax the components perpendicular to it so the structure stays on the valley floor, and repeat until the curvature along the mode turns negative. Negative curvature means the ridge is behind, and a quench from there falls into a different basin.
What this costs is honest and worth stating. Each climbing step is a curvature pass and a few perpendicular relaxation steps, so an activation is several hundred charged evaluations where a random displacement is one. It buys escapes that actually leave.
Relation to the rest of the crate
The perpendicular relaxation is the same projection
crate::pathuses to hold a band off its endpoints, and the mode comes fromcrate::curvature. The controller incrate::methods::minima_hoppingsets how far to climb; this module decides when to stop.Functions
-
fn activate<G>(x: ArrayView1<f64>, mut grad: G, cfg: &Activation, sign: f64) -> Option<ActivationOutcome>¶
where
G: FnMut(ArrayView1<f64>) -> Option<Array1<f64>>
¶ Climbs out of the basin containing
x.gradreturns the gradient orNonewhen the caller’s budget is spent, in which case the climb stops and reports what it has.signpicks which way along the mode to go; the two ends of a soft direction are different saddles.Returns
Noneonly when the first curvature pass fails, since there is then no direction to climb along.
Structs and Unions
- struct Activation¶
How the climb is run.
- step: f64¶
Distance moved along the mode per climbing step.
- max_steps: usize¶
Climbing steps before giving up.
A cap rather than a convergence criterion: some directions do not reach negative curvature at all, and a climb that has not turned over after this many steps is abandoned rather than run to exhaustion.
- perp_steps: usize¶
Perpendicular relaxation steps between climbs.
- perp_rate: f64¶
Step size of the perpendicular relaxation.
- perp_max_move: f64¶
Largest displacement one perpendicular step may make.
A fixed rate is not safe on a potential whose gradient spans decades. On a Lennard-Jones cluster two points a little too close carry a gradient of order a thousand, and a rate of 0.02 against that moves the structure twenty units and destroys it: measured on LJ38, 6 relaxations in 1589 reached a minimum and the returned structure had a gradient of 1.0 where a minimum has 1e-6. The cap makes the step a direction with a bounded length rather than a length proportional to the gradient.
- lanczos_steps: usize¶
Lanczos steps per curvature pass.
- epsilon: f64¶
Finite-difference step for the curvature.
- refresh: usize¶
Climbing steps between recomputing the mode.
Recomputing every step is the accurate choice and the expensive one. The mode rotates slowly along a valley floor, so reusing it for a few steps costs little accuracy and divides the curvature bill.
- overshoot: f64¶
Extra push along the mode once the curvature has turned over, in units of
step, before the quench.
Traits implemented
- impl Default for Activation¶
- struct ActivationOutcome¶
Where a climb ended.
- state: Array1<f64>¶
The activated structure, to be quenched by the caller.
- lambda: f64¶
Curvature along the mode at the end of the climb.
- steps: usize¶
Climbing steps taken.
- crossed: bool¶
Whether the curvature turned negative, so the ridge is behind.
- evaluations: usize¶
Gradient evaluations spent, all of them charged by the caller.
-
fn activate<G>(x: ArrayView1<f64>, mut grad: G, cfg: &Activation, sign: f64) -> Option<ActivationOutcome>¶