use crate::model::ContextItem;
use crate::scorer::Scorer;
#[derive(Debug, Clone, Copy)]
pub struct ReflexiveScorer;
impl Scorer for ReflexiveScorer {
fn score(&self, item: &ContextItem, _all_items: &[ContextItem]) -> f64 {
match item.future_relevance_hint() {
None => 0.0,
Some(value) => {
if !value.is_finite() {
return 0.0;
}
value.clamp(0.0, 1.0)
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::model::ContextItemBuilder;
#[test]
fn reflexive_scorer_nan_hint() {
let item = ContextItemBuilder::new("nan-item", 5)
.future_relevance_hint(f64::NAN)
.build()
.unwrap();
let score = ReflexiveScorer.score(&item, std::slice::from_ref(&item));
assert_eq!(score, 0.0);
}
#[test]
fn reflexive_scorer_large_hint_clamped() {
let item = ContextItemBuilder::new("large-hint", 5)
.future_relevance_hint(2.0)
.build()
.unwrap();
let score = ReflexiveScorer.score(&item, std::slice::from_ref(&item));
assert_eq!(score, 1.0);
}
}