use std::sync::{ Arc, Mutex };
use rand::{ rngs::StdRng, SeedableRng };
use crate::rotta_rs_module::{ NodeType, WeightInitialization };
pub struct Module {
pub parameters: Arc<Mutex<Vec<NodeType>>>,
pub initialization: WeightInitialization,
pub eval_handlers: Vec<Arc<Mutex<bool>>>,
pub rng: StdRng,
}
impl Module {
pub fn init() -> Module {
Module {
parameters: Arc::new(Mutex::new(Vec::new())),
initialization: WeightInitialization::He,
eval_handlers: vec![],
rng: StdRng::seed_from_u64(42),
}
}
pub fn parameters(&self) -> Arc<Mutex<Vec<Arc<Mutex<crate::rotta_rs_module::Node>>>>> {
self.parameters.clone()
}
pub fn train(&self) {
for p in &self.eval_handlers {
*p.lock().unwrap() = false;
}
}
pub fn eval(&self) {
for p in &self.eval_handlers {
*p.lock().unwrap() = true;
}
}
pub fn update_seed(&mut self, seed: u64) {
self.rng = StdRng::seed_from_u64(seed);
}
pub fn update_initialization(&mut self, initialization: WeightInitialization) {
self.initialization = initialization;
}
}