mod featomic_hop

module featomic_hop

featomic SOAP power-spectrum leftover hop. Recommended hop in a featomic SOAP power spectrum.

The calculator is featomic soap_power_spectrum. High-l (l ≥ 5) leftover p_i − μ is a defect patch when some centres stick out of the species mean. On a closed shell that leftover is a core-versus-surface breath: the quench returns the same packing. The packing label is the unit species mean μ (the bank Dcut). When leftover is a shell mode the hop places one point of the Plasencia cover of the displacement sphere. A fivefold residual is the fallback, then a kick of μ. Occupancy archive holes and packing kicks then ring-lens that Cartesian step: pentagon atoms when the occupied profile has 5-rings, triangle atoms when it does not. Champion leftover SOAP is not that lens. No Marks, fcc, or 421 target.

Variables

const CALCULATOR: &str

Calculator name passed to Calculator::new.

const LMIN: i32

Power-spectrum angular channels kept in the leftover.

const SOAP_DCUT_FALLBACK: f64

Dcut when every seed is the same packing.

High-l mean SOAP of LJ75 Mackay vs Marks is 0.163; of a structure to itself is 0. The bank used to fall back to merge_radius (0.7), which is a length, and 0.163 < 0.7 so Marks was a duplicate of Mackay. This floor sits below the packing gap and above numerical zero, so a one-funnel seed bank still admits the other funnel.

const SOAP_PACK_ESCAPE: f64

Cloud-mean distance a hole step walks before it stops.

Measured on the LJ75 icosahedral fixture, twelve seeds, sweeping this from one to five merge radii: the walk reaches 0.33 to 0.55 in the cloud mean and the quench that follows returns to the same DECAF family every time, at every distance. Distance is not what separates packings here, so there is nothing to buy by walking further, and the extra Cartesian displacement is not free. Occupancy Leave uses this walk as the archive-hole start.

const SOAP_PACK_GAP: f64

Packing-class gap on unit mean SOAP. Ico isomers sit under SOAP_PACK_MERGE. Mackay vs Marks is 0.163. A bank sample closer than this is the same funnel, not a class another chain opened, and adopting it restamps the walk onto ico.

const SOAP_PACK_MERGE: f64

Merge radius on unit mean SOAP: isomers of one packing, not Marks.

LJ75 ico-isomer high-l sits below 0.4 of the ico-Marks gap (0.163). This floor is above that isomer band and below the packing gap, so a well-tempered deposit fills the occupied superbasin and not the other funnel.

Functions

fn atom_leftover_rms(x: ArrayView1<f64>, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>) -> Array1<f64>

Per-atom leftover RMS of the high-l power spectrum.

fn first_that_moves(origin: ArrayView1<f64>, steps: &[Array1<f64>]) -> Array1<f64>

First proposal that actually moves, in order.

A closed shell has no leftover direction. The order is one covering displacement, then the fivefold residual, then the ordinary kick.

fn in_stored_well(x: ArrayView1<f64>, wells: &[Array1<f64>], rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>) -> bool

Whether the structure’s leftover-SOAP packing mean sits in a stored well.

fn leave_archive_hole<R: Rng + ?Sized>(x: ArrayView1<f64>, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>, rmsd: f64, rng: &mut R) -> Array1<f64>

Extra ArchiveHole: one SoftSaddle covering direction around the occupied minimum, then the existing RMSD cap.

Plasencia Gutiérrez, M.; Argáez, C.; Jónsson, H. Improved Minimum Mode Following Method for Finding First Order Saddle Points. J. Chem. Theory Comput. 2017, 13 (1), 125-134. <https://doi.org/10.1021/acs.jctc.5b01216> (ookcite ACS bibliography). Gaussian kicks reconverge on the same exit; an even covering of (S^{3N-1}) does not. Champion leftover walks isomers of the occupied packing (step_into_hole of its wells). This start is leftover-orthogonal to that walk: a Cartesian direction from the covering, not a packing-mean (nu=3) increment. Species unused. No named morphology.

fn leave_archive_hole_at<R: Rng + ?Sized>(x: ArrayView1<f64>, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>, rmsd: f64, cover_index: Option<usize>, rng: &mut R) -> Array1<f64>

leave_archive_hole on covering direction cover_index.

None draws an index from rng so a lone call is still a covering point, not a Gaussian. Occupancy extras pass replica + leave_count * wave so the wave does not share one direction.

fn leave_occupied_packing<R, Q>(x: ArrayView1<f64>, wells: &[Array1<f64>], rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>, mut quench: Q, rng: &mut R) -> Array1<f64>
where
    R: Rng + ?Sized,
    Q: FnMut(ArrayView1<f64>) -> Array1<f64>

Leave an occupied packing: hole, quench, keep the quench only when the trial chains to no packing on file. Off-well is not a packing change and neither is another isomer. Failed attempts kick mean SOAP off the occupied packing. A dead kick stays at the origin so crate::catalog::occupancy_leave_adopt Refuse does not install a same-packing hole.

This is the leftover-SOAP hole generator, and the hop loop no longer reaches for it on a refused Leave: a hole of the occupied packing quenches into the occupied packing. crate::known_basin::leave_packing_ladder is the escalation.

fn leftover_profile_distance(a: ArrayView1<f64>, b: ArrayView1<f64>, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>) -> f64

Sorted per-atom leftover-RMS L2. This is the metric that collapsed.

Closed shells share a core-versus-surface leftover magnitude, so Mackay and Marks sit almost on top of each other. Kept so a test can name the failure; the bank must not call this.

fn leftover_rms(x: ArrayView1<f64>, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>) -> f64

RMS of the featomic leftover on the mobile, species-conditioned cloud.

fn packing_archive() -> Vec<Array1<f64>>

Occupied packing means last stored by set_packing_archive.

fn set_packing_archive(wells: Vec<Array1<f64>>)

Replace the packing archive used by step_away_featomic.

fn soap_bank_distance(a: ArrayView1<f64>, b: ArrayView1<f64>, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>) -> f64

Distance between two packings in mean SOAP, not leftover RMS.

Leftover RMS is a core-versus-surface magnitude. It is almost the same on every closed shell, so Dcut collapsed to 10^{-3} and the bank treated every Mackay isomer as a new basin. The mean spectrum is the packing.

fn soap_bank_distance_lmin(a: ArrayView1<f64>, b: ArrayView1<f64>, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>, lmin: i32) -> f64

Mean-SOAP L2 with a chosen angular floor. lmin = 0 is the full spectrum; production leftover hops keep LMIN.

fn soap_cloud_mean(x: ArrayView1<f64>, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>) -> Array1<f64>

Species-conditioned mean high-l SOAP. The packing label.

fn soap_morphology(x: ArrayView1<f64>, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>) -> Array1<f64>

Mean-spectrum morphology the bank acquisition model fits.

fn step_away_featomic<R: Rng + ?Sized>(x: ArrayView1<f64>, rmsd: f64, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>, rng: &mut R) -> Array1<f64>

SOAP hop through featomic soap_power_spectrum.

A local leftover patch when some centres stick out of the species mean. A packing-mean kick when leftover is a closed-shell breath or numerically gone.

fn step_away_featomic_at<R: Rng + ?Sized>(x: ArrayView1<f64>, rmsd: f64, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>, rng: &mut R) -> Array1<f64>

Same hop as step_away_featomic, at rmsd with no extra floor.

fn step_into_hole<R: Rng + ?Sized>(x: ArrayView1<f64>, wells: &[Array1<f64>], soap_step: f64, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>, rng: &mut R) -> Array1<f64>

Walk coordinates so the packing mean moves toward a hole in the shared SOAP archive.

J = ∂μ/∂x is already built for the leftover hop. The Cartesian 0.35 cap keeps μ inside one packing and the quench is a projector back onto that packing. The step size here is in SOAP: each microstep asks for soap_step of mean-spectrum change, with only a loose Cartesian guard. Repeat until μ sits outside every well.

fn step_into_hole_escaping<R: Rng + ?Sized>(x: ArrayView1<f64>, wells: &[Array1<f64>], soap_step: f64, escape: f64, rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>, rng: &mut R) -> Array1<f64>

step_into_hole with the escape distance supplied, so the distance a Leave has to cover can be measured rather than assumed.

fn surplus_reseed<R: Rng + ?Sized>(x: ArrayView1<f64>, wells: &[Array1<f64>], rcut: f64, species: Option<&[u32]>, mobile: Option<&[usize]>, rng: &mut R) -> Option<Array1<f64>>

Surplus Hyperband start: step the current packing mean into a SOAP hole of the occupied cloud. Empty wells yield None so the caller Leaves OtherFamily or ArchiveHole. Not a parent clone and not a named morphology.