#[test]
fn epistemic_weight_zero_preserves_behavior() {
let make = || {
vec![
input_with_gain("a", 100, 0.9, 10.0),
input_with_gain("b", 100, 0.8, 0.0),
input_with_gain("c", 100, 0.7, 5.0),
]
};
let w_default = SelectorWeights {
..Default::default()
};
let w_zero = SelectorWeights {
epistemic_weight: 0.0,
..Default::default()
};
let out_d = GreedySelector.select(make(), 200, &w_default).unwrap();
let out_z = GreedySelector.select(make(), 200, &w_zero).unwrap();
let ids_d: Vec<&str> = out_d.selected.iter().map(|i| i.id.as_str()).collect();
let ids_z: Vec<&str> = out_z.selected.iter().map(|i| i.id.as_str()).collect();
assert_eq!(ids_d, ids_z);
assert_eq!(ids_d, vec!["a", "b"]);
}
#[test]
fn epistemic_weight_positive_reorders_by_gain() {
let inputs = vec![
input_with_gain("a", 100, 0.5, 10.0),
input_with_gain("b", 100, 0.9, 0.0),
];
let w = SelectorWeights {
epistemic_weight: 1.0,
..Default::default()
};
let out = GreedySelector.select(inputs, 100, &w).unwrap();
assert_eq!(out.selected.len(), 1);
assert_eq!(out.selected[0].id, "a");
}
#[test]
fn information_gain_none_equivalent_to_zero() {
let with_none = vec![
input("a", 100, 0.9), input("b", 100, 0.8),
];
let with_zero = vec![
input_with_gain("a", 100, 0.9, 0.0),
input_with_gain("b", 100, 0.8, 0.0),
];
let w = SelectorWeights {
epistemic_weight: 1.0,
..Default::default()
};
let out_none = GreedySelector.select(with_none, 200, &w).unwrap();
let out_zero = GreedySelector.select(with_zero, 200, &w).unwrap();
let ids_none: Vec<&str> = out_none.selected.iter().map(|i| i.id.as_str()).collect();
let ids_zero: Vec<&str> = out_zero.selected.iter().map(|i| i.id.as_str()).collect();
assert_eq!(ids_none, ids_zero);
}
#[test]
fn epistemic_weight_works_with_diversity_bias() {
let inputs = vec![
{
let mut i = input_with_gain("a", 100, 0.5, 10.0);
i.category = Some("x".to_string());
i
},
{
let mut i = input_with_gain("b", 100, 0.8, 0.0);
i.category = Some("x".to_string());
i
},
{
let mut i = input_with_gain("c", 100, 0.3, 0.0);
i.category = Some("y".to_string());
i
},
];
let w = SelectorWeights {
epistemic_weight: 1.0,
diversity_bias: 0.5,
..Default::default()
};
let out = GreedySelector.select(inputs, 200, &w).unwrap();
assert_eq!(out.selected.len(), 2);
assert_eq!(out.selected[0].id, "a");
assert_eq!(out.selected[1].id, "b");
}