Skip to main content

qdrant_client/builders/
binary_quantization_builder.rs

1use crate::qdrant::*;
2
3#[must_use]
4#[derive(Clone)]
5pub struct BinaryQuantizationBuilder {
6    /// If true - quantized vectors always will be stored in RAM, ignoring the config of main storage
7    pub(crate) always_ram: Option<Option<bool>>,
8    pub(crate) encoding: Option<Option<i32>>,
9    pub(crate) query_encoding: Option<Option<BinaryQuantizationQueryEncoding>>,
10    /// Memory placement of quantized vectors.
11    pub(crate) memory: Option<Option<i32>>,
12}
13
14impl BinaryQuantizationBuilder {
15    /// If true - quantized vectors always will be stored in RAM, ignoring the config of main storage
16    ///
17    /// Deprecated since 1.19.0, use [`memory`](Self::memory) instead.
18    pub fn always_ram(self, value: bool) -> Self {
19        let mut new = self;
20        new.always_ram = Some(Some(value));
21        new
22    }
23
24    /// Binary quantization encoding method
25    pub fn encoding(self, value: impl Into<BinaryQuantizationEncoding>) -> Self {
26        let mut new = self;
27        let encoding: BinaryQuantizationEncoding = value.into();
28        new.encoding = Some(Some(encoding.into()));
29        new
30    }
31
32    /// Asymmetric quantization configuration allows a query to have different quantization than stored vectors.
33    /// It can increase the accuracy of search at the cost of performance.
34    pub fn query_encoding(self, value: impl Into<BinaryQuantizationQueryEncoding>) -> Self {
35        let mut new = self;
36        new.query_encoding = Some(Some(value.into()));
37        new
38    }
39
40    /// Memory placement of quantized vectors.
41    /// Overrides the deprecated `always_ram` flag if both are set.
42    pub fn memory(self, value: impl Into<i32>) -> Self {
43        let mut new = self;
44        new.memory = Some(Some(value.into()));
45        new
46    }
47
48    #[allow(deprecated)]
49    fn build_inner(self) -> Result<BinaryQuantization, BinaryQuantizationBuilderError> {
50        Ok(BinaryQuantization {
51            always_ram: self.always_ram.unwrap_or_default(),
52            encoding: self.encoding.unwrap_or_default(),
53            query_encoding: self.query_encoding.unwrap_or_default(),
54            memory: self.memory.unwrap_or_default(),
55        })
56    }
57    /// Create an empty builder, with all fields set to `None` or `PhantomData`.
58    fn create_empty() -> Self {
59        Self {
60            always_ram: Default::default(),
61            encoding: Default::default(),
62            query_encoding: Default::default(),
63            memory: Default::default(),
64        }
65    }
66}
67
68impl From<BinaryQuantizationBuilder> for BinaryQuantization {
69    fn from(value: BinaryQuantizationBuilder) -> Self {
70        value.build_inner().unwrap_or_else(|_| {
71            panic!(
72                "Failed to convert {0} to {1}",
73                "BinaryQuantizationBuilder", "BinaryQuantization"
74            )
75        })
76    }
77}
78
79impl BinaryQuantizationBuilder {
80    /// Builds the desired type. Can often be omitted.
81    pub fn build(self) -> BinaryQuantization {
82        self.build_inner().unwrap_or_else(|_| {
83            panic!(
84                "Failed to build {0} into {1}",
85                "BinaryQuantizationBuilder", "BinaryQuantization"
86            )
87        })
88    }
89}
90
91impl BinaryQuantizationBuilder {
92    pub(crate) fn empty() -> Self {
93        Self::create_empty()
94    }
95}
96
97impl Default for BinaryQuantizationBuilder {
98    fn default() -> Self {
99        Self::create_empty()
100    }
101}
102
103#[non_exhaustive]
104#[derive(Debug)]
105pub enum BinaryQuantizationBuilderError {
106    /// Uninitialized field
107    UninitializedField(&'static str),
108    /// Custom validation error
109    ValidationError(String),
110}
111
112// Implementing the Display trait for better error messages
113impl std::fmt::Display for BinaryQuantizationBuilderError {
114    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
115        match self {
116            Self::UninitializedField(field) => {
117                write!(f, "`{field}` must be initialized")
118            }
119            Self::ValidationError(error) => write!(f, "{error}"),
120        }
121    }
122}
123
124// Implementing the Error trait
125impl std::error::Error for BinaryQuantizationBuilderError {}
126
127// Implementing From trait for conversion from UninitializedFieldError
128impl From<derive_builder::UninitializedFieldError> for BinaryQuantizationBuilderError {
129    fn from(error: derive_builder::UninitializedFieldError) -> Self {
130        Self::UninitializedField(error.field_name())
131    }
132}
133
134// Implementing From trait for conversion from String
135impl From<String> for BinaryQuantizationBuilderError {
136    fn from(error: String) -> Self {
137        Self::ValidationError(error)
138    }
139}
140
141impl BinaryQuantizationQueryEncoding {
142    pub fn scalar8bits() -> Self {
143        Self {
144            variant: Some(binary_quantization_query_encoding::Variant::Setting(
145                binary_quantization_query_encoding::Setting::Scalar8Bits.into(),
146            )),
147        }
148    }
149
150    pub fn scalar4bits() -> Self {
151        Self {
152            variant: Some(binary_quantization_query_encoding::Variant::Setting(
153                binary_quantization_query_encoding::Setting::Scalar4Bits.into(),
154            )),
155        }
156    }
157
158    pub fn binary() -> Self {
159        Self {
160            variant: Some(binary_quantization_query_encoding::Variant::Setting(
161                binary_quantization_query_encoding::Setting::Binary.into(),
162            )),
163        }
164    }
165
166    pub fn default_encoding() -> Self {
167        Self {
168            variant: Some(binary_quantization_query_encoding::Variant::Setting(
169                binary_quantization_query_encoding::Setting::Default.into(),
170            )),
171        }
172    }
173}