use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Task {
Binary,
MultiClass(usize),
Regression,
}
impl fmt::Display for Task {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let name = match self {
Self::Binary => "Binary C.".to_string(),
Self::MultiClass(n) => format!("Multiclass ({n}) C."),
Self::Regression => "Regression".to_string(),
};
write!(f, "{name}")
}
}
#[inline(always)]
pub(crate) fn binarize<T: AsRef<[f64]>>(y: T) -> f64 {
let y = y.as_ref();
if y.len() == 1 {
1.0 - 2.0 * y[0]
} else if y.len() == 2 {
if y[0] > y[1] { -y[0] } else { y[1] }
} else {
panic!("Cannot convert a vector of length >= 3 into a scalar");
}
}
#[inline(always)]
pub(crate) fn discretize<T: AsRef<[f64]>>(y: T, n_class: usize) -> f64 {
let y = y.as_ref();
assert_eq!(y.len(), n_class);
let k = y.iter()
.enumerate()
.max_by(|a, b| a.1.partial_cmp(b.1).unwrap())
.unwrap().0;
k as f64
}
#[inline(always)]
pub(crate) fn vectorize(y: f64, n_class: usize) -> Vec<f64> {
if n_class == 1 { return vec![y]; }
let y = if y <= 0.0 { 0_usize } else { y as usize };
let mut vec = vec![0.0; n_class];
vec[y] = 1.0;
vec
}