radiate_engines/events/
events.rs1use 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}