#![deny(missing_docs)]
pub fn mmr(rel: &[f32], pair: &[Vec<f32>], lambda: f32, k: usize) -> Vec<usize> {
let n = rel.len();
assert_eq!(pair.len(), n, "pair rows must equal rel length");
let mut picked: Vec<usize> = Vec::with_capacity(k.min(n));
let mut remaining: Vec<usize> = (0..n).collect();
while picked.len() < k && !remaining.is_empty() {
let mut best_score = f32::NEG_INFINITY;
let mut best_idx_in_rem = 0;
for (slot, &cand) in remaining.iter().enumerate() {
let max_pair = picked
.iter()
.map(|&p| pair[cand][p])
.fold(0.0_f32, f32::max);
let score = lambda * rel[cand] - (1.0 - lambda) * max_pair;
if score > best_score {
best_score = score;
best_idx_in_rem = slot;
}
}
let winner = remaining.remove(best_idx_in_rem);
picked.push(winner);
}
picked
}