How-to: topology keys for near-duplicate frames#

xxHash3 on stored CON bytes is exact identity. The bonded graph up to relabelling is a coarser identity: two minima or saddles that share a graph and ring census share a topology key even when coordinates differ by relaxation or a permutation.

d-SEAMS computes that key (seams fingerprint FILE --format json). This crate stores the frame key; it does not reimplement the certificate.

Prerequisites#

A writeable corpus directory needs at least one ingested trajectory. The seams binary must be on PATH, or set SEAMS=/path/to/seams, or pass --seams PATH. The engine must be seams-core at 44f91bad or later so the fingerprint command exists.

A missing binary makes annotate-topology and find-by-topology exit nonzero and name the seams fingerprint command on stderr.

Annotate a corpus#

The cutoff is required and is per-corpus. The default graph is cutoff. The default hop count is 2.

readcon-db ingest /tmp/corpus resources/test/tiny_cuh2.con
readcon-db annotate-topology /tmp/corpus --cutoff 3.0
# optional:
#   --graph cutoff --hops 2 --seams /path/to/seams

Rust:

use readcon_db::{AnnotateTopologyOpts, ConCorpus};

let db = ConCorpus::open("/tmp/corpus")?;
db.append_trajectory_path(1, "tiny_cuh2.con")?;
db.annotate_topology(AnnotateTopologyOpts::new(3.0))?;

Each annotated trajectory records topo_cutoff, topo_graph, topo_hops, and topo_method on TrajMeta. A later run that would mix methods, or disagree on cutoff, graph, or hops, is refused.

On tiny_cuh2.con, a 3.0 A cutoff yields a non-empty graph (Cu-Cu is about 2.56 A; H-H is about 0.74 A).

Select by topology key#

readcon-db select /tmp/corpus --topo-key HEX
let keys = db.select(&Select::new().topo_key(hex))?;

select prefix-scans idx_topo the same way exact_composition scans idx_formula. A readonly open of an older corpus that lacks idx_topo treats the index as empty.

Look up a candidate file#

The lookup fingerprints the file with the recorded corpus parameters and returns matching FrameKeys:

readcon-db find-by-topology /tmp/corpus candidate.con
let hits = db.find_by_topology_path("candidate.con")?;

A permuted copy of a stored frame (swap two Cu rows) hits the original. A frame with a broken bond (one Cu displaced by about 10 A on this fixture, whose default cutoff graph is the first-atom type) does not.

A corpus with no recorded topology parameters errors and names annotate-topology.

Reindex#

readcon-db reindex rebuilds the existing secondary indexes. It rebuilds idx_topo from stored topo_by_frame values when every annotated trajectory records the same cutoff/graph/hops/method. Mixed parameters return an error and do not half-rebuild. An unannotated corpus leaves idx_topo empty. A matching rebuild does not need the engine binary.

Why this identity#

On an EON / kinetic ART catalogue, a saddle search that finds a configuration whose topology key already exists is a revisited state up to symmetry. See the architecture note on topology keys, and Trochet et al., Phys. Rev. B 91, 224106 (2015).