| 244 | } |
| 245 | |
| 246 | fn prepare_query(&self, q: &[f32]) -> BbqQuery { |
| 247 | let mut centered = Vec::with_capacity(self.dim); |
| 248 | self.center(q, &mut centered); |
| 249 | let signs = Self::pack_signs(¢ered); |
| 250 | let query_norm = Self::norm(¢ered); |
| 251 | let sign_fp: Vec<f32> = centered |
| 252 | .iter() |
| 253 | .map(|&x| if x >= 0.0 { 1.0 } else { -1.0 }) |
| 254 | .collect(); |
| 255 | let dot_vs = Self::dot(¢ered, &sign_fp); |
| 256 | let query_dot_quantized = if query_norm > 0.0 { |
| 257 | dot_vs / query_norm |
| 258 | } else { |
| 259 | 0.0 |
| 260 | }; |
| 261 | BbqQuery { |
| 262 | centered, |
| 263 | signs, |
| 264 | query_norm, |
| 265 | query_dot_quantized, |
| 266 | } |
| 267 | } |
| 268 | |
| 269 | /// Fast Hamming-based symmetric distance estimate. |
| 270 | /// |