mod corekey

module corekey

Prospective superbasin identity from the topology of a structure’s core.

The isomers that pile up on an icosahedral shelf differ by where a few surface atoms sit; their interiors are one Mackay core deformed by symmetry operations. A key that reads only the interior contact network therefore names the superbasin a structure belongs to on first sight, before any revisit, and does so from topology alone: no reference structure, no order parameter, no size rule.

The key is the d-SEAMS construction carried over to clusters and coloured: primitive rings of the core contact graph in the shortest-path sense of Franzblau (Phys. Rev. B 1991, 44, 4925), each coloured by its size and by the species and coordination of its atoms, joined wherever two rings share a bond, and the coloured ring graph hashed by Weisfeiler–Lehman refinement. Rings and the cages they close are what separate packing families in a network (Goswami, Goswami and Singh, J. Chem. Inf. Model. 2020, 60, 2169), and a network built from rings is what a water cage census and a metal core census have in common.

A key is not a proof of identity: two cores with the same refined colouring hash together. It is a prospective label for a superbasin, and the exact witnesses elsewhere in the crate decide identity where it matters.

Variables

const MAX_RING: usize

Rings longer than this are not part of the key.

const WL_ROUNDS: usize

Weisfeiler–Lehman refinement rounds.

Functions

fn contact_cutoff(x: ArrayView1<f64>) -> f64

The contact cutoff the key uses: RING_CUTOFF_SCALE times the median nearest-neighbour distance, which sits between the first and second shells of every packing measured here and, unlike a histogram minimum, cannot slip a shell on a strained decahedron.

fn contact_neighbours(x: ArrayView1<f64>, n: usize, cutoff: f64) -> Vec<Vec<usize>>

Contact adjacency lists at cutoff.

fn core_atoms(neighbours: &[Vec<usize>], rule: CoreRule) -> Vec<usize>

Atoms the rule admits, by index.

fn core_key(x: ArrayView1<f64>, species: &[u32], cutoff: f64, rule: CoreRule) -> CoreKey

Superbasin key of a structure.

species is one atomic number per atom or empty for a single species; cutoff is the contact distance. The core is taken by rule on the full contact graph, rings are found on the core-induced subgraph, and the coloured ring graph is refined and hashed.

fn core_key_nn(x: ArrayView1<f64>, species: &[u32], rule: CoreRule) -> CoreKey

core_key at the structure’s own contact cutoff.

fn primitive_rings(nb: &[Vec<usize>], max_ring: usize) -> Vec<Vec<usize>>

Primitive rings of a graph up to max_ring, as sorted-by-walk member lists starting from their smallest vertex.

A cycle is primitive when every pair of its vertices is joined along the cycle by a shortest path of the whole graph, which is Franzblau’s criterion: no chord, and no shortcut through vertices off the ring.

Enums

enum CoreRule

Which atoms count as the core.

NearMaximum

Atoms whose coordination is within slack of the largest observed.

slack: usize

Allowed shortfall from the largest coordination.

AtLeast(usize)

Atoms with at least this coordination.

Traits implemented

impl Default for CoreRule

Structs and Unions

struct CoreKey

A superbasin key with the census behind it.

key: u64

Weisfeiler–Lehman hash of the coloured core ring graph.

core_atoms: usize

Atoms the core rule admitted.

rings: usize

Primitive rings of the core, up to MAX_RING.

Implementations

impl CoreKey

Functions

fn coordinates(&self) -> [f64; 4]

The key spread over four coordinates, so a Euclidean lookup with a radius below one treats equal keys as one basin and different keys as far apart.