Skip to main content

MinMaxQuantizer

Struct MinMaxQuantizer 

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

Recall that from the module-level documentation, MinMaxQuantizer, quantizes X into n bit vectors as follows -

X' = round((X - s) * (2^n - 1) / c).clamp(0, 2^n - 1))

where s is a shift value and c is a scaling parameter computed from the range of values.

For most bit widths (>1), given a positive scaling parameter grid_scale : f32, these are computed as:

- m = (max_i X[i] + min_i X[i]) / 2.0
- w = max_i X[i] - min_i X[i]

- s = m - w * grid_scale
- c = 2 * w * grid_scale

where `grid_scale` is an input to the quantizer.

For 1-bit quantization, to avoid outliers, s and c are derived differently:

  • Values are first split into two groups: those below and above the mean.
  • s is the average of values below the mean.
  • c is the difference between the average of values above the mean and s.

See MinMaxCompensation for notation. We have then that

X = X' * (c / (2^n - 1)) + s
         --------------    -
                |          |
               ax          bx

Implementations§

Source§

impl MinMaxQuantizer

Source

pub fn new( transform: Transform<GlobalAllocator>, grid_scale: Positive<f32>, ) -> Self

Instantiates a new quantizer with specific transform.

Source

pub fn dim(&self) -> usize

Input dimension of vectors to quantizer.

Source

pub fn output_dim(&self) -> usize

Output dimension of vectors after applying transform.

Output storage vectors should use this dimension instead of self.dim() because in general, the output dim may be different from the input dimension.

Trait Implementations§

Source§

impl AsFunctor<MinMaxCosine> for MinMaxQuantizer

Source§

impl AsFunctor<MinMaxCosineNormalized> for MinMaxQuantizer

Source§

impl AsFunctor<MinMaxIP> for MinMaxQuantizer

Source§

impl AsFunctor<MinMaxL2Squared> for MinMaxQuantizer

Source§

impl<'a, T> CompressInto<&[T], Slice<&'a mut [f32], Mut<'a, FullQueryMeta>>> for MinMaxQuantizer
where T: Copy + Into<f32>,

Source§

fn compress_into( &self, from: &[T], to: FullQueryMut<'a>, ) -> Result<(), Self::Error>

Compress the input vector from into a FullQueryMut to.

This method simply applies the transformation to the input without any compression.

§Error

Returns an error if the input contains NaN.

§Panics

Panics if:

  • from.len() != self.dim(): Vector to be compressed must have the same dimensionality as the quantizer.
  • to.len() != self.output_dim(): Compressed vector must have the same dimensionality as the quantizer.
Source§

type Error = InputContainsNaN

Errors that may occur during compression.
Source§

type Output = ()

An output type resulting from compression.
Source§

impl<const NBITS: usize, T> CompressInto<&[T], VectorBase<NBITS, Unsigned, MutSlicePtr<'_, u8>, Mut<'_, MinMaxCompensation>>> for MinMaxQuantizer
where T: Copy + Into<f32>, Unsigned: Representation<NBITS>,

Source§

fn compress_into( &self, from: &[T], to: DataMutRef<'_, NBITS>, ) -> Result<L2Loss, Self::Error>

Compress the input vector from into a mut ref of Data to.

This method computes and stores the compensation coefficients required for computing distances correctly.

§Error

Returns an error if the input contains NaN.

§Panics

Panics if:

  • from.len() != self.dim(): Vector to be compressed must have the same dimensionality as the quantizer.
  • to.vector().len() != self.output_dim(): Compressed vector must have the same dimensionality as the quantizer.
Source§

type Error = InputContainsNaN

Errors that may occur during compression.
Source§

type Output = L2Loss

An output type resulting from compression.
Source§

impl<'a, 'b, const NBITS: usize, T> CompressInto<MatRef<'a, Standard<T>>, MatMut<'b, MinMaxMeta<NBITS>>> for MinMaxQuantizer
where T: Copy + Into<f32>, Unsigned: Representation<NBITS>,

Source§

fn compress_into( &self, from: MatRef<'a, Standard<T>>, to: MatMut<'b, MinMaxMeta<NBITS>>, ) -> Result<(), Self::Error>

Compress a multi-vector of full-precision vectors into a multi-vector of MinMax quantized vectors.

This method iterates row by row over the input matrix, quantizing each full-precision vector into the corresponding row of the output MinMax matrix.

§Error

Returns InputContainsNaN error if any input vector contains NaN.

§Panics

Panics if:

  • from.num_vectors() != to.num_vectors(): The input and output must have the same number of vectors.
  • from.vector_dim() != self.dim(): Each input vector must have the same dimensionality as the quantizer.
  • The output intrinsic dimension doesn’t match self.output_dim().
Source§

type Error = InputContainsNaN

Errors that may occur during compression.
Source§

type Output = ()

An output type resulting from compression.

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

Source§

fn by_ref(&self) -> &T

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> 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, 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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> AsyncFriendly for T
where T: Send + Sync + 'static,