diff --git a/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs b/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs index 0b8c31bc2299c602b3f1444f8d37be3e1697ec10..bc8cc4dd755e5ab00183959d4befe3b4449a4966 100644 --- a/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs +++ b/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs @@ -11,6 +11,7 @@ use derivative::Derivative; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; +use btypes::bboolean::IntoBool; use btypes::binteger::BInteger; use btypes::bboolean::BBoolean; use btypes::brelation::BRelation; @@ -49,7 +50,7 @@ impl sort_m2_data1000_MC { return m; } fn init(&mut self) { - self.n = BInteger::new(1000); + self.n = BInteger::new(300); let mut _ic_set_0 = BRelation::<BInteger, BInteger>::new(vec![]); for _ic_i_1 in BSet::<BInteger>::interval(&BInteger::new(1), &self.n).clone().iter().cloned() { _ic_set_0 = _ic_set_0._union(&BRelation::<BInteger, BInteger>::new(vec![BTuple::new(_ic_i_1, BInteger::new(15000).minus(&_ic_i_1))])); @@ -87,7 +88,7 @@ impl sort_m2_data1000_MC { } pub fn progress(&mut self) -> () { - if (self.k.unequal(&self.n).and(&self.j.equal(&self.n))).booleanValue() { + if (self.k.unequal(&self.n).booleanValue() && self.j.equal(&self.n).booleanValue()).booleanValue() { let mut _ld_g = self.g.clone(); let mut _ld_k = self.k.clone(); let mut _ld_l = self.l.clone(); @@ -101,7 +102,7 @@ impl sort_m2_data1000_MC { } pub fn prog1(&mut self) -> () { - if (self.k.unequal(&self.n).and(&self.j.unequal(&self.n)).and(&self.g.functionCall(&self.l).lessEqual(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))))).booleanValue() { + if (self.k.unequal(&self.n).booleanValue() && self.j.unequal(&self.n).booleanValue().booleanValue() && self.g.functionCall(&self.l).lessEqual(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))).booleanValue()).booleanValue() { let mut _ld_j = self.j.clone(); let mut _ld_l = self.l.clone(); self.l = _ld_l; @@ -112,7 +113,7 @@ impl sort_m2_data1000_MC { } pub fn prog2(&mut self) -> () { - if (self.k.unequal(&self.n).and(&self.j.unequal(&self.n)).and(&self.g.functionCall(&self.l).greater(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))))).booleanValue() { + if (self.k.unequal(&self.n).booleanValue() && self.j.unequal(&self.n).booleanValue().booleanValue() && self.g.functionCall(&self.l).greater(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))).booleanValue()).booleanValue() { let mut _ld_j = self.j.clone(); self.j = _ld_j.plus(&BInteger::new(1)); self.l = _ld_j.plus(&BInteger::new(1)); @@ -131,7 +132,7 @@ impl sort_m2_data1000_MC { pub fn _tr_progress(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_progress.is_none() { - let mut __tmp__val__ = self.k.unequal(&self.n).and(&self.j.equal(&self.n)).booleanValue(); + let mut __tmp__val__ = self.k.unequal(&self.n).booleanValue() && self.j.equal(&self.n).booleanValue().booleanValue(); self._tr_cache_progress = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -142,7 +143,7 @@ impl sort_m2_data1000_MC { pub fn _tr_prog1(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_prog1.is_none() { - let mut __tmp__val__ = self.k.unequal(&self.n).and(&self.j.unequal(&self.n)).and(&self.g.functionCall(&self.l).lessEqual(&self.g.functionCall(&self.j.plus(&BInteger::new(1))))).booleanValue(); + let mut __tmp__val__ = self.k.unequal(&self.n).booleanValue() && self.j.unequal(&self.n).booleanValue().booleanValue() && self.g.functionCall(&self.l).lessEqual(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))).booleanValue().booleanValue(); self._tr_cache_prog1 = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -153,7 +154,7 @@ impl sort_m2_data1000_MC { pub fn _tr_prog2(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_prog2.is_none() { - let mut __tmp__val__ = self.k.unequal(&self.n).and(&self.j.unequal(&self.n)).and(&self.g.functionCall(&self.l).greater(&self.g.functionCall(&self.j.plus(&BInteger::new(1))))).booleanValue(); + let mut __tmp__val__ = self.k.unequal(&self.n).booleanValue() && self.j.unequal(&self.n).booleanValue().booleanValue() && self.g.functionCall(&self.l).greater(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))).booleanValue().booleanValue(); self._tr_cache_prog2 = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -222,14 +223,9 @@ impl sort_m2_data1000_MC { invariant_dependency: &HashMap<&str, HashSet<&'static str>>, dependent_invariant_m: Arc<Mutex<HashMap<sort_m2_data1000_MC, HashSet<&str>>>>, guard_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_guard_m: Arc<Mutex<HashMap<sort_m2_data1000_MC, HashSet<&str>>>>, - guardCache: Arc<Mutex<HashMap<sort_m2_data1000_MC, PersistentHashMap<&str, bool>>>>, - parents_m: Arc<Mutex<HashMap<sort_m2_data1000_MC, sort_m2_data1000_MC>>>, transitions: Arc<AtomicI64>) -> HashSet<sort_m2_data1000_MC> { let mut result = HashSet::<sort_m2_data1000_MC>::new(); if isCaching { - let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned()); - let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() }; //model_check_transition let mut _trid_1 = state._tr_progress(isCaching); if _trid_1 { @@ -239,18 +235,10 @@ impl sort_m2_data1000_MC { match guard_dependency.get("progress") { Some(map) => copiedState.invalidate_caches(map), _ => (),} { let mut dependent_invariant = dependent_invariant_m.lock().unwrap(); - let mut dependent_guard = dependent_guard_m.lock().unwrap(); - let mut parents = parents_m.lock().unwrap(); if !dependent_invariant.contains_key(&copiedState) { dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("progress").unwrap().clone()); } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("progress").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } } result.insert(copiedState); transitions.fetch_add(1, Ordering::AcqRel); @@ -264,18 +252,10 @@ impl sort_m2_data1000_MC { match guard_dependency.get("prog1") { Some(map) => copiedState.invalidate_caches(map), _ => (),} { let mut dependent_invariant = dependent_invariant_m.lock().unwrap(); - let mut dependent_guard = dependent_guard_m.lock().unwrap(); - let mut parents = parents_m.lock().unwrap(); if !dependent_invariant.contains_key(&copiedState) { dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("prog1").unwrap().clone()); } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("prog1").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } } result.insert(copiedState); transitions.fetch_add(1, Ordering::AcqRel); @@ -289,18 +269,10 @@ impl sort_m2_data1000_MC { match guard_dependency.get("prog2") { Some(map) => copiedState.invalidate_caches(map), _ => (),} { let mut dependent_invariant = dependent_invariant_m.lock().unwrap(); - let mut dependent_guard = dependent_guard_m.lock().unwrap(); - let mut parents = parents_m.lock().unwrap(); if !dependent_invariant.contains_key(&copiedState) { dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("prog2").unwrap().clone()); } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("prog2").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } } result.insert(copiedState); transitions.fetch_add(1, Ordering::AcqRel); @@ -314,24 +286,14 @@ impl sort_m2_data1000_MC { match guard_dependency.get("final_evt") { Some(map) => copiedState.invalidate_caches(map), _ => (),} { let mut dependent_invariant = dependent_invariant_m.lock().unwrap(); - let mut dependent_guard = dependent_guard_m.lock().unwrap(); - let mut parents = parents_m.lock().unwrap(); if !dependent_invariant.contains_key(&copiedState) { dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("final_evt").unwrap().clone()); } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("final_evt").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } } result.insert(copiedState); transitions.fetch_add(1, Ordering::AcqRel); } - - guardCache.lock().unwrap().insert(state.clone(), newCache); } else { //model_check_transition if state._tr_progress(isCaching) { @@ -379,7 +341,8 @@ impl sort_m2_data1000_MC { //model_check_invariants pub fn checkInvariants(state: &sort_m2_data1000_MC, isCaching: bool, - dependent_invariant_m: Arc<Mutex<HashMap<sort_m2_data1000_MC, HashSet<&str>>>> ) -> bool { + dependent_invariant_m: Arc<Mutex<HashMap<sort_m2_data1000_MC, HashSet<&str>>>> ) -> bool + { let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned(); if cached_invariants.is_some() && isCaching { let dependent_invariants_of_state = cached_invariants.unwrap().clone(); @@ -464,9 +427,6 @@ impl sort_m2_data1000_MC { let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new(); let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new(); let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<sort_m2_data1000_MC, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<sort_m2_data1000_MC, HashSet<&str>>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::<sort_m2_data1000_MC, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<sort_m2_data1000_MC, sort_m2_data1000_MC>::new())); if is_caching { //model_check_init_static @@ -486,7 +446,6 @@ impl sort_m2_data1000_MC { //model_check_init_static guardDependency.insert("final_evt", HashSet::from([])); dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); } let transitions = Arc::new(AtomicI64::new(0)); @@ -494,7 +453,7 @@ impl sort_m2_data1000_MC { while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { let mut state = Self::next(Arc::clone(&collection_m), mc_type); - let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions)); + let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&transitions)); next_states.iter().cloned().for_each(|next_state| { if !states.contains(&next_state) { @@ -548,9 +507,6 @@ impl sort_m2_data1000_MC { let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new(); let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new(); let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<sort_m2_data1000_MC, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<sort_m2_data1000_MC, HashSet<&str>>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<sort_m2_data1000_MC, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<sort_m2_data1000_MC, sort_m2_data1000_MC>::new())); if is_caching { //model_check_init_static @@ -570,7 +526,6 @@ impl sort_m2_data1000_MC { //model_check_init_static guardDependency.insert("final_evt", HashSet::from([])); dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); } let num_transitions = Arc::new(AtomicI64::new(0)); @@ -591,16 +546,13 @@ impl sort_m2_data1000_MC { let invariant_dependency = Arc::clone(&invariant_dependency_arc); let guard_dependency = Arc::clone(&guard_dependency_arc); let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m); - let dependent_guard_m2 = Arc::clone(&dependent_guard_m); - let parents_m2 = Arc::clone(&parents_m); - let guard_cache = Arc::clone(&guard_cache_b); let transitions = Arc::clone(&num_transitions); let states_m2 = Arc::clone(&states_m); let number_states = Arc::clone(&number_states_arc); let tx = tx.clone(); //println!("Thread {:?} spawning a thread", thread::current().id()); threadPool.execute(move|| { - let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions)); + let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, Arc::clone(&transitions)); //println!("Thread {:?} executing", thread::current().id()); next_states.iter().cloned().for_each(|next_state| { diff --git a/btypes_primitives/src/main/rust/btypes/src/OrderedHashSet.rs b/btypes_primitives/src/main/rust/btypes/src/OrderedHashSet.rs new file mode 100644 index 0000000000000000000000000000000000000000..71b8ed5a4f6a32750e6668e6042159bceb405714 --- /dev/null +++ b/btypes_primitives/src/main/rust/btypes/src/OrderedHashSet.rs @@ -0,0 +1,56 @@ +use std::collections::hash_map::DefaultHasher; +use std::cell::RefCell; +use std::hash::{Hash, Hasher}; + +use im::OrdSet; +use crate::bobject::BObject; + +#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +pub struct OrderedHashSet<I: BObject> { + set: OrdSet<I>, + hash_cache: RefCell<Option<u64>>, +} + +impl<I: BObject> Hash for OrderedHashSet<I> { + fn hash<H: Hasher>(self: &OrderedHashSet<I>, state: &mut H) { + let cache = self.hash_cache.clone().take(); + let hash: u64; + + if cache.is_none() { + let mut hasher = DefaultHasher::new(); + self.set.hash(&mut hasher); + hash = hasher.finish(); + self.hash_cache.replace(Option::Some(hash)); + } else { + hash = cache.unwrap(); + } + hash.hash(state); + } +} + +impl<I: BObject> OrderedHashSet<I> { + pub fn new() -> Self { Self::from_set(OrdSet::new()) } + + pub fn from_set(val: OrdSet<I>) -> Self { OrderedHashSet {set: val, hash_cache: RefCell::new(Option::None)} } + + pub fn unit(item: I) -> Self { Self::from_set(OrdSet::unit(item)) } + + pub fn from(items: Vec<I>) -> Self { Self::from_set(OrdSet::from(items)) } + + pub fn update(&self, item: I) -> Self { Self::from_set(self.set.update(item)) } + + pub fn unions<A: IntoIterator<Item = Self>>(a: A) -> Self { + Self::from_set(OrdSet::unions(a)) + } + + pub fn iter(&self) -> Iter<I> { self.set.iter() } + + pub fn len(&self) -> usize { self.set.len() } + pub fn is_empty(&self) -> bool { self.set.is_empty() } + + pub fn contains(&self, value: &I) -> bool { self.set.contains(value) } + + pub fn union(&self, other: Self) -> Self { Self::from_set(self.set.union(other.set)) } + pub fn intersection(&self, other: Self) -> Self { Self::from_set(self.set.intersection(other.set)) } + pub fn relative_complement(&self, other: Self) -> Self { Self::from_set(self.set.relative_complement(other.set)) } +} \ No newline at end of file diff --git a/btypes_primitives/src/main/rust/btypes/src/brelation.rs b/btypes_primitives/src/main/rust/btypes/src/brelation.rs index fc4b023d9d80d3a8d938e0bd3b04af814dd26250..dd249fc99babac052e19103fe84b7057bb9a2c15 100644 --- a/btypes_primitives/src/main/rust/btypes/src/brelation.rs +++ b/btypes_primitives/src/main/rust/btypes/src/brelation.rs @@ -12,7 +12,8 @@ use std::hash::{Hash, Hasher}; use std::convert::TryInto; use std::iter::FromIterator; use rand::prelude::IteratorRandom; -use im::{HashMap, OrdSet}; +use crate::orderedhashset::OrderedHashSet as OrdSet; //TODO try OrdMap instead +use im::OrdMap as HashMap; use crate::bboolean::BBoolean; use crate::brelation::CombiningType::{DIFFERENCE, INTERSECTION, UNION}; use crate::bset::{BSet, SetLike, TBSet}; @@ -50,12 +51,15 @@ impl<L: BObject, R: BObject> Hash for BRelation<L, R> { if cache.is_none() { let mut hasher = DefaultHasher::new(); + self.map.hash(&mut hasher); + /* let mut kvs = self.map.iter().collect::<Vec<(&L, &OrdSet<R>)>>(); kvs.sort_by(|(k1, _v1), (k2, _v2)| k1.cmp(k2)); for (key, value) in kvs { key.hash(&mut hasher); value.iter().for_each(|v| v.hash(&mut hasher)); } + */ hash = hasher.finish(); self.hash_cache.replace(Option::Some(hash)); } else { diff --git a/btypes_primitives/src/main/rust/btypes/src/lib.rs b/btypes_primitives/src/main/rust/btypes/src/lib.rs index 40a68be5c62027875e64e9be023af06ec00ce759..2f9ff7c4685867feaef86d121a73cb13770f7307 100644 --- a/btypes_primitives/src/main/rust/btypes/src/lib.rs +++ b/btypes_primitives/src/main/rust/btypes/src/lib.rs @@ -10,3 +10,4 @@ pub mod bstring; pub mod btuple; pub mod brelation; pub mod butils; +pub mod orderedhashset; diff --git a/src/main/resources/de/hhu/stups/codegenerator/RustTemplate.stg b/src/main/resources/de/hhu/stups/codegenerator/RustTemplate.stg index 9f6a0f91b85bd2a05e676382469e95a8cb913ce2..b6516a12bd242af35f2953ef176054044208475f 100644 --- a/src/main/resources/de/hhu/stups/codegenerator/RustTemplate.stg +++ b/src/main/resources/de/hhu/stups/codegenerator/RustTemplate.stg @@ -771,16 +771,10 @@ fn generateNextStates(state: &mut <machine>, invariant_dependency: &HashMap\<&str, HashSet\<&'static str>\>, dependent_invariant_m: Arc\<Mutex\<HashMap\<<machine>, HashSet\<&str>\>\>>, guard_dependency: &HashMap\<&str, HashSet\<&'static str\>>, - dependent_guard_m: Arc\<Mutex\<HashMap\<<machine>, HashSet\<&str>\>\>>, - guardCache: Arc\<Mutex\<HashMap\<<machine>, PersistentHashMap\<&str, bool>\>\>>, - parents_m: Arc\<Mutex\<HashMap\<<machine>, <machine>\>\>>, transitions: Arc\<AtomicI64>) -> HashSet\<<machine>\> { let mut result = HashSet::\<<machine>\>::new(); if isCaching { - let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned()); - let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() }; <transitionsWithCaching> - guardCache.lock().unwrap().insert(state.clone(), newCache); } else { <transitionsWithoutCaching> } @@ -804,12 +798,12 @@ for param in <transitionIdentifier>.iter().cloned() { <endif> <else> <if(isCaching)> -let mut <transitionIdentifier> = state.<evalTransitions>(isCaching); +let mut <transitionIdentifier> = state.<evalTransitions>(true); if <transitionIdentifier> { <execTransitions> } <else> -if state.<evalTransitions>(isCaching) { +if state.<evalTransitions>(false) { <execTransitions> } <endif> @@ -851,18 +845,10 @@ match guard_dependency.get("<operation>") { Some(map) => copiedState.invalidate_ <if(isCaching)> { let mut dependent_invariant = dependent_invariant_m.lock().unwrap(); - let mut dependent_guard = dependent_guard_m.lock().unwrap(); - let mut parents = parents_m.lock().unwrap(); if !dependent_invariant.contains_key(&copiedState) { dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("<operation>").unwrap().clone()); } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("<operation>").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } } <endif> result.insert(copiedState); @@ -939,15 +925,11 @@ fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { let mut invariantDependency = HashMap::\<&str, HashSet\<&'static str>\>::new(); let mut guardDependency = HashMap::\<&str, HashSet\<&'static str>\>::new(); let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::\<<machine>, HashSet\<&str>\>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::\<<machine>, HashSet\<&str>\>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::\<<machine>, PersistentHashMap\<&'static str, bool\>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::\<<machine>, <machine>\>::new())); if is_caching { <invariantDependency; separator="\n"> <guardDependency; separator="\n"> dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); } let transitions = Arc::new(AtomicI64::new(0)); @@ -955,7 +937,7 @@ fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { let mut state = Self::next(Arc::clone(&collection_m), mc_type); - let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions)); + let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&transitions)); next_states.iter().cloned().for_each(|next_state| { if !states.contains(&next_state) { @@ -1009,15 +991,11 @@ fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { let mut invariantDependency = HashMap::\<&str, HashSet\<&'static str>\>::new(); let mut guardDependency = HashMap::\<&str, HashSet\<&'static str>\>::new(); let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::\<<machine>, HashSet\<&str>\>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::\<<machine>, HashSet\<&str>\>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::\<<machine>, PersistentHashMap\<&'static str, bool\>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::\<<machine>, <machine>\>::new())); if is_caching { <invariantDependency; separator="\n"> <guardDependency; separator="\n"> dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); } let num_transitions = Arc::new(AtomicI64::new(0)); @@ -1038,16 +1016,13 @@ fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { let invariant_dependency = Arc::clone(&invariant_dependency_arc); let guard_dependency = Arc::clone(&guard_dependency_arc); let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m); - let dependent_guard_m2 = Arc::clone(&dependent_guard_m); - let parents_m2 = Arc::clone(&parents_m); - let guard_cache = Arc::clone(&guard_cache_b); let transitions = Arc::clone(&num_transitions); let states_m2 = Arc::clone(&states_m); let number_states = Arc::clone(&number_states_arc); let tx = tx.clone(); //println!("Thread {:?} spawning a thread", thread::current().id()); threadPool.execute(move|| { - let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions)); + let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, Arc::clone(&transitions)); //println!("Thread {:?} executing", thread::current().id()); next_states.iter().cloned().for_each(|next_state| {