use std::sync::Arc;
use crate::metric::{MetricDefinition, MetricEntry, NumericEntry};
pub enum Event {
MetricsInit(Vec<MetricDefinition>),
MetricsUpdate(MetricsUpdate),
EndEpoch(EpochSummary),
}
#[derive(new, Clone, Debug)]
pub struct NumericMetricUpdate {
pub entry: MetricEntry,
pub numeric_entry: NumericEntry,
pub running_entry: NumericEntry,
}
#[derive(new, Clone, Debug)]
pub struct MetricsUpdate {
pub entries: Vec<MetricEntry>,
pub entries_numeric: Vec<NumericMetricUpdate>,
}
#[derive(new, Clone, Debug)]
pub struct EpochSummary {
pub epoch_number: usize,
pub split: Split,
}
pub trait EventStore: Send {
fn add_event(&mut self, event: Event, split: Split, tag: Option<Arc<String>>);
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, Debug, Hash, PartialEq, Eq)]
pub enum Split {
Train,
Valid,
Test,
}
impl std::fmt::Display for Split {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Split::Train => write!(f, "train"),
Split::Valid => write!(f, "valid"),
Split::Test => write!(f, "test"),
}
}
}
#[derive(Copy, Clone)]
pub enum Direction {
Lowest,
Highest,
}