use crate::{datasets::GaussType, models::Labelled, types::Labels};
#[non_exhaustive]
#[derive(Clone, Debug)]
pub enum GaussEvT {
CertainPositive {
event: usize,
value: GaussType,
},
}
impl GaussEvT {
pub const fn event(&self) -> usize {
match self {
Self::CertainPositive { event, .. } => *event,
}
}
}
#[derive(Clone, Debug)]
pub struct GaussEv {
labels: Labels,
evidences: Vec<Option<GaussEvT>>,
}
impl Labelled for GaussEv {
#[inline]
fn labels(&self) -> &Labels {
&self.labels
}
}
impl GaussEv {
pub fn new<I>(mut labels: Labels, values: I) -> Self
where
I: IntoIterator<Item = GaussEvT>,
{
use GaussEvT as E;
let mut evidences = vec![None; labels.len()];
values.into_iter().for_each(|e| {
let event = e.event();
evidences[event] = Some(e);
});
if !labels.is_sorted() {
let mut new_labels = labels.clone();
new_labels.sort();
let mut new_evidences = vec![None; new_labels.len()];
evidences.into_iter().flatten().for_each(|e| {
let event = labels
.get_index(e.event())
.expect("Failed to get label of evidence.");
let event = new_labels
.get_index_of(event)
.expect("Failed to get index of evidence.");
let e = match e {
E::CertainPositive { value, .. } => E::CertainPositive { event, value },
};
new_evidences[event] = Some(e);
});
labels = new_labels;
evidences = new_evidences;
}
Self { labels, evidences }
}
#[inline]
pub const fn evidences(&self) -> &Vec<Option<GaussEvT>> {
&self.evidences
}
}