use turboquant::packed::TurboQuantConfig;
use turboquant::quantize::{dequantize_vec, quantize_vec};
const BITS: u8 = 3;
const DIM: usize = 128;
const ROTATION_SEED: u64 = 42;
const BYTES_PER_F32: usize = 4;
const SINE_FREQUENCY: f64 = 0.1;
const SINE_AMPLITUDE: f32 = 2.5;
fn main() {
let config = TurboQuantConfig::new(BITS, DIM)
.expect("valid config")
.with_seed(ROTATION_SEED);
let input: Vec<f32> = (0..DIM)
.map(|i| SINE_AMPLITUDE * ((i as f64 * SINE_FREQUENCY).sin() as f32))
.collect();
let original_bytes = DIM * BYTES_PER_F32;
let block = quantize_vec(&config, &input).expect("quantization succeeded");
let packed_bytes = block.size_bytes();
let recovered = dequantize_vec(&config, &block).expect("dequantization succeeded");
let mse: f32 = input
.iter()
.zip(recovered.iter())
.map(|(&a, &b)| {
let diff = a - b;
diff * diff
})
.sum::<f32>()
/ DIM as f32;
let input_energy: f32 = input.iter().map(|&x| x * x).sum::<f32>() / DIM as f32;
let normalized_mse = mse / input_energy;
let compression_ratio = original_bytes as f64 / packed_bytes as f64;
println!("TurboQuant TQ{BITS} basic example (d={DIM})");
println!("---------------------------------------------");
println!("Original size: {original_bytes} bytes (FP32)");
println!("Packed size: {packed_bytes} bytes");
println!("Compression ratio: {compression_ratio:.1}x");
println!("MSE: {mse:.6}");
println!("Normalized MSE: {normalized_mse:.6}");
println!();
println!("First 8 values:");
println!(" original: {:?}", &input[..8]);
println!(" recovered: {:?}", &recovered[..8]);
}