Skip to main content

RaBitQCodec

Struct RaBitQCodec 

Source
pub struct RaBitQCodec {
    pub dim: usize,
    pub bias_correct: bool,
    /* private fields */
}
Expand description

RaBitQ codec: 1-bit quantization with O(1/√D) MSE error bound.

See module-level documentation for algorithm details.

Fields§

§dim: usize§bias_correct: bool

If true, subtract dot_quantized from the asymmetric distance estimate as a TurboQuant-style IP-bias correction term.

Implementations§

Source§

impl RaBitQCodec

Source

pub fn calibrate(vectors: &[&[f32]], dim: usize, rotation_seed: u64) -> Self

Calibrate a new codec from a set of training vectors.

  • Computes the centroid as the coordinate-wise mean of vectors.
  • Stores rotation_seed for reproducible signed-diagonal generation.
§Errors (none — returns Self directly)

Returns a zero-centroid codec if vectors is empty.

Source

pub fn apply_rotation(&self, v: &[f32]) -> Vec<f32>

Apply the randomised WHT rotation to a residual vector.

Steps:

  1. Apply signed-diagonal D (deterministic from rotation_seed).
  2. Zero-pad to the next power of two if dim is not pow2.
  3. WHT in-place.
  4. Truncate back to dim.

Trait Implementations§

Source§

impl VectorCodec for RaBitQCodec

Source§

fn fast_symmetric_distance( &self, q: &Self::Quantized, v: &Self::Quantized, ) -> f32

Symmetric distance estimate: both q and v are quantized.

approx_l2 = ‖v-c‖² + ‖q-c‖² − 2·‖v-c‖·‖q-c‖·(1 − 2·hamming/D)

The angular factor 1 − 2·hamming/D approximates cos(θ) between the two sign-vectors. Error bound: O(1/√D) MSE.

Source§

fn exact_asymmetric_distance(&self, q: &Self::Query, v: &Self::Quantized) -> f32

Asymmetric distance estimate: q is a prepared RaBitQQuery, v is a stored quantized vector.

Uses query_norm (exact ‖q−c‖) against v.residual_norm (exact ‖v−c‖) for higher fidelity than the symmetric variant.

If self.bias_correct = true, subtract v.dot_quantized as a first- order IP-bias correction term (TurboQuant-style).

Source§

type Quantized = RaBitQQuantized

The packed quantized form. Must be convertible to a UnifiedQuantizedVector reference via AsRef.
Source§

type Query = RaBitQQuery

The prepared query form (codec-specific).
Source§

fn encode(&self, v: &[f32]) -> Self::Quantized

Encode a single FP32 vector into the codec’s packed form.
Source§

fn prepare_query(&self, q: &[f32]) -> Self::Query

Prepare a query for distance computations against this codec. May rotate, normalize, build a LUT, etc.
Source§

fn adc_lut(&self, _q: &Self::Query) -> Option<AdcLut>

Optional: precompute ADC lookup table for codecs that use one (PQ, IVF-PQ, TurboQuant). Returns None for codecs that don’t (RaBitQ, BBQ, ternary, binary).
Source§

fn train(&mut self, samples: &[&[f32]]) -> Result<(), CodecError>

Optional: fit the codec’s learned parameters on a set of training vectors. 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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

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

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
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.