use serde::{Deserialize, Serialize};
use crate::vector::core::distance::DistanceMetric;
use crate::vector::core::quantization;
fn default_dimension() -> usize {
128
}
fn default_getting_m() -> usize {
16
}
fn default_getting_ef_construction() -> usize {
200
}
fn default_getting_n_clusters() -> usize {
100
}
fn default_getting_n_probe() -> usize {
1
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", content = "options", rename_all = "snake_case")]
pub enum FieldOption {
Flat(FlatOption),
Hnsw(HnswOption),
Ivf(IvfOption),
}
impl Default for FieldOption {
fn default() -> Self {
FieldOption::Hnsw(HnswOption::default())
}
}
impl FieldOption {
pub fn dimension(&self) -> usize {
match self {
FieldOption::Flat(opt) => opt.dimension,
FieldOption::Hnsw(opt) => opt.dimension,
FieldOption::Ivf(opt) => opt.dimension,
}
}
pub fn distance(&self) -> DistanceMetric {
match self {
FieldOption::Flat(opt) => opt.distance,
FieldOption::Hnsw(opt) => opt.distance,
FieldOption::Ivf(opt) => opt.distance,
}
}
pub fn base_weight(&self) -> f32 {
match self {
FieldOption::Flat(opt) => opt.base_weight,
FieldOption::Hnsw(opt) => opt.base_weight,
FieldOption::Ivf(opt) => opt.base_weight,
}
}
pub fn index_kind(&self) -> VectorIndexKind {
match self {
FieldOption::Flat(_) => VectorIndexKind::Flat,
FieldOption::Hnsw(_) => VectorIndexKind::Hnsw,
FieldOption::Ivf(_) => VectorIndexKind::Ivf,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FlatOption {
#[serde(default = "default_dimension")]
pub dimension: usize,
#[serde(default = "default_distance_metric")]
pub distance: DistanceMetric,
#[serde(default = "default_weight")]
pub base_weight: f32,
#[serde(default)]
pub quantizer: Option<quantization::QuantizationMethod>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub embedder: Option<String>,
}
impl Default for FlatOption {
fn default() -> Self {
Self {
dimension: 128,
distance: default_distance_metric(),
base_weight: default_weight(),
quantizer: None,
embedder: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HnswOption {
#[serde(default = "default_dimension")]
pub dimension: usize,
#[serde(default = "default_distance_metric")]
pub distance: DistanceMetric,
#[serde(default = "default_getting_m")]
pub m: usize,
#[serde(default = "default_getting_ef_construction")]
pub ef_construction: usize,
#[serde(default = "default_weight")]
pub base_weight: f32,
#[serde(default)]
pub quantizer: Option<quantization::QuantizationMethod>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub embedder: Option<String>,
}
impl Default for HnswOption {
fn default() -> Self {
Self {
dimension: 128,
distance: default_distance_metric(),
m: default_getting_m(),
ef_construction: default_getting_ef_construction(),
base_weight: default_weight(),
quantizer: None,
embedder: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IvfOption {
pub dimension: usize,
#[serde(default = "default_distance_metric")]
pub distance: DistanceMetric,
#[serde(default = "default_getting_n_clusters")]
pub n_clusters: usize,
#[serde(default = "default_getting_n_probe")]
pub n_probe: usize,
#[serde(default = "default_weight")]
pub base_weight: f32,
#[serde(default)]
pub quantizer: Option<quantization::QuantizationMethod>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub embedder: Option<String>,
}
impl Default for IvfOption {
fn default() -> Self {
Self {
dimension: 128,
distance: default_distance_metric(),
n_clusters: default_getting_n_clusters(),
n_probe: default_getting_n_probe(),
base_weight: default_weight(),
quantizer: None,
embedder: None,
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum VectorIndexKind {
Flat,
Hnsw,
Ivf,
}
impl From<FlatOption> for FieldOption {
fn from(opt: FlatOption) -> Self {
FieldOption::Flat(opt)
}
}
impl From<HnswOption> for FieldOption {
fn from(opt: HnswOption) -> Self {
FieldOption::Hnsw(opt)
}
}
impl From<IvfOption> for FieldOption {
fn from(opt: IvfOption) -> Self {
FieldOption::Ivf(opt)
}
}
impl FlatOption {
pub fn new(dimension: usize) -> Self {
Self {
dimension,
..Default::default()
}
}
pub fn dimension(mut self, dimension: usize) -> Self {
self.dimension = dimension;
self
}
pub fn distance(mut self, distance: DistanceMetric) -> Self {
self.distance = distance;
self
}
pub fn base_weight(mut self, weight: f32) -> Self {
self.base_weight = weight;
self
}
pub fn quantizer(mut self, quantizer: quantization::QuantizationMethod) -> Self {
self.quantizer = Some(quantizer);
self
}
}
impl HnswOption {
pub fn new(dimension: usize) -> Self {
Self {
dimension,
..Default::default()
}
}
pub fn dimension(mut self, dimension: usize) -> Self {
self.dimension = dimension;
self
}
pub fn distance(mut self, distance: DistanceMetric) -> Self {
self.distance = distance;
self
}
pub fn m(mut self, m: usize) -> Self {
self.m = m;
self
}
pub fn ef_construction(mut self, ef: usize) -> Self {
self.ef_construction = ef;
self
}
pub fn base_weight(mut self, weight: f32) -> Self {
self.base_weight = weight;
self
}
pub fn quantizer(mut self, quantizer: quantization::QuantizationMethod) -> Self {
self.quantizer = Some(quantizer);
self
}
}
impl IvfOption {
pub fn new(dimension: usize) -> Self {
Self {
dimension,
..Default::default()
}
}
pub fn dimension(mut self, dimension: usize) -> Self {
self.dimension = dimension;
self
}
pub fn distance(mut self, distance: DistanceMetric) -> Self {
self.distance = distance;
self
}
pub fn n_clusters(mut self, n: usize) -> Self {
self.n_clusters = n;
self
}
pub fn n_probe(mut self, n: usize) -> Self {
self.n_probe = n;
self
}
pub fn base_weight(mut self, weight: f32) -> Self {
self.base_weight = weight;
self
}
pub fn quantizer(mut self, quantizer: quantization::QuantizationMethod) -> Self {
self.quantizer = Some(quantizer);
self
}
}
fn default_distance_metric() -> DistanceMetric {
DistanceMetric::Cosine
}
fn default_weight() -> f32 {
1.0
}