#[test]
fn test_realistic_embedding_dimensions() {
let dims = [64, 128, 256, 384, 512, 768, 1024, 1536];
for dim in dims {
let a: Vec<f32> = (0..dim).map(|i| (i as f32 * 0.001).sin()).collect();
let b: Vec<f32> = (0..dim).map(|i| (i as f32 * 0.002).cos()).collect();
let dot = innr::dot(&a, &b);
assert!(
dot.is_finite(),
"Dot product not finite for dim={}: {}",
dim,
dot
);
let cos = innr::cosine(&a, &b);
assert!(
(-1.0..=1.0).contains(&cos) || (cos - 1.0).abs() < 1e-5 || (cos + 1.0).abs() < 1e-5,
"Cosine out of range for dim={}: {}",
dim,
cos
);
let l2 = innr::l2_distance_squared(&a, &b);
assert!(
l2 >= 0.0,
"L2 squared should be non-negative for dim={}: {}",
dim,
l2
);
let norm_a = innr::norm(&a);
assert!(
norm_a > 0.0,
"Norm should be positive for dim={}: {}",
dim,
norm_a
);
}
}
#[test]
fn test_colbert_style_maxsim() {
let query_len = 8; let doc_len = 128; let dim = 128;
let query_tokens: Vec<Vec<f32>> = (0..query_len)
.map(|i| {
(0..dim)
.map(|j| ((i * dim + j) as f32 * 0.01).sin())
.collect()
})
.collect();
let doc_tokens: Vec<Vec<f32>> = (0..doc_len)
.map(|i| {
(0..dim)
.map(|j| ((i * dim + j) as f32 * 0.01).cos())
.collect()
})
.collect();
let q_refs: Vec<&[f32]> = query_tokens.iter().map(|v| v.as_slice()).collect();
let d_refs: Vec<&[f32]> = doc_tokens.iter().map(|v| v.as_slice()).collect();
let score = innr::maxsim(&q_refs, &d_refs);
assert!(score.is_finite(), "MaxSim should be finite: {}", score);
let cos_score = innr::maxsim_cosine(&q_refs, &d_refs);
assert!(
cos_score <= query_len as f32 + 0.01,
"MaxSim-cosine {} should be bounded by query tokens {}",
cos_score,
query_len
);
}
#[test]
fn test_edge_cases() {
let zero = vec![0.0f32; 128];
let nonzero: Vec<f32> = (0..128).map(|i| i as f32).collect();
assert_eq!(innr::cosine(&zero, &nonzero), 0.0);
assert_eq!(innr::cosine(&nonzero, &zero), 0.0);
assert_eq!(innr::cosine(&zero, &zero), 0.0);
let tiny: Vec<f32> = vec![1e-38; 128];
let result = innr::dot(&tiny, &tiny);
assert!(result.is_finite());
let large: Vec<f32> = vec![1e18; 128];
let result = innr::dot(&large, &large);
assert!(
result.is_finite() || result == f32::INFINITY,
"dot of large values should be finite or +infinity, got {}",
result
);
let mixed: Vec<f32> = (0..128)
.map(|i| if i % 2 == 0 { 1.0 } else { -1.0 })
.collect();
let result = innr::dot(&mixed, &mixed);
assert!((result - 128.0).abs() < 0.01);
}
#[test]
fn test_determinism() {
let a: Vec<f32> = (0..1024).map(|i| (i as f32).sin()).collect();
let b: Vec<f32> = (0..1024).map(|i| (i as f32).cos()).collect();
let dot1 = innr::dot(&a, &b);
let dot2 = innr::dot(&a, &b);
assert_eq!(dot1, dot2, "Dot product should be deterministic");
let cos1 = innr::cosine(&a, &b);
let cos2 = innr::cosine(&a, &b);
assert_eq!(cos1, cos2, "Cosine should be deterministic");
let l2_1 = innr::l2_distance_squared(&a, &b);
let l2_2 = innr::l2_distance_squared(&a, &b);
assert_eq!(l2_1, l2_2, "L2 distance should be deterministic");
}