Skip to main content

HNSWIndex

Struct HNSWIndex 

Source
pub struct HNSWIndex { /* private fields */ }
Expand description

HNSW index for approximate nearest neighbor search.

Implementations§

Source§

impl HNSWIndex

Source

pub fn new() -> HNSWIndex

Create a new HNSW index with default configuration.

Source

pub const fn with_config(config: HNSWConfig) -> HNSWIndex

Create a new HNSW index with custom configuration.

Source

pub fn with_instrumentation(config: HNSWConfig) -> HNSWIndex

Create an HNSW index with access instrumentation enabled.

Source

pub const fn has_instrumentation(&self) -> bool

Returns true if access instrumentation is enabled.

Source

pub fn access_stats(&self) -> Option<HNSWStatsSnapshot>

Returns access statistics snapshot if instrumentation is enabled.

Source

pub fn len(&self) -> usize

Returns the number of nodes in the index.

§Panics

Panics if the internal lock is poisoned.

Source

pub fn is_empty(&self) -> bool

Returns true if the index contains no nodes.

Source

pub fn insert(&self, vector: Vec<f32>) -> usize

Insert a vector into the index. Returns the assigned node ID.

Source

pub fn insert_sparse(&self, sparse: SparseVector) -> usize

Insert a sparse vector into the index. Returns the assigned node ID.

Source

pub fn insert_auto(&self, vector: Vec<f32>) -> usize

Insert a vector with automatic storage format selection.

Automatically chooses sparse storage when the vector has sparsity above config.sparsity_threshold (default 50% zeros), otherwise uses dense storage. This provides memory savings for high-sparsity vectors without requiring manual format selection.

Source

pub fn try_insert( &self, vector: Vec<f32>, ) -> Result<usize, EmbeddingStorageError>

Try to insert a vector into the index.

§Errors

Returns Err(CapacityExceeded) if max_nodes limit is reached.

Source

pub fn try_insert_sparse( &self, sparse: SparseVector, ) -> Result<usize, EmbeddingStorageError>

Try to insert a sparse vector into the index.

§Errors

Returns Err(CapacityExceeded) if max_nodes limit is reached.

Source

pub fn insert_quantized(&self, vector: &[f32]) -> usize

Insert a vector with 8-bit scalar quantization.

Quantizes the vector to 8-bit precision before storage, achieving ~4x memory reduction compared to dense storage. The quantization preserves relative magnitudes using asymmetric min/max scaling.

§Trade-offs
  • Memory: ~4x reduction (768-dim: 3072 bytes -> 784 bytes)
  • Recall: Typically >90% recall@10 compared to dense
  • Latency: ~10-20% overhead from dequantization during search
Source

pub fn try_insert_quantized( &self, vector: &[f32], ) -> Result<usize, EmbeddingStorageError>

Try to insert a quantized vector into the index.

§Errors

Returns Err(CapacityExceeded) if max_nodes limit is reached.

Source

pub fn insert_quantized_vector(&self, quantized: ScalarQuantizedVector) -> usize

Insert a pre-quantized vector into the index.

Source

pub fn insert_tt( &self, vector: Vec<f32>, config: &TTConfig, ) -> Result<usize, String>

Insert a vector with TensorTrain compression.

Uses Tensor Train decomposition to compress the vector before storage, achieving 8-10x memory savings for high-dimensional vectors (768+ dims). The config parameter controls compression accuracy vs size tradeoff.

§Errors

Returns an error if TT decomposition fails.

Source

pub fn insert_tt_vector(&self, tt: &TTVector) -> usize

Insert a pre-decomposed TensorTrain vector.

Reconstructs to dense for storage - HNSW needs fast distance computations. TT compression is useful for storage/transmission, not HNSW indexing.

Source

pub fn insert_batch_tt( &self, vectors: Vec<Vec<f32>>, config: &TTConfig, ) -> Result<Vec<usize>, String>

Insert multiple vectors with TensorTrain validation in batch.

Vectors are validated via TT decomposition but stored as dense for fast HNSW distance computations.

§Errors

Returns an error if batch TT decomposition fails.

Source

pub fn search_tt( &self, query: &[f32], k: usize, config: &TTConfig, ) -> Vec<(usize, f32)>

Search with a TensorTrain-compressed query.

The query is compressed before searching, reducing memory bandwidth during the search. Works best when the index contains TT-compressed vectors.

Source

pub fn search_tt_with_ef( &self, query_tt: &TTVector, k: usize, ef: usize, ) -> Vec<(usize, f32)>

Search with TT query and custom ef parameter.

Uses native TT operations throughout - no dense reconstruction needed. For TT-to-TT comparisons, this is zero-allocation.

§Panics

Panics if the internal lock is poisoned.

Source

pub fn insert_embedding(&self, embedding: EmbeddingStorage) -> usize

Insert an embedding (dense or sparse) into the index.

Use try_insert_embedding for a non-panicking version.

§Panics

Panics if the index is at capacity (max_nodes), if Delta vectors are used, or if the internal lock is poisoned.

Source

pub fn try_insert_embedding( &self, embedding: EmbeddingStorage, ) -> Result<usize, EmbeddingStorageError>

Insert an embedding with capacity checking.

§Errors

Returns Err(CapacityExceeded) if max_nodes limit is reached. Returns Err(DeltaNotSupported) if a Delta vector is provided.

§Panics

Panics if the internal lock is poisoned.

Source

pub fn search(&self, query: &[f32], k: usize) -> Vec<(usize, f32)>

Search for k nearest neighbors of the query vector.

Source

pub fn search_sparse(&self, query: &SparseVector, k: usize) -> Vec<(usize, f32)>

Search for k nearest neighbors using a sparse query.

Source

pub fn search_with_ef( &self, query: &[f32], k: usize, ef: usize, ) -> Vec<(usize, f32)>

Search with custom ef parameter (higher = better recall, slower)

§Panics

Panics if the internal lock is poisoned.

Source

pub fn search_sparse_with_ef( &self, query: &SparseVector, k: usize, ef: usize, ) -> Vec<(usize, f32)>

Search with sparse query and custom ef parameter.

§Panics

Panics if the internal lock is poisoned.

Source

pub fn get_vector(&self, id: usize) -> Option<Vec<f32>>

Get the vector for a node ID (as dense, for compatibility).

Returns None if the vector cannot be converted to dense (e.g., Delta without registry).

§Panics

Panics if the internal lock is poisoned.

Source

pub fn get_embedding(&self, id: usize) -> Option<EmbeddingStorage>

Get the embedding storage for a node ID.

§Panics

Panics if the internal lock is poisoned.

Source

pub fn memory_stats(&self) -> HNSWMemoryStats

Get memory usage statistics.

§Panics

Panics if the internal lock is poisoned.

Source

pub const fn config(&self) -> &HNSWConfig

Get configuration

Set ef_search parameter (controls recall/speed tradeoff)

Trait Implementations§

Source§

impl Default for HNSWIndex

Source§

fn default() -> HNSWIndex

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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 more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more