| 295 | use crate::multivec::storage::{MultiVecMode, MultiVectorDoc, MultiVectorStore}; |
| 296 | |
| 297 | fn build_store() -> MultiVectorStore { |
| 298 | let mut store = MultiVectorStore::new(2, MultiVecMode::PerToken); |
| 299 | |
| 300 | // Three well-separated clusters of documents. |
| 301 | // Cluster A: docs 0–2 near (0,0). |
| 302 | // Cluster B: docs 3–5 near (10,0). |
| 303 | // Cluster C: docs 6–8 near (0,10). |
| 304 | for i in 0u32..3 { |
| 305 | store |
| 306 | .insert(MultiVectorDoc { |
| 307 | doc_id: i, |
| 308 | vectors: vec![vec![i as f32 * 0.1, i as f32 * 0.1]], |
| 309 | }) |
| 310 | .unwrap(); |
| 311 | } |
| 312 | for i in 3u32..6 { |
| 313 | store |
| 314 | .insert(MultiVectorDoc { |
| 315 | doc_id: i, |
| 316 | vectors: vec![vec![10.0 + i as f32 * 0.1, 0.0]], |
| 317 | }) |
| 318 | .unwrap(); |
| 319 | } |
| 320 | for i in 6u32..9 { |
| 321 | store |
| 322 | .insert(MultiVectorDoc { |
| 323 | doc_id: i, |
| 324 | vectors: vec![vec![0.0, 10.0 + i as f32 * 0.1]], |
| 325 | }) |
| 326 | .unwrap(); |
| 327 | } |
| 328 | store |
| 329 | } |
| 330 | |
| 331 | #[test] |
| 332 | fn train_produces_correct_centroid_count() { |