use serde::{Deserialize, Serialize};
use crate::quantization::turboquant::simd::{Query1bitSimd, Query2bitSimd, Query4bitSimd};
pub mod encoding;
pub mod lloyd_max;
pub mod math;
mod permutation;
pub mod quantization;
pub mod rotation;
pub mod simd;
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[serde(rename_all = "snake_case")]
pub enum TQBits {
Bits4,
Bits2,
Bits1_5,
Bits1,
}
impl TQBits {
#[inline]
fn bit_size(&self) -> u8 {
match self {
TQBits::Bits4 => 4,
TQBits::Bits2 => 2,
TQBits::Bits1_5 => 1,
TQBits::Bits1 => 1,
}
}
#[inline]
pub(crate) fn sample_size(&self) -> usize {
match self {
TQBits::Bits1 | TQBits::Bits1_5 => 2_048,
TQBits::Bits2 => 4_096,
TQBits::Bits4 => 8_192,
}
}
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[serde(rename_all = "snake_case")]
pub enum TQMode {
Normal,
Plus,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[serde(rename_all = "snake_case")]
pub enum TQRotation {
Padded,
Unpadded,
}
pub struct EncodedQueryTQ {
data: EncodedQueryTQData,
l2_norm: Option<f32>,
query: Option<Vec<f32>>,
ec_correction: f32,
}
pub enum EncodedQueryTQData {
Bits1(Query1bitSimd),
Bits1Wide(Query1bitSimd<16>),
Bits2(Query2bitSimd),
Bits4(Query4bitSimd),
}