use anyhow::{anyhow, Result};
use ndarray::{Array2, Axis};
use ndarray_rand::RandomExt;
use rand_distr::StandardNormal;
use vector_quantizer::pq::PQ;
fn create_random_vectors(n: usize, dim: usize) -> Array2<f32> {
Array2::random((n, dim), StandardNormal)
}
fn calculate_mse(original: &Array2<f32>, reconstructed: &Array2<f32>) -> Result<f32> {
let diff = original - reconstructed;
let mse = diff
.mapv(|x| x.powi(2))
.mean()
.ok_or_else(|| anyhow!("Failed to compute MSE"))?;
Ok(mse)
}
fn main() -> Result<()> {
let n_train = 1000; let n_test = 5; let dimension = 128;
let train_vectors = create_random_vectors(n_train, dimension);
let test_vectors = create_random_vectors(n_test, dimension);
let m = 8; let ks = 256; let verbose = Some(true);
let mut pq = PQ::try_new(m, ks)?;
let iterations = 20; pq.fit(&train_vectors, iterations)?;
let codes = pq.encode(&test_vectors)?;
println!("Codes (Compressed Representation):");
println!("{:?}", codes);
let reconstructed_vectors = pq.decode(&codes)?;
println!("Reconstructed (Quantized) Vectors:");
println!("{:?}", reconstructed_vectors);
for i in 0..n_test {
let original_vector = test_vectors.row(i);
let quantized_vector = reconstructed_vectors.row(i);
println!("Original Vector ({}): {:?}", i, original_vector);
println!("Quantized Vector ({}): {:?}", i, quantized_vector);
let difference = &original_vector - &quantized_vector;
println!("Difference ({}): {:?}", i, difference);
println!("----------------------------------------------------");
}
let mse = calculate_mse(&test_vectors, &reconstructed_vectors)?;
println!("Mean Squared Reconstruction Error: {}", mse);
Ok(())
}