ADCTable

Struct ADCTable 

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

Asymmetric Distance Computation (ADC) lookup table for fast quantized search

Precomputes partial squared distances from a query vector to all possible quantized codes. This enables O(1) distance computation per dimension instead of O(dim) decompression + distance calculation.

§Performance

  • Memory: For 4-bit: dim * 16 * 4 bytes (e.g., 1536D = 96KB per query)
  • Speedup: 5-10x faster distance computation vs full decompression
  • Use case: Scanning many candidate vectors during HNSW search

§Algorithm

Instead of:

for each candidate:
    decompress(candidate) -> O(dim)
    distance(query, decompressed) -> O(dim)

With ADC:

precompute table[code] = (query_value - dequantize(code))^2 for all codes
for each candidate:
    sum(table[candidate[i]]) -> O(1) per dimension

Implementations§

Source§

impl ADCTable

Source

pub fn new_trained( query: &[f32], trained: &TrainedParams, params: &RaBitQParams, ) -> Self

Build ADC lookup table using trained quantization parameters

This is the production method that computes correct distances. Uses per-dimension min/max ranges from training.

§Arguments
  • query - The uncompressed query vector
  • trained - Trained parameters with per-dimension min/max
  • params - Quantization parameters (bits per dimension)
Source

pub fn new(query: &[f32], scale: f32, params: &RaBitQParams) -> Self

Build ADC lookup table for a query vector (DEPRECATED)

For each dimension and each possible quantized code, precomputes the squared distance contribution: (query[i] - dequantize(code, scale))^2

WARNING: This method uses a fixed scale which produces incorrect distances when vectors were quantized with different scales. Use new_trained() instead.

§Arguments
  • query - The uncompressed query vector
  • scale - The scale factor used for quantization (from training or default)
  • params - Quantization parameters (bits per dimension)
§Returns

An ADCTable that can compute distances via distance() method

§Note

Prefer ADCTable::new_trained() with TrainedParams for correct ADC distances. This method uses per-vector scale which gives lower accuracy.

Source

pub fn distance_squared(&self, data: &[u8]) -> f32

Compute approximate L2 squared distance using lookup table

This is the hot path for search! Instead of decompressing and computing distance, we just sum up precomputed values from the table.

§Performance
  • 4-bit: ~5-10x faster than decompression + distance
  • Cache-friendly: sequential access patterns
  • SIMD-friendly: can vectorize the summation
§Arguments
  • data - Packed quantized bytes
§Returns

Approximate squared L2 distance (not square-rooted for efficiency)

Source

pub fn distance(&self, data: &[u8]) -> f32

Compute distance and return square root (actual L2 distance)

Uses SIMD-accelerated distance computation (AVX2 on x86_64, NEON on aarch64).

Source

pub fn distance_squared_simd(&self, data: &[u8]) -> f32

SIMD-accelerated distance computation for 4-bit quantization

Uses AVX2 on x86_64 or NEON on aarch64 to process multiple lookups in parallel. Falls back to scalar implementation if SIMD not available.

Source

pub fn bits(&self) -> u8

Get bits per dimension

Source

pub fn dimensions(&self) -> usize

Get number of dimensions

Source

pub fn get(&self, dim: usize, code: usize) -> f32

Get partial distance for a dimension and code

Returns 0.0 if indices are out of bounds.

Source

pub fn memory_bytes(&self) -> usize

Get memory usage in bytes

Trait Implementations§

Source§

impl Clone for ADCTable

Source§

fn clone(&self) -> ADCTable

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ADCTable

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. 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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
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> 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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
Source§

impl<T> Fruit for T
where T: Send + Downcast,