use bitpolar::kv_cache::{KvCacheConfig, MultiHeadKvCache};
fn main() {
let config = KvCacheConfig {
head_dim: 64,
bits: 4,
projections: 16,
seed: 42,
};
let num_heads = 4;
let mut cache = MultiHeadKvCache::new(num_heads, &config).unwrap();
println!("=== Multi-Head KV Cache ({} heads × {} dim, {}-bit) ===\n", num_heads, config.head_dim, config.bits);
for token in 0..50 {
let keys: Vec<Vec<f32>> = (0..num_heads)
.map(|h| {
(0..config.head_dim)
.map(|d| ((token * num_heads + h) as f32 * 0.01 + d as f32 * 0.001).sin())
.collect()
})
.collect();
let values = keys.clone();
let key_refs: Vec<&[f32]> = keys.iter().map(|v| v.as_slice()).collect();
let val_refs: Vec<&[f32]> = values.iter().map(|v| v.as_slice()).collect();
cache.push_token(&key_refs, &val_refs).unwrap();
}
println!("Tokens cached: 50");
println!("Cache length: {} tokens", cache.len());
}