Refine re-runs the neighbor selection over entries already in the graph, returning a DenseRefineReport: the entries re-selected and changed, the islands found and reconnected, and the closing audit.
A batch built at a low expansion factor can be brought up to the quality of a slower build afterwards, and Changed reaching zero is what settled looks like:
for { report, err := index.On(executor).Refine(&usearch.DenseRefineConfig{ExpansionFactor: 128}) if err != nil { log.Fatal(err)} if report.Changed == 0 { break}}
Absorb moves donor indexes into one, one after another, keeping their graphs rather than re-inserting their vectors, then refines every shard that took one across the appended part.
A donor must share the index’s residency, scalar, metric and geometry, or the call answers StatusConfigMismatch.
Each absorbed donor is consumed, and every later verb on it reports StatusUninitialized; a stop between donors, or a failure, leaves the rest live, still yours to close.
Split is the inverse: it hands graph-local parts of the index to empty receivers of the same configuration, one part each, keeping their edges and leaving the index empty but live.