use std::sync::Arc;
use crate::metric::{MetricEntry, NumericEntry};
pub enum Event {
MetricsUpdate(MetricsUpdate),
EndEpoch(usize),
}
#[derive(new, Clone, Debug)]
pub struct MetricsUpdate {
pub entries: Vec<MetricEntry>,
pub entries_numeric: Vec<(MetricEntry, NumericEntry)>,
}
impl MetricsUpdate {
pub fn tag(&mut self, tag: Arc<String>) {
self.entries.iter_mut().for_each(|entry| {
entry.tags.push(tag.clone());
});
self.entries_numeric.iter_mut().for_each(|(entry, _)| {
entry.tags.push(tag.clone());
});
}
}
pub trait EventStore: Send {
fn add_event(&mut self, event: Event, split: Split);
fn find_epoch(
&mut self,
name: &str,
aggregate: Aggregate,
direction: Direction,
split: Split,
) -> Option<usize>;
fn find_metric(
&mut self,
name: &str,
epoch: usize,
aggregate: Aggregate,
split: Split,
) -> Option<f64>;
}
#[derive(Copy, Clone, Hash, PartialEq, Eq, Debug)]
pub enum Aggregate {
Mean,
}
#[derive(Copy, Clone)]
pub enum Split {
Train,
Valid,
Test,
}
#[derive(Copy, Clone)]
pub enum Direction {
Lowest,
Highest,
}