use bitpolar::adaptive::AdaptiveQuantizer;
use bitpolar::tiered::Tier;
fn main() {
let aq = AdaptiveQuantizer::builder(128, 42)
.hot_bits(8)
.warm_bits(4)
.cold_bits(3)
.build()
.unwrap();
let vector: Vec<f32> = (0..128).map(|i| i as f32 * 0.01).collect();
println!("=== Adaptive Quantization (Promote/Demote) ===\n");
let code = aq.encode_adaptive(&vector, Tier::Cold).unwrap();
println!("Initial: {:?} tier", code.tier());
let promoted = aq.promote(&code).unwrap();
println!("Promoted: {:?} tier", promoted.tier());
let hot = aq.promote(&promoted).unwrap();
println!("Promoted: {:?} tier", hot.tier());
let demoted = aq.demote(&hot).unwrap();
println!("Demoted: {:?} tier", demoted.tier());
let cold_again = aq.demote(&demoted).unwrap();
println!("Demoted: {:?} tier", cold_again.tier());
println!("\nReconstruction quality by tier:");
for tier in [Tier::Hot, Tier::Warm, Tier::Cold] {
let c = aq.encode_adaptive(&vector, tier).unwrap();
let decoded = aq.decode_adaptive(&c);
let error: f32 = vector
.iter()
.zip(decoded.iter())
.map(|(a, b)| (a - b).powi(2))
.sum::<f32>()
.sqrt();
println!(" {:?}: error = {:.6}", tier, error);
}
}