manifoldb_vector/quantization/
mod.rs

1//! Product Quantization for vector compression.
2//!
3//! This module provides Product Quantization (PQ) for compressing high-dimensional
4//! vectors into compact codes while preserving approximate distance computation.
5//!
6//! # Overview
7//!
8//! Product Quantization works by:
9//! 1. Splitting vectors into M subspaces (segments)
10//! 2. Training K centroids (codebook entries) per subspace using k-means
11//! 3. Encoding each vector as M indices into the codebooks
12//!
13//! For example, a 128-dimensional vector with M=8 segments and K=256 centroids
14//! can be compressed from 512 bytes (128 × 4 bytes) to just 8 bytes (8 × 1 byte).
15//!
16//! # Distance Computation
17//!
18//! Two modes are supported:
19//! - **Symmetric Distance Computation (SDC)**: Approximate distances between two
20//!   compressed vectors. Fast but less accurate.
21//! - **Asymmetric Distance Computation (ADC)**: Exact query vector, compressed
22//!   database vectors. Better accuracy for search.
23//!
24//! # Example
25//!
26//! ```ignore
27//! use manifoldb_vector::quantization::{ProductQuantizer, PQConfig};
28//!
29//! // Create a PQ with 8 segments and 256 centroids per segment
30//! let config = PQConfig::new(128, 8).with_num_centroids(256);
31//! let training_data: Vec<Vec<f32>> = /* your training vectors */;
32//! let pq = ProductQuantizer::train(&config, &training_data)?;
33//!
34//! // Encode vectors
35//! let vector = vec![0.1f32; 128];
36//! let code = pq.encode(&vector);
37//!
38//! // Compute distances with ADC
39//! let query = vec![0.2f32; 128];
40//! let distance_table = pq.compute_distance_table(&query);
41//! let distance = pq.asymmetric_distance(&distance_table, &code);
42//! ```
43
44mod config;
45mod pq;
46mod training;
47
48pub use config::PQConfig;
49pub use pq::{PQCode, ProductQuantizer};
50pub use training::{KMeans, KMeansConfig};