use std::{collections::HashSet, vec};
use super::{brain_prelude::StateElement, prelude::Brain};
pub struct BrainStats<'a> {
brain: &'a Brain,
}
impl<'a> BrainStats<'a> {
pub(crate) fn new(brain: &'a Brain) -> Self {
Self { brain }
}
pub fn get_total_states(&self) -> usize {
self.brain.state_transitions.len()
}
pub fn get_total_transitions(&self) -> usize {
self.brain
.state_transitions
.iter()
.map(|(_, transition)| transition.prev.len() + transition.next.len())
.sum()
}
pub fn avg_transition_per_state(&self) -> f32 {
return self.get_total_transitions() as f32 / self.get_total_states() as f32;
}
pub fn get_total_words(&self) -> usize {
let mut words: Vec<&str> = vec![];
self.brain.state_transitions.iter().for_each(|(state, _)| {
state
.0
.iter()
.filter_map(|elem| {
if let StateElement::Word(e) = elem {
Some(e.as_str())
} else {
None
}
})
.for_each(|ref word| {
words.push(word);
});
});
let set: HashSet<_> = words.drain(..).collect();
set.len()
}
}