Skip to main content

radiate_engines/events/
events.rs

1use crate::context::Context;
2use radiate_core::{Chromosome, MetricSet, Objective, Score};
3use std::{fmt::Debug, sync::Arc};
4
5pub enum EngineMessage<'a, C, T>
6where
7    C: Chromosome,
8    T: Clone,
9{
10    Start,
11    Stop(&'a Context<C, T>),
12    EpochStart(&'a Context<C, T>),
13    EpochEnd(&'a Context<C, T>),
14    Improvement(&'a Context<C, T>),
15}
16
17pub enum EngineEventInner<T> {
18    Start,
19    Stop(usize, T, MetricSet, Score),
20    EpochStart(usize),
21    EpochComplete(usize, T, MetricSet, Score, Objective),
22    Improvement(usize, T, Score),
23}
24
25impl<T: Debug> Debug for EngineEventInner<T> {
26    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
27        match self {
28            EngineEventInner::Start => write!(f, "Start"),
29            EngineEventInner::Stop(index, best, metrics, score) => write!(
30                f,
31                "Stop(index={}, best={:?}, metrics={:?}, score={:?})",
32                index, best, metrics, score
33            ),
34            EngineEventInner::EpochStart(index) => write!(f, "EpochStart(index={})", index),
35            EngineEventInner::EpochComplete(index, best, metrics, score, objective) => write!(
36                f,
37                "EpochComplete(index={}, best={:?}, metrics={:?}, score={:?}, objective={:?})",
38                index, best, metrics, score, objective
39            ),
40            EngineEventInner::Improvement(index, best, score) => write!(
41                f,
42                "Improvement(index={}, best={:?}, score={:?})",
43                index, best, score
44            ),
45        }
46    }
47}
48
49pub struct EngineEvent<T> {
50    inner: Arc<EngineEventInner<T>>,
51}
52
53impl<T> EngineEvent<T> {
54    pub fn new(inner: EngineEventInner<T>) -> Self {
55        EngineEvent {
56            inner: Arc::new(inner),
57        }
58    }
59
60    pub fn inner(&self) -> &EngineEventInner<T> {
61        self.inner.as_ref()
62    }
63
64    pub fn is_start(&self) -> bool {
65        matches!(self.inner(), EngineEventInner::Start)
66    }
67
68    pub fn is_stop(&self) -> bool {
69        matches!(self.inner(), EngineEventInner::Stop(..))
70    }
71
72    pub fn is_epoch_start(&self) -> bool {
73        matches!(self.inner(), EngineEventInner::EpochStart(..))
74    }
75
76    pub fn is_epoch_complete(&self) -> bool {
77        matches!(self.inner(), EngineEventInner::EpochComplete(..))
78    }
79
80    pub fn is_improvement(&self) -> bool {
81        matches!(self.inner(), EngineEventInner::Improvement(..))
82    }
83}
84
85impl<T> Clone for EngineEvent<T> {
86    fn clone(&self) -> Self {
87        EngineEvent {
88            inner: Arc::clone(&self.inner),
89        }
90    }
91}
92
93impl<T: Debug> Debug for EngineEvent<T> {
94    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
95        write!(f, "EngineEvent::{:?}", self.inner())
96    }
97}