pub struct EmbeddingIndexMerger {
pub config: MergeConfig,
}Expand description
Merges multiple partial HNSW embedding index shards into a unified index.
§Example
use ipfrs_semantic::index_merger::{
EmbeddingIndexMerger, IndexShard, MergeConfig, ShardEntry,
};
let config = MergeConfig::default();
let merger = EmbeddingIndexMerger::new(config);
let shard = IndexShard::new(
"node-1",
vec![ShardEntry::new(1, vec![1.0_f32, 0.0], "doc-a")],
2,
);
let (entries, stats) = merger.merge(&[shard]).expect("merge failed");
assert_eq!(entries.len(), 1);
assert_eq!(stats.output_entries, 1);Fields§
§config: MergeConfigConfiguration for this merger instance.
Implementations§
Source§impl EmbeddingIndexMerger
impl EmbeddingIndexMerger
Sourcepub fn new(config: MergeConfig) -> Self
pub fn new(config: MergeConfig) -> Self
Creates a new EmbeddingIndexMerger with the supplied configuration.
Sourcepub fn merge(
&self,
shards: &[IndexShard],
) -> Result<(Vec<ShardEntry>, MergeStats), MergeConflict>
pub fn merge( &self, shards: &[IndexShard], ) -> Result<(Vec<ShardEntry>, MergeStats), MergeConflict>
Merges the provided shards into a single flat list of ShardEntry values.
§Algorithm
- Each shard is validated; a dimension mismatch causes an immediate
Err. - Entries are walked in shard order. A
HashMap<u64, usize>maps each seen embedding ID to its current position in the output vector. - On a duplicate ID the cosine distance between the stored vector and the
incoming vector is computed:
- Distance >
conflict_threshold→MergeConflict::DuplicateIdis appended tostats.conflicts; the new entry is always skipped. - Distance ≤
conflict_threshold→ near-identical copy; skipped silently. - When
keep_first = falsethe existing slot is overwritten regardless of whether the conflict was recorded.
- Distance >
- If adding a new (non-duplicate) entry would push the output beyond
max_entries,Err(CapacityExceeded)is returned immediately.
Returns (merged_entries, stats) on success.
Sourcepub fn cosine_distance(a: &[f32], b: &[f32]) -> f32
pub fn cosine_distance(a: &[f32], b: &[f32]) -> f32
Computes the cosine distance between two vectors.
cosine_distance = 1.0 - cosine_similarity
Returns 1.0 when either vector has zero norm (undefined similarity).
Sourcepub fn shard_coverage(shards: &[IndexShard]) -> Vec<(String, usize)>
pub fn shard_coverage(shards: &[IndexShard]) -> Vec<(String, usize)>
Returns a list of (shard_id, entry_count) pairs sorted by entry count
in descending order.
Auto Trait Implementations§
impl Freeze for EmbeddingIndexMerger
impl RefUnwindSafe for EmbeddingIndexMerger
impl Send for EmbeddingIndexMerger
impl Sync for EmbeddingIndexMerger
impl Unpin for EmbeddingIndexMerger
impl UnsafeUnpin for EmbeddingIndexMerger
impl UnwindSafe for EmbeddingIndexMerger
Blanket Implementations§
impl<T> Allocation for T
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.