use super::{
Metric,
range::{Bias, Cardinality, range_pr_auc_impl},
roc_auc::roc_auc_buffered,
};
pub struct RangePrVus {
pub max_buffer: usize,
pub cardinality: Cardinality,
pub bias: Bias,
pub max_samples: usize,
}
pub struct RangeRocVus {
pub max_buffer: usize,
}
impl Default for RangePrVus {
fn default() -> Self {
Self {
max_buffer: 200,
cardinality: Cardinality::One,
bias: Bias::Flat,
max_samples: 20,
}
}
}
impl Default for RangeRocVus {
fn default() -> Self {
Self { max_buffer: 200 }
}
}
impl Metric for RangePrVus {
fn name(&self) -> &str {
"RangePR-VUS"
}
fn score(&self, labels: &[u8], scores: &[f32]) -> f64 {
let values: Vec<f64> = (0..=self.max_buffer)
.map(|buf| {
let dilated = super::roc_auc::dilate(labels, buf);
range_pr_auc_impl(
&dilated,
scores,
self.cardinality,
self.bias,
self.max_samples,
)
})
.filter(|v| v.is_finite())
.collect();
if values.is_empty() {
return f64::NAN;
}
values.iter().sum::<f64>() / values.len() as f64
}
}
impl Metric for RangeRocVus {
fn name(&self) -> &str {
"RangeROC-VUS"
}
fn score(&self, labels: &[u8], scores: &[f32]) -> f64 {
let values: Vec<f64> = (0..=self.max_buffer)
.map(|buf| roc_auc_buffered(labels, scores, buf))
.filter(|v| v.is_finite())
.collect();
if values.is_empty() {
return f64::NAN;
}
values.iter().sum::<f64>() / values.len() as f64
}
}