From dee8a3a5ffc5855948d0c6df71190cfca748dd75 Mon Sep 17 00:00:00 2001 From: elvis Date: Wed, 24 Sep 2025 19:08:01 +0200 Subject: [PATCH] lazy evaluation, back to 40ms --- rsprocess/src/system.rs | 107 +++++++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 40 deletions(-) diff --git a/rsprocess/src/system.rs b/rsprocess/src/system.rs index 9aa05c8..c7b2c88 100644 --- a/rsprocess/src/system.rs +++ b/rsprocess/src/system.rs @@ -1,3 +1,4 @@ +use std::cell::RefCell; use std::collections::{HashMap, VecDeque}; use std::fmt::Debug; use std::hash::Hash; @@ -53,8 +54,8 @@ where fn context(&self) -> &Self::Process; fn reactions(&self) -> &Vec; - fn context_elements(&self) -> &Self::Set; - fn products_elements(&self) -> &Self::Set; + fn context_elements(&self) -> Self::Set; + fn products_elements(&self) -> Self::Set; } pub trait ExtensionsSystem: BasicSystem { @@ -414,8 +415,8 @@ pub struct System { pub context_process: Process, pub reaction_rules: Rc>, - context_elements: Rc, - products_elements: Rc, + context_elements: Rc>>, + products_elements: Rc>>, } impl BasicSystem for System { @@ -448,12 +449,34 @@ impl BasicSystem for System { &self.reaction_rules } - fn context_elements(&self) -> &Self::Set { - &self.context_elements + fn context_elements(&self) -> Self::Set { + let mut c = self.context_elements.borrow_mut(); + if c.is_some() { + c.as_ref().unwrap().clone() + } else { + let all_elements_context = self.delta + .all_elements() + .union(&self.context_process.all_elements()) + .subtraction(&self.products_elements()); + + *c = Some(all_elements_context.clone()); + all_elements_context + } } - fn products_elements(&self) -> &Self::Set { - &self.products_elements + fn products_elements(&self) -> Self::Set { + let mut p = self.products_elements.borrow_mut(); + if p.is_some() { + p.as_ref().unwrap().clone() + } else { + let products_elements = self.reaction_rules + .iter() + .fold(Self::Set::default(), |acc: Self::Set, r| + acc.union(&r.products)); + + *p = Some(products_elements.clone()); + products_elements + } } } @@ -489,8 +512,8 @@ impl Default for System { context_process: Process::Nill, reaction_rules: Rc::new(Vec::default()), - context_elements: Rc::new(Set::default()), - products_elements: Rc::new(Set::default()), + context_elements: Rc::new(RefCell::new(None)), + products_elements: Rc::new(RefCell::new(None)), } } } @@ -528,22 +551,14 @@ impl System { context_process: Process, reaction_rules: Rc>, ) -> System { - let products_elements = reaction_rules - .iter() - .fold(Set::default(), |acc: Set, r| acc.union(&r.products)); - let all_elements_context = delta - .all_elements() - .union(&context_process.all_elements()) - .subtraction(&products_elements); - System { delta: Rc::clone(&delta), available_entities, context_process, reaction_rules: Rc::clone(&reaction_rules), - context_elements: Rc::new(all_elements_context), - products_elements: Rc::new(products_elements), + context_elements: Rc::new(RefCell::new(None)), + products_elements: Rc::new(RefCell::new(None)), } } } @@ -696,8 +711,8 @@ pub struct PositiveSystem { pub context_process: PositiveProcess, pub reaction_rules: Rc>, - context_elements: Rc, - products_elements: Rc, + context_elements: Rc>>, + products_elements: Rc>>, } impl BasicSystem for PositiveSystem { @@ -730,12 +745,34 @@ impl BasicSystem for PositiveSystem { &self.reaction_rules } - fn context_elements(&self) -> &Self::Set { - &self.context_elements + fn context_elements(&self) -> Self::Set { + let mut c = self.context_elements.borrow_mut(); + if c.is_some() { + c.as_ref().unwrap().clone() + } else { + let all_elements_context = self.delta + .all_elements() + .union(&self.context_process.all_elements()) + .subtraction(&self.products_elements()); + + *c = Some(all_elements_context.clone()); + all_elements_context + } } - fn products_elements(&self) -> &Self::Set { - &self.products_elements + fn products_elements(&self) -> Self::Set { + let mut p = self.products_elements.borrow_mut(); + if p.is_some() { + p.as_ref().unwrap().clone() + } else { + let products_elements = self.reaction_rules + .iter() + .fold(Self::Set::default(), |acc: Self::Set, r| + acc.union(&r.products)); + + *p = Some(products_elements.clone()); + products_elements + } } } @@ -771,8 +808,8 @@ impl Default for PositiveSystem { context_process: PositiveProcess::default(), reaction_rules: Rc::new(Vec::default()), - context_elements: Rc::new(PositiveSet::default()), - products_elements: Rc::new(PositiveSet::default()), + context_elements: Rc::new(RefCell::new(None)), + products_elements: Rc::new(RefCell::new(None)), } } } @@ -891,24 +928,14 @@ impl PositiveSystem { context_process: PositiveProcess, reaction_rules: Rc>, ) -> Self { - let products_elements = reaction_rules - .iter() - .fold(PositiveSet::default(), |acc: PositiveSet, r| { - acc.union(&r.products) - }); - let all_elements_context = delta - .all_elements() - .union(&context_process.all_elements()) - .subtraction(&products_elements); - Self { delta: Rc::clone(&delta), available_entities, context_process, reaction_rules: Rc::clone(&reaction_rules), - context_elements: Rc::new(all_elements_context), - products_elements: Rc::new(products_elements), + context_elements: Rc::new(RefCell::new(None)), + products_elements: Rc::new(RefCell::new(None)), } } }