#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Task {
Binary,
MultiClass(usize),
Regression,
}
#[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.into_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
}