diff --git a/benchmarks/model_checking/Rust/CAN_BUS_tlc.rs b/benchmarks/model_checking/Rust/CAN_BUS_tlc.rs index bde161e534454493e2a6eb2ddf850dc58b25919c..564a59a407c5fd65054d7ca75591e56daacab8ee 100644 --- a/benchmarks/model_checking/Rust/CAN_BUS_tlc.rs +++ b/benchmarks/model_checking/Rust/CAN_BUS_tlc.rs @@ -1,16 +1,17 @@ -#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ] +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] use std::env; -use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::thread; -use std::collections::{HashMap, HashSet, LinkedList}; -use im::HashMap as PersistentHashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, mpsc, Mutex}; +use std::collections::{HashSet, LinkedList}; +use dashmap::DashSet; use threadpool::ThreadPool; use std::sync::mpsc::channel; use derivative::Derivative; +use std::time::{Duration}; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; +use btypes::bboolean::{IntoBool, BBooleanT}; use btypes::bboolean::BBoolean; use btypes::binteger::BInteger; use btypes::brelation::BRelation; @@ -24,9 +25,9 @@ pub enum MC_TYPE { BFS, DFS, MIXED } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum T1state { - T1_EN, - T1_CALC, - T1_SEND, + T1_EN, + T1_CALC, + T1_SEND, T1_WAIT } impl T1state { @@ -39,19 +40,19 @@ impl Default for T1state { } impl fmt::Display for T1state { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - T1state::T1_EN => write!(f, "T1_EN"), - T1state::T1_CALC => write!(f, "T1_CALC"), - T1state::T1_SEND => write!(f, "T1_SEND"), - T1state::T1_WAIT => write!(f, "T1_WAIT"), - } + match *self { + T1state::T1_EN => write!(f, "T1_EN"), + T1state::T1_CALC => write!(f, "T1_CALC"), + T1state::T1_SEND => write!(f, "T1_SEND"), + T1state::T1_WAIT => write!(f, "T1_WAIT"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum T2mode { - T2MODE_SENSE, - T2MODE_TRANSMIT, + T2MODE_SENSE, + T2MODE_TRANSMIT, T2MODE_RELEASE } impl T2mode { @@ -64,22 +65,22 @@ impl Default for T2mode { } impl fmt::Display for T2mode { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - T2mode::T2MODE_SENSE => write!(f, "T2MODE_SENSE"), - T2mode::T2MODE_TRANSMIT => write!(f, "T2MODE_TRANSMIT"), - T2mode::T2MODE_RELEASE => write!(f, "T2MODE_RELEASE"), - } + match *self { + T2mode::T2MODE_SENSE => write!(f, "T2MODE_SENSE"), + T2mode::T2MODE_TRANSMIT => write!(f, "T2MODE_TRANSMIT"), + T2mode::T2MODE_RELEASE => write!(f, "T2MODE_RELEASE"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum T2state { - T2_EN, - T2_RCV, - T2_PROC, - T2_CALC, - T2_SEND, - T2_WAIT, + T2_EN, + T2_RCV, + T2_PROC, + T2_CALC, + T2_SEND, + T2_WAIT, T2_RELEASE } impl T2state { @@ -92,25 +93,25 @@ impl Default for T2state { } impl fmt::Display for T2state { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - T2state::T2_EN => write!(f, "T2_EN"), - T2state::T2_RCV => write!(f, "T2_RCV"), - T2state::T2_PROC => write!(f, "T2_PROC"), - T2state::T2_CALC => write!(f, "T2_CALC"), - T2state::T2_SEND => write!(f, "T2_SEND"), - T2state::T2_WAIT => write!(f, "T2_WAIT"), - T2state::T2_RELEASE => write!(f, "T2_RELEASE"), - } + match *self { + T2state::T2_EN => write!(f, "T2_EN"), + T2state::T2_RCV => write!(f, "T2_RCV"), + T2state::T2_PROC => write!(f, "T2_PROC"), + T2state::T2_CALC => write!(f, "T2_CALC"), + T2state::T2_SEND => write!(f, "T2_SEND"), + T2state::T2_WAIT => write!(f, "T2_WAIT"), + T2state::T2_RELEASE => write!(f, "T2_RELEASE"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum T3state { - T3_READY, - T3_WRITE, - T3_RELEASE, - T3_READ, - T3_PROC, + T3_READY, + T3_WRITE, + T3_RELEASE, + T3_READ, + T3_PROC, T3_WAIT } impl T3state { @@ -123,14 +124,14 @@ impl Default for T3state { } impl fmt::Display for T3state { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - T3state::T3_READY => write!(f, "T3_READY"), - T3state::T3_WRITE => write!(f, "T3_WRITE"), - T3state::T3_RELEASE => write!(f, "T3_RELEASE"), - T3state::T3_READ => write!(f, "T3_READ"), - T3state::T3_PROC => write!(f, "T3_PROC"), - T3state::T3_WAIT => write!(f, "T3_WAIT"), - } + match *self { + T3state::T3_READY => write!(f, "T3_READY"), + T3state::T3_WRITE => write!(f, "T3_WRITE"), + T3state::T3_RELEASE => write!(f, "T3_RELEASE"), + T3state::T3_READ => write!(f, "T3_READ"), + T3state::T3_PROC => write!(f, "T3_PROC"), + T3state::T3_WAIT => write!(f, "T3_WAIT"), + } } } @@ -203,6 +204,32 @@ pub struct CAN_BUS_tlc { #[derivative(Hash="ignore", PartialEq="ignore")] _tr_cache_Update: Option<BSet<BInteger>>,} +impl fmt::Display for CAN_BUS_tlc { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut result = "CAN_BUS_tlc: (".to_owned(); + result += &format!("_get_BUSpriority: {}, ", self._get_BUSpriority()); + result += &format!("_get_BUSvalue: {}, ", self._get_BUSvalue()); + result += &format!("_get_BUSwrite: {}, ", self._get_BUSwrite()); + result += &format!("_get_T1_state: {}, ", self._get_T1_state()); + result += &format!("_get_T1_timer: {}, ", self._get_T1_timer()); + result += &format!("_get_T1_writevalue: {}, ", self._get_T1_writevalue()); + result += &format!("_get_T2_mode: {}, ", self._get_T2_mode()); + result += &format!("_get_T2_readpriority: {}, ", self._get_T2_readpriority()); + result += &format!("_get_T2_readvalue: {}, ", self._get_T2_readvalue()); + result += &format!("_get_T2_state: {}, ", self._get_T2_state()); + result += &format!("_get_T2_timer: {}, ", self._get_T2_timer()); + result += &format!("_get_T2_writevalue: {}, ", self._get_T2_writevalue()); + result += &format!("_get_T2v: {}, ", self._get_T2v()); + result += &format!("_get_T3_enabled: {}, ", self._get_T3_enabled()); + result += &format!("_get_T3_evaluated: {}, ", self._get_T3_evaluated()); + result += &format!("_get_T3_readpriority: {}, ", self._get_T3_readpriority()); + result += &format!("_get_T3_readvalue: {}, ", self._get_T3_readvalue()); + result += &format!("_get_T3_state: {}, ", self._get_T3_state()); + result = result + ")"; + return write!(f, "{}", result); + } +} + impl CAN_BUS_tlc { pub fn new() -> CAN_BUS_tlc { @@ -212,11 +239,11 @@ impl CAN_BUS_tlc { return m; } fn init(&mut self) { - self.NATSET = BSet::<BInteger>::interval(&BInteger::new(0), &BInteger::new(5)); self._T1state = BSet::new(vec![T1state::T1_EN, T1state::T1_CALC, T1state::T1_SEND, T1state::T1_WAIT]); self._T2mode = BSet::new(vec![T2mode::T2MODE_SENSE, T2mode::T2MODE_TRANSMIT, T2mode::T2MODE_RELEASE]); self._T2state = BSet::new(vec![T2state::T2_EN, T2state::T2_RCV, T2state::T2_PROC, T2state::T2_CALC, T2state::T2_SEND, T2state::T2_WAIT, T2state::T2_RELEASE]); self._T3state = BSet::new(vec![T3state::T3_READY, T3state::T3_WRITE, T3state::T3_RELEASE, T3state::T3_READ, T3state::T3_PROC, T3state::T3_WAIT]); + self.NATSET = BSet::<BInteger>::interval(&BInteger::new(0), &BInteger::new(5)); self.T2v = BInteger::new(0); self.T3_evaluated = BBoolean::new(true); self.T3_enabled = BBoolean::new(true); @@ -237,95 +264,95 @@ impl CAN_BUS_tlc { self.T2_mode = T2mode::T2MODE_SENSE; } - pub fn get_NATSET(&self) -> BSet<BInteger> { + pub fn _get_NATSET(&self) -> BSet<BInteger> { return self.NATSET.clone(); } - pub fn get_BUSpriority(&self) -> BInteger { + pub fn _get_BUSpriority(&self) -> BInteger { return self.BUSpriority.clone(); } - pub fn get_BUSvalue(&self) -> BInteger { + pub fn _get_BUSvalue(&self) -> BInteger { return self.BUSvalue.clone(); } - pub fn get_BUSwrite(&self) -> BRelation<BInteger, BInteger> { + pub fn _get_BUSwrite(&self) -> BRelation<BInteger, BInteger> { return self.BUSwrite.clone(); } - pub fn get_T1_state(&self) -> T1state { + pub fn _get_T1_state(&self) -> T1state { return self.T1_state.clone(); } - pub fn get_T1_timer(&self) -> BInteger { + pub fn _get_T1_timer(&self) -> BInteger { return self.T1_timer.clone(); } - pub fn get_T1_writevalue(&self) -> BInteger { + pub fn _get_T1_writevalue(&self) -> BInteger { return self.T1_writevalue.clone(); } - pub fn get_T2_mode(&self) -> T2mode { + pub fn _get_T2_mode(&self) -> T2mode { return self.T2_mode.clone(); } - pub fn get_T2_readpriority(&self) -> BInteger { + pub fn _get_T2_readpriority(&self) -> BInteger { return self.T2_readpriority.clone(); } - pub fn get_T2_readvalue(&self) -> BInteger { + pub fn _get_T2_readvalue(&self) -> BInteger { return self.T2_readvalue.clone(); } - pub fn get_T2_state(&self) -> T2state { + pub fn _get_T2_state(&self) -> T2state { return self.T2_state.clone(); } - pub fn get_T2_timer(&self) -> BInteger { + pub fn _get_T2_timer(&self) -> BInteger { return self.T2_timer.clone(); } - pub fn get_T2_writevalue(&self) -> BInteger { + pub fn _get_T2_writevalue(&self) -> BInteger { return self.T2_writevalue.clone(); } - pub fn get_T2v(&self) -> BInteger { + pub fn _get_T2v(&self) -> BInteger { return self.T2v.clone(); } - pub fn get_T3_enabled(&self) -> BBoolean { + pub fn _get_T3_enabled(&self) -> BBoolean { return self.T3_enabled.clone(); } - pub fn get_T3_evaluated(&self) -> BBoolean { + pub fn _get_T3_evaluated(&self) -> BBoolean { return self.T3_evaluated.clone(); } - pub fn get_T3_readpriority(&self) -> BInteger { + pub fn _get_T3_readpriority(&self) -> BInteger { return self.T3_readpriority.clone(); } - pub fn get_T3_readvalue(&self) -> BInteger { + pub fn _get_T3_readvalue(&self) -> BInteger { return self.T3_readvalue.clone(); } - pub fn get_T3_state(&self) -> T3state { + pub fn _get_T3_state(&self) -> T3state { return self.T3_state.clone(); } - pub fn get__T1state(&self) -> BSet<T1state> { + pub fn _get__T1state(&self) -> BSet<T1state> { return self._T1state.clone(); } - pub fn get__T2mode(&self) -> BSet<T2mode> { + pub fn _get__T2mode(&self) -> BSet<T2mode> { return self._T2mode.clone(); } - pub fn get__T2state(&self) -> BSet<T2state> { + pub fn _get__T2state(&self) -> BSet<T2state> { return self._T2state.clone(); } - pub fn get__T3state(&self) -> BSet<T3state> { + pub fn _get__T3state(&self) -> BSet<T3state> { return self._T3state.clone(); } @@ -493,7 +520,7 @@ impl CAN_BUS_tlc { pub fn _tr_T1Evaluate(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_T1Evaluate.is_none() { - let mut __tmp__val__ = self.T1_timer.equal(&BInteger::new(0)).and(&self.T1_state.equal(&T1state::T1_EN)).booleanValue(); + let mut __tmp__val__ = (self.T1_timer.equal(&BInteger::new(0)) && self.T1_state.equal(&T1state::T1_EN)).booleanValue(); self._tr_cache_T1Evaluate = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -505,6 +532,7 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_T1Calculate.is_none() { let mut _ic_set_1: BSet<BInteger> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_p_1 in BSet::<BInteger>::interval(&BInteger::new(1).negative(), &BInteger::new(3)).clone().iter().cloned() { if (self.T1_state.equal(&T1state::T1_CALC)).booleanValue() { _ic_set_1 = _ic_set_1._union(&BSet::new(vec![_ic_p_1])); @@ -522,6 +550,7 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_T1SendResult.is_none() { let mut _ic_set_2: BSet<BTuple<BInteger, BInteger>> = BSet::new(vec![]); + //transition, parameters, no condidtion { let mut _ic_ppriority_1 = BInteger::new(3); { @@ -543,6 +572,7 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_T1Wait.is_none() { let mut _ic_set_3: BSet<BInteger> = BSet::new(vec![]); + //transition, parameters, no condidtion { let mut _ic_pt_1 = BInteger::new(2); if (self.T1_state.equal(&T1state::T1_WAIT)).booleanValue() { @@ -560,7 +590,7 @@ impl CAN_BUS_tlc { pub fn _tr_T2Evaluate(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_T2Evaluate.is_none() { - let mut __tmp__val__ = self.T2_timer.equal(&BInteger::new(0)).and(&self.T2_state.equal(&T2state::T2_EN)).booleanValue(); + let mut __tmp__val__ = (self.T2_timer.equal(&BInteger::new(0)) && self.T2_state.equal(&T2state::T2_EN)).booleanValue(); self._tr_cache_T2Evaluate = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -572,6 +602,7 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_T2ReadBus.is_none() { let mut _ic_set_5: BSet<BTuple<BInteger, BInteger>> = BSet::new(vec![]); + //transition, parameters, no condidtion { let mut _ic_ppriority_1 = self.BUSpriority; { @@ -592,7 +623,7 @@ impl CAN_BUS_tlc { pub fn _tr_T2Reset(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_T2Reset.is_none() { - let mut __tmp__val__ = self.T2_readpriority.equal(&BInteger::new(4)).and(&self.T2_state.equal(&T2state::T2_PROC)).booleanValue(); + let mut __tmp__val__ = (self.T2_readpriority.equal(&BInteger::new(4)) && self.T2_state.equal(&T2state::T2_PROC)).booleanValue(); self._tr_cache_T2Reset = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -603,7 +634,7 @@ impl CAN_BUS_tlc { pub fn _tr_T2Complete(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_T2Complete.is_none() { - let mut __tmp__val__ = self.T2_state.equal(&T2state::T2_PROC).and(&self.T2_readpriority.equal(&BInteger::new(5))).and(&self.T2_mode.equal(&T2mode::T2MODE_TRANSMIT)).booleanValue(); + let mut __tmp__val__ = ((self.T2_state.equal(&T2state::T2_PROC) && self.T2_readpriority.equal(&BInteger::new(5))) && self.T2_mode.equal(&T2mode::T2MODE_TRANSMIT)).booleanValue(); self._tr_cache_T2Complete = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -615,9 +646,10 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_T2ReleaseBus.is_none() { let mut _ic_set_8: BSet<BInteger> = BSet::new(vec![]); + //transition, parameters, no condidtion { let mut _ic_ppriority_1 = self.T2_readpriority; - if (self.BUSwrite.domain().elementOf(&_ic_ppriority_1).and(&self.T2_state.equal(&T2state::T2_RELEASE))).booleanValue() { + if ((self.BUSwrite.domain().elementOf(&_ic_ppriority_1) && self.T2_state.equal(&T2state::T2_RELEASE))).booleanValue() { _ic_set_8 = _ic_set_8._union(&BSet::new(vec![_ic_ppriority_1])); } @@ -632,7 +664,7 @@ impl CAN_BUS_tlc { pub fn _tr_T2Calculate(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_T2Calculate.is_none() { - let mut __tmp__val__ = self.T2_readpriority.equal(&BInteger::new(3)).and(&self.T2_state.equal(&T2state::T2_PROC)).booleanValue(); + let mut __tmp__val__ = (self.T2_readpriority.equal(&BInteger::new(3)) && self.T2_state.equal(&T2state::T2_PROC)).booleanValue(); self._tr_cache_T2Calculate = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -644,6 +676,7 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_T2WriteBus.is_none() { let mut _ic_set_10: BSet<BTuple<BInteger, BInteger>> = BSet::new(vec![]); + //transition, parameters, no condidtion { let mut _ic_ppriority_1 = BInteger::new(5); { @@ -665,6 +698,7 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_T2Wait.is_none() { let mut _ic_set_11: BSet<BInteger> = BSet::new(vec![]); + //transition, parameters, no condidtion { let mut _ic_pt_1 = BInteger::new(3); if (self.T2_state.equal(&T2state::T2_WAIT)).booleanValue() { @@ -682,7 +716,7 @@ impl CAN_BUS_tlc { pub fn _tr_T3Initiate(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_T3Initiate.is_none() { - let mut __tmp__val__ = self.T3_state.equal(&T3state::T3_READY).and(&self.T3_evaluated.equal(&BBoolean::new(false))).and(&self.T3_enabled.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = ((self.T3_state.equal(&T3state::T3_READY) && self.T3_evaluated.equal(&BBoolean::new(false))) && self.T3_enabled.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_T3Initiate = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -693,7 +727,7 @@ impl CAN_BUS_tlc { pub fn _tr_T3Evaluate(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_T3Evaluate.is_none() { - let mut __tmp__val__ = self.T3_state.equal(&T3state::T3_READY).and(&self.T3_evaluated.equal(&BBoolean::new(false))).and(&self.T3_enabled.equal(&BBoolean::new(false))).booleanValue(); + let mut __tmp__val__ = ((self.T3_state.equal(&T3state::T3_READY) && self.T3_evaluated.equal(&BBoolean::new(false))) && self.T3_enabled.equal(&BBoolean::new(false))).booleanValue(); self._tr_cache_T3Evaluate = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -705,6 +739,7 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_T3writebus.is_none() { let mut _ic_set_14: BSet<BTuple<BInteger, BInteger>> = BSet::new(vec![]); + //transition, parameters, no condidtion { let mut _ic_ppriority_1 = BInteger::new(4); { @@ -726,6 +761,7 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_T3Read.is_none() { let mut _ic_set_15: BSet<BTuple<BInteger, BInteger>> = BSet::new(vec![]); + //transition, parameters, no condidtion { let mut _ic_ppriority_1 = self.BUSpriority; { @@ -746,7 +782,7 @@ impl CAN_BUS_tlc { pub fn _tr_T3Poll(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_T3Poll.is_none() { - let mut __tmp__val__ = self.T3_readpriority.less(&BInteger::new(5)).and(&self.T3_state.equal(&T3state::T3_PROC)).booleanValue(); + let mut __tmp__val__ = (self.T3_readpriority.less(&BInteger::new(5)) && self.T3_state.equal(&T3state::T3_PROC)).booleanValue(); self._tr_cache_T3Poll = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -758,9 +794,10 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_T3ReleaseBus.is_none() { let mut _ic_set_17: BSet<BInteger> = BSet::new(vec![]); + //transition, parameters, no condidtion { let mut _ic_ppriority_1 = BInteger::new(4); - if (self.T3_readpriority.equal(&BInteger::new(5)).and(&self.T3_state.equal(&T3state::T3_PROC))).booleanValue() { + if ((self.T3_readpriority.equal(&BInteger::new(5)) && self.T3_state.equal(&T3state::T3_PROC))).booleanValue() { _ic_set_17 = _ic_set_17._union(&BSet::new(vec![_ic_ppriority_1])); } @@ -798,9 +835,10 @@ impl CAN_BUS_tlc { //transition if !is_caching || self._tr_cache_Update.is_none() { let mut _ic_set_20: BSet<BInteger> = BSet::new(vec![]); + //transition, parameters, no condidtion { let mut _ic_pmax_1 = self.BUSwrite.domain()._max(); - if (self.T1_timer.greater(&BInteger::new(0)).and(&self.T2_timer.greater(&BInteger::new(0))).and(&self.T3_enabled.equal(&BBoolean::new(true)).or(&self.T3_evaluated.equal(&BBoolean::new(true))))).booleanValue() { + if (((self.T1_timer.greater(&BInteger::new(0)) && self.T2_timer.greater(&BInteger::new(0))) && (self.T3_enabled.equal(&BBoolean::new(true)) || self.T3_evaluated.equal(&BBoolean::new(true))))).booleanValue() { _ic_set_20 = _ic_set_20._union(&BSet::new(vec![_ic_pmax_1])); } @@ -912,11 +950,10 @@ impl CAN_BUS_tlc { return self.BUSwrite.domain().elementOf(&BInteger::new(0)).booleanValue(); } - fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) { + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { //calling the given functions without caching will recalculate them and cache them afterwards - //if caching is enabled globally, this will just prefill those, if caching is - for trans in to_invalidate.iter() { - match *trans { + for trans in to_invalidate { + match trans { "_tr_T1Evaluate" => {self._tr_T1Evaluate(false);}, "_tr_T1Calculate" => {self._tr_T1Calculate(false);}, "_tr_T1SendResult" => {self._tr_T1SendResult(false);}, @@ -946,962 +983,401 @@ impl CAN_BUS_tlc { //model_check_next_states fn generateNextStates(state: &mut CAN_BUS_tlc, isCaching: bool, - invariant_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_invariant_m: Arc<Mutex<HashMap<CAN_BUS_tlc, HashSet<&str>>>>, - guard_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_guard_m: Arc<Mutex<HashMap<CAN_BUS_tlc, HashSet<&str>>>>, - guardCache: Arc<Mutex<HashMap<CAN_BUS_tlc, PersistentHashMap<&str, bool>>>>, - parents_m: Arc<Mutex<HashMap<CAN_BUS_tlc, CAN_BUS_tlc>>>, - transitions: Arc<AtomicI64>) -> HashSet<CAN_BUS_tlc> { - let mut result = HashSet::<CAN_BUS_tlc>::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_T1Evaluate(isCaching); - if _trid_1 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T1Evaluate(); - match guard_dependency.get("T1Evaluate") { 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("T1Evaluate").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T1Evaluate").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_T1Calculate(isCaching); - for param in _trid_2.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.T1Calculate(_tmp_1); - match guard_dependency.get("T1Calculate") { 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("T1Calculate").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T1Calculate").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_T1SendResult(isCaching); - for param in _trid_3.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.T1SendResult(_tmp_2, _tmp_1); - match guard_dependency.get("T1SendResult") { 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("T1SendResult").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T1SendResult").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_T1Wait(isCaching); - for param in _trid_4.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.T1Wait(_tmp_1); - match guard_dependency.get("T1Wait") { 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("T1Wait").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T1Wait").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_5 = state._tr_T2Evaluate(isCaching); - if _trid_5 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T2Evaluate(); - match guard_dependency.get("T2Evaluate") { 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("T2Evaluate").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2Evaluate").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_T2ReadBus(isCaching); - for param in _trid_6.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.T2ReadBus(_tmp_2, _tmp_1); - match guard_dependency.get("T2ReadBus") { 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("T2ReadBus").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2ReadBus").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_7 = state._tr_T2Reset(isCaching); - if _trid_7 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T2Reset(); - match guard_dependency.get("T2Reset") { 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("T2Reset").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2Reset").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_8 = state._tr_T2Complete(isCaching); - if _trid_8 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T2Complete(); - match guard_dependency.get("T2Complete") { 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("T2Complete").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2Complete").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_9 = state._tr_T2ReleaseBus(isCaching); - for param in _trid_9.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.T2ReleaseBus(_tmp_1); - match guard_dependency.get("T2ReleaseBus") { 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("T2ReleaseBus").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2ReleaseBus").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_10 = state._tr_T2Calculate(isCaching); - if _trid_10 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T2Calculate(); - match guard_dependency.get("T2Calculate") { 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("T2Calculate").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2Calculate").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_11 = state._tr_T2WriteBus(isCaching); - for param in _trid_11.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.T2WriteBus(_tmp_2, _tmp_1); - match guard_dependency.get("T2WriteBus") { 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("T2WriteBus").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2WriteBus").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_12 = state._tr_T2Wait(isCaching); - for param in _trid_12.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.T2Wait(_tmp_1); - match guard_dependency.get("T2Wait") { 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("T2Wait").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2Wait").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_13 = state._tr_T3Initiate(isCaching); - if _trid_13 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T3Initiate(); - match guard_dependency.get("T3Initiate") { 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("T3Initiate").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3Initiate").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_14 = state._tr_T3Evaluate(isCaching); - if _trid_14 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T3Evaluate(); - match guard_dependency.get("T3Evaluate") { 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("T3Evaluate").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3Evaluate").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_15 = state._tr_T3writebus(isCaching); - for param in _trid_15.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.T3writebus(_tmp_2, _tmp_1); - match guard_dependency.get("T3writebus") { 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("T3writebus").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3writebus").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_16 = state._tr_T3Read(isCaching); - for param in _trid_16.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.T3Read(_tmp_2, _tmp_1); - match guard_dependency.get("T3Read") { 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("T3Read").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3Read").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_17 = state._tr_T3Poll(isCaching); - if _trid_17 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T3Poll(); - match guard_dependency.get("T3Poll") { 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("T3Poll").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3Poll").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_18 = state._tr_T3ReleaseBus(isCaching); - for param in _trid_18.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.T3ReleaseBus(_tmp_1); - match guard_dependency.get("T3ReleaseBus") { 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("T3ReleaseBus").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3ReleaseBus").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_19 = state._tr_T3Wait(isCaching); - if _trid_19 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T3Wait(); - match guard_dependency.get("T3Wait") { 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("T3Wait").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3Wait").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_20 = state._tr_T3ReEnableWait(isCaching); - if _trid_20 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T3ReEnableWait(); - match guard_dependency.get("T3ReEnableWait") { 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("T3ReEnableWait").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3ReEnableWait").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_21 = state._tr_Update(isCaching); - for param in _trid_21.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.Update(_tmp_1); - match guard_dependency.get("Update") { 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(); + transitions: Arc<AtomicU64>) -> HashSet<(CAN_BUS_tlc, &'static str)> { + let mut result = HashSet::<(CAN_BUS_tlc, &'static str)>::new(); + let mut evaluated_transitions: u64 = 0; + //model_check_transition + if state._tr_T1Evaluate(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.T1Evaluate(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T1Evaluate")); } + result.insert((copiedState, "T1Evaluate")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_2 = state._tr_T1Calculate(isCaching); + for param in _trid_2.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.T1Calculate(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T1Calculate")); } + result.insert((copiedState, "T1Calculate")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_3 = state._tr_T1SendResult(isCaching); + for param in _trid_3.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.T1SendResult(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T1SendResult")); } + result.insert((copiedState, "T1SendResult")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_4 = state._tr_T1Wait(isCaching); + for param in _trid_4.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.T1Wait(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T1Wait")); } + result.insert((copiedState, "T1Wait")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_T2Evaluate(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.T2Evaluate(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2Evaluate")); } + result.insert((copiedState, "T2Evaluate")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_6 = state._tr_T2ReadBus(isCaching); + for param in _trid_6.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.T2ReadBus(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2ReadBus")); } + result.insert((copiedState, "T2ReadBus")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_T2Reset(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.T2Reset(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2Reset")); } + result.insert((copiedState, "T2Reset")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_T2Complete(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.T2Complete(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2Complete")); } + result.insert((copiedState, "T2Complete")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_9 = state._tr_T2ReleaseBus(isCaching); + for param in _trid_9.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.T2ReleaseBus(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2ReleaseBus")); } + result.insert((copiedState, "T2ReleaseBus")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_T2Calculate(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.T2Calculate(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2Calculate")); } + result.insert((copiedState, "T2Calculate")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_11 = state._tr_T2WriteBus(isCaching); + for param in _trid_11.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.T2WriteBus(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2WriteBus")); } + result.insert((copiedState, "T2WriteBus")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_12 = state._tr_T2Wait(isCaching); + for param in _trid_12.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.T2Wait(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2Wait")); } + result.insert((copiedState, "T2Wait")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_T3Initiate(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.T3Initiate(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3Initiate")); } + result.insert((copiedState, "T3Initiate")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_T3Evaluate(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.T3Evaluate(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3Evaluate")); } + result.insert((copiedState, "T3Evaluate")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_15 = state._tr_T3writebus(isCaching); + for param in _trid_15.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.T3writebus(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3writebus")); } + result.insert((copiedState, "T3writebus")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_16 = state._tr_T3Read(isCaching); + for param in _trid_16.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.T3Read(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3Read")); } + result.insert((copiedState, "T3Read")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_T3Poll(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.T3Poll(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3Poll")); } + result.insert((copiedState, "T3Poll")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_18 = state._tr_T3ReleaseBus(isCaching); + for param in _trid_18.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.T3ReleaseBus(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3ReleaseBus")); } + result.insert((copiedState, "T3ReleaseBus")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_T3Wait(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.T3Wait(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3Wait")); } + result.insert((copiedState, "T3Wait")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_T3ReEnableWait(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.T3ReEnableWait(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3ReEnableWait")); } + result.insert((copiedState, "T3ReEnableWait")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_21 = state._tr_Update(isCaching); + for param in _trid_21.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.Update(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("Update")); } + result.insert((copiedState, "Update")); + evaluated_transitions += 1; + } - if !dependent_invariant.contains_key(&copiedState) { - dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("Update").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("Update").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_T1Evaluate(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T1Evaluate(); - match guard_dependency.get("T1Evaluate") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_T1Calculate(isCaching); - for param in _trid_2.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.T1Calculate(_tmp_1); - match guard_dependency.get("T1Calculate") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_T1SendResult(isCaching); - for param in _trid_3.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.T1SendResult(_tmp_2, _tmp_1); - match guard_dependency.get("T1SendResult") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_T1Wait(isCaching); - for param in _trid_4.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.T1Wait(_tmp_1); - match guard_dependency.get("T1Wait") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_T2Evaluate(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T2Evaluate(); - match guard_dependency.get("T2Evaluate") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_T2ReadBus(isCaching); - for param in _trid_6.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.T2ReadBus(_tmp_2, _tmp_1); - match guard_dependency.get("T2ReadBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_T2Reset(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T2Reset(); - match guard_dependency.get("T2Reset") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_T2Complete(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T2Complete(); - match guard_dependency.get("T2Complete") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_9 = state._tr_T2ReleaseBus(isCaching); - for param in _trid_9.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.T2ReleaseBus(_tmp_1); - match guard_dependency.get("T2ReleaseBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_T2Calculate(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T2Calculate(); - match guard_dependency.get("T2Calculate") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_11 = state._tr_T2WriteBus(isCaching); - for param in _trid_11.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.T2WriteBus(_tmp_2, _tmp_1); - match guard_dependency.get("T2WriteBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_12 = state._tr_T2Wait(isCaching); - for param in _trid_12.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.T2Wait(_tmp_1); - match guard_dependency.get("T2Wait") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_T3Initiate(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T3Initiate(); - match guard_dependency.get("T3Initiate") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_T3Evaluate(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T3Evaluate(); - match guard_dependency.get("T3Evaluate") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_15 = state._tr_T3writebus(isCaching); - for param in _trid_15.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.T3writebus(_tmp_2, _tmp_1); - match guard_dependency.get("T3writebus") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_16 = state._tr_T3Read(isCaching); - for param in _trid_16.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.T3Read(_tmp_2, _tmp_1); - match guard_dependency.get("T3Read") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_T3Poll(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T3Poll(); - match guard_dependency.get("T3Poll") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_18 = state._tr_T3ReleaseBus(isCaching); - for param in _trid_18.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.T3ReleaseBus(_tmp_1); - match guard_dependency.get("T3ReleaseBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_T3Wait(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T3Wait(); - match guard_dependency.get("T3Wait") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_T3ReEnableWait(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.T3ReEnableWait(); - match guard_dependency.get("T3ReEnableWait") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_21 = state._tr_Update(isCaching); - for param in _trid_21.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.Update(_tmp_1); - match guard_dependency.get("Update") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - - } + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); return result; } //model_check_evaluate_state //model_check_invariants - pub fn checkInvariants(state: &CAN_BUS_tlc, - isCaching: bool, - dependent_invariant_m: Arc<Mutex<HashMap<CAN_BUS_tlc, 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(); + pub fn checkInvariants(state: &CAN_BUS_tlc, last_op: &'static str, isCaching: bool) -> bool { + if isCaching { + let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op); //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_1") { + if dependent_invariants_of_state.contains(&"_check_inv_1") { if !state._check_inv_1() { + println!("_check_inv_1 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_2") { + if dependent_invariants_of_state.contains(&"_check_inv_2") { if !state._check_inv_2() { + println!("_check_inv_2 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_3") { + if dependent_invariants_of_state.contains(&"_check_inv_3") { if !state._check_inv_3() { + println!("_check_inv_3 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_4") { + if dependent_invariants_of_state.contains(&"_check_inv_4") { if !state._check_inv_4() { + println!("_check_inv_4 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_5") { + if dependent_invariants_of_state.contains(&"_check_inv_5") { if !state._check_inv_5() { + println!("_check_inv_5 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_6") { + if dependent_invariants_of_state.contains(&"_check_inv_6") { if !state._check_inv_6() { + println!("_check_inv_6 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_7") { + if dependent_invariants_of_state.contains(&"_check_inv_7") { if !state._check_inv_7() { + println!("_check_inv_7 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_8") { + if dependent_invariants_of_state.contains(&"_check_inv_8") { if !state._check_inv_8() { + println!("_check_inv_8 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_9") { + if dependent_invariants_of_state.contains(&"_check_inv_9") { if !state._check_inv_9() { + println!("_check_inv_9 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_10") { + if dependent_invariants_of_state.contains(&"_check_inv_10") { if !state._check_inv_10() { + println!("_check_inv_10 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_11") { + if dependent_invariants_of_state.contains(&"_check_inv_11") { if !state._check_inv_11() { + println!("_check_inv_11 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_12") { + if dependent_invariants_of_state.contains(&"_check_inv_12") { if !state._check_inv_12() { + println!("_check_inv_12 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_13") { + if dependent_invariants_of_state.contains(&"_check_inv_13") { if !state._check_inv_13() { + println!("_check_inv_13 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_14") { + if dependent_invariants_of_state.contains(&"_check_inv_14") { if !state._check_inv_14() { + println!("_check_inv_14 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_15") { + if dependent_invariants_of_state.contains(&"_check_inv_15") { if !state._check_inv_15() { + println!("_check_inv_15 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_16") { + if dependent_invariants_of_state.contains(&"_check_inv_16") { if !state._check_inv_16() { + println!("_check_inv_16 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_17") { + if dependent_invariants_of_state.contains(&"_check_inv_17") { if !state._check_inv_17() { + println!("_check_inv_17 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_18") { + if dependent_invariants_of_state.contains(&"_check_inv_18") { if !state._check_inv_18() { + println!("_check_inv_18 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_19") { + if dependent_invariants_of_state.contains(&"_check_inv_19") { if !state._check_inv_19() { + println!("_check_inv_19 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_20") { + if dependent_invariants_of_state.contains(&"_check_inv_20") { if !state._check_inv_20() { + println!("_check_inv_20 failed!"); return false; } } @@ -1911,16 +1387,14 @@ impl CAN_BUS_tlc { } //model_check_print - fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) { - if deadlock_detected { println!("DEADLOCK DETECTED"); } - if invariant_violated { println!("INVARIANT VIOLATED"); } - if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); } + fn print_result(states: usize, transitions: u64, error_detected: bool) { + if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); } println!("Number of States: {}", states); println!("Number of Transitions: {}", transitions); } //model_check_main - fn next(collection_m: Arc<Mutex<LinkedList<CAN_BUS_tlc>>>, mc_type: MC_TYPE) -> CAN_BUS_tlc { + fn next(collection_m: Arc<Mutex<LinkedList<(CAN_BUS_tlc, &'static str)>>>, mc_type: MC_TYPE) -> (CAN_BUS_tlc, &'static str) { let mut collection = collection_m.lock().unwrap(); return match mc_type { MC_TYPE::BFS => collection.pop_front().unwrap(), @@ -1929,152 +1403,140 @@ impl CAN_BUS_tlc { }; } - fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { - let mut machine = CAN_BUS_tlc::new(); - - let invariant_violated = AtomicBool::new(false); - let deadlock_detected = AtomicBool::new(false); - let stop_threads = AtomicBool::new(false); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() { - invariant_violated.store(true, Ordering::Release); - } - - let mut states = HashSet::<CAN_BUS_tlc>::new(); - states.insert(machine.clone()); - let number_states = AtomicI64::new(1); - - let collection_m = Arc::new(Mutex::new(LinkedList::<CAN_BUS_tlc>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<CAN_BUS_tlc, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, HashSet<&str>>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, CAN_BUS_tlc>::new())); - - if is_caching { + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - invariantDependency.insert("T1Wait", HashSet::from(["_check_inv_10", "_check_inv_4"])); + "T1Wait" => vec!["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"], //model_check_init_static - invariantDependency.insert("T1Calculate", HashSet::from(["_check_inv_7", "_check_inv_4"])); + "T1Calculate" => vec!["_tr_T1Evaluate", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"], //model_check_init_static - invariantDependency.insert("T1SendResult", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_4"])); + "T1SendResult" => vec!["_tr_T1Evaluate", "_tr_T2ReleaseBus", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"], //model_check_init_static - invariantDependency.insert("T2ReadBus", HashSet::from(["_check_inv_17", "_check_inv_5", "_check_inv_9"])); + "T2ReadBus" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], //model_check_init_static - invariantDependency.insert("T2Reset", HashSet::from(["_check_inv_1", "_check_inv_5", "_check_inv_8", "_check_inv_12"])); + "T2Reset" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], //model_check_init_static - invariantDependency.insert("T2Complete", HashSet::from(["_check_inv_5", "_check_inv_12"])); + "T2Complete" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], //model_check_init_static - invariantDependency.insert("T2Evaluate", HashSet::from(["_check_inv_5", "_check_inv_11"])); + "T2Evaluate" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], //model_check_init_static - invariantDependency.insert("T3Evaluate", HashSet::from(["_check_inv_6"])); + "T3Evaluate" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], //model_check_init_static - invariantDependency.insert("T3ReleaseBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"])); + "T3ReleaseBus" => vec!["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], //model_check_init_static - invariantDependency.insert("T1Evaluate", HashSet::from(["_check_inv_10", "_check_inv_4"])); + "T1Evaluate" => vec!["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"], //model_check_init_static - invariantDependency.insert("T3Initiate", HashSet::from(["_check_inv_3", "_check_inv_6"])); + "T3Initiate" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], //model_check_init_static - invariantDependency.insert("T3ReEnableWait", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_6"])); + "T3ReEnableWait" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], //model_check_init_static - invariantDependency.insert("T3writebus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"])); + "T3writebus" => vec!["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], //model_check_init_static - invariantDependency.insert("Update", HashSet::from(["_check_inv_2", "_check_inv_10", "_check_inv_14", "_check_inv_13", "_check_inv_11"])); + "Update" => vec!["_tr_T1Evaluate", "_tr_T3Read", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T3Evaluate", "_tr_T3Initiate"], //model_check_init_static - invariantDependency.insert("T2ReleaseBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"])); + "T2ReleaseBus" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], //model_check_init_static - invariantDependency.insert("T2Wait", HashSet::from(["_check_inv_5", "_check_inv_11"])); + "T2Wait" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], //model_check_init_static - invariantDependency.insert("T3Poll", HashSet::from(["_check_inv_6"])); + "T3Poll" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], //model_check_init_static - invariantDependency.insert("T2Calculate", HashSet::from(["_check_inv_1", "_check_inv_5"])); + "T2Calculate" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], //model_check_init_static - invariantDependency.insert("T3Read", HashSet::from(["_check_inv_16", "_check_inv_15", "_check_inv_6"])); + "T3Read" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], //model_check_init_static - invariantDependency.insert("T3Wait", HashSet::from(["_check_inv_2", "_check_inv_6"])); + "T3Wait" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], //model_check_init_static - invariantDependency.insert("T2WriteBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"])); + "T2WriteBus" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], + _ => vec![], + } + } + + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - guardDependency.insert("T1Wait", HashSet::from(["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"])); + "T1Wait" => vec!["_check_inv_10", "_check_inv_4"], //model_check_init_static - guardDependency.insert("T1Calculate", HashSet::from(["_tr_T1Evaluate", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"])); + "T1Calculate" => vec!["_check_inv_7", "_check_inv_4"], //model_check_init_static - guardDependency.insert("T1SendResult", HashSet::from(["_tr_T1Evaluate", "_tr_T2ReleaseBus", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"])); + "T1SendResult" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_4"], //model_check_init_static - guardDependency.insert("T2ReadBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); + "T2ReadBus" => vec!["_check_inv_17", "_check_inv_5", "_check_inv_9"], //model_check_init_static - guardDependency.insert("T2Reset", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); + "T2Reset" => vec!["_check_inv_1", "_check_inv_5", "_check_inv_8", "_check_inv_12"], //model_check_init_static - guardDependency.insert("T2Complete", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); + "T2Complete" => vec!["_check_inv_5", "_check_inv_12"], //model_check_init_static - guardDependency.insert("T2Evaluate", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); + "T2Evaluate" => vec!["_check_inv_5", "_check_inv_11"], //model_check_init_static - guardDependency.insert("T3Evaluate", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); + "T3Evaluate" => vec!["_check_inv_6"], //model_check_init_static - guardDependency.insert("T3ReleaseBus", HashSet::from(["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); + "T3ReleaseBus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"], //model_check_init_static - guardDependency.insert("T1Evaluate", HashSet::from(["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"])); + "T1Evaluate" => vec!["_check_inv_10", "_check_inv_4"], //model_check_init_static - guardDependency.insert("T3Initiate", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); + "T3Initiate" => vec!["_check_inv_3", "_check_inv_6"], //model_check_init_static - guardDependency.insert("T3ReEnableWait", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); + "T3ReEnableWait" => vec!["_check_inv_2", "_check_inv_3", "_check_inv_6"], //model_check_init_static - guardDependency.insert("T3writebus", HashSet::from(["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); + "T3writebus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"], //model_check_init_static - guardDependency.insert("Update", HashSet::from(["_tr_T1Evaluate", "_tr_T3Read", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T3Evaluate", "_tr_T3Initiate"])); + "Update" => vec!["_check_inv_2", "_check_inv_10", "_check_inv_14", "_check_inv_13", "_check_inv_11"], //model_check_init_static - guardDependency.insert("T2ReleaseBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); + "T2ReleaseBus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"], //model_check_init_static - guardDependency.insert("T2Wait", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); + "T2Wait" => vec!["_check_inv_5", "_check_inv_11"], //model_check_init_static - guardDependency.insert("T3Poll", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); + "T3Poll" => vec!["_check_inv_6"], //model_check_init_static - guardDependency.insert("T2Calculate", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); + "T2Calculate" => vec!["_check_inv_1", "_check_inv_5"], //model_check_init_static - guardDependency.insert("T3Read", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); + "T3Read" => vec!["_check_inv_16", "_check_inv_15", "_check_inv_6"], //model_check_init_static - guardDependency.insert("T3Wait", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); + "T3Wait" => vec!["_check_inv_2", "_check_inv_6"], //model_check_init_static - guardDependency.insert("T2WriteBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); + "T2WriteBus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"], + _ => vec![], } + } - let transitions = Arc::new(AtomicI64::new(0)); + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { + let mut machine = CAN_BUS_tlc::new(); - while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - let mut state = Self::next(Arc::clone(&collection_m), mc_type); + let mut all_states = HashSet::<CAN_BUS_tlc>::new(); + all_states.insert(machine.clone()); - 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 states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(CAN_BUS_tlc, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine.clone(), "")); - next_states.iter().cloned().for_each(|next_state| { - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection_m.lock().unwrap().push_back(next_state); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - }); + let num_transitions = Arc::new(AtomicU64::new(0)); + + let mut stop_threads = false; + + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions)); + if !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); + print!("DEADLOCK DETECTED"); + stop_threads = true; } - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| all_states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op))); + if all_states.len() % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } } - Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { @@ -2082,187 +1544,66 @@ impl CAN_BUS_tlc { let machine = CAN_BUS_tlc::new(); + let all_states = Arc::new(DashSet::<CAN_BUS_tlc>::new()); + all_states.insert(machine.clone()); - let invariant_violated_b = Arc::new(AtomicBool::new(false)); - let deadlock_detected_b = Arc::new(AtomicBool::new(false)); - let stop_threads_b = Arc::new(AtomicBool::new(false)); - let possible_queue_changes_b = Arc::new(AtomicI32::new(0)); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() { - invariant_violated_b.store(true, Ordering::Release); - } + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(CAN_BUS_tlc, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); - let states_m = Arc::new(Mutex::new(HashSet::<CAN_BUS_tlc>::new())); - states_m.lock().unwrap().insert(machine.clone()); - let number_states_arc = Arc::new(AtomicI64::new(1)); + let num_transitions = Arc::new(AtomicU64::new(0)); - let collection_m = Arc::new(Mutex::new(LinkedList::<CAN_BUS_tlc>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<CAN_BUS_tlc, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, HashSet<&str>>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, CAN_BUS_tlc>::new())); - - if is_caching { - //model_check_init_static - invariantDependency.insert("T1Wait", HashSet::from(["_check_inv_10", "_check_inv_4"])); - //model_check_init_static - invariantDependency.insert("T1Calculate", HashSet::from(["_check_inv_7", "_check_inv_4"])); - //model_check_init_static - invariantDependency.insert("T1SendResult", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_4"])); - //model_check_init_static - invariantDependency.insert("T2ReadBus", HashSet::from(["_check_inv_17", "_check_inv_5", "_check_inv_9"])); - //model_check_init_static - invariantDependency.insert("T2Reset", HashSet::from(["_check_inv_1", "_check_inv_5", "_check_inv_8", "_check_inv_12"])); - //model_check_init_static - invariantDependency.insert("T2Complete", HashSet::from(["_check_inv_5", "_check_inv_12"])); - //model_check_init_static - invariantDependency.insert("T2Evaluate", HashSet::from(["_check_inv_5", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("T3Evaluate", HashSet::from(["_check_inv_6"])); - //model_check_init_static - invariantDependency.insert("T3ReleaseBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"])); - //model_check_init_static - invariantDependency.insert("T1Evaluate", HashSet::from(["_check_inv_10", "_check_inv_4"])); - //model_check_init_static - invariantDependency.insert("T3Initiate", HashSet::from(["_check_inv_3", "_check_inv_6"])); - //model_check_init_static - invariantDependency.insert("T3ReEnableWait", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_6"])); - //model_check_init_static - invariantDependency.insert("T3writebus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"])); - //model_check_init_static - invariantDependency.insert("Update", HashSet::from(["_check_inv_2", "_check_inv_10", "_check_inv_14", "_check_inv_13", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("T2ReleaseBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"])); - //model_check_init_static - invariantDependency.insert("T2Wait", HashSet::from(["_check_inv_5", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("T3Poll", HashSet::from(["_check_inv_6"])); - //model_check_init_static - invariantDependency.insert("T2Calculate", HashSet::from(["_check_inv_1", "_check_inv_5"])); - //model_check_init_static - invariantDependency.insert("T3Read", HashSet::from(["_check_inv_16", "_check_inv_15", "_check_inv_6"])); - //model_check_init_static - invariantDependency.insert("T3Wait", HashSet::from(["_check_inv_2", "_check_inv_6"])); - //model_check_init_static - invariantDependency.insert("T2WriteBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"])); - //model_check_init_static - guardDependency.insert("T1Wait", HashSet::from(["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"])); - //model_check_init_static - guardDependency.insert("T1Calculate", HashSet::from(["_tr_T1Evaluate", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"])); - //model_check_init_static - guardDependency.insert("T1SendResult", HashSet::from(["_tr_T1Evaluate", "_tr_T2ReleaseBus", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"])); - //model_check_init_static - guardDependency.insert("T2ReadBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); - //model_check_init_static - guardDependency.insert("T2Reset", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); - //model_check_init_static - guardDependency.insert("T2Complete", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); - //model_check_init_static - guardDependency.insert("T2Evaluate", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); - //model_check_init_static - guardDependency.insert("T3Evaluate", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); - //model_check_init_static - guardDependency.insert("T3ReleaseBus", HashSet::from(["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); - //model_check_init_static - guardDependency.insert("T1Evaluate", HashSet::from(["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"])); - //model_check_init_static - guardDependency.insert("T3Initiate", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); - //model_check_init_static - guardDependency.insert("T3ReEnableWait", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); - //model_check_init_static - guardDependency.insert("T3writebus", HashSet::from(["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); - //model_check_init_static - guardDependency.insert("Update", HashSet::from(["_tr_T1Evaluate", "_tr_T3Read", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T3Evaluate", "_tr_T3Initiate"])); - //model_check_init_static - guardDependency.insert("T2ReleaseBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); - //model_check_init_static - guardDependency.insert("T2Wait", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); - //model_check_init_static - guardDependency.insert("T3Poll", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); - //model_check_init_static - guardDependency.insert("T2Calculate", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); - //model_check_init_static - guardDependency.insert("T3Read", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); - //model_check_init_static - guardDependency.insert("T3Wait", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"])); - //model_check_init_static - guardDependency.insert("T2WriteBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } - - let num_transitions = Arc::new(AtomicI64::new(0)); - let invariant_dependency_arc = Arc::new(invariantDependency); - let guard_dependency_arc = Arc::new(guardDependency); + let mut stop_threads = false; + let mut spawned_tasks: u64 = 0; + let mut finished_tasks: u64 = 0; let (tx, rx) = channel(); //println!("Thread {:?} starting threads", thread::current().id()); - while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - possible_queue_changes_b.fetch_add(1, Ordering::AcqRel); - let mut state = Self::next(Arc::clone(&collection_m), mc_type); - - let invariant_violated = Arc::clone(&invariant_violated_b); - let deadlock_detected = Arc::clone(&deadlock_detected_b); - let stop_threads = Arc::clone(&stop_threads_b); - let possible_queue_changes = Arc::clone(&possible_queue_changes_b); - let collection_m2 = Arc::clone(&collection_m); - 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); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let states_to_process = Arc::clone(&states_to_process_mutex); let transitions = Arc::clone(&num_transitions); - let states_m2 = Arc::clone(&states_m); - let number_states = Arc::clone(&number_states_arc); + let states = Arc::clone(&all_states); 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)); + if !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } - //println!("Thread {:?} executing", thread::current().id()); - next_states.iter().cloned().for_each(|next_state| { - { - let mut states = states_m2.lock().unwrap(); - let mut collection = collection_m2.lock().unwrap(); - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection.push_back(next_state); - //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len()); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - } - }); - possible_queue_changes.fetch_sub(1, Ordering::AcqRel); + let next_states = Self::generateNextStates(&mut state, is_caching, transitions); + if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } - if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + //println!("Thread {:?} executing", thread::current().id()); + next_states.into_iter() + .filter(|(next_state, _)| states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op))); - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } //println!("Thread {:?} done", thread::current().id()); - tx.send(1).expect(""); + let _ = tx.send(Ok(1)); }); - while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 { + + spawned_tasks += 1; + if spawned_tasks % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } + + while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 { //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id()); - rx.recv().expect("Waiting for a thread to finish: "); + match rx.recv_timeout(Duration::from_secs(1)) { + Ok(val) => match val { + Ok(_) => finished_tasks += 1, + Err(msg) => { println!("{}", msg); stop_threads = true; }, + }, + Err(_) => (), + } + if threadPool.panic_count() > 0 { stop_threads = true; } } } - Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } } diff --git a/benchmarks/model_checking/Rust/Cruise_finite1_deterministic_MC.rs b/benchmarks/model_checking/Rust/Cruise_finite1_deterministic_MC.rs index 7f12bc7b48af29b3387723074ea901e6d4037a45..3c75c4370810b7ebd5c4a6236b0d6f245220c94d 100644 --- a/benchmarks/model_checking/Rust/Cruise_finite1_deterministic_MC.rs +++ b/benchmarks/model_checking/Rust/Cruise_finite1_deterministic_MC.rs @@ -1,16 +1,17 @@ -#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ] +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] use std::env; -use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::thread; -use std::collections::{HashMap, HashSet, LinkedList}; -use im::HashMap as PersistentHashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, mpsc, Mutex}; +use std::collections::{HashSet, LinkedList}; +use dashmap::DashSet; use threadpool::ThreadPool; use std::sync::mpsc::channel; use derivative::Derivative; +use std::time::{Duration}; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; +use btypes::bboolean::{IntoBool, BBooleanT}; use btypes::bboolean::BBoolean; use btypes::binteger::BInteger; use btypes::bset::BSet; @@ -23,9 +24,9 @@ pub enum MC_TYPE { BFS, DFS, MIXED } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum RSset { - RSnone, - RSpos, - RSneg, + RSnone, + RSpos, + RSneg, RSequal } impl RSset { @@ -38,19 +39,19 @@ impl Default for RSset { } impl fmt::Display for RSset { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - RSset::RSnone => write!(f, "RSnone"), - RSset::RSpos => write!(f, "RSpos"), - RSset::RSneg => write!(f, "RSneg"), - RSset::RSequal => write!(f, "RSequal"), - } + match *self { + RSset::RSnone => write!(f, "RSnone"), + RSset::RSpos => write!(f, "RSpos"), + RSset::RSneg => write!(f, "RSneg"), + RSset::RSequal => write!(f, "RSequal"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum ODset { - ODnone, - ODclose, + ODnone, + ODclose, ODveryclose } impl ODset { @@ -63,11 +64,11 @@ impl Default for ODset { } impl fmt::Display for ODset { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - ODset::ODnone => write!(f, "ODnone"), - ODset::ODclose => write!(f, "ODclose"), - ODset::ODveryclose => write!(f, "ODveryclose"), - } + match *self { + ODset::ODnone => write!(f, "ODnone"), + ODset::ODclose => write!(f, "ODclose"), + ODset::ODveryclose => write!(f, "ODveryclose"), + } } } @@ -144,6 +145,29 @@ pub struct Cruise_finite1_deterministic_MC { #[derivative(Hash="ignore", PartialEq="ignore")] _tr_cache_ObstacleBecomesOld: Option<bool>,} +impl fmt::Display for Cruise_finite1_deterministic_MC { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut result = "Cruise_finite1_deterministic_MC: (".to_owned(); + result += &format!("_get_CruiseAllowed: {}, ", self._get_CruiseAllowed()); + result += &format!("_get_CruiseActive: {}, ", self._get_CruiseActive()); + result += &format!("_get_VehicleAtCruiseSpeed: {}, ", self._get_VehicleAtCruiseSpeed()); + result += &format!("_get_VehicleCanKeepSpeed: {}, ", self._get_VehicleCanKeepSpeed()); + result += &format!("_get_VehicleTryKeepSpeed: {}, ", self._get_VehicleTryKeepSpeed()); + result += &format!("_get_SpeedAboveMax: {}, ", self._get_SpeedAboveMax()); + result += &format!("_get_VehicleTryKeepTimeGap: {}, ", self._get_VehicleTryKeepTimeGap()); + result += &format!("_get_CruiseSpeedAtMax: {}, ", self._get_CruiseSpeedAtMax()); + result += &format!("_get_ObstaclePresent: {}, ", self._get_ObstaclePresent()); + result += &format!("_get_ObstacleDistance: {}, ", self._get_ObstacleDistance()); + result += &format!("_get_ObstacleRelativeSpeed: {}, ", self._get_ObstacleRelativeSpeed()); + result += &format!("_get_ObstacleStatusJustChanged: {}, ", self._get_ObstacleStatusJustChanged()); + result += &format!("_get_CCInitialisationInProgress: {}, ", self._get_CCInitialisationInProgress()); + result += &format!("_get_CruiseSpeedChangeInProgress: {}, ", self._get_CruiseSpeedChangeInProgress()); + result += &format!("_get_NumberOfSetCruise: {}, ", self._get_NumberOfSetCruise()); + result = result + ")"; + return write!(f, "{}", result); + } +} + impl Cruise_finite1_deterministic_MC { pub fn new() -> Cruise_finite1_deterministic_MC { @@ -172,71 +196,71 @@ impl Cruise_finite1_deterministic_MC { self.ObstacleRelativeSpeed = RSset::RSnone; } - pub fn get_CruiseAllowed(&self) -> BBoolean { + pub fn _get_CruiseAllowed(&self) -> BBoolean { return self.CruiseAllowed.clone(); } - pub fn get_CruiseActive(&self) -> BBoolean { + pub fn _get_CruiseActive(&self) -> BBoolean { return self.CruiseActive.clone(); } - pub fn get_VehicleAtCruiseSpeed(&self) -> BBoolean { + pub fn _get_VehicleAtCruiseSpeed(&self) -> BBoolean { return self.VehicleAtCruiseSpeed.clone(); } - pub fn get_VehicleCanKeepSpeed(&self) -> BBoolean { + pub fn _get_VehicleCanKeepSpeed(&self) -> BBoolean { return self.VehicleCanKeepSpeed.clone(); } - pub fn get_VehicleTryKeepSpeed(&self) -> BBoolean { + pub fn _get_VehicleTryKeepSpeed(&self) -> BBoolean { return self.VehicleTryKeepSpeed.clone(); } - pub fn get_SpeedAboveMax(&self) -> BBoolean { + pub fn _get_SpeedAboveMax(&self) -> BBoolean { return self.SpeedAboveMax.clone(); } - pub fn get_VehicleTryKeepTimeGap(&self) -> BBoolean { + pub fn _get_VehicleTryKeepTimeGap(&self) -> BBoolean { return self.VehicleTryKeepTimeGap.clone(); } - pub fn get_CruiseSpeedAtMax(&self) -> BBoolean { + pub fn _get_CruiseSpeedAtMax(&self) -> BBoolean { return self.CruiseSpeedAtMax.clone(); } - pub fn get_ObstaclePresent(&self) -> BBoolean { + pub fn _get_ObstaclePresent(&self) -> BBoolean { return self.ObstaclePresent.clone(); } - pub fn get_ObstacleDistance(&self) -> ODset { + pub fn _get_ObstacleDistance(&self) -> ODset { return self.ObstacleDistance.clone(); } - pub fn get_ObstacleRelativeSpeed(&self) -> RSset { + pub fn _get_ObstacleRelativeSpeed(&self) -> RSset { return self.ObstacleRelativeSpeed.clone(); } - pub fn get_ObstacleStatusJustChanged(&self) -> BBoolean { + pub fn _get_ObstacleStatusJustChanged(&self) -> BBoolean { return self.ObstacleStatusJustChanged.clone(); } - pub fn get_CCInitialisationInProgress(&self) -> BBoolean { + pub fn _get_CCInitialisationInProgress(&self) -> BBoolean { return self.CCInitialisationInProgress.clone(); } - pub fn get_CruiseSpeedChangeInProgress(&self) -> BBoolean { + pub fn _get_CruiseSpeedChangeInProgress(&self) -> BBoolean { return self.CruiseSpeedChangeInProgress.clone(); } - pub fn get_NumberOfSetCruise(&self) -> BInteger { + pub fn _get_NumberOfSetCruise(&self) -> BInteger { return self.NumberOfSetCruise.clone(); } - pub fn get__RSset(&self) -> BSet<RSset> { + pub fn _get__RSset(&self) -> BSet<RSset> { return self._RSset.clone(); } - pub fn get__ODset(&self) -> BSet<ODset> { + pub fn _get__ODset(&self) -> BSet<ODset> { return self._ODset.clone(); } @@ -287,7 +311,7 @@ impl Cruise_finite1_deterministic_MC { } if (_ld_NumberOfSetCruise.less(&BInteger::new(1))).booleanValue() { self.NumberOfSetCruise = _ld_NumberOfSetCruise.plus(&BInteger::new(1)); - } + } } @@ -299,7 +323,7 @@ impl Cruise_finite1_deterministic_MC { } pub fn CCInitialisationDelayFinished(&mut self) -> () { - if (self.CCInitialisationInProgress.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() { + if ((((((self.CCInitialisationInProgress.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() { self.CCInitialisationInProgress = BBoolean::new(true); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -307,7 +331,7 @@ impl Cruise_finite1_deterministic_MC { } pub fn CruiseSpeedChangeFinished(&mut self, mut vtks: BBoolean, mut vtktg: BBoolean) -> () { - if (butils::BOOL.elementOf(&vtks).and(&butils::BOOL.elementOf(&vtktg)).and(&vtks.equal(&BBoolean::new(true)).or(&vtktg.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true)))).and(&self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&vtks.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtks.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).booleanValue() { + if ((((((((((((butils::BOOL.elementOf(&vtks) && butils::BOOL.elementOf(&vtktg)) && (((vtks.equal(&BBoolean::new(true)) || vtktg.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true)))) && self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&vtktg.equal(&BBoolean::new(false)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&vtks.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtks.equal(&BBoolean::new(true)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&vtktg.equal(&BBoolean::new(false)))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).booleanValue() { self.VehicleTryKeepTimeGap = vtktg; self.VehicleTryKeepSpeed = vtks; } else { @@ -316,7 +340,7 @@ impl Cruise_finite1_deterministic_MC { } pub fn CruiseSpeedChangeDelayFinished(&mut self) -> () { - if (self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() { + if ((((((self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() { self.CruiseSpeedChangeInProgress = BBoolean::new(true); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -350,7 +374,7 @@ impl Cruise_finite1_deterministic_MC { } pub fn ExternalForcesBecomesNormal(&mut self) -> () { - if (self.CruiseActive.equal(&BBoolean::new(true)).and(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)))).booleanValue() { + if ((self.CruiseActive.equal(&BBoolean::new(true)) && self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)))).booleanValue() { self.VehicleCanKeepSpeed = BBoolean::new(true); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -358,7 +382,7 @@ impl Cruise_finite1_deterministic_MC { } pub fn VehicleLeavesCruiseSpeed(&mut self) -> () { - if (self.VehicleAtCruiseSpeed.equal(&BBoolean::new(true)).and(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).or(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(false)))).booleanValue() { + if (((self.VehicleAtCruiseSpeed.equal(&BBoolean::new(true)) && (self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)) && self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) || self.VehicleTryKeepSpeed.equal(&BBoolean::new(false)))).booleanValue() { self.VehicleAtCruiseSpeed = BBoolean::new(false); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -366,7 +390,7 @@ impl Cruise_finite1_deterministic_MC { } pub fn VehicleReachesCruiseSpeed(&mut self) -> () { - if (self.CruiseActive.equal(&BBoolean::new(true)).and(&self.VehicleAtCruiseSpeed.equal(&BBoolean::new(false))).and(&self.SpeedAboveMax.equal(&BBoolean::new(false)))).booleanValue() { + if (((self.CruiseActive.equal(&BBoolean::new(true)) && self.VehicleAtCruiseSpeed.equal(&BBoolean::new(false))) && self.SpeedAboveMax.equal(&BBoolean::new(false)))).booleanValue() { self.VehicleAtCruiseSpeed = BBoolean::new(true); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -374,7 +398,7 @@ impl Cruise_finite1_deterministic_MC { } pub fn VehicleExceedsMaxCruiseSpeed(&mut self) -> () { - if (self.SpeedAboveMax.equal(&BBoolean::new(false)).and(&self.CruiseActive.equal(&BBoolean::new(false)).or(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))))).booleanValue() { + if ((self.SpeedAboveMax.equal(&BBoolean::new(false)) && ((self.CruiseActive.equal(&BBoolean::new(false)) || self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))) || ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))))).booleanValue() { self.SpeedAboveMax = BBoolean::new(true); self.VehicleAtCruiseSpeed = BBoolean::new(false); } else { @@ -385,16 +409,16 @@ impl Cruise_finite1_deterministic_MC { pub fn VehicleFallsBelowMaxCruiseSpeed(&mut self) -> () { if (self.SpeedAboveMax.equal(&BBoolean::new(true))).booleanValue() { self.SpeedAboveMax = BBoolean::new(false); - if (self.CruiseActive.equal(&BBoolean::new(true)).and(&self.CruiseSpeedAtMax.equal(&BBoolean::new(true)))).booleanValue() { + if ((self.CruiseActive.equal(&BBoolean::new(true)) && self.CruiseSpeedAtMax.equal(&BBoolean::new(true)))).booleanValue() { self.VehicleAtCruiseSpeed = BBoolean::new(true); - } + } } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); } } pub fn ObstacleDistanceBecomesVeryClose(&mut self) -> () { - if (self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg))).booleanValue() { + if ((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSneg))).booleanValue() { self.ObstacleDistance = ODset::ODveryclose; self.ObstacleStatusJustChanged = BBoolean::new(true); } else { @@ -403,19 +427,19 @@ impl Cruise_finite1_deterministic_MC { } pub fn ObstacleDistanceBecomesClose(&mut self) -> () { - if (self.ObstaclePresent.equal(&BBoolean::new(true)).and(&self.CruiseActive.equal(&BBoolean::new(true))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos)).or(&self.ObstacleDistance.equal(&ODset::ODnone).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg))))).booleanValue() { + if (((self.ObstaclePresent.equal(&BBoolean::new(true)) && self.CruiseActive.equal(&BBoolean::new(true))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSpos)) || (self.ObstacleDistance.equal(&ODset::ODnone) && self.ObstacleRelativeSpeed.equal(&RSset::RSneg))))).booleanValue() { self.ObstacleDistance = ODset::ODclose; self.ObstacleStatusJustChanged = BBoolean::new(true); if (self.ObstacleRelativeSpeed.equal(&RSset::RSpos)).booleanValue() { self.VehicleTryKeepTimeGap = BBoolean::new(false); - } + } } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); } } pub fn ObstacleDistanceBecomesBig(&mut self) -> () { - if (self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos))).booleanValue() { + if ((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSpos))).booleanValue() { self.ObstacleStatusJustChanged = BBoolean::new(true); self.ObstacleDistance = ODset::ODnone; self.VehicleTryKeepTimeGap = BBoolean::new(false); @@ -425,14 +449,14 @@ impl Cruise_finite1_deterministic_MC { } pub fn ObstacleStartsTravelFaster(&mut self) -> () { - if (self.ObstaclePresent.equal(&BBoolean::new(true)).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal))).booleanValue() { + if ((self.ObstaclePresent.equal(&BBoolean::new(true)) && self.ObstacleRelativeSpeed.equal(&RSset::RSequal))).booleanValue() { self.ObstacleRelativeSpeed = RSset::RSpos; if (self.CruiseActive.equal(&BBoolean::new(true))).booleanValue() { self.ObstacleStatusJustChanged = BBoolean::new(true); - } + } if (self.ObstacleDistance.unequal(&ODset::ODveryclose)).booleanValue() { self.VehicleTryKeepTimeGap = BBoolean::new(false); - } + } } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); } @@ -443,7 +467,7 @@ impl Cruise_finite1_deterministic_MC { self.ObstacleRelativeSpeed = RSset::RSequal; if (self.CruiseActive.equal(&BBoolean::new(true))).booleanValue() { self.ObstacleStatusJustChanged = BBoolean::new(true); - } + } } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); } @@ -454,7 +478,7 @@ impl Cruise_finite1_deterministic_MC { self.ObstacleRelativeSpeed = RSset::RSneg; if (self.CruiseActive.equal(&BBoolean::new(true))).booleanValue() { self.ObstacleStatusJustChanged = BBoolean::new(true); - } + } } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); } @@ -465,7 +489,7 @@ impl Cruise_finite1_deterministic_MC { self.ObstacleRelativeSpeed = RSset::RSequal; if (self.CruiseActive.equal(&BBoolean::new(true))).booleanValue() { self.ObstacleStatusJustChanged = BBoolean::new(true); - } + } } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); } @@ -494,7 +518,7 @@ impl Cruise_finite1_deterministic_MC { self.ObstacleRelativeSpeed = RSset::RSnone; if (self.CruiseActive.equal(&BBoolean::new(true))).booleanValue() { self.ObstacleStatusJustChanged = BBoolean::new(true); - } + } self.ObstacleDistance = ODset::ODnone; self.VehicleTryKeepTimeGap = BBoolean::new(false); } else { @@ -503,7 +527,7 @@ impl Cruise_finite1_deterministic_MC { } pub fn VehicleManageObstacle(&mut self, mut vtks: BBoolean, mut vtktg: BBoolean) -> () { - if (butils::BOOL.elementOf(&vtks).and(&butils::BOOL.elementOf(&vtktg)).and(&vtks.equal(&BBoolean::new(true)).or(&vtktg.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).and(&self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&vtks.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtks.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)))).booleanValue() { + if ((((((((((((butils::BOOL.elementOf(&vtks) && butils::BOOL.elementOf(&vtktg)) && (((vtks.equal(&BBoolean::new(true)) || vtktg.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))) && self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&vtktg.equal(&BBoolean::new(false)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&vtks.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtks.equal(&BBoolean::new(true)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&vtktg.equal(&BBoolean::new(false)))) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)))).booleanValue() { self.VehicleTryKeepTimeGap = vtktg; self.VehicleTryKeepSpeed = vtks; } else { @@ -512,7 +536,7 @@ impl Cruise_finite1_deterministic_MC { } pub fn ObstacleBecomesOld(&mut self) -> () { - if (self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() { + if ((((((self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() { self.ObstacleStatusJustChanged = BBoolean::new(false); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -545,6 +569,7 @@ impl Cruise_finite1_deterministic_MC { //transition if !is_caching || self._tr_cache_SetCruiseSpeed.is_none() { let mut _ic_set_2: BSet<BTuple<BBoolean, BBoolean>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_vcks_1 in butils::BOOL.clone().iter().cloned() { for _ic_csam_1 in butils::BOOL.clone().iter().cloned() { if (self.CruiseAllowed.equal(&BBoolean::new(true))).booleanValue() { @@ -564,9 +589,10 @@ impl Cruise_finite1_deterministic_MC { //transition if !is_caching || self._tr_cache_CCInitialisationFinished.is_none() { let mut _ic_set_3: BSet<BTuple<BBoolean, BBoolean>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_vtks_1 in butils::BOOL.clone().iter().cloned() { for _ic_vtktg_1 in butils::BOOL.clone().iter().cloned() { - if (_ic_vtks_1.equal(&BBoolean::new(true)).or(&_ic_vtktg_1.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true))).and(&self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(true)))).booleanValue() { + if (((((((((((((_ic_vtks_1.equal(&BBoolean::new(true)) || _ic_vtktg_1.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true))) && self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.CCInitialisationInProgress.equal(&BBoolean::new(true)))).booleanValue() { _ic_set_3 = _ic_set_3._union(&BSet::new(vec![BTuple::from_refs(&_ic_vtks_1, &_ic_vtktg_1)])); } @@ -582,7 +608,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_CCInitialisationDelayFinished(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_CCInitialisationDelayFinished.is_none() { - let mut __tmp__val__ = self.CCInitialisationInProgress.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue(); + let mut __tmp__val__ = (((((self.CCInitialisationInProgress.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue(); self._tr_cache_CCInitialisationDelayFinished = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -594,9 +620,10 @@ impl Cruise_finite1_deterministic_MC { //transition if !is_caching || self._tr_cache_CruiseSpeedChangeFinished.is_none() { let mut _ic_set_5: BSet<BTuple<BBoolean, BBoolean>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_vtks_1 in butils::BOOL.clone().iter().cloned() { for _ic_vtktg_1 in butils::BOOL.clone().iter().cloned() { - if (_ic_vtks_1.equal(&BBoolean::new(true)).or(&_ic_vtktg_1.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true))).and(&self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).booleanValue() { + if (((((((((((((_ic_vtks_1.equal(&BBoolean::new(true)) || _ic_vtktg_1.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true))) && self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).booleanValue() { _ic_set_5 = _ic_set_5._union(&BSet::new(vec![BTuple::from_refs(&_ic_vtks_1, &_ic_vtktg_1)])); } @@ -612,7 +639,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_CruiseSpeedChangeDelayFinished(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_CruiseSpeedChangeDelayFinished.is_none() { - let mut __tmp__val__ = self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue(); + let mut __tmp__val__ = (((((self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue(); self._tr_cache_CruiseSpeedChangeDelayFinished = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -645,7 +672,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_ExternalForcesBecomesNormal(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_ExternalForcesBecomesNormal.is_none() { - let mut __tmp__val__ = self.CruiseActive.equal(&BBoolean::new(true)).and(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))).booleanValue(); + let mut __tmp__val__ = (self.CruiseActive.equal(&BBoolean::new(true)) && self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))).booleanValue(); self._tr_cache_ExternalForcesBecomesNormal = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -656,7 +683,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_VehicleLeavesCruiseSpeed(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_VehicleLeavesCruiseSpeed.is_none() { - let mut __tmp__val__ = self.VehicleAtCruiseSpeed.equal(&BBoolean::new(true)).and(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).or(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(false))).booleanValue(); + let mut __tmp__val__ = ((self.VehicleAtCruiseSpeed.equal(&BBoolean::new(true)) && (self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)) && self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) || self.VehicleTryKeepSpeed.equal(&BBoolean::new(false))).booleanValue(); self._tr_cache_VehicleLeavesCruiseSpeed = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -667,7 +694,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_VehicleReachesCruiseSpeed(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_VehicleReachesCruiseSpeed.is_none() { - let mut __tmp__val__ = self.CruiseActive.equal(&BBoolean::new(true)).and(&self.VehicleAtCruiseSpeed.equal(&BBoolean::new(false))).and(&self.SpeedAboveMax.equal(&BBoolean::new(false))).booleanValue(); + let mut __tmp__val__ = ((self.CruiseActive.equal(&BBoolean::new(true)) && self.VehicleAtCruiseSpeed.equal(&BBoolean::new(false))) && self.SpeedAboveMax.equal(&BBoolean::new(false))).booleanValue(); self._tr_cache_VehicleReachesCruiseSpeed = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -678,7 +705,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_VehicleExceedsMaxCruiseSpeed(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_VehicleExceedsMaxCruiseSpeed.is_none() { - let mut __tmp__val__ = self.SpeedAboveMax.equal(&BBoolean::new(false)).and(&self.CruiseActive.equal(&BBoolean::new(false)).or(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))))).booleanValue(); + let mut __tmp__val__ = (self.SpeedAboveMax.equal(&BBoolean::new(false)) && ((self.CruiseActive.equal(&BBoolean::new(false)) || self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))) || ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))))).booleanValue(); self._tr_cache_VehicleExceedsMaxCruiseSpeed = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -700,7 +727,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_ObstacleDistanceBecomesVeryClose(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_ObstacleDistanceBecomesVeryClose.is_none() { - let mut __tmp__val__ = self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg)).booleanValue(); + let mut __tmp__val__ = (self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSneg)).booleanValue(); self._tr_cache_ObstacleDistanceBecomesVeryClose = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -711,7 +738,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_ObstacleDistanceBecomesClose(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_ObstacleDistanceBecomesClose.is_none() { - let mut __tmp__val__ = self.ObstaclePresent.equal(&BBoolean::new(true)).and(&self.CruiseActive.equal(&BBoolean::new(true))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos)).or(&self.ObstacleDistance.equal(&ODset::ODnone).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg)))).booleanValue(); + let mut __tmp__val__ = ((self.ObstaclePresent.equal(&BBoolean::new(true)) && self.CruiseActive.equal(&BBoolean::new(true))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSpos)) || (self.ObstacleDistance.equal(&ODset::ODnone) && self.ObstacleRelativeSpeed.equal(&RSset::RSneg)))).booleanValue(); self._tr_cache_ObstacleDistanceBecomesClose = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -722,7 +749,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_ObstacleDistanceBecomesBig(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_ObstacleDistanceBecomesBig.is_none() { - let mut __tmp__val__ = self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos)).booleanValue(); + let mut __tmp__val__ = (self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSpos)).booleanValue(); self._tr_cache_ObstacleDistanceBecomesBig = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -733,7 +760,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_ObstacleStartsTravelFaster(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_ObstacleStartsTravelFaster.is_none() { - let mut __tmp__val__ = self.ObstaclePresent.equal(&BBoolean::new(true)).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal)).booleanValue(); + let mut __tmp__val__ = (self.ObstaclePresent.equal(&BBoolean::new(true)) && self.ObstacleRelativeSpeed.equal(&RSset::RSequal)).booleanValue(); self._tr_cache_ObstacleStartsTravelFaster = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -778,9 +805,10 @@ impl Cruise_finite1_deterministic_MC { //transition if !is_caching || self._tr_cache_ObstacleAppearsWhenCruiseActive.is_none() { let mut _ic_set_21: BSet<BTuple<RSset, ODset>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_ors_1 in self._RSset.difference(&BSet::new(vec![RSset::RSnone])).clone().iter().cloned() { for _ic_od_1 in self._ODset.difference(&BSet::new(vec![ODset::ODnone])).clone().iter().cloned() { - if (self.ObstaclePresent.equal(&BBoolean::new(false)).and(&self.CruiseActive.equal(&BBoolean::new(true)))).booleanValue() { + if ((self.ObstaclePresent.equal(&BBoolean::new(false)) && self.CruiseActive.equal(&BBoolean::new(true)))).booleanValue() { _ic_set_21 = _ic_set_21._union(&BSet::new(vec![BTuple::from_refs(&_ic_ors_1, &_ic_od_1)])); } @@ -797,8 +825,9 @@ impl Cruise_finite1_deterministic_MC { //transition if !is_caching || self._tr_cache_ObstacleAppearsWhenCruiseInactive.is_none() { let mut _ic_set_22: BSet<RSset> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_ors_1 in self._RSset.difference(&BSet::new(vec![RSset::RSnone])).clone().iter().cloned() { - if (self.ObstaclePresent.equal(&BBoolean::new(false)).and(&self.CruiseActive.equal(&BBoolean::new(false)))).booleanValue() { + if ((self.ObstaclePresent.equal(&BBoolean::new(false)) && self.CruiseActive.equal(&BBoolean::new(false)))).booleanValue() { _ic_set_22 = _ic_set_22._union(&BSet::new(vec![_ic_ors_1])); } @@ -825,9 +854,10 @@ impl Cruise_finite1_deterministic_MC { //transition if !is_caching || self._tr_cache_VehicleManageObstacle.is_none() { let mut _ic_set_24: BSet<BTuple<BBoolean, BBoolean>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_vtks_1 in butils::BOOL.clone().iter().cloned() { for _ic_vtktg_1 in butils::BOOL.clone().iter().cloned() { - if (_ic_vtks_1.equal(&BBoolean::new(true)).or(&_ic_vtktg_1.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true))).and(&self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)))).booleanValue() { + if (((((((((((((_ic_vtks_1.equal(&BBoolean::new(true)) || _ic_vtktg_1.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true))) && self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)))).booleanValue() { _ic_set_24 = _ic_set_24._union(&BSet::new(vec![BTuple::from_refs(&_ic_vtks_1, &_ic_vtktg_1)])); } @@ -843,7 +873,7 @@ impl Cruise_finite1_deterministic_MC { pub fn _tr_ObstacleBecomesOld(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_ObstacleBecomesOld.is_none() { - let mut __tmp__val__ = self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue(); + let mut __tmp__val__ = (((((self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue(); self._tr_cache_ObstacleBecomesOld = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -998,17 +1028,17 @@ impl Cruise_finite1_deterministic_MC { pub fn _check_inv_30(&self) -> bool { //invariant - return self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue(); + return (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue(); } pub fn _check_inv_31(&self) -> bool { //invariant - return self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue(); + return (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue(); } pub fn _check_inv_32(&self) -> bool { //invariant - return self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue(); + return (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue(); } pub fn _check_inv_33(&self) -> bool { @@ -1023,34 +1053,33 @@ impl Cruise_finite1_deterministic_MC { pub fn _check_inv_35(&self) -> bool { //invariant - return self.CruiseActive.equal(&BBoolean::new(true)).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).not())).booleanValue(); + return self.CruiseActive.equal(&BBoolean::new(true)).implies(&((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).not())).booleanValue(); } pub fn _check_inv_36(&self) -> bool { //invariant - return self.ObstacleDistance.equal(&ODset::ODnone).and(&self.CruiseActive.equal(&BBoolean::new(true))).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))).booleanValue(); + return ((self.ObstacleDistance.equal(&ODset::ODnone) && self.CruiseActive.equal(&BBoolean::new(true))) && ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))).booleanValue(); } pub fn _check_inv_37(&self) -> bool { //invariant - return self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).booleanValue(); + return ((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).booleanValue(); } pub fn _check_inv_38(&self) -> bool { //invariant - return self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).booleanValue(); + return (self.ObstacleDistance.equal(&ODset::ODveryclose) && ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).booleanValue(); } pub fn _check_inv_39(&self) -> bool { //invariant - return self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.CruiseActive.equal(&BBoolean::new(true))).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))).booleanValue(); + return (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.CruiseActive.equal(&BBoolean::new(true))) && ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))).booleanValue(); } - fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) { + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { //calling the given functions without caching will recalculate them and cache them afterwards - //if caching is enabled globally, this will just prefill those, if caching is - for trans in to_invalidate.iter() { - match *trans { + for trans in to_invalidate { + match trans { "_tr_CruiseBecomesNotAllowed" => {self._tr_CruiseBecomesNotAllowed(false);}, "_tr_CruiseBecomesAllowed" => {self._tr_CruiseBecomesAllowed(false);}, "_tr_SetCruiseSpeed" => {self._tr_SetCruiseSpeed(false);}, @@ -1085,1211 +1114,559 @@ impl Cruise_finite1_deterministic_MC { //model_check_next_states fn generateNextStates(state: &mut Cruise_finite1_deterministic_MC, isCaching: bool, - invariant_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_invariant_m: Arc<Mutex<HashMap<Cruise_finite1_deterministic_MC, HashSet<&str>>>>, - guard_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_guard_m: Arc<Mutex<HashMap<Cruise_finite1_deterministic_MC, HashSet<&str>>>>, - guardCache: Arc<Mutex<HashMap<Cruise_finite1_deterministic_MC, PersistentHashMap<&str, bool>>>>, - parents_m: Arc<Mutex<HashMap<Cruise_finite1_deterministic_MC, Cruise_finite1_deterministic_MC>>>, - transitions: Arc<AtomicI64>) -> HashSet<Cruise_finite1_deterministic_MC> { - let mut result = HashSet::<Cruise_finite1_deterministic_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_CruiseBecomesNotAllowed(isCaching); - if _trid_1 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.CruiseBecomesNotAllowed(); - match guard_dependency.get("CruiseBecomesNotAllowed") { 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("CruiseBecomesNotAllowed").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("CruiseBecomesNotAllowed").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_CruiseBecomesAllowed(isCaching); - if _trid_2 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.CruiseBecomesAllowed(); - match guard_dependency.get("CruiseBecomesAllowed") { 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("CruiseBecomesAllowed").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("CruiseBecomesAllowed").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_SetCruiseSpeed(isCaching); - for param in _trid_3.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.SetCruiseSpeed(_tmp_2, _tmp_1); - match guard_dependency.get("SetCruiseSpeed") { 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("SetCruiseSpeed").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("SetCruiseSpeed").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_CCInitialisationFinished(isCaching); - for param in _trid_4.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.CCInitialisationFinished(_tmp_2, _tmp_1); - match guard_dependency.get("CCInitialisationFinished") { 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("CCInitialisationFinished").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("CCInitialisationFinished").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_5 = state._tr_CCInitialisationDelayFinished(isCaching); - if _trid_5 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.CCInitialisationDelayFinished(); - match guard_dependency.get("CCInitialisationDelayFinished") { 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("CCInitialisationDelayFinished").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("CCInitialisationDelayFinished").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_CruiseSpeedChangeFinished(isCaching); - for param in _trid_6.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.CruiseSpeedChangeFinished(_tmp_2, _tmp_1); - match guard_dependency.get("CruiseSpeedChangeFinished") { 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("CruiseSpeedChangeFinished").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("CruiseSpeedChangeFinished").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_7 = state._tr_CruiseSpeedChangeDelayFinished(isCaching); - if _trid_7 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.CruiseSpeedChangeDelayFinished(); - match guard_dependency.get("CruiseSpeedChangeDelayFinished") { 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("CruiseSpeedChangeDelayFinished").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("CruiseSpeedChangeDelayFinished").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_8 = state._tr_CruiseOff(isCaching); - if _trid_8 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.CruiseOff(); - match guard_dependency.get("CruiseOff") { 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("CruiseOff").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("CruiseOff").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_9 = state._tr_ExternalForcesBecomesExtreme(isCaching); - if _trid_9 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ExternalForcesBecomesExtreme(); - match guard_dependency.get("ExternalForcesBecomesExtreme") { 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("ExternalForcesBecomesExtreme").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ExternalForcesBecomesExtreme").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_10 = state._tr_ExternalForcesBecomesNormal(isCaching); - if _trid_10 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ExternalForcesBecomesNormal(); - match guard_dependency.get("ExternalForcesBecomesNormal") { 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("ExternalForcesBecomesNormal").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ExternalForcesBecomesNormal").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_11 = state._tr_VehicleLeavesCruiseSpeed(isCaching); - if _trid_11 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.VehicleLeavesCruiseSpeed(); - match guard_dependency.get("VehicleLeavesCruiseSpeed") { 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("VehicleLeavesCruiseSpeed").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("VehicleLeavesCruiseSpeed").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_12 = state._tr_VehicleReachesCruiseSpeed(isCaching); - if _trid_12 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.VehicleReachesCruiseSpeed(); - match guard_dependency.get("VehicleReachesCruiseSpeed") { 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("VehicleReachesCruiseSpeed").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("VehicleReachesCruiseSpeed").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_13 = state._tr_VehicleExceedsMaxCruiseSpeed(isCaching); - if _trid_13 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.VehicleExceedsMaxCruiseSpeed(); - match guard_dependency.get("VehicleExceedsMaxCruiseSpeed") { 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("VehicleExceedsMaxCruiseSpeed").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("VehicleExceedsMaxCruiseSpeed").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_14 = state._tr_VehicleFallsBelowMaxCruiseSpeed(isCaching); - if _trid_14 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.VehicleFallsBelowMaxCruiseSpeed(); - match guard_dependency.get("VehicleFallsBelowMaxCruiseSpeed") { 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("VehicleFallsBelowMaxCruiseSpeed").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("VehicleFallsBelowMaxCruiseSpeed").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_15 = state._tr_ObstacleDistanceBecomesVeryClose(isCaching); - if _trid_15 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleDistanceBecomesVeryClose(); - match guard_dependency.get("ObstacleDistanceBecomesVeryClose") { 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("ObstacleDistanceBecomesVeryClose").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleDistanceBecomesVeryClose").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_16 = state._tr_ObstacleDistanceBecomesClose(isCaching); - if _trid_16 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleDistanceBecomesClose(); - match guard_dependency.get("ObstacleDistanceBecomesClose") { 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("ObstacleDistanceBecomesClose").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleDistanceBecomesClose").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_17 = state._tr_ObstacleDistanceBecomesBig(isCaching); - if _trid_17 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleDistanceBecomesBig(); - match guard_dependency.get("ObstacleDistanceBecomesBig") { 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("ObstacleDistanceBecomesBig").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleDistanceBecomesBig").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_18 = state._tr_ObstacleStartsTravelFaster(isCaching); - if _trid_18 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleStartsTravelFaster(); - match guard_dependency.get("ObstacleStartsTravelFaster") { 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("ObstacleStartsTravelFaster").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleStartsTravelFaster").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_19 = state._tr_ObstacleStopsTravelFaster(isCaching); - if _trid_19 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleStopsTravelFaster(); - match guard_dependency.get("ObstacleStopsTravelFaster") { 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("ObstacleStopsTravelFaster").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleStopsTravelFaster").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_20 = state._tr_ObstacleStartsTravelSlower(isCaching); - if _trid_20 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleStartsTravelSlower(); - match guard_dependency.get("ObstacleStartsTravelSlower") { 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("ObstacleStartsTravelSlower").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleStartsTravelSlower").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_21 = state._tr_ObstacleStopsTravelSlower(isCaching); - if _trid_21 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleStopsTravelSlower(); - match guard_dependency.get("ObstacleStopsTravelSlower") { 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("ObstacleStopsTravelSlower").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleStopsTravelSlower").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_22 = state._tr_ObstacleAppearsWhenCruiseActive(isCaching); - for param in _trid_22.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.ObstacleAppearsWhenCruiseActive(_tmp_2, _tmp_1); - match guard_dependency.get("ObstacleAppearsWhenCruiseActive") { 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("ObstacleAppearsWhenCruiseActive").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleAppearsWhenCruiseActive").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_23 = state._tr_ObstacleAppearsWhenCruiseInactive(isCaching); - for param in _trid_23.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.ObstacleAppearsWhenCruiseInactive(_tmp_1); - match guard_dependency.get("ObstacleAppearsWhenCruiseInactive") { 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("ObstacleAppearsWhenCruiseInactive").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleAppearsWhenCruiseInactive").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_24 = state._tr_ObstacleDisappears(isCaching); - if _trid_24 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleDisappears(); - match guard_dependency.get("ObstacleDisappears") { 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("ObstacleDisappears").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleDisappears").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_25 = state._tr_VehicleManageObstacle(isCaching); - for param in _trid_25.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.VehicleManageObstacle(_tmp_2, _tmp_1); - match guard_dependency.get("VehicleManageObstacle") { 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("VehicleManageObstacle").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("VehicleManageObstacle").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_26 = state._tr_ObstacleBecomesOld(isCaching); - if _trid_26 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleBecomesOld(); - match guard_dependency.get("ObstacleBecomesOld") { 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("ObstacleBecomesOld").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleBecomesOld").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } + transitions: Arc<AtomicU64>) -> HashSet<(Cruise_finite1_deterministic_MC, &'static str)> { + let mut result = HashSet::<(Cruise_finite1_deterministic_MC, &'static str)>::new(); + let mut evaluated_transitions: u64 = 0; + //model_check_transition + if state._tr_CruiseBecomesNotAllowed(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.CruiseBecomesNotAllowed(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CruiseBecomesNotAllowed")); } + result.insert((copiedState, "CruiseBecomesNotAllowed")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_CruiseBecomesAllowed(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.CruiseBecomesAllowed(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CruiseBecomesAllowed")); } + result.insert((copiedState, "CruiseBecomesAllowed")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_3 = state._tr_SetCruiseSpeed(isCaching); + for param in _trid_3.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.SetCruiseSpeed(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("SetCruiseSpeed")); } + result.insert((copiedState, "SetCruiseSpeed")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_4 = state._tr_CCInitialisationFinished(isCaching); + for param in _trid_4.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.CCInitialisationFinished(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CCInitialisationFinished")); } + result.insert((copiedState, "CCInitialisationFinished")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_CCInitialisationDelayFinished(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.CCInitialisationDelayFinished(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CCInitialisationDelayFinished")); } + result.insert((copiedState, "CCInitialisationDelayFinished")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_6 = state._tr_CruiseSpeedChangeFinished(isCaching); + for param in _trid_6.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.CruiseSpeedChangeFinished(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CruiseSpeedChangeFinished")); } + result.insert((copiedState, "CruiseSpeedChangeFinished")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_CruiseSpeedChangeDelayFinished(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.CruiseSpeedChangeDelayFinished(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CruiseSpeedChangeDelayFinished")); } + result.insert((copiedState, "CruiseSpeedChangeDelayFinished")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_CruiseOff(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.CruiseOff(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CruiseOff")); } + result.insert((copiedState, "CruiseOff")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ExternalForcesBecomesExtreme(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ExternalForcesBecomesExtreme(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ExternalForcesBecomesExtreme")); } + result.insert((copiedState, "ExternalForcesBecomesExtreme")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ExternalForcesBecomesNormal(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ExternalForcesBecomesNormal(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ExternalForcesBecomesNormal")); } + result.insert((copiedState, "ExternalForcesBecomesNormal")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_VehicleLeavesCruiseSpeed(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.VehicleLeavesCruiseSpeed(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("VehicleLeavesCruiseSpeed")); } + result.insert((copiedState, "VehicleLeavesCruiseSpeed")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_VehicleReachesCruiseSpeed(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.VehicleReachesCruiseSpeed(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("VehicleReachesCruiseSpeed")); } + result.insert((copiedState, "VehicleReachesCruiseSpeed")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_VehicleExceedsMaxCruiseSpeed(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.VehicleExceedsMaxCruiseSpeed(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("VehicleExceedsMaxCruiseSpeed")); } + result.insert((copiedState, "VehicleExceedsMaxCruiseSpeed")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_VehicleFallsBelowMaxCruiseSpeed(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.VehicleFallsBelowMaxCruiseSpeed(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("VehicleFallsBelowMaxCruiseSpeed")); } + result.insert((copiedState, "VehicleFallsBelowMaxCruiseSpeed")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ObstacleDistanceBecomesVeryClose(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ObstacleDistanceBecomesVeryClose(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleDistanceBecomesVeryClose")); } + result.insert((copiedState, "ObstacleDistanceBecomesVeryClose")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ObstacleDistanceBecomesClose(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ObstacleDistanceBecomesClose(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleDistanceBecomesClose")); } + result.insert((copiedState, "ObstacleDistanceBecomesClose")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ObstacleDistanceBecomesBig(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ObstacleDistanceBecomesBig(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleDistanceBecomesBig")); } + result.insert((copiedState, "ObstacleDistanceBecomesBig")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ObstacleStartsTravelFaster(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ObstacleStartsTravelFaster(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleStartsTravelFaster")); } + result.insert((copiedState, "ObstacleStartsTravelFaster")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ObstacleStopsTravelFaster(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ObstacleStopsTravelFaster(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleStopsTravelFaster")); } + result.insert((copiedState, "ObstacleStopsTravelFaster")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ObstacleStartsTravelSlower(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ObstacleStartsTravelSlower(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleStartsTravelSlower")); } + result.insert((copiedState, "ObstacleStartsTravelSlower")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ObstacleStopsTravelSlower(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ObstacleStopsTravelSlower(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleStopsTravelSlower")); } + result.insert((copiedState, "ObstacleStopsTravelSlower")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_22 = state._tr_ObstacleAppearsWhenCruiseActive(isCaching); + for param in _trid_22.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.ObstacleAppearsWhenCruiseActive(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleAppearsWhenCruiseActive")); } + result.insert((copiedState, "ObstacleAppearsWhenCruiseActive")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_23 = state._tr_ObstacleAppearsWhenCruiseInactive(isCaching); + for param in _trid_23.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.ObstacleAppearsWhenCruiseInactive(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleAppearsWhenCruiseInactive")); } + result.insert((copiedState, "ObstacleAppearsWhenCruiseInactive")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ObstacleDisappears(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ObstacleDisappears(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleDisappears")); } + result.insert((copiedState, "ObstacleDisappears")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_25 = state._tr_VehicleManageObstacle(isCaching); + for param in _trid_25.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.VehicleManageObstacle(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("VehicleManageObstacle")); } + result.insert((copiedState, "VehicleManageObstacle")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_ObstacleBecomesOld(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.ObstacleBecomesOld(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleBecomesOld")); } + result.insert((copiedState, "ObstacleBecomesOld")); + evaluated_transitions += 1; + } - guardCache.lock().unwrap().insert(state.clone(), newCache); - } else { - //model_check_transition - if state._tr_CruiseBecomesNotAllowed(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.CruiseBecomesNotAllowed(); - match guard_dependency.get("CruiseBecomesNotAllowed") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_CruiseBecomesAllowed(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.CruiseBecomesAllowed(); - match guard_dependency.get("CruiseBecomesAllowed") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_SetCruiseSpeed(isCaching); - for param in _trid_3.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.SetCruiseSpeed(_tmp_2, _tmp_1); - match guard_dependency.get("SetCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_CCInitialisationFinished(isCaching); - for param in _trid_4.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.CCInitialisationFinished(_tmp_2, _tmp_1); - match guard_dependency.get("CCInitialisationFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_CCInitialisationDelayFinished(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.CCInitialisationDelayFinished(); - match guard_dependency.get("CCInitialisationDelayFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_CruiseSpeedChangeFinished(isCaching); - for param in _trid_6.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.CruiseSpeedChangeFinished(_tmp_2, _tmp_1); - match guard_dependency.get("CruiseSpeedChangeFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_CruiseSpeedChangeDelayFinished(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.CruiseSpeedChangeDelayFinished(); - match guard_dependency.get("CruiseSpeedChangeDelayFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_CruiseOff(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.CruiseOff(); - match guard_dependency.get("CruiseOff") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ExternalForcesBecomesExtreme(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ExternalForcesBecomesExtreme(); - match guard_dependency.get("ExternalForcesBecomesExtreme") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ExternalForcesBecomesNormal(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ExternalForcesBecomesNormal(); - match guard_dependency.get("ExternalForcesBecomesNormal") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_VehicleLeavesCruiseSpeed(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.VehicleLeavesCruiseSpeed(); - match guard_dependency.get("VehicleLeavesCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_VehicleReachesCruiseSpeed(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.VehicleReachesCruiseSpeed(); - match guard_dependency.get("VehicleReachesCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_VehicleExceedsMaxCruiseSpeed(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.VehicleExceedsMaxCruiseSpeed(); - match guard_dependency.get("VehicleExceedsMaxCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_VehicleFallsBelowMaxCruiseSpeed(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.VehicleFallsBelowMaxCruiseSpeed(); - match guard_dependency.get("VehicleFallsBelowMaxCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ObstacleDistanceBecomesVeryClose(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleDistanceBecomesVeryClose(); - match guard_dependency.get("ObstacleDistanceBecomesVeryClose") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ObstacleDistanceBecomesClose(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleDistanceBecomesClose(); - match guard_dependency.get("ObstacleDistanceBecomesClose") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ObstacleDistanceBecomesBig(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleDistanceBecomesBig(); - match guard_dependency.get("ObstacleDistanceBecomesBig") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ObstacleStartsTravelFaster(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleStartsTravelFaster(); - match guard_dependency.get("ObstacleStartsTravelFaster") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ObstacleStopsTravelFaster(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleStopsTravelFaster(); - match guard_dependency.get("ObstacleStopsTravelFaster") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ObstacleStartsTravelSlower(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleStartsTravelSlower(); - match guard_dependency.get("ObstacleStartsTravelSlower") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ObstacleStopsTravelSlower(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleStopsTravelSlower(); - match guard_dependency.get("ObstacleStopsTravelSlower") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_22 = state._tr_ObstacleAppearsWhenCruiseActive(isCaching); - for param in _trid_22.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.ObstacleAppearsWhenCruiseActive(_tmp_2, _tmp_1); - match guard_dependency.get("ObstacleAppearsWhenCruiseActive") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_23 = state._tr_ObstacleAppearsWhenCruiseInactive(isCaching); - for param in _trid_23.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.ObstacleAppearsWhenCruiseInactive(_tmp_1); - match guard_dependency.get("ObstacleAppearsWhenCruiseInactive") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ObstacleDisappears(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleDisappears(); - match guard_dependency.get("ObstacleDisappears") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_25 = state._tr_VehicleManageObstacle(isCaching); - for param in _trid_25.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.VehicleManageObstacle(_tmp_2, _tmp_1); - match guard_dependency.get("VehicleManageObstacle") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_ObstacleBecomesOld(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.ObstacleBecomesOld(); - match guard_dependency.get("ObstacleBecomesOld") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - } + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); return result; } //model_check_evaluate_state //model_check_invariants - pub fn checkInvariants(state: &Cruise_finite1_deterministic_MC, - isCaching: bool, - dependent_invariant_m: Arc<Mutex<HashMap<Cruise_finite1_deterministic_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(); + pub fn checkInvariants(state: &Cruise_finite1_deterministic_MC, last_op: &'static str, isCaching: bool) -> bool { + if isCaching { + let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op); //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_1") { + if dependent_invariants_of_state.contains(&"_check_inv_1") { if !state._check_inv_1() { + println!("_check_inv_1 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_2") { + if dependent_invariants_of_state.contains(&"_check_inv_2") { if !state._check_inv_2() { + println!("_check_inv_2 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_3") { + if dependent_invariants_of_state.contains(&"_check_inv_3") { if !state._check_inv_3() { + println!("_check_inv_3 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_4") { + if dependent_invariants_of_state.contains(&"_check_inv_4") { if !state._check_inv_4() { + println!("_check_inv_4 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_5") { + if dependent_invariants_of_state.contains(&"_check_inv_5") { if !state._check_inv_5() { + println!("_check_inv_5 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_6") { + if dependent_invariants_of_state.contains(&"_check_inv_6") { if !state._check_inv_6() { + println!("_check_inv_6 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_7") { + if dependent_invariants_of_state.contains(&"_check_inv_7") { if !state._check_inv_7() { + println!("_check_inv_7 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_8") { + if dependent_invariants_of_state.contains(&"_check_inv_8") { if !state._check_inv_8() { + println!("_check_inv_8 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_9") { + if dependent_invariants_of_state.contains(&"_check_inv_9") { if !state._check_inv_9() { + println!("_check_inv_9 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_10") { + if dependent_invariants_of_state.contains(&"_check_inv_10") { if !state._check_inv_10() { + println!("_check_inv_10 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_11") { + if dependent_invariants_of_state.contains(&"_check_inv_11") { if !state._check_inv_11() { + println!("_check_inv_11 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_12") { + if dependent_invariants_of_state.contains(&"_check_inv_12") { if !state._check_inv_12() { + println!("_check_inv_12 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_13") { + if dependent_invariants_of_state.contains(&"_check_inv_13") { if !state._check_inv_13() { + println!("_check_inv_13 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_14") { + if dependent_invariants_of_state.contains(&"_check_inv_14") { if !state._check_inv_14() { + println!("_check_inv_14 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_15") { + if dependent_invariants_of_state.contains(&"_check_inv_15") { if !state._check_inv_15() { + println!("_check_inv_15 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_16") { + if dependent_invariants_of_state.contains(&"_check_inv_16") { if !state._check_inv_16() { + println!("_check_inv_16 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_17") { + if dependent_invariants_of_state.contains(&"_check_inv_17") { if !state._check_inv_17() { + println!("_check_inv_17 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_18") { + if dependent_invariants_of_state.contains(&"_check_inv_18") { if !state._check_inv_18() { + println!("_check_inv_18 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_19") { + if dependent_invariants_of_state.contains(&"_check_inv_19") { if !state._check_inv_19() { + println!("_check_inv_19 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_20") { + if dependent_invariants_of_state.contains(&"_check_inv_20") { if !state._check_inv_20() { + println!("_check_inv_20 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_21") { + if dependent_invariants_of_state.contains(&"_check_inv_21") { if !state._check_inv_21() { + println!("_check_inv_21 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_22") { + if dependent_invariants_of_state.contains(&"_check_inv_22") { if !state._check_inv_22() { + println!("_check_inv_22 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_23") { + if dependent_invariants_of_state.contains(&"_check_inv_23") { if !state._check_inv_23() { + println!("_check_inv_23 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_24") { + if dependent_invariants_of_state.contains(&"_check_inv_24") { if !state._check_inv_24() { + println!("_check_inv_24 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_25") { + if dependent_invariants_of_state.contains(&"_check_inv_25") { if !state._check_inv_25() { + println!("_check_inv_25 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_26") { + if dependent_invariants_of_state.contains(&"_check_inv_26") { if !state._check_inv_26() { + println!("_check_inv_26 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_27") { + if dependent_invariants_of_state.contains(&"_check_inv_27") { if !state._check_inv_27() { + println!("_check_inv_27 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_28") { + if dependent_invariants_of_state.contains(&"_check_inv_28") { if !state._check_inv_28() { + println!("_check_inv_28 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_29") { + if dependent_invariants_of_state.contains(&"_check_inv_29") { if !state._check_inv_29() { + println!("_check_inv_29 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_30") { + if dependent_invariants_of_state.contains(&"_check_inv_30") { if !state._check_inv_30() { + println!("_check_inv_30 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_31") { + if dependent_invariants_of_state.contains(&"_check_inv_31") { if !state._check_inv_31() { + println!("_check_inv_31 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_32") { + if dependent_invariants_of_state.contains(&"_check_inv_32") { if !state._check_inv_32() { + println!("_check_inv_32 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_33") { + if dependent_invariants_of_state.contains(&"_check_inv_33") { if !state._check_inv_33() { + println!("_check_inv_33 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_34") { + if dependent_invariants_of_state.contains(&"_check_inv_34") { if !state._check_inv_34() { + println!("_check_inv_34 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_35") { + if dependent_invariants_of_state.contains(&"_check_inv_35") { if !state._check_inv_35() { + println!("_check_inv_35 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_36") { + if dependent_invariants_of_state.contains(&"_check_inv_36") { if !state._check_inv_36() { + println!("_check_inv_36 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_37") { + if dependent_invariants_of_state.contains(&"_check_inv_37") { if !state._check_inv_37() { + println!("_check_inv_37 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_38") { + if dependent_invariants_of_state.contains(&"_check_inv_38") { if !state._check_inv_38() { + println!("_check_inv_38 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_39") { + if dependent_invariants_of_state.contains(&"_check_inv_39") { if !state._check_inv_39() { + println!("_check_inv_39 failed!"); return false; } } @@ -2299,16 +1676,14 @@ impl Cruise_finite1_deterministic_MC { } //model_check_print - fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) { - if deadlock_detected { println!("DEADLOCK DETECTED"); } - if invariant_violated { println!("INVARIANT VIOLATED"); } - if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); } + fn print_result(states: usize, transitions: u64, error_detected: bool) { + if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); } println!("Number of States: {}", states); println!("Number of Transitions: {}", transitions); } //model_check_main - fn next(collection_m: Arc<Mutex<LinkedList<Cruise_finite1_deterministic_MC>>>, mc_type: MC_TYPE) -> Cruise_finite1_deterministic_MC { + fn next(collection_m: Arc<Mutex<LinkedList<(Cruise_finite1_deterministic_MC, &'static str)>>>, mc_type: MC_TYPE) -> (Cruise_finite1_deterministic_MC, &'static str) { let mut collection = collection_m.lock().unwrap(); return match mc_type { MC_TYPE::BFS => collection.pop_front().unwrap(), @@ -2317,172 +1692,160 @@ impl Cruise_finite1_deterministic_MC { }; } - fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { - let mut machine = Cruise_finite1_deterministic_MC::new(); - - let invariant_violated = AtomicBool::new(false); - let deadlock_detected = AtomicBool::new(false); - let stop_threads = AtomicBool::new(false); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() || !machine._check_inv_21() || !machine._check_inv_22() || !machine._check_inv_23() || !machine._check_inv_24() || !machine._check_inv_25() || !machine._check_inv_26() || !machine._check_inv_27() || !machine._check_inv_28() || !machine._check_inv_29() || !machine._check_inv_30() || !machine._check_inv_31() || !machine._check_inv_32() || !machine._check_inv_33() || !machine._check_inv_34() || !machine._check_inv_35() || !machine._check_inv_36() || !machine._check_inv_37() || !machine._check_inv_38() || !machine._check_inv_39() { - invariant_violated.store(true, Ordering::Release); - } - - let mut states = HashSet::<Cruise_finite1_deterministic_MC>::new(); - states.insert(machine.clone()); - let number_states = AtomicI64::new(1); - - let collection_m = Arc::new(Mutex::new(LinkedList::<Cruise_finite1_deterministic_MC>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<Cruise_finite1_deterministic_MC, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, HashSet<&str>>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, Cruise_finite1_deterministic_MC>::new())); - - if is_caching { + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - invariantDependency.insert("ObstacleStopsTravelSlower", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"])); + "ObstacleStopsTravelSlower" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"], //model_check_init_static - invariantDependency.insert("SetCruiseSpeed", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_34", "_check_inv_33", "_check_inv_26", "_check_inv_21", "_check_inv_20", "_check_inv_4", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"])); + "SetCruiseSpeed" => vec!["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleAppearsWhenCruiseInactive"], //model_check_init_static - invariantDependency.insert("VehicleLeavesCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_34"])); + "VehicleLeavesCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"], //model_check_init_static - invariantDependency.insert("VehicleFallsBelowMaxCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"])); + "VehicleFallsBelowMaxCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"], //model_check_init_static - invariantDependency.insert("CCInitialisationFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"])); + "CCInitialisationFinished" => vec!["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"], //model_check_init_static - invariantDependency.insert("VehicleReachesCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_34"])); + "VehicleReachesCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"], //model_check_init_static - invariantDependency.insert("ObstacleAppearsWhenCruiseActive", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"])); + "ObstacleAppearsWhenCruiseActive" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"], //model_check_init_static - invariantDependency.insert("ObstacleStartsTravelSlower", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"])); + "ObstacleStartsTravelSlower" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"], //model_check_init_static - invariantDependency.insert("CruiseBecomesNotAllowed", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3", "_check_inv_1"])); + "CruiseBecomesNotAllowed" => vec!["_tr_SetCruiseSpeed", "_tr_VehicleManageObstacle", "_tr_CruiseBecomesAllowed", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseBecomesNotAllowed", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"], //model_check_init_static - invariantDependency.insert("ObstacleAppearsWhenCruiseInactive", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_36", "_check_inv_13", "_check_inv_12", "_check_inv_23", "_check_inv_11"])); + "ObstacleAppearsWhenCruiseInactive" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"], //model_check_init_static - invariantDependency.insert("CCInitialisationDelayFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_36", "_check_inv_25", "_check_inv_35"])); + "CCInitialisationDelayFinished" => vec!["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"], //model_check_init_static - invariantDependency.insert("ObstacleDistanceBecomesClose", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"])); + "ObstacleDistanceBecomesClose" => vec!["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"], //model_check_init_static - invariantDependency.insert("ObstacleStartsTravelFaster", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"])); + "ObstacleStartsTravelFaster" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"], //model_check_init_static - invariantDependency.insert("ExternalForcesBecomesExtreme", HashSet::from(["_check_inv_18", "_check_inv_4"])); + "ExternalForcesBecomesExtreme" => vec!["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"], //model_check_init_static - invariantDependency.insert("CruiseOff", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"])); + "CruiseOff" => vec!["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"], //model_check_init_static - invariantDependency.insert("CruiseSpeedChangeDelayFinished", HashSet::from(["_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_37", "_check_inv_26", "_check_inv_36", "_check_inv_35"])); + "CruiseSpeedChangeDelayFinished" => vec!["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"], //model_check_init_static - invariantDependency.insert("ObstacleStopsTravelFaster", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"])); + "ObstacleStopsTravelFaster" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"], //model_check_init_static - invariantDependency.insert("ObstacleDistanceBecomesVeryClose", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"])); + "ObstacleDistanceBecomesVeryClose" => vec!["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"], //model_check_init_static - invariantDependency.insert("VehicleManageObstacle", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"])); + "VehicleManageObstacle" => vec!["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"], //model_check_init_static - invariantDependency.insert("CruiseBecomesAllowed", HashSet::from(["_check_inv_1", "_check_inv_33"])); + "CruiseBecomesAllowed" => vec!["_tr_SetCruiseSpeed", "_tr_CruiseBecomesAllowed", "_tr_CruiseBecomesNotAllowed"], //model_check_init_static - invariantDependency.insert("VehicleExceedsMaxCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"])); + "VehicleExceedsMaxCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"], //model_check_init_static - invariantDependency.insert("CruiseSpeedChangeFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"])); + "CruiseSpeedChangeFinished" => vec!["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"], //model_check_init_static - invariantDependency.insert("ObstacleDisappears", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"])); + "ObstacleDisappears" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"], //model_check_init_static - invariantDependency.insert("ExternalForcesBecomesNormal", HashSet::from(["_check_inv_18", "_check_inv_4"])); + "ExternalForcesBecomesNormal" => vec!["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"], //model_check_init_static - invariantDependency.insert("ObstacleBecomesOld", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24"])); + "ObstacleBecomesOld" => vec!["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"], //model_check_init_static - invariantDependency.insert("ObstacleDistanceBecomesBig", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"])); + "ObstacleDistanceBecomesBig" => vec!["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"], + _ => vec![], + } + } + + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - guardDependency.insert("ObstacleStopsTravelSlower", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"])); + "ObstacleStopsTravelSlower" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"], //model_check_init_static - guardDependency.insert("SetCruiseSpeed", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleAppearsWhenCruiseInactive"])); + "SetCruiseSpeed" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_34", "_check_inv_33", "_check_inv_26", "_check_inv_21", "_check_inv_20", "_check_inv_4", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"], //model_check_init_static - guardDependency.insert("VehicleLeavesCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"])); + "VehicleLeavesCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_34"], //model_check_init_static - guardDependency.insert("VehicleFallsBelowMaxCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"])); + "VehicleFallsBelowMaxCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"], //model_check_init_static - guardDependency.insert("CCInitialisationFinished", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"])); + "CCInitialisationFinished" => vec!["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"], //model_check_init_static - guardDependency.insert("VehicleReachesCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"])); + "VehicleReachesCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_34"], //model_check_init_static - guardDependency.insert("ObstacleAppearsWhenCruiseActive", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"])); + "ObstacleAppearsWhenCruiseActive" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"], //model_check_init_static - guardDependency.insert("ObstacleStartsTravelSlower", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"])); + "ObstacleStartsTravelSlower" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"], //model_check_init_static - guardDependency.insert("CruiseBecomesNotAllowed", HashSet::from(["_tr_SetCruiseSpeed", "_tr_VehicleManageObstacle", "_tr_CruiseBecomesAllowed", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseBecomesNotAllowed", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"])); + "CruiseBecomesNotAllowed" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3", "_check_inv_1"], //model_check_init_static - guardDependency.insert("ObstacleAppearsWhenCruiseInactive", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"])); + "ObstacleAppearsWhenCruiseInactive" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_36", "_check_inv_13", "_check_inv_12", "_check_inv_23", "_check_inv_11"], //model_check_init_static - guardDependency.insert("CCInitialisationDelayFinished", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); + "CCInitialisationDelayFinished" => vec!["_check_inv_39", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_36", "_check_inv_25", "_check_inv_35"], //model_check_init_static - guardDependency.insert("ObstacleDistanceBecomesClose", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); + "ObstacleDistanceBecomesClose" => vec!["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"], //model_check_init_static - guardDependency.insert("ObstacleStartsTravelFaster", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"])); + "ObstacleStartsTravelFaster" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"], //model_check_init_static - guardDependency.insert("ExternalForcesBecomesExtreme", HashSet::from(["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"])); + "ExternalForcesBecomesExtreme" => vec!["_check_inv_18", "_check_inv_4"], //model_check_init_static - guardDependency.insert("CruiseOff", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"])); + "CruiseOff" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"], //model_check_init_static - guardDependency.insert("CruiseSpeedChangeDelayFinished", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); + "CruiseSpeedChangeDelayFinished" => vec!["_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_37", "_check_inv_26", "_check_inv_36", "_check_inv_35"], //model_check_init_static - guardDependency.insert("ObstacleStopsTravelFaster", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"])); + "ObstacleStopsTravelFaster" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"], //model_check_init_static - guardDependency.insert("ObstacleDistanceBecomesVeryClose", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); + "ObstacleDistanceBecomesVeryClose" => vec!["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"], //model_check_init_static - guardDependency.insert("VehicleManageObstacle", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"])); + "VehicleManageObstacle" => vec!["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"], //model_check_init_static - guardDependency.insert("CruiseBecomesAllowed", HashSet::from(["_tr_SetCruiseSpeed", "_tr_CruiseBecomesAllowed", "_tr_CruiseBecomesNotAllowed"])); + "CruiseBecomesAllowed" => vec!["_check_inv_1", "_check_inv_33"], //model_check_init_static - guardDependency.insert("VehicleExceedsMaxCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"])); + "VehicleExceedsMaxCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"], //model_check_init_static - guardDependency.insert("CruiseSpeedChangeFinished", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"])); + "CruiseSpeedChangeFinished" => vec!["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"], //model_check_init_static - guardDependency.insert("ObstacleDisappears", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"])); + "ObstacleDisappears" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"], //model_check_init_static - guardDependency.insert("ExternalForcesBecomesNormal", HashSet::from(["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"])); + "ExternalForcesBecomesNormal" => vec!["_check_inv_18", "_check_inv_4"], //model_check_init_static - guardDependency.insert("ObstacleBecomesOld", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); + "ObstacleBecomesOld" => vec!["_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24"], //model_check_init_static - guardDependency.insert("ObstacleDistanceBecomesBig", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); + "ObstacleDistanceBecomesBig" => vec!["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"], + _ => vec![], } + } - let transitions = Arc::new(AtomicI64::new(0)); + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { + let mut machine = Cruise_finite1_deterministic_MC::new(); - while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - let mut state = Self::next(Arc::clone(&collection_m), mc_type); + let mut all_states = HashSet::<Cruise_finite1_deterministic_MC>::new(); + all_states.insert(machine.clone()); - 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 states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Cruise_finite1_deterministic_MC, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine.clone(), "")); - next_states.iter().cloned().for_each(|next_state| { - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection_m.lock().unwrap().push_back(next_state); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - }); + let num_transitions = Arc::new(AtomicU64::new(0)); + + let mut stop_threads = false; + + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions)); + + if !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); + print!("DEADLOCK DETECTED"); + stop_threads = true; } - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| all_states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op))); + if all_states.len() % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } } - Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { @@ -2490,207 +1853,66 @@ impl Cruise_finite1_deterministic_MC { let machine = Cruise_finite1_deterministic_MC::new(); + let all_states = Arc::new(DashSet::<Cruise_finite1_deterministic_MC>::new()); + all_states.insert(machine.clone()); - let invariant_violated_b = Arc::new(AtomicBool::new(false)); - let deadlock_detected_b = Arc::new(AtomicBool::new(false)); - let stop_threads_b = Arc::new(AtomicBool::new(false)); - let possible_queue_changes_b = Arc::new(AtomicI32::new(0)); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() || !machine._check_inv_21() || !machine._check_inv_22() || !machine._check_inv_23() || !machine._check_inv_24() || !machine._check_inv_25() || !machine._check_inv_26() || !machine._check_inv_27() || !machine._check_inv_28() || !machine._check_inv_29() || !machine._check_inv_30() || !machine._check_inv_31() || !machine._check_inv_32() || !machine._check_inv_33() || !machine._check_inv_34() || !machine._check_inv_35() || !machine._check_inv_36() || !machine._check_inv_37() || !machine._check_inv_38() || !machine._check_inv_39() { - invariant_violated_b.store(true, Ordering::Release); - } - - let states_m = Arc::new(Mutex::new(HashSet::<Cruise_finite1_deterministic_MC>::new())); - states_m.lock().unwrap().insert(machine.clone()); - let number_states_arc = Arc::new(AtomicI64::new(1)); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Cruise_finite1_deterministic_MC, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); - let collection_m = Arc::new(Mutex::new(LinkedList::<Cruise_finite1_deterministic_MC>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); + let num_transitions = Arc::new(AtomicU64::new(0)); - 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::<Cruise_finite1_deterministic_MC, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, HashSet<&str>>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, Cruise_finite1_deterministic_MC>::new())); - - if is_caching { - //model_check_init_static - invariantDependency.insert("ObstacleStopsTravelSlower", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"])); - //model_check_init_static - invariantDependency.insert("SetCruiseSpeed", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_34", "_check_inv_33", "_check_inv_26", "_check_inv_21", "_check_inv_20", "_check_inv_4", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"])); - //model_check_init_static - invariantDependency.insert("VehicleLeavesCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_34"])); - //model_check_init_static - invariantDependency.insert("VehicleFallsBelowMaxCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"])); - //model_check_init_static - invariantDependency.insert("CCInitialisationFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"])); - //model_check_init_static - invariantDependency.insert("VehicleReachesCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_34"])); - //model_check_init_static - invariantDependency.insert("ObstacleAppearsWhenCruiseActive", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("ObstacleStartsTravelSlower", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"])); - //model_check_init_static - invariantDependency.insert("CruiseBecomesNotAllowed", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3", "_check_inv_1"])); - //model_check_init_static - invariantDependency.insert("ObstacleAppearsWhenCruiseInactive", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_36", "_check_inv_13", "_check_inv_12", "_check_inv_23", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("CCInitialisationDelayFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_36", "_check_inv_25", "_check_inv_35"])); - //model_check_init_static - invariantDependency.insert("ObstacleDistanceBecomesClose", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"])); - //model_check_init_static - invariantDependency.insert("ObstacleStartsTravelFaster", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"])); - //model_check_init_static - invariantDependency.insert("ExternalForcesBecomesExtreme", HashSet::from(["_check_inv_18", "_check_inv_4"])); - //model_check_init_static - invariantDependency.insert("CruiseOff", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"])); - //model_check_init_static - invariantDependency.insert("CruiseSpeedChangeDelayFinished", HashSet::from(["_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_37", "_check_inv_26", "_check_inv_36", "_check_inv_35"])); - //model_check_init_static - invariantDependency.insert("ObstacleStopsTravelFaster", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"])); - //model_check_init_static - invariantDependency.insert("ObstacleDistanceBecomesVeryClose", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"])); - //model_check_init_static - invariantDependency.insert("VehicleManageObstacle", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"])); - //model_check_init_static - invariantDependency.insert("CruiseBecomesAllowed", HashSet::from(["_check_inv_1", "_check_inv_33"])); - //model_check_init_static - invariantDependency.insert("VehicleExceedsMaxCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"])); - //model_check_init_static - invariantDependency.insert("CruiseSpeedChangeFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"])); - //model_check_init_static - invariantDependency.insert("ObstacleDisappears", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("ExternalForcesBecomesNormal", HashSet::from(["_check_inv_18", "_check_inv_4"])); - //model_check_init_static - invariantDependency.insert("ObstacleBecomesOld", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24"])); - //model_check_init_static - invariantDependency.insert("ObstacleDistanceBecomesBig", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"])); - //model_check_init_static - guardDependency.insert("ObstacleStopsTravelSlower", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"])); - //model_check_init_static - guardDependency.insert("SetCruiseSpeed", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleAppearsWhenCruiseInactive"])); - //model_check_init_static - guardDependency.insert("VehicleLeavesCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"])); - //model_check_init_static - guardDependency.insert("VehicleFallsBelowMaxCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"])); - //model_check_init_static - guardDependency.insert("CCInitialisationFinished", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"])); - //model_check_init_static - guardDependency.insert("VehicleReachesCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"])); - //model_check_init_static - guardDependency.insert("ObstacleAppearsWhenCruiseActive", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"])); - //model_check_init_static - guardDependency.insert("ObstacleStartsTravelSlower", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"])); - //model_check_init_static - guardDependency.insert("CruiseBecomesNotAllowed", HashSet::from(["_tr_SetCruiseSpeed", "_tr_VehicleManageObstacle", "_tr_CruiseBecomesAllowed", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseBecomesNotAllowed", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"])); - //model_check_init_static - guardDependency.insert("ObstacleAppearsWhenCruiseInactive", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"])); - //model_check_init_static - guardDependency.insert("CCInitialisationDelayFinished", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); - //model_check_init_static - guardDependency.insert("ObstacleDistanceBecomesClose", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); - //model_check_init_static - guardDependency.insert("ObstacleStartsTravelFaster", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"])); - //model_check_init_static - guardDependency.insert("ExternalForcesBecomesExtreme", HashSet::from(["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"])); - //model_check_init_static - guardDependency.insert("CruiseOff", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"])); - //model_check_init_static - guardDependency.insert("CruiseSpeedChangeDelayFinished", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); - //model_check_init_static - guardDependency.insert("ObstacleStopsTravelFaster", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"])); - //model_check_init_static - guardDependency.insert("ObstacleDistanceBecomesVeryClose", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); - //model_check_init_static - guardDependency.insert("VehicleManageObstacle", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"])); - //model_check_init_static - guardDependency.insert("CruiseBecomesAllowed", HashSet::from(["_tr_SetCruiseSpeed", "_tr_CruiseBecomesAllowed", "_tr_CruiseBecomesNotAllowed"])); - //model_check_init_static - guardDependency.insert("VehicleExceedsMaxCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"])); - //model_check_init_static - guardDependency.insert("CruiseSpeedChangeFinished", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"])); - //model_check_init_static - guardDependency.insert("ObstacleDisappears", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"])); - //model_check_init_static - guardDependency.insert("ExternalForcesBecomesNormal", HashSet::from(["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"])); - //model_check_init_static - guardDependency.insert("ObstacleBecomesOld", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); - //model_check_init_static - guardDependency.insert("ObstacleDistanceBecomesBig", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } - - let num_transitions = Arc::new(AtomicI64::new(0)); - let invariant_dependency_arc = Arc::new(invariantDependency); - let guard_dependency_arc = Arc::new(guardDependency); + let mut stop_threads = false; + let mut spawned_tasks: u64 = 0; + let mut finished_tasks: u64 = 0; let (tx, rx) = channel(); //println!("Thread {:?} starting threads", thread::current().id()); - while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - possible_queue_changes_b.fetch_add(1, Ordering::AcqRel); - let mut state = Self::next(Arc::clone(&collection_m), mc_type); - - let invariant_violated = Arc::clone(&invariant_violated_b); - let deadlock_detected = Arc::clone(&deadlock_detected_b); - let stop_threads = Arc::clone(&stop_threads_b); - let possible_queue_changes = Arc::clone(&possible_queue_changes_b); - let collection_m2 = Arc::clone(&collection_m); - 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); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let states_to_process = Arc::clone(&states_to_process_mutex); let transitions = Arc::clone(&num_transitions); - let states_m2 = Arc::clone(&states_m); - let number_states = Arc::clone(&number_states_arc); + let states = Arc::clone(&all_states); 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)); + if !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } - //println!("Thread {:?} executing", thread::current().id()); - next_states.iter().cloned().for_each(|next_state| { - { - let mut states = states_m2.lock().unwrap(); - let mut collection = collection_m2.lock().unwrap(); - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection.push_back(next_state); - //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len()); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - } - }); - possible_queue_changes.fetch_sub(1, Ordering::AcqRel); + let next_states = Self::generateNextStates(&mut state, is_caching, transitions); + if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } - if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + //println!("Thread {:?} executing", thread::current().id()); + next_states.into_iter() + .filter(|(next_state, _)| states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op))); - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } //println!("Thread {:?} done", thread::current().id()); - tx.send(1).expect(""); + let _ = tx.send(Ok(1)); }); - while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 { + + spawned_tasks += 1; + if spawned_tasks % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } + + while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 { //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id()); - rx.recv().expect("Waiting for a thread to finish: "); + match rx.recv_timeout(Duration::from_secs(1)) { + Ok(val) => match val { + Ok(_) => finished_tasks += 1, + Err(msg) => { println!("{}", msg); stop_threads = true; }, + }, + Err(_) => (), + } + if threadPool.panic_count() > 0 { stop_threads = true; } } } - Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } } diff --git a/benchmarks/model_checking/Rust/LandingGear_R6.rs b/benchmarks/model_checking/Rust/LandingGear_R6.rs index c5d829d6341953aedf912438f8b3bb5a84d6d831..60e94590d2447ac06c93eaa51f5268bdb9425edf 100644 --- a/benchmarks/model_checking/Rust/LandingGear_R6.rs +++ b/benchmarks/model_checking/Rust/LandingGear_R6.rs @@ -1,16 +1,17 @@ -#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ] +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] use std::env; -use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::thread; -use std::collections::{HashMap, HashSet, LinkedList}; -use im::HashMap as PersistentHashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, mpsc, Mutex}; +use std::collections::{HashSet, LinkedList}; +use dashmap::DashSet; use threadpool::ThreadPool; use std::sync::mpsc::channel; use derivative::Derivative; +use std::time::{Duration}; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; +use btypes::bboolean::{IntoBool, BBooleanT}; use btypes::bboolean::BBoolean; use btypes::brelation::BRelation; use btypes::bset::BSet; @@ -23,8 +24,8 @@ pub enum MC_TYPE { BFS, DFS, MIXED } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum DOOR_STATE { - open, - closed, + open, + closed, door_moving } impl DOOR_STATE { @@ -37,18 +38,18 @@ impl Default for DOOR_STATE { } impl fmt::Display for DOOR_STATE { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - DOOR_STATE::open => write!(f, "open"), - DOOR_STATE::closed => write!(f, "closed"), - DOOR_STATE::door_moving => write!(f, "door_moving"), - } + match *self { + DOOR_STATE::open => write!(f, "open"), + DOOR_STATE::closed => write!(f, "closed"), + DOOR_STATE::door_moving => write!(f, "door_moving"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum GEAR_STATE { - retracted, - extended, + retracted, + extended, gear_moving } impl GEAR_STATE { @@ -61,17 +62,17 @@ impl Default for GEAR_STATE { } impl fmt::Display for GEAR_STATE { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - GEAR_STATE::retracted => write!(f, "retracted"), - GEAR_STATE::extended => write!(f, "extended"), - GEAR_STATE::gear_moving => write!(f, "gear_moving"), - } + match *self { + GEAR_STATE::retracted => write!(f, "retracted"), + GEAR_STATE::extended => write!(f, "extended"), + GEAR_STATE::gear_moving => write!(f, "gear_moving"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum HANDLE_STATE { - up, + up, down } impl HANDLE_STATE { @@ -84,17 +85,17 @@ impl Default for HANDLE_STATE { } impl fmt::Display for HANDLE_STATE { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - HANDLE_STATE::up => write!(f, "up"), - HANDLE_STATE::down => write!(f, "down"), - } + match *self { + HANDLE_STATE::up => write!(f, "up"), + HANDLE_STATE::down => write!(f, "down"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum POSITION { - fr, - lt, + fr, + lt, rt } impl POSITION { @@ -107,17 +108,17 @@ impl Default for POSITION { } impl fmt::Display for POSITION { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - POSITION::fr => write!(f, "fr"), - POSITION::lt => write!(f, "lt"), - POSITION::rt => write!(f, "rt"), - } + match *self { + POSITION::fr => write!(f, "fr"), + POSITION::lt => write!(f, "lt"), + POSITION::rt => write!(f, "rt"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum SWITCH_STATE { - switch_open, + switch_open, switch_closed } impl SWITCH_STATE { @@ -130,16 +131,16 @@ impl Default for SWITCH_STATE { } impl fmt::Display for SWITCH_STATE { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - SWITCH_STATE::switch_open => write!(f, "switch_open"), - SWITCH_STATE::switch_closed => write!(f, "switch_closed"), - } + match *self { + SWITCH_STATE::switch_open => write!(f, "switch_open"), + SWITCH_STATE::switch_closed => write!(f, "switch_closed"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum PLANE_STATE { - ground, + ground, flight } impl PLANE_STATE { @@ -152,16 +153,16 @@ impl Default for PLANE_STATE { } impl fmt::Display for PLANE_STATE { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - PLANE_STATE::ground => write!(f, "ground"), - PLANE_STATE::flight => write!(f, "flight"), - } + match *self { + PLANE_STATE::ground => write!(f, "ground"), + PLANE_STATE::flight => write!(f, "flight"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum VALVE_STATE { - valve_open, + valve_open, valve_closed } impl VALVE_STATE { @@ -174,10 +175,10 @@ impl Default for VALVE_STATE { } impl fmt::Display for VALVE_STATE { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - VALVE_STATE::valve_open => write!(f, "valve_open"), - VALVE_STATE::valve_closed => write!(f, "valve_closed"), - } + match *self { + VALVE_STATE::valve_open => write!(f, "valve_open"), + VALVE_STATE::valve_closed => write!(f, "valve_closed"), + } } } @@ -286,6 +287,32 @@ pub struct LandingGear_R6 { #[derivative(Hash="ignore", PartialEq="ignore")] _tr_cache_env_open_analogical_switch: Option<bool>,} +impl fmt::Display for LandingGear_R6 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut result = "LandingGear_R6: (".to_owned(); + result += &format!("_get_analogical_switch: {}, ", self._get_analogical_switch()); + result += &format!("_get_general_EV: {}, ", self._get_general_EV()); + result += &format!("_get_general_valve: {}, ", self._get_general_valve()); + result += &format!("_get_handle_move: {}, ", self._get_handle_move()); + result += &format!("_get_close_EV: {}, ", self._get_close_EV()); + result += &format!("_get_extend_EV: {}, ", self._get_extend_EV()); + result += &format!("_get_open_EV: {}, ", self._get_open_EV()); + result += &format!("_get_retract_EV: {}, ", self._get_retract_EV()); + result += &format!("_get_shock_absorber: {}, ", self._get_shock_absorber()); + result += &format!("_get_valve_close_door: {}, ", self._get_valve_close_door()); + result += &format!("_get_valve_extend_gear: {}, ", self._get_valve_extend_gear()); + result += &format!("_get_valve_open_door: {}, ", self._get_valve_open_door()); + result += &format!("_get_valve_retract_gear: {}, ", self._get_valve_retract_gear()); + result += &format!("_get_doors: {}, ", self._get_doors()); + result += &format!("_get_gears: {}, ", self._get_gears()); + result += &format!("_get_handle: {}, ", self._get_handle()); + result += &format!("_get_door: {}, ", self._get_door()); + result += &format!("_get_gear: {}, ", self._get_gear()); + result = result + ")"; + return write!(f, "{}", result); + } +} + impl LandingGear_R6 { pub fn new() -> LandingGear_R6 { @@ -322,103 +349,103 @@ impl LandingGear_R6 { self.door = DOOR_STATE::closed; } - pub fn get_analogical_switch(&self) -> SWITCH_STATE { + pub fn _get_analogical_switch(&self) -> SWITCH_STATE { return self.analogical_switch.clone(); } - pub fn get_general_EV(&self) -> BBoolean { + pub fn _get_general_EV(&self) -> BBoolean { return self.general_EV.clone(); } - pub fn get_general_valve(&self) -> VALVE_STATE { + pub fn _get_general_valve(&self) -> VALVE_STATE { return self.general_valve.clone(); } - pub fn get_handle_move(&self) -> BBoolean { + pub fn _get_handle_move(&self) -> BBoolean { return self.handle_move.clone(); } - pub fn get_close_EV(&self) -> BBoolean { + pub fn _get_close_EV(&self) -> BBoolean { return self.close_EV.clone(); } - pub fn get_extend_EV(&self) -> BBoolean { + pub fn _get_extend_EV(&self) -> BBoolean { return self.extend_EV.clone(); } - pub fn get_open_EV(&self) -> BBoolean { + pub fn _get_open_EV(&self) -> BBoolean { return self.open_EV.clone(); } - pub fn get_retract_EV(&self) -> BBoolean { + pub fn _get_retract_EV(&self) -> BBoolean { return self.retract_EV.clone(); } - pub fn get_shock_absorber(&self) -> PLANE_STATE { + pub fn _get_shock_absorber(&self) -> PLANE_STATE { return self.shock_absorber.clone(); } - pub fn get_valve_close_door(&self) -> VALVE_STATE { + pub fn _get_valve_close_door(&self) -> VALVE_STATE { return self.valve_close_door.clone(); } - pub fn get_valve_extend_gear(&self) -> VALVE_STATE { + pub fn _get_valve_extend_gear(&self) -> VALVE_STATE { return self.valve_extend_gear.clone(); } - pub fn get_valve_open_door(&self) -> VALVE_STATE { + pub fn _get_valve_open_door(&self) -> VALVE_STATE { return self.valve_open_door.clone(); } - pub fn get_valve_retract_gear(&self) -> VALVE_STATE { + pub fn _get_valve_retract_gear(&self) -> VALVE_STATE { return self.valve_retract_gear.clone(); } - pub fn get_doors(&self) -> BRelation<POSITION, DOOR_STATE> { + pub fn _get_doors(&self) -> BRelation<POSITION, DOOR_STATE> { return self.doors.clone(); } - pub fn get_gears(&self) -> BRelation<POSITION, GEAR_STATE> { + pub fn _get_gears(&self) -> BRelation<POSITION, GEAR_STATE> { return self.gears.clone(); } - pub fn get_handle(&self) -> HANDLE_STATE { + pub fn _get_handle(&self) -> HANDLE_STATE { return self.handle.clone(); } - pub fn get_door(&self) -> DOOR_STATE { + pub fn _get_door(&self) -> DOOR_STATE { return self.door.clone(); } - pub fn get_gear(&self) -> GEAR_STATE { + pub fn _get_gear(&self) -> GEAR_STATE { return self.gear.clone(); } - pub fn get__DOOR_STATE(&self) -> BSet<DOOR_STATE> { + pub fn _get__DOOR_STATE(&self) -> BSet<DOOR_STATE> { return self._DOOR_STATE.clone(); } - pub fn get__GEAR_STATE(&self) -> BSet<GEAR_STATE> { + pub fn _get__GEAR_STATE(&self) -> BSet<GEAR_STATE> { return self._GEAR_STATE.clone(); } - pub fn get__HANDLE_STATE(&self) -> BSet<HANDLE_STATE> { + pub fn _get__HANDLE_STATE(&self) -> BSet<HANDLE_STATE> { return self._HANDLE_STATE.clone(); } - pub fn get__POSITION(&self) -> BSet<POSITION> { + pub fn _get__POSITION(&self) -> BSet<POSITION> { return self._POSITION.clone(); } - pub fn get__SWITCH_STATE(&self) -> BSet<SWITCH_STATE> { + pub fn _get__SWITCH_STATE(&self) -> BSet<SWITCH_STATE> { return self._SWITCH_STATE.clone(); } - pub fn get__PLANE_STATE(&self) -> BSet<PLANE_STATE> { + pub fn _get__PLANE_STATE(&self) -> BSet<PLANE_STATE> { return self._PLANE_STATE.clone(); } - pub fn get__VALVE_STATE(&self) -> BSet<VALVE_STATE> { + pub fn _get__VALVE_STATE(&self) -> BSet<VALVE_STATE> { return self._VALVE_STATE.clone(); } @@ -439,7 +466,7 @@ impl LandingGear_R6 { } pub fn open_valve_door_open(&mut self) -> () { - if (self.valve_open_door.equal(&VALVE_STATE::valve_closed).and(&self.open_EV.equal(&BBoolean::new(true)))).booleanValue() { + if ((self.valve_open_door.equal(&VALVE_STATE::valve_closed) && self.open_EV.equal(&BBoolean::new(true)))).booleanValue() { self.valve_open_door = VALVE_STATE::valve_open; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -447,7 +474,7 @@ impl LandingGear_R6 { } pub fn close_valve_door_open(&mut self) -> () { - if (self.valve_open_door.equal(&VALVE_STATE::valve_open).and(&self.open_EV.equal(&BBoolean::new(false)))).booleanValue() { + if ((self.valve_open_door.equal(&VALVE_STATE::valve_open) && self.open_EV.equal(&BBoolean::new(false)))).booleanValue() { self.valve_open_door = VALVE_STATE::valve_closed; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -455,7 +482,7 @@ impl LandingGear_R6 { } pub fn open_valve_door_close(&mut self) -> () { - if (self.valve_close_door.equal(&VALVE_STATE::valve_closed).and(&self.close_EV.equal(&BBoolean::new(true)))).booleanValue() { + if ((self.valve_close_door.equal(&VALVE_STATE::valve_closed) && self.close_EV.equal(&BBoolean::new(true)))).booleanValue() { self.valve_close_door = VALVE_STATE::valve_open; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -463,7 +490,7 @@ impl LandingGear_R6 { } pub fn close_valve_door_close(&mut self) -> () { - if (self.valve_close_door.equal(&VALVE_STATE::valve_open).and(&self.close_EV.equal(&BBoolean::new(false)))).booleanValue() { + if ((self.valve_close_door.equal(&VALVE_STATE::valve_open) && self.close_EV.equal(&BBoolean::new(false)))).booleanValue() { self.valve_close_door = VALVE_STATE::valve_closed; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -471,7 +498,7 @@ impl LandingGear_R6 { } pub fn open_valve_retract_gear(&mut self) -> () { - if (self.valve_retract_gear.equal(&VALVE_STATE::valve_closed).and(&self.retract_EV.equal(&BBoolean::new(true)))).booleanValue() { + if ((self.valve_retract_gear.equal(&VALVE_STATE::valve_closed) && self.retract_EV.equal(&BBoolean::new(true)))).booleanValue() { self.valve_retract_gear = VALVE_STATE::valve_open; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -479,7 +506,7 @@ impl LandingGear_R6 { } pub fn close_valve_retract_gear(&mut self) -> () { - if (self.valve_retract_gear.equal(&VALVE_STATE::valve_open).and(&self.retract_EV.equal(&BBoolean::new(false)))).booleanValue() { + if ((self.valve_retract_gear.equal(&VALVE_STATE::valve_open) && self.retract_EV.equal(&BBoolean::new(false)))).booleanValue() { self.valve_retract_gear = VALVE_STATE::valve_closed; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -487,7 +514,7 @@ impl LandingGear_R6 { } pub fn open_valve_extend_gear(&mut self) -> () { - if (self.valve_extend_gear.equal(&VALVE_STATE::valve_closed).and(&self.extend_EV.equal(&BBoolean::new(true)))).booleanValue() { + if ((self.valve_extend_gear.equal(&VALVE_STATE::valve_closed) && self.extend_EV.equal(&BBoolean::new(true)))).booleanValue() { self.valve_extend_gear = VALVE_STATE::valve_open; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -495,7 +522,7 @@ impl LandingGear_R6 { } pub fn close_valve_extend_gear(&mut self) -> () { - if (self.valve_extend_gear.equal(&VALVE_STATE::valve_open).and(&self.extend_EV.equal(&BBoolean::new(false)))).booleanValue() { + if ((self.valve_extend_gear.equal(&VALVE_STATE::valve_open) && self.extend_EV.equal(&BBoolean::new(false)))).booleanValue() { self.valve_extend_gear = VALVE_STATE::valve_closed; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -503,7 +530,7 @@ impl LandingGear_R6 { } pub fn con_stimulate_open_door_valve(&mut self) -> () { - if (self.open_EV.equal(&BBoolean::new(false)).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.shock_absorber.equal(&PLANE_STATE::ground)).not()))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { + if ((((self.open_EV.equal(&BBoolean::new(false)) && self.close_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()) || ((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()) && (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.shock_absorber.equal(&PLANE_STATE::ground)).not()))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { self.open_EV = BBoolean::new(true); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -511,7 +538,7 @@ impl LandingGear_R6 { } pub fn con_stop_stimulate_open_door_valve(&mut self) -> () { - if (self.open_EV.equal(&BBoolean::new(true)).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { + if (((((self.open_EV.equal(&BBoolean::new(true)) && self.extend_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) || ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { self.open_EV = BBoolean::new(false); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -519,7 +546,7 @@ impl LandingGear_R6 { } pub fn con_stimulate_close_door_valve(&mut self) -> () { - if (self.close_EV.equal(&BBoolean::new(false)).and(&self.open_EV.equal(&BBoolean::new(false))).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed])).not()).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { + if (((((((self.close_EV.equal(&BBoolean::new(false)) && self.open_EV.equal(&BBoolean::new(false))) && self.extend_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) || (self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed])).not()) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { self.close_EV = BBoolean::new(true); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -527,7 +554,7 @@ impl LandingGear_R6 { } pub fn con_stop_stimulate_close_door_valve(&mut self) -> () { - if (self.close_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { + if (((self.close_EV.equal(&BBoolean::new(true)) && (((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) || ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { self.close_EV = BBoolean::new(false); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -535,7 +562,7 @@ impl LandingGear_R6 { } pub fn con_stimulate_retract_gear_valve(&mut self) -> () { - if (self.retract_EV.equal(&BBoolean::new(false)).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.open_EV.equal(&BBoolean::new(true))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()).and(&self.shock_absorber.equal(&PLANE_STATE::flight)).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { + if ((((((((self.retract_EV.equal(&BBoolean::new(false)) && self.extend_EV.equal(&BBoolean::new(false))) && self.open_EV.equal(&BBoolean::new(true))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()) && self.shock_absorber.equal(&PLANE_STATE::flight)) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { self.retract_EV = BBoolean::new(true); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -543,7 +570,7 @@ impl LandingGear_R6 { } pub fn con_stop_stimulate_retract_gear_valve(&mut self) -> () { - if (self.retract_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::down).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { + if (((self.retract_EV.equal(&BBoolean::new(true)) && (self.handle.equal(&HANDLE_STATE::down) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { self.retract_EV = BBoolean::new(false); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -551,7 +578,7 @@ impl LandingGear_R6 { } pub fn con_stimulate_extend_gear_valve(&mut self) -> () { - if (self.extend_EV.equal(&BBoolean::new(false)).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.open_EV.equal(&BBoolean::new(true))).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { + if (((((((self.extend_EV.equal(&BBoolean::new(false)) && self.retract_EV.equal(&BBoolean::new(false))) && self.open_EV.equal(&BBoolean::new(true))) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { self.extend_EV = BBoolean::new(true); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -559,7 +586,7 @@ impl LandingGear_R6 { } pub fn con_stop_stimulate_extend_gear_valve(&mut self) -> () { - if (self.extend_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::up).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { + if (((self.extend_EV.equal(&BBoolean::new(true)) && (self.handle.equal(&HANDLE_STATE::up) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() { self.extend_EV = BBoolean::new(false); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -567,7 +594,7 @@ impl LandingGear_R6 { } pub fn env_start_retracting_first(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::extended)).and(&self.valve_retract_gear.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::gear_moving]).elementOf(&self.gear)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() { + if ((((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&gr).equal(&GEAR_STATE::extended)) && self.valve_retract_gear.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::gear_moving]).elementOf(&self.gear)) && self.door.equal(&DOOR_STATE::open))).booleanValue() { let mut _ld_gears = self.gears.clone(); self.gears = _ld_gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::gear_moving)])).clone().clone(); self.gear = GEAR_STATE::gear_moving; @@ -577,7 +604,7 @@ impl LandingGear_R6 { } pub fn env_retract_gear_skip(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { + if ((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { self.gears = self.gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::retracted)])).clone().clone(); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -585,7 +612,7 @@ impl LandingGear_R6 { } pub fn env_retract_gear_last(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.gear.equal(&GEAR_STATE::gear_moving)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() { + if ((((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.gear.equal(&GEAR_STATE::gear_moving)) && self.door.equal(&DOOR_STATE::open))).booleanValue() { let mut _ld_gears = self.gears.clone(); self.gears = _ld_gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::retracted)])).clone().clone(); self.gear = GEAR_STATE::retracted; @@ -595,7 +622,7 @@ impl LandingGear_R6 { } pub fn env_start_extending(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::retracted)).and(&self.valve_extend_gear.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![GEAR_STATE::gear_moving, GEAR_STATE::retracted]).elementOf(&self.gear)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() { + if ((((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.functionCall(&gr).equal(&GEAR_STATE::retracted)) && self.valve_extend_gear.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![GEAR_STATE::gear_moving, GEAR_STATE::retracted]).elementOf(&self.gear)) && self.door.equal(&DOOR_STATE::open))).booleanValue() { let mut _ld_gears = self.gears.clone(); self.gears = _ld_gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::gear_moving)])).clone().clone(); self.gear = GEAR_STATE::gear_moving; @@ -605,7 +632,7 @@ impl LandingGear_R6 { } pub fn env_extend_gear_last(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.gear.equal(&GEAR_STATE::gear_moving)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() { + if ((((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.gear.equal(&GEAR_STATE::gear_moving)) && self.door.equal(&DOOR_STATE::open))).booleanValue() { let mut _ld_gears = self.gears.clone(); self.gears = _ld_gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::extended)])).clone().clone(); self.gear = GEAR_STATE::extended; @@ -615,7 +642,7 @@ impl LandingGear_R6 { } pub fn env_extend_gear_skip(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { + if ((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![GEAR_STATE::extended]))) && self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { self.gears = self.gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::extended)])).clone().clone(); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -623,7 +650,7 @@ impl LandingGear_R6 { } pub fn env_start_open_door(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::closed)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![DOOR_STATE::closed, DOOR_STATE::door_moving]).elementOf(&self.door)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::retracted)).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gear.equal(&GEAR_STATE::extended))))).booleanValue() { + if ((((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::closed)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![DOOR_STATE::closed, DOOR_STATE::door_moving]).elementOf(&self.door)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::retracted)) || (self.handle.equal(&HANDLE_STATE::up) && self.gear.equal(&GEAR_STATE::extended))))).booleanValue() { let mut _ld_doors = self.doors.clone(); self.doors = _ld_doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::door_moving)])).clone().clone(); self.door = DOOR_STATE::door_moving; @@ -633,7 +660,7 @@ impl LandingGear_R6 { } pub fn env_open_door_last(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.door.equal(&DOOR_STATE::door_moving)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::retracted)).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gear.equal(&GEAR_STATE::extended))))).booleanValue() { + if (((((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![DOOR_STATE::open]))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.door.equal(&DOOR_STATE::door_moving)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::retracted)) || (self.handle.equal(&HANDLE_STATE::up) && self.gear.equal(&GEAR_STATE::extended))))).booleanValue() { let mut _ld_doors = self.doors.clone(); self.doors = _ld_doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::open)])).clone().clone(); self.door = DOOR_STATE::open; @@ -643,7 +670,7 @@ impl LandingGear_R6 { } pub fn env_open_door_skip(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { + if ((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![DOOR_STATE::open]))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { self.doors = self.doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::open)])).clone().clone(); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -651,7 +678,7 @@ impl LandingGear_R6 { } pub fn env_start_close_door(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::open)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![DOOR_STATE::door_moving, DOOR_STATE::open]).elementOf(&self.door)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::extended)).or(&self.handle.equal(&HANDLE_STATE::up).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() { + if (((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::open)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![DOOR_STATE::door_moving, DOOR_STATE::open]).elementOf(&self.door)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::extended)) || (self.handle.equal(&HANDLE_STATE::up) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() { let mut _ld_doors = self.doors.clone(); self.doors = _ld_doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::door_moving)])).clone().clone(); self.door = DOOR_STATE::door_moving; @@ -661,7 +688,7 @@ impl LandingGear_R6 { } pub fn env_close_door(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.door.equal(&DOOR_STATE::door_moving)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::extended)).or(&self.handle.equal(&HANDLE_STATE::up).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() { + if ((((((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![DOOR_STATE::closed]))) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.door.equal(&DOOR_STATE::door_moving)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::extended)) || (self.handle.equal(&HANDLE_STATE::up) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() { let mut _ld_doors = self.doors.clone(); self.doors = _ld_doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::closed)])).clone().clone(); self.door = DOOR_STATE::closed; @@ -671,7 +698,7 @@ impl LandingGear_R6 { } pub fn env_close_door_skip(&mut self, mut gr: POSITION) -> () { - if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { + if (((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![DOOR_STATE::closed]))) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { self.doors = self.doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::closed)])).clone().clone(); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -697,7 +724,7 @@ impl LandingGear_R6 { } pub fn con_stimulate_general_valve(&mut self) -> () { - if (self.general_EV.equal(&BBoolean::new(false)).and(&self.handle_move.equal(&BBoolean::new(true)))).booleanValue() { + if ((self.general_EV.equal(&BBoolean::new(false)) && self.handle_move.equal(&BBoolean::new(true)))).booleanValue() { self.general_EV = BBoolean::new(true); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -705,7 +732,7 @@ impl LandingGear_R6 { } pub fn con_stop_stimulate_general_valve(&mut self) -> () { - if (self.general_EV.equal(&BBoolean::new(true)).and(&self.open_EV.equal(&BBoolean::new(false))).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false)))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false)))))).booleanValue() { + if (((((((self.general_EV.equal(&BBoolean::new(true)) && self.open_EV.equal(&BBoolean::new(false))) && self.close_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && self.extend_EV.equal(&BBoolean::new(false))) && self.close_EV.equal(&BBoolean::new(false))) && (((((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false))) || (((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false)))) || (((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false)))))).booleanValue() { self.general_EV = BBoolean::new(false); self.handle_move = BBoolean::new(false); } else { @@ -714,7 +741,7 @@ impl LandingGear_R6 { } pub fn evn_open_general_valve(&mut self) -> () { - if (self.general_EV.equal(&BBoolean::new(true)).and(&self.general_valve.equal(&VALVE_STATE::valve_closed)).and(&self.analogical_switch.equal(&SWITCH_STATE::switch_closed))).booleanValue() { + if (((self.general_EV.equal(&BBoolean::new(true)) && self.general_valve.equal(&VALVE_STATE::valve_closed)) && self.analogical_switch.equal(&SWITCH_STATE::switch_closed))).booleanValue() { self.general_valve = VALVE_STATE::valve_open; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -722,7 +749,7 @@ impl LandingGear_R6 { } pub fn evn_close_general_valve(&mut self) -> () { - if (self.general_EV.equal(&BBoolean::new(false)).or(&self.analogical_switch.equal(&SWITCH_STATE::switch_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { + if (((self.general_EV.equal(&BBoolean::new(false)) || self.analogical_switch.equal(&SWITCH_STATE::switch_open)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { self.general_valve = VALVE_STATE::valve_closed; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -730,7 +757,7 @@ impl LandingGear_R6 { } pub fn env_close_analogical_switch(&mut self) -> () { - if (self.analogical_switch.equal(&SWITCH_STATE::switch_open).and(&self.handle_move.equal(&BBoolean::new(true)))).booleanValue() { + if ((self.analogical_switch.equal(&SWITCH_STATE::switch_open) && self.handle_move.equal(&BBoolean::new(true)))).booleanValue() { self.analogical_switch = SWITCH_STATE::switch_closed; } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -770,7 +797,7 @@ impl LandingGear_R6 { pub fn _tr_open_valve_door_open(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_open_valve_door_open.is_none() { - let mut __tmp__val__ = self.valve_open_door.equal(&VALVE_STATE::valve_closed).and(&self.open_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = (self.valve_open_door.equal(&VALVE_STATE::valve_closed) && self.open_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_open_valve_door_open = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -781,7 +808,7 @@ impl LandingGear_R6 { pub fn _tr_close_valve_door_open(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_close_valve_door_open.is_none() { - let mut __tmp__val__ = self.valve_open_door.equal(&VALVE_STATE::valve_open).and(&self.open_EV.equal(&BBoolean::new(false))).booleanValue(); + let mut __tmp__val__ = (self.valve_open_door.equal(&VALVE_STATE::valve_open) && self.open_EV.equal(&BBoolean::new(false))).booleanValue(); self._tr_cache_close_valve_door_open = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -792,7 +819,7 @@ impl LandingGear_R6 { pub fn _tr_open_valve_door_close(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_open_valve_door_close.is_none() { - let mut __tmp__val__ = self.valve_close_door.equal(&VALVE_STATE::valve_closed).and(&self.close_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = (self.valve_close_door.equal(&VALVE_STATE::valve_closed) && self.close_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_open_valve_door_close = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -803,7 +830,7 @@ impl LandingGear_R6 { pub fn _tr_close_valve_door_close(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_close_valve_door_close.is_none() { - let mut __tmp__val__ = self.valve_close_door.equal(&VALVE_STATE::valve_open).and(&self.close_EV.equal(&BBoolean::new(false))).booleanValue(); + let mut __tmp__val__ = (self.valve_close_door.equal(&VALVE_STATE::valve_open) && self.close_EV.equal(&BBoolean::new(false))).booleanValue(); self._tr_cache_close_valve_door_close = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -814,7 +841,7 @@ impl LandingGear_R6 { pub fn _tr_open_valve_retract_gear(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_open_valve_retract_gear.is_none() { - let mut __tmp__val__ = self.valve_retract_gear.equal(&VALVE_STATE::valve_closed).and(&self.retract_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = (self.valve_retract_gear.equal(&VALVE_STATE::valve_closed) && self.retract_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_open_valve_retract_gear = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -825,7 +852,7 @@ impl LandingGear_R6 { pub fn _tr_close_valve_retract_gear(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_close_valve_retract_gear.is_none() { - let mut __tmp__val__ = self.valve_retract_gear.equal(&VALVE_STATE::valve_open).and(&self.retract_EV.equal(&BBoolean::new(false))).booleanValue(); + let mut __tmp__val__ = (self.valve_retract_gear.equal(&VALVE_STATE::valve_open) && self.retract_EV.equal(&BBoolean::new(false))).booleanValue(); self._tr_cache_close_valve_retract_gear = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -836,7 +863,7 @@ impl LandingGear_R6 { pub fn _tr_open_valve_extend_gear(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_open_valve_extend_gear.is_none() { - let mut __tmp__val__ = self.valve_extend_gear.equal(&VALVE_STATE::valve_closed).and(&self.extend_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = (self.valve_extend_gear.equal(&VALVE_STATE::valve_closed) && self.extend_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_open_valve_extend_gear = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -847,7 +874,7 @@ impl LandingGear_R6 { pub fn _tr_close_valve_extend_gear(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_close_valve_extend_gear.is_none() { - let mut __tmp__val__ = self.valve_extend_gear.equal(&VALVE_STATE::valve_open).and(&self.extend_EV.equal(&BBoolean::new(false))).booleanValue(); + let mut __tmp__val__ = (self.valve_extend_gear.equal(&VALVE_STATE::valve_open) && self.extend_EV.equal(&BBoolean::new(false))).booleanValue(); self._tr_cache_close_valve_extend_gear = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -858,7 +885,7 @@ impl LandingGear_R6 { pub fn _tr_con_stimulate_open_door_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_con_stimulate_open_door_valve.is_none() { - let mut __tmp__val__ = self.open_EV.equal(&BBoolean::new(false)).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.shock_absorber.equal(&PLANE_STATE::ground)).not()))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = (((self.open_EV.equal(&BBoolean::new(false)) && self.close_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()) || ((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()) && (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.shock_absorber.equal(&PLANE_STATE::ground)).not()))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_con_stimulate_open_door_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -869,7 +896,7 @@ impl LandingGear_R6 { pub fn _tr_con_stop_stimulate_open_door_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_con_stop_stimulate_open_door_valve.is_none() { - let mut __tmp__val__ = self.open_EV.equal(&BBoolean::new(true)).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = ((((self.open_EV.equal(&BBoolean::new(true)) && self.extend_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) || ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_con_stop_stimulate_open_door_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -880,7 +907,7 @@ impl LandingGear_R6 { pub fn _tr_con_stimulate_close_door_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_con_stimulate_close_door_valve.is_none() { - let mut __tmp__val__ = self.close_EV.equal(&BBoolean::new(false)).and(&self.open_EV.equal(&BBoolean::new(false))).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed])).not()).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = ((((((self.close_EV.equal(&BBoolean::new(false)) && self.open_EV.equal(&BBoolean::new(false))) && self.extend_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) || (self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed])).not()) && self.general_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_con_stimulate_close_door_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -891,7 +918,7 @@ impl LandingGear_R6 { pub fn _tr_con_stop_stimulate_close_door_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_con_stop_stimulate_close_door_valve.is_none() { - let mut __tmp__val__ = self.close_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = ((self.close_EV.equal(&BBoolean::new(true)) && (((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) || ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_con_stop_stimulate_close_door_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -902,7 +929,7 @@ impl LandingGear_R6 { pub fn _tr_con_stimulate_retract_gear_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_con_stimulate_retract_gear_valve.is_none() { - let mut __tmp__val__ = self.retract_EV.equal(&BBoolean::new(false)).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.open_EV.equal(&BBoolean::new(true))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()).and(&self.shock_absorber.equal(&PLANE_STATE::flight)).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = (((((((self.retract_EV.equal(&BBoolean::new(false)) && self.extend_EV.equal(&BBoolean::new(false))) && self.open_EV.equal(&BBoolean::new(true))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()) && self.shock_absorber.equal(&PLANE_STATE::flight)) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_con_stimulate_retract_gear_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -913,7 +940,7 @@ impl LandingGear_R6 { pub fn _tr_con_stop_stimulate_retract_gear_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_con_stop_stimulate_retract_gear_valve.is_none() { - let mut __tmp__val__ = self.retract_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::down).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = ((self.retract_EV.equal(&BBoolean::new(true)) && (self.handle.equal(&HANDLE_STATE::down) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_con_stop_stimulate_retract_gear_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -924,7 +951,7 @@ impl LandingGear_R6 { pub fn _tr_con_stimulate_extend_gear_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_con_stimulate_extend_gear_valve.is_none() { - let mut __tmp__val__ = self.extend_EV.equal(&BBoolean::new(false)).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.open_EV.equal(&BBoolean::new(true))).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = ((((((self.extend_EV.equal(&BBoolean::new(false)) && self.retract_EV.equal(&BBoolean::new(false))) && self.open_EV.equal(&BBoolean::new(true))) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_con_stimulate_extend_gear_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -935,7 +962,7 @@ impl LandingGear_R6 { pub fn _tr_con_stop_stimulate_extend_gear_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_con_stop_stimulate_extend_gear_valve.is_none() { - let mut __tmp__val__ = self.extend_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::up).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = ((self.extend_EV.equal(&BBoolean::new(true)) && (self.handle.equal(&HANDLE_STATE::up) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_con_stop_stimulate_extend_gear_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -947,8 +974,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_start_retracting_first.is_none() { let mut _ic_set_18: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::extended)).and(&self.valve_retract_gear.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::gear_moving]).elementOf(&self.gear)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() { + if (((((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::extended)) && self.valve_retract_gear.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::gear_moving]).elementOf(&self.gear)) && self.door.equal(&DOOR_STATE::open))).booleanValue() { _ic_set_18 = _ic_set_18._union(&BSet::new(vec![_ic_gr_1])); } @@ -964,8 +992,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_retract_gear_skip.is_none() { let mut _ic_set_19: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { + if (((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { _ic_set_19 = _ic_set_19._union(&BSet::new(vec![_ic_gr_1])); } @@ -981,8 +1010,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_retract_gear_last.is_none() { let mut _ic_set_20: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.gear.equal(&GEAR_STATE::gear_moving)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() { + if (((((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.gear.equal(&GEAR_STATE::gear_moving)) && self.door.equal(&DOOR_STATE::open))).booleanValue() { _ic_set_20 = _ic_set_20._union(&BSet::new(vec![_ic_gr_1])); } @@ -998,8 +1028,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_start_extending.is_none() { let mut _ic_set_21: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::retracted)).and(&self.valve_extend_gear.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![GEAR_STATE::gear_moving, GEAR_STATE::retracted]).elementOf(&self.gear)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() { + if (((((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::retracted)) && self.valve_extend_gear.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![GEAR_STATE::gear_moving, GEAR_STATE::retracted]).elementOf(&self.gear)) && self.door.equal(&DOOR_STATE::open))).booleanValue() { _ic_set_21 = _ic_set_21._union(&BSet::new(vec![_ic_gr_1])); } @@ -1015,8 +1046,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_extend_gear_last.is_none() { let mut _ic_set_22: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.gear.equal(&GEAR_STATE::gear_moving)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() { + if (((((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.gear.equal(&GEAR_STATE::gear_moving)) && self.door.equal(&DOOR_STATE::open))).booleanValue() { _ic_set_22 = _ic_set_22._union(&BSet::new(vec![_ic_gr_1])); } @@ -1032,8 +1064,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_extend_gear_skip.is_none() { let mut _ic_set_23: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { + if (((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![GEAR_STATE::extended]))) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { _ic_set_23 = _ic_set_23._union(&BSet::new(vec![_ic_gr_1])); } @@ -1049,8 +1082,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_start_open_door.is_none() { let mut _ic_set_24: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::closed).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![DOOR_STATE::closed, DOOR_STATE::door_moving]).elementOf(&self.door)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::retracted)).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gear.equal(&GEAR_STATE::extended))))).booleanValue() { + if (((((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::closed) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![DOOR_STATE::closed, DOOR_STATE::door_moving]).elementOf(&self.door)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::retracted)) || (self.handle.equal(&HANDLE_STATE::up) && self.gear.equal(&GEAR_STATE::extended))))).booleanValue() { _ic_set_24 = _ic_set_24._union(&BSet::new(vec![_ic_gr_1])); } @@ -1066,8 +1100,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_open_door_last.is_none() { let mut _ic_set_25: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.door.equal(&DOOR_STATE::door_moving)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::retracted)).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gear.equal(&GEAR_STATE::extended))))).booleanValue() { + if ((((((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![DOOR_STATE::open]))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.door.equal(&DOOR_STATE::door_moving)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::retracted)) || (self.handle.equal(&HANDLE_STATE::up) && self.gear.equal(&GEAR_STATE::extended))))).booleanValue() { _ic_set_25 = _ic_set_25._union(&BSet::new(vec![_ic_gr_1])); } @@ -1083,8 +1118,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_open_door_skip.is_none() { let mut _ic_set_26: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { + if (((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![DOOR_STATE::open]))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { _ic_set_26 = _ic_set_26._union(&BSet::new(vec![_ic_gr_1])); } @@ -1100,8 +1136,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_start_close_door.is_none() { let mut _ic_set_27: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::open).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![DOOR_STATE::door_moving, DOOR_STATE::open]).elementOf(&self.door)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::extended)).or(&self.handle.equal(&HANDLE_STATE::up).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() { + if ((((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::open) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![DOOR_STATE::door_moving, DOOR_STATE::open]).elementOf(&self.door)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::extended)) || (self.handle.equal(&HANDLE_STATE::up) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() { _ic_set_27 = _ic_set_27._union(&BSet::new(vec![_ic_gr_1])); } @@ -1117,8 +1154,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_close_door.is_none() { let mut _ic_set_28: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.door.equal(&DOOR_STATE::door_moving)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::extended)).or(&self.handle.equal(&HANDLE_STATE::up).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() { + if (((((((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![DOOR_STATE::closed]))) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.door.equal(&DOOR_STATE::door_moving)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::extended)) || (self.handle.equal(&HANDLE_STATE::up) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() { _ic_set_28 = _ic_set_28._union(&BSet::new(vec![_ic_gr_1])); } @@ -1134,8 +1172,9 @@ impl LandingGear_R6 { //transition if !is_caching || self._tr_cache_env_close_door_skip.is_none() { let mut _ic_set_29: BSet<POSITION> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_gr_1 in self.gears.domain().clone().iter().cloned() { - if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { + if ((((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![DOOR_STATE::closed]))) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() { _ic_set_29 = _ic_set_29._union(&BSet::new(vec![_ic_gr_1])); } @@ -1172,7 +1211,7 @@ impl LandingGear_R6 { pub fn _tr_con_stimulate_general_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_con_stimulate_general_valve.is_none() { - let mut __tmp__val__ = self.general_EV.equal(&BBoolean::new(false)).and(&self.handle_move.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = (self.general_EV.equal(&BBoolean::new(false)) && self.handle_move.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_con_stimulate_general_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -1183,7 +1222,7 @@ impl LandingGear_R6 { pub fn _tr_con_stop_stimulate_general_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_con_stop_stimulate_general_valve.is_none() { - let mut __tmp__val__ = self.general_EV.equal(&BBoolean::new(true)).and(&self.open_EV.equal(&BBoolean::new(false))).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false)))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false))))).booleanValue(); + let mut __tmp__val__ = ((((((self.general_EV.equal(&BBoolean::new(true)) && self.open_EV.equal(&BBoolean::new(false))) && self.close_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && self.extend_EV.equal(&BBoolean::new(false))) && self.close_EV.equal(&BBoolean::new(false))) && (((((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false))) || (((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false)))) || (((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false))))).booleanValue(); self._tr_cache_con_stop_stimulate_general_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -1194,7 +1233,7 @@ impl LandingGear_R6 { pub fn _tr_evn_open_general_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_evn_open_general_valve.is_none() { - let mut __tmp__val__ = self.general_EV.equal(&BBoolean::new(true)).and(&self.general_valve.equal(&VALVE_STATE::valve_closed)).and(&self.analogical_switch.equal(&SWITCH_STATE::switch_closed)).booleanValue(); + let mut __tmp__val__ = ((self.general_EV.equal(&BBoolean::new(true)) && self.general_valve.equal(&VALVE_STATE::valve_closed)) && self.analogical_switch.equal(&SWITCH_STATE::switch_closed)).booleanValue(); self._tr_cache_evn_open_general_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -1205,7 +1244,7 @@ impl LandingGear_R6 { pub fn _tr_evn_close_general_valve(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_evn_close_general_valve.is_none() { - let mut __tmp__val__ = self.general_EV.equal(&BBoolean::new(false)).or(&self.analogical_switch.equal(&SWITCH_STATE::switch_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).booleanValue(); + let mut __tmp__val__ = ((self.general_EV.equal(&BBoolean::new(false)) || self.analogical_switch.equal(&SWITCH_STATE::switch_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)).booleanValue(); self._tr_cache_evn_close_general_valve = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -1216,7 +1255,7 @@ impl LandingGear_R6 { pub fn _tr_env_close_analogical_switch(&mut self, is_caching: bool) -> bool { //transition if !is_caching || self._tr_cache_env_close_analogical_switch.is_none() { - let mut __tmp__val__ = self.analogical_switch.equal(&SWITCH_STATE::switch_open).and(&self.handle_move.equal(&BBoolean::new(true))).booleanValue(); + let mut __tmp__val__ = (self.analogical_switch.equal(&SWITCH_STATE::switch_open) && self.handle_move.equal(&BBoolean::new(true))).booleanValue(); self._tr_cache_env_close_analogical_switch = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -1317,12 +1356,12 @@ impl LandingGear_R6 { pub fn _check_inv_17(&self) -> bool { //invariant - return self.open_EV.equal(&BBoolean::new(true)).or(&self.close_EV.equal(&BBoolean::new(true))).or(&self.retract_EV.equal(&BBoolean::new(true))).or(&self.extend_EV.equal(&BBoolean::new(true))).implies(&self.general_EV.equal(&BBoolean::new(true))).booleanValue(); + return (((self.open_EV.equal(&BBoolean::new(true)) || self.close_EV.equal(&BBoolean::new(true))) || self.retract_EV.equal(&BBoolean::new(true))) || self.extend_EV.equal(&BBoolean::new(true))).implies(&self.general_EV.equal(&BBoolean::new(true))).booleanValue(); } pub fn _check_inv_18(&self) -> bool { //invariant - return self.open_EV.equal(&BBoolean::new(true)).and(&self.close_EV.equal(&BBoolean::new(true))).not().booleanValue(); + return (self.open_EV.equal(&BBoolean::new(true)) && self.close_EV.equal(&BBoolean::new(true))).not().booleanValue(); } pub fn _check_inv_19(&self) -> bool { @@ -1360,11 +1399,10 @@ impl LandingGear_R6 { return self.gear.equal(&GEAR_STATE::gear_moving).implies(&self.door.equal(&DOOR_STATE::open)).booleanValue(); } - fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) { + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { //calling the given functions without caching will recalculate them and cache them afterwards - //if caching is enabled globally, this will just prefill those, if caching is - for trans in to_invalidate.iter() { - match *trans { + for trans in to_invalidate { + match trans { "_tr_begin_flying" => {self._tr_begin_flying(false);}, "_tr_land_plane" => {self._tr_land_plane(false);}, "_tr_open_valve_door_open" => {self._tr_open_valve_door_open(false);}, @@ -1411,1557 +1449,583 @@ impl LandingGear_R6 { //model_check_next_states fn generateNextStates(state: &mut LandingGear_R6, isCaching: bool, - invariant_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_invariant_m: Arc<Mutex<HashMap<LandingGear_R6, HashSet<&str>>>>, - guard_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_guard_m: Arc<Mutex<HashMap<LandingGear_R6, HashSet<&str>>>>, - guardCache: Arc<Mutex<HashMap<LandingGear_R6, PersistentHashMap<&str, bool>>>>, - parents_m: Arc<Mutex<HashMap<LandingGear_R6, LandingGear_R6>>>, - transitions: Arc<AtomicI64>) -> HashSet<LandingGear_R6> { - let mut result = HashSet::<LandingGear_R6>::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_begin_flying(isCaching); - if _trid_1 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.begin_flying(); - match guard_dependency.get("begin_flying") { 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("begin_flying").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("begin_flying").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_land_plane(isCaching); - if _trid_2 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.land_plane(); - match guard_dependency.get("land_plane") { 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("land_plane").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("land_plane").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_open_valve_door_open(isCaching); - if _trid_3 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.open_valve_door_open(); - match guard_dependency.get("open_valve_door_open") { 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("open_valve_door_open").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("open_valve_door_open").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_close_valve_door_open(isCaching); - if _trid_4 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.close_valve_door_open(); - match guard_dependency.get("close_valve_door_open") { 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("close_valve_door_open").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("close_valve_door_open").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_5 = state._tr_open_valve_door_close(isCaching); - if _trid_5 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.open_valve_door_close(); - match guard_dependency.get("open_valve_door_close") { 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("open_valve_door_close").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("open_valve_door_close").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_close_valve_door_close(isCaching); - if _trid_6 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.close_valve_door_close(); - match guard_dependency.get("close_valve_door_close") { 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("close_valve_door_close").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("close_valve_door_close").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_7 = state._tr_open_valve_retract_gear(isCaching); - if _trid_7 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.open_valve_retract_gear(); - match guard_dependency.get("open_valve_retract_gear") { 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("open_valve_retract_gear").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("open_valve_retract_gear").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_8 = state._tr_close_valve_retract_gear(isCaching); - if _trid_8 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.close_valve_retract_gear(); - match guard_dependency.get("close_valve_retract_gear") { 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("close_valve_retract_gear").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("close_valve_retract_gear").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_9 = state._tr_open_valve_extend_gear(isCaching); - if _trid_9 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.open_valve_extend_gear(); - match guard_dependency.get("open_valve_extend_gear") { 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("open_valve_extend_gear").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("open_valve_extend_gear").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_10 = state._tr_close_valve_extend_gear(isCaching); - if _trid_10 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.close_valve_extend_gear(); - match guard_dependency.get("close_valve_extend_gear") { 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("close_valve_extend_gear").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("close_valve_extend_gear").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_11 = state._tr_con_stimulate_open_door_valve(isCaching); - if _trid_11 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stimulate_open_door_valve(); - match guard_dependency.get("con_stimulate_open_door_valve") { 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("con_stimulate_open_door_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stimulate_open_door_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_12 = state._tr_con_stop_stimulate_open_door_valve(isCaching); - if _trid_12 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stop_stimulate_open_door_valve(); - match guard_dependency.get("con_stop_stimulate_open_door_valve") { 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("con_stop_stimulate_open_door_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stop_stimulate_open_door_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_13 = state._tr_con_stimulate_close_door_valve(isCaching); - if _trid_13 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stimulate_close_door_valve(); - match guard_dependency.get("con_stimulate_close_door_valve") { 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("con_stimulate_close_door_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stimulate_close_door_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_14 = state._tr_con_stop_stimulate_close_door_valve(isCaching); - if _trid_14 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stop_stimulate_close_door_valve(); - match guard_dependency.get("con_stop_stimulate_close_door_valve") { 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("con_stop_stimulate_close_door_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stop_stimulate_close_door_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_15 = state._tr_con_stimulate_retract_gear_valve(isCaching); - if _trid_15 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stimulate_retract_gear_valve(); - match guard_dependency.get("con_stimulate_retract_gear_valve") { 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("con_stimulate_retract_gear_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stimulate_retract_gear_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_16 = state._tr_con_stop_stimulate_retract_gear_valve(isCaching); - if _trid_16 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stop_stimulate_retract_gear_valve(); - match guard_dependency.get("con_stop_stimulate_retract_gear_valve") { 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("con_stop_stimulate_retract_gear_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stop_stimulate_retract_gear_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_17 = state._tr_con_stimulate_extend_gear_valve(isCaching); - if _trid_17 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stimulate_extend_gear_valve(); - match guard_dependency.get("con_stimulate_extend_gear_valve") { 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("con_stimulate_extend_gear_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stimulate_extend_gear_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_18 = state._tr_con_stop_stimulate_extend_gear_valve(isCaching); - if _trid_18 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stop_stimulate_extend_gear_valve(); - match guard_dependency.get("con_stop_stimulate_extend_gear_valve") { 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("con_stop_stimulate_extend_gear_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stop_stimulate_extend_gear_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_19 = state._tr_env_start_retracting_first(isCaching); - for param in _trid_19.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_start_retracting_first(_tmp_1); - match guard_dependency.get("env_start_retracting_first") { 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("env_start_retracting_first").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_start_retracting_first").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_20 = state._tr_env_retract_gear_skip(isCaching); - for param in _trid_20.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_retract_gear_skip(_tmp_1); - match guard_dependency.get("env_retract_gear_skip") { 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("env_retract_gear_skip").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_retract_gear_skip").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_21 = state._tr_env_retract_gear_last(isCaching); - for param in _trid_21.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_retract_gear_last(_tmp_1); - match guard_dependency.get("env_retract_gear_last") { 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("env_retract_gear_last").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_retract_gear_last").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_22 = state._tr_env_start_extending(isCaching); - for param in _trid_22.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_start_extending(_tmp_1); - match guard_dependency.get("env_start_extending") { 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("env_start_extending").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_start_extending").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_23 = state._tr_env_extend_gear_last(isCaching); - for param in _trid_23.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_extend_gear_last(_tmp_1); - match guard_dependency.get("env_extend_gear_last") { 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("env_extend_gear_last").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_extend_gear_last").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_24 = state._tr_env_extend_gear_skip(isCaching); - for param in _trid_24.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_extend_gear_skip(_tmp_1); - match guard_dependency.get("env_extend_gear_skip") { 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("env_extend_gear_skip").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_extend_gear_skip").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_25 = state._tr_env_start_open_door(isCaching); - for param in _trid_25.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_start_open_door(_tmp_1); - match guard_dependency.get("env_start_open_door") { 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("env_start_open_door").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_start_open_door").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_26 = state._tr_env_open_door_last(isCaching); - for param in _trid_26.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_open_door_last(_tmp_1); - match guard_dependency.get("env_open_door_last") { 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("env_open_door_last").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_open_door_last").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_27 = state._tr_env_open_door_skip(isCaching); - for param in _trid_27.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_open_door_skip(_tmp_1); - match guard_dependency.get("env_open_door_skip") { 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("env_open_door_skip").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_open_door_skip").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_28 = state._tr_env_start_close_door(isCaching); - for param in _trid_28.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_start_close_door(_tmp_1); - match guard_dependency.get("env_start_close_door") { 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("env_start_close_door").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_start_close_door").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_29 = state._tr_env_close_door(isCaching); - for param in _trid_29.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_close_door(_tmp_1); - match guard_dependency.get("env_close_door") { 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("env_close_door").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_close_door").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_30 = state._tr_env_close_door_skip(isCaching); - for param in _trid_30.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_close_door_skip(_tmp_1); - match guard_dependency.get("env_close_door_skip") { 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("env_close_door_skip").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_close_door_skip").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_31 = state._tr_toggle_handle_up(isCaching); - if _trid_31 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.toggle_handle_up(); - match guard_dependency.get("toggle_handle_up") { 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("toggle_handle_up").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("toggle_handle_up").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_32 = state._tr_toggle_handle_down(isCaching); - if _trid_32 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.toggle_handle_down(); - match guard_dependency.get("toggle_handle_down") { 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("toggle_handle_down").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("toggle_handle_down").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_33 = state._tr_con_stimulate_general_valve(isCaching); - if _trid_33 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stimulate_general_valve(); - match guard_dependency.get("con_stimulate_general_valve") { 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("con_stimulate_general_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stimulate_general_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_34 = state._tr_con_stop_stimulate_general_valve(isCaching); - if _trid_34 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stop_stimulate_general_valve(); - match guard_dependency.get("con_stop_stimulate_general_valve") { 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("con_stop_stimulate_general_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stop_stimulate_general_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_35 = state._tr_evn_open_general_valve(isCaching); - if _trid_35 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.evn_open_general_valve(); - match guard_dependency.get("evn_open_general_valve") { 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("evn_open_general_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("evn_open_general_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_36 = state._tr_evn_close_general_valve(isCaching); - if _trid_36 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.evn_close_general_valve(); - match guard_dependency.get("evn_close_general_valve") { 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("evn_close_general_valve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("evn_close_general_valve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_37 = state._tr_env_close_analogical_switch(isCaching); - if _trid_37 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.env_close_analogical_switch(); - match guard_dependency.get("env_close_analogical_switch") { 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("env_close_analogical_switch").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_close_analogical_switch").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_38 = state._tr_env_open_analogical_switch(isCaching); - if _trid_38 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.env_open_analogical_switch(); - match guard_dependency.get("env_open_analogical_switch") { 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("env_open_analogical_switch").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_open_analogical_switch").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_begin_flying(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.begin_flying(); - match guard_dependency.get("begin_flying") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_land_plane(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.land_plane(); - match guard_dependency.get("land_plane") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_open_valve_door_open(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.open_valve_door_open(); - match guard_dependency.get("open_valve_door_open") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_close_valve_door_open(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.close_valve_door_open(); - match guard_dependency.get("close_valve_door_open") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_open_valve_door_close(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.open_valve_door_close(); - match guard_dependency.get("open_valve_door_close") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_close_valve_door_close(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.close_valve_door_close(); - match guard_dependency.get("close_valve_door_close") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_open_valve_retract_gear(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.open_valve_retract_gear(); - match guard_dependency.get("open_valve_retract_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_close_valve_retract_gear(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.close_valve_retract_gear(); - match guard_dependency.get("close_valve_retract_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_open_valve_extend_gear(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.open_valve_extend_gear(); - match guard_dependency.get("open_valve_extend_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_close_valve_extend_gear(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.close_valve_extend_gear(); - match guard_dependency.get("close_valve_extend_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_con_stimulate_open_door_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stimulate_open_door_valve(); - match guard_dependency.get("con_stimulate_open_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_con_stop_stimulate_open_door_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stop_stimulate_open_door_valve(); - match guard_dependency.get("con_stop_stimulate_open_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_con_stimulate_close_door_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stimulate_close_door_valve(); - match guard_dependency.get("con_stimulate_close_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_con_stop_stimulate_close_door_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stop_stimulate_close_door_valve(); - match guard_dependency.get("con_stop_stimulate_close_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_con_stimulate_retract_gear_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stimulate_retract_gear_valve(); - match guard_dependency.get("con_stimulate_retract_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_con_stop_stimulate_retract_gear_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stop_stimulate_retract_gear_valve(); - match guard_dependency.get("con_stop_stimulate_retract_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_con_stimulate_extend_gear_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stimulate_extend_gear_valve(); - match guard_dependency.get("con_stimulate_extend_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_con_stop_stimulate_extend_gear_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stop_stimulate_extend_gear_valve(); - match guard_dependency.get("con_stop_stimulate_extend_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_19 = state._tr_env_start_retracting_first(isCaching); - for param in _trid_19.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_start_retracting_first(_tmp_1); - match guard_dependency.get("env_start_retracting_first") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_20 = state._tr_env_retract_gear_skip(isCaching); - for param in _trid_20.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_retract_gear_skip(_tmp_1); - match guard_dependency.get("env_retract_gear_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_21 = state._tr_env_retract_gear_last(isCaching); - for param in _trid_21.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_retract_gear_last(_tmp_1); - match guard_dependency.get("env_retract_gear_last") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_22 = state._tr_env_start_extending(isCaching); - for param in _trid_22.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_start_extending(_tmp_1); - match guard_dependency.get("env_start_extending") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_23 = state._tr_env_extend_gear_last(isCaching); - for param in _trid_23.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_extend_gear_last(_tmp_1); - match guard_dependency.get("env_extend_gear_last") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_24 = state._tr_env_extend_gear_skip(isCaching); - for param in _trid_24.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_extend_gear_skip(_tmp_1); - match guard_dependency.get("env_extend_gear_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_25 = state._tr_env_start_open_door(isCaching); - for param in _trid_25.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_start_open_door(_tmp_1); - match guard_dependency.get("env_start_open_door") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_26 = state._tr_env_open_door_last(isCaching); - for param in _trid_26.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_open_door_last(_tmp_1); - match guard_dependency.get("env_open_door_last") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_27 = state._tr_env_open_door_skip(isCaching); - for param in _trid_27.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_open_door_skip(_tmp_1); - match guard_dependency.get("env_open_door_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_28 = state._tr_env_start_close_door(isCaching); - for param in _trid_28.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_start_close_door(_tmp_1); - match guard_dependency.get("env_start_close_door") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_29 = state._tr_env_close_door(isCaching); - for param in _trid_29.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_close_door(_tmp_1); - match guard_dependency.get("env_close_door") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_30 = state._tr_env_close_door_skip(isCaching); - for param in _trid_30.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.env_close_door_skip(_tmp_1); - match guard_dependency.get("env_close_door_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_toggle_handle_up(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.toggle_handle_up(); - match guard_dependency.get("toggle_handle_up") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_toggle_handle_down(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.toggle_handle_down(); - match guard_dependency.get("toggle_handle_down") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_con_stimulate_general_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stimulate_general_valve(); - match guard_dependency.get("con_stimulate_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_con_stop_stimulate_general_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.con_stop_stimulate_general_valve(); - match guard_dependency.get("con_stop_stimulate_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_evn_open_general_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.evn_open_general_valve(); - match guard_dependency.get("evn_open_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_evn_close_general_valve(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.evn_close_general_valve(); - match guard_dependency.get("evn_close_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_env_close_analogical_switch(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.env_close_analogical_switch(); - match guard_dependency.get("env_close_analogical_switch") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_env_open_analogical_switch(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.env_open_analogical_switch(); - match guard_dependency.get("env_open_analogical_switch") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - - } + transitions: Arc<AtomicU64>) -> HashSet<(LandingGear_R6, &'static str)> { + let mut result = HashSet::<(LandingGear_R6, &'static str)>::new(); + let mut evaluated_transitions: u64 = 0; + //model_check_transition + if state._tr_begin_flying(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.begin_flying(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("begin_flying")); } + result.insert((copiedState, "begin_flying")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_land_plane(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.land_plane(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("land_plane")); } + result.insert((copiedState, "land_plane")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_open_valve_door_open(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.open_valve_door_open(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("open_valve_door_open")); } + result.insert((copiedState, "open_valve_door_open")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_close_valve_door_open(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.close_valve_door_open(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("close_valve_door_open")); } + result.insert((copiedState, "close_valve_door_open")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_open_valve_door_close(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.open_valve_door_close(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("open_valve_door_close")); } + result.insert((copiedState, "open_valve_door_close")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_close_valve_door_close(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.close_valve_door_close(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("close_valve_door_close")); } + result.insert((copiedState, "close_valve_door_close")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_open_valve_retract_gear(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.open_valve_retract_gear(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("open_valve_retract_gear")); } + result.insert((copiedState, "open_valve_retract_gear")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_close_valve_retract_gear(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.close_valve_retract_gear(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("close_valve_retract_gear")); } + result.insert((copiedState, "close_valve_retract_gear")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_open_valve_extend_gear(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.open_valve_extend_gear(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("open_valve_extend_gear")); } + result.insert((copiedState, "open_valve_extend_gear")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_close_valve_extend_gear(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.close_valve_extend_gear(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("close_valve_extend_gear")); } + result.insert((copiedState, "close_valve_extend_gear")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_con_stimulate_open_door_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.con_stimulate_open_door_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stimulate_open_door_valve")); } + result.insert((copiedState, "con_stimulate_open_door_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_con_stop_stimulate_open_door_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.con_stop_stimulate_open_door_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stop_stimulate_open_door_valve")); } + result.insert((copiedState, "con_stop_stimulate_open_door_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_con_stimulate_close_door_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.con_stimulate_close_door_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stimulate_close_door_valve")); } + result.insert((copiedState, "con_stimulate_close_door_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_con_stop_stimulate_close_door_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.con_stop_stimulate_close_door_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stop_stimulate_close_door_valve")); } + result.insert((copiedState, "con_stop_stimulate_close_door_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_con_stimulate_retract_gear_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.con_stimulate_retract_gear_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stimulate_retract_gear_valve")); } + result.insert((copiedState, "con_stimulate_retract_gear_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_con_stop_stimulate_retract_gear_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.con_stop_stimulate_retract_gear_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stop_stimulate_retract_gear_valve")); } + result.insert((copiedState, "con_stop_stimulate_retract_gear_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_con_stimulate_extend_gear_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.con_stimulate_extend_gear_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stimulate_extend_gear_valve")); } + result.insert((copiedState, "con_stimulate_extend_gear_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_con_stop_stimulate_extend_gear_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.con_stop_stimulate_extend_gear_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stop_stimulate_extend_gear_valve")); } + result.insert((copiedState, "con_stop_stimulate_extend_gear_valve")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_19 = state._tr_env_start_retracting_first(isCaching); + for param in _trid_19.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_start_retracting_first(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_start_retracting_first")); } + result.insert((copiedState, "env_start_retracting_first")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_20 = state._tr_env_retract_gear_skip(isCaching); + for param in _trid_20.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_retract_gear_skip(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_retract_gear_skip")); } + result.insert((copiedState, "env_retract_gear_skip")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_21 = state._tr_env_retract_gear_last(isCaching); + for param in _trid_21.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_retract_gear_last(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_retract_gear_last")); } + result.insert((copiedState, "env_retract_gear_last")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_22 = state._tr_env_start_extending(isCaching); + for param in _trid_22.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_start_extending(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_start_extending")); } + result.insert((copiedState, "env_start_extending")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_23 = state._tr_env_extend_gear_last(isCaching); + for param in _trid_23.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_extend_gear_last(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_extend_gear_last")); } + result.insert((copiedState, "env_extend_gear_last")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_24 = state._tr_env_extend_gear_skip(isCaching); + for param in _trid_24.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_extend_gear_skip(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_extend_gear_skip")); } + result.insert((copiedState, "env_extend_gear_skip")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_25 = state._tr_env_start_open_door(isCaching); + for param in _trid_25.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_start_open_door(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_start_open_door")); } + result.insert((copiedState, "env_start_open_door")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_26 = state._tr_env_open_door_last(isCaching); + for param in _trid_26.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_open_door_last(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_open_door_last")); } + result.insert((copiedState, "env_open_door_last")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_27 = state._tr_env_open_door_skip(isCaching); + for param in _trid_27.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_open_door_skip(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_open_door_skip")); } + result.insert((copiedState, "env_open_door_skip")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_28 = state._tr_env_start_close_door(isCaching); + for param in _trid_28.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_start_close_door(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_start_close_door")); } + result.insert((copiedState, "env_start_close_door")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_29 = state._tr_env_close_door(isCaching); + for param in _trid_29.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_close_door(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_close_door")); } + result.insert((copiedState, "env_close_door")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_30 = state._tr_env_close_door_skip(isCaching); + for param in _trid_30.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.env_close_door_skip(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_close_door_skip")); } + result.insert((copiedState, "env_close_door_skip")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_toggle_handle_up(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.toggle_handle_up(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("toggle_handle_up")); } + result.insert((copiedState, "toggle_handle_up")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_toggle_handle_down(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.toggle_handle_down(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("toggle_handle_down")); } + result.insert((copiedState, "toggle_handle_down")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_con_stimulate_general_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.con_stimulate_general_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stimulate_general_valve")); } + result.insert((copiedState, "con_stimulate_general_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_con_stop_stimulate_general_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.con_stop_stimulate_general_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stop_stimulate_general_valve")); } + result.insert((copiedState, "con_stop_stimulate_general_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_evn_open_general_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.evn_open_general_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("evn_open_general_valve")); } + result.insert((copiedState, "evn_open_general_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_evn_close_general_valve(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.evn_close_general_valve(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("evn_close_general_valve")); } + result.insert((copiedState, "evn_close_general_valve")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_env_close_analogical_switch(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.env_close_analogical_switch(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_close_analogical_switch")); } + result.insert((copiedState, "env_close_analogical_switch")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_env_open_analogical_switch(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.env_open_analogical_switch(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_open_analogical_switch")); } + result.insert((copiedState, "env_open_analogical_switch")); + evaluated_transitions += 1; + } + + + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); return result; } //model_check_evaluate_state //model_check_invariants - pub fn checkInvariants(state: &LandingGear_R6, - isCaching: bool, - dependent_invariant_m: Arc<Mutex<HashMap<LandingGear_R6, 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(); + pub fn checkInvariants(state: &LandingGear_R6, last_op: &'static str, isCaching: bool) -> bool { + if isCaching { + let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op); //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_1") { + if dependent_invariants_of_state.contains(&"_check_inv_1") { if !state._check_inv_1() { + println!("_check_inv_1 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_2") { + if dependent_invariants_of_state.contains(&"_check_inv_2") { if !state._check_inv_2() { + println!("_check_inv_2 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_3") { + if dependent_invariants_of_state.contains(&"_check_inv_3") { if !state._check_inv_3() { + println!("_check_inv_3 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_4") { + if dependent_invariants_of_state.contains(&"_check_inv_4") { if !state._check_inv_4() { + println!("_check_inv_4 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_5") { + if dependent_invariants_of_state.contains(&"_check_inv_5") { if !state._check_inv_5() { + println!("_check_inv_5 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_6") { + if dependent_invariants_of_state.contains(&"_check_inv_6") { if !state._check_inv_6() { + println!("_check_inv_6 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_7") { + if dependent_invariants_of_state.contains(&"_check_inv_7") { if !state._check_inv_7() { + println!("_check_inv_7 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_8") { + if dependent_invariants_of_state.contains(&"_check_inv_8") { if !state._check_inv_8() { + println!("_check_inv_8 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_9") { + if dependent_invariants_of_state.contains(&"_check_inv_9") { if !state._check_inv_9() { + println!("_check_inv_9 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_10") { + if dependent_invariants_of_state.contains(&"_check_inv_10") { if !state._check_inv_10() { + println!("_check_inv_10 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_11") { + if dependent_invariants_of_state.contains(&"_check_inv_11") { if !state._check_inv_11() { + println!("_check_inv_11 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_12") { + if dependent_invariants_of_state.contains(&"_check_inv_12") { if !state._check_inv_12() { + println!("_check_inv_12 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_13") { + if dependent_invariants_of_state.contains(&"_check_inv_13") { if !state._check_inv_13() { + println!("_check_inv_13 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_14") { + if dependent_invariants_of_state.contains(&"_check_inv_14") { if !state._check_inv_14() { + println!("_check_inv_14 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_15") { + if dependent_invariants_of_state.contains(&"_check_inv_15") { if !state._check_inv_15() { + println!("_check_inv_15 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_16") { + if dependent_invariants_of_state.contains(&"_check_inv_16") { if !state._check_inv_16() { + println!("_check_inv_16 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_17") { + if dependent_invariants_of_state.contains(&"_check_inv_17") { if !state._check_inv_17() { + println!("_check_inv_17 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_18") { + if dependent_invariants_of_state.contains(&"_check_inv_18") { if !state._check_inv_18() { + println!("_check_inv_18 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_19") { + if dependent_invariants_of_state.contains(&"_check_inv_19") { if !state._check_inv_19() { + println!("_check_inv_19 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_20") { + if dependent_invariants_of_state.contains(&"_check_inv_20") { if !state._check_inv_20() { + println!("_check_inv_20 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_21") { + if dependent_invariants_of_state.contains(&"_check_inv_21") { if !state._check_inv_21() { + println!("_check_inv_21 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_22") { + if dependent_invariants_of_state.contains(&"_check_inv_22") { if !state._check_inv_22() { + println!("_check_inv_22 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_23") { + if dependent_invariants_of_state.contains(&"_check_inv_23") { if !state._check_inv_23() { + println!("_check_inv_23 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_24") { + if dependent_invariants_of_state.contains(&"_check_inv_24") { if !state._check_inv_24() { + println!("_check_inv_24 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_25") { + if dependent_invariants_of_state.contains(&"_check_inv_25") { if !state._check_inv_25() { + println!("_check_inv_25 failed!"); return false; } } @@ -2971,16 +2035,14 @@ impl LandingGear_R6 { } //model_check_print - fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) { - if deadlock_detected { println!("DEADLOCK DETECTED"); } - if invariant_violated { println!("INVARIANT VIOLATED"); } - if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); } + fn print_result(states: usize, transitions: u64, error_detected: bool) { + if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); } println!("Number of States: {}", states); println!("Number of Transitions: {}", transitions); } //model_check_main - fn next(collection_m: Arc<Mutex<LinkedList<LandingGear_R6>>>, mc_type: MC_TYPE) -> LandingGear_R6 { + fn next(collection_m: Arc<Mutex<LinkedList<(LandingGear_R6, &'static str)>>>, mc_type: MC_TYPE) -> (LandingGear_R6, &'static str) { let mut collection = collection_m.lock().unwrap(); return match mc_type { MC_TYPE::BFS => collection.pop_front().unwrap(), @@ -2989,220 +2051,208 @@ impl LandingGear_R6 { }; } - fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { - let mut machine = LandingGear_R6::new(); - - let invariant_violated = AtomicBool::new(false); - let deadlock_detected = AtomicBool::new(false); - let stop_threads = AtomicBool::new(false); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() || !machine._check_inv_21() || !machine._check_inv_22() || !machine._check_inv_23() || !machine._check_inv_24() || !machine._check_inv_25() { - invariant_violated.store(true, Ordering::Release); - } - - let mut states = HashSet::<LandingGear_R6>::new(); - states.insert(machine.clone()); - let number_states = AtomicI64::new(1); - - let collection_m = Arc::new(Mutex::new(LinkedList::<LandingGear_R6>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<LandingGear_R6, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<LandingGear_R6, HashSet<&str>>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::<LandingGear_R6, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<LandingGear_R6, LandingGear_R6>::new())); - - if is_caching { + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - invariantDependency.insert("close_valve_door_close", HashSet::from(["_check_inv_10"])); + "close_valve_door_close" => vec!["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"], //model_check_init_static - invariantDependency.insert("close_valve_retract_gear", HashSet::from(["_check_inv_13"])); + "close_valve_retract_gear" => vec!["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"], //model_check_init_static - invariantDependency.insert("con_stimulate_open_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_7"])); + "con_stimulate_open_door_valve" => vec!["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"], //model_check_init_static - invariantDependency.insert("env_close_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"])); + "env_close_door" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("env_start_close_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"])); + "env_start_close_door" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("toggle_handle_up", HashSet::from(["_check_inv_4", "_check_inv_14"])); + "toggle_handle_up" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"], //model_check_init_static - invariantDependency.insert("toggle_handle_down", HashSet::from(["_check_inv_4", "_check_inv_14"])); + "toggle_handle_down" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"], //model_check_init_static - invariantDependency.insert("open_valve_door_open", HashSet::from(["_check_inv_12"])); + "open_valve_door_open" => vec!["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"], //model_check_init_static - invariantDependency.insert("env_retract_gear_last", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"])); + "env_retract_gear_last" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("env_open_door_last", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"])); + "env_open_door_last" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("con_stop_stimulate_retract_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_8"])); + "con_stop_stimulate_retract_gear_valve" => vec!["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"], //model_check_init_static - invariantDependency.insert("env_close_door_skip", HashSet::from(["_check_inv_21", "_check_inv_20", "_check_inv_22"])); + "env_close_door_skip" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("con_stop_stimulate_close_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_5"])); + "con_stop_stimulate_close_door_valve" => vec!["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"], //model_check_init_static - invariantDependency.insert("env_open_analogical_switch", HashSet::from(["_check_inv_1"])); + "env_open_analogical_switch" => vec!["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"], //model_check_init_static - invariantDependency.insert("con_stop_stimulate_general_valve", HashSet::from(["_check_inv_17", "_check_inv_2", "_check_inv_4"])); + "con_stop_stimulate_general_valve" => vec!["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve"], //model_check_init_static - invariantDependency.insert("env_extend_gear_last", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"])); + "env_extend_gear_last" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("evn_open_general_valve", HashSet::from(["_check_inv_3"])); + "evn_open_general_valve" => vec!["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("land_plane", HashSet::from(["_check_inv_9"])); + "land_plane" => vec!["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"], //model_check_init_static - invariantDependency.insert("con_stimulate_retract_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_8"])); + "con_stimulate_retract_gear_valve" => vec!["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"], //model_check_init_static - invariantDependency.insert("con_stimulate_general_valve", HashSet::from(["_check_inv_17", "_check_inv_2"])); + "con_stimulate_general_valve" => vec!["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"], //model_check_init_static - invariantDependency.insert("env_start_retracting_first", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"])); + "env_start_retracting_first" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("env_retract_gear_skip", HashSet::from(["_check_inv_19", "_check_inv_24", "_check_inv_23"])); + "env_retract_gear_skip" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("open_valve_extend_gear", HashSet::from(["_check_inv_11"])); + "open_valve_extend_gear" => vec!["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"], //model_check_init_static - invariantDependency.insert("begin_flying", HashSet::from(["_check_inv_9"])); + "begin_flying" => vec!["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"], //model_check_init_static - invariantDependency.insert("open_valve_retract_gear", HashSet::from(["_check_inv_13"])); + "open_valve_retract_gear" => vec!["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"], //model_check_init_static - invariantDependency.insert("env_close_analogical_switch", HashSet::from(["_check_inv_1"])); + "env_close_analogical_switch" => vec!["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"], //model_check_init_static - invariantDependency.insert("env_start_extending", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"])); + "env_start_extending" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("open_valve_door_close", HashSet::from(["_check_inv_10"])); + "open_valve_door_close" => vec!["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"], //model_check_init_static - invariantDependency.insert("con_stop_stimulate_open_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_7"])); + "con_stop_stimulate_open_door_valve" => vec!["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"], //model_check_init_static - invariantDependency.insert("con_stop_stimulate_extend_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_6"])); + "con_stop_stimulate_extend_gear_valve" => vec!["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"], //model_check_init_static - invariantDependency.insert("evn_close_general_valve", HashSet::from(["_check_inv_3"])); + "evn_close_general_valve" => vec!["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("close_valve_extend_gear", HashSet::from(["_check_inv_11"])); + "close_valve_extend_gear" => vec!["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"], //model_check_init_static - invariantDependency.insert("con_stimulate_extend_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_6"])); + "con_stimulate_extend_gear_valve" => vec!["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"], //model_check_init_static - invariantDependency.insert("close_valve_door_open", HashSet::from(["_check_inv_12"])); + "close_valve_door_open" => vec!["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"], //model_check_init_static - invariantDependency.insert("con_stimulate_close_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_5"])); + "con_stimulate_close_door_valve" => vec!["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"], //model_check_init_static - invariantDependency.insert("env_extend_gear_skip", HashSet::from(["_check_inv_19", "_check_inv_24", "_check_inv_23"])); + "env_extend_gear_skip" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("env_open_door_skip", HashSet::from(["_check_inv_21", "_check_inv_20", "_check_inv_22"])); + "env_open_door_skip" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], //model_check_init_static - invariantDependency.insert("env_start_open_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"])); + "env_start_open_door" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"], + _ => vec![], + } + } + + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - guardDependency.insert("close_valve_door_close", HashSet::from(["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"])); + "close_valve_door_close" => vec!["_check_inv_10"], //model_check_init_static - guardDependency.insert("close_valve_retract_gear", HashSet::from(["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"])); + "close_valve_retract_gear" => vec!["_check_inv_13"], //model_check_init_static - guardDependency.insert("con_stimulate_open_door_valve", HashSet::from(["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"])); + "con_stimulate_open_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_7"], //model_check_init_static - guardDependency.insert("env_close_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_close_door" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"], //model_check_init_static - guardDependency.insert("env_start_close_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_start_close_door" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"], //model_check_init_static - guardDependency.insert("toggle_handle_up", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"])); + "toggle_handle_up" => vec!["_check_inv_4", "_check_inv_14"], //model_check_init_static - guardDependency.insert("toggle_handle_down", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"])); + "toggle_handle_down" => vec!["_check_inv_4", "_check_inv_14"], //model_check_init_static - guardDependency.insert("open_valve_door_open", HashSet::from(["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"])); + "open_valve_door_open" => vec!["_check_inv_12"], //model_check_init_static - guardDependency.insert("env_retract_gear_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_retract_gear_last" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"], //model_check_init_static - guardDependency.insert("env_open_door_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_open_door_last" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"], //model_check_init_static - guardDependency.insert("con_stop_stimulate_retract_gear_valve", HashSet::from(["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"])); + "con_stop_stimulate_retract_gear_valve" => vec!["_check_inv_17", "_check_inv_8"], //model_check_init_static - guardDependency.insert("env_close_door_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_close_door_skip" => vec!["_check_inv_21", "_check_inv_20", "_check_inv_22"], //model_check_init_static - guardDependency.insert("con_stop_stimulate_close_door_valve", HashSet::from(["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"])); + "con_stop_stimulate_close_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_5"], //model_check_init_static - guardDependency.insert("env_open_analogical_switch", HashSet::from(["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"])); + "env_open_analogical_switch" => vec!["_check_inv_1"], //model_check_init_static - guardDependency.insert("con_stop_stimulate_general_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve"])); + "con_stop_stimulate_general_valve" => vec!["_check_inv_17", "_check_inv_2", "_check_inv_4"], //model_check_init_static - guardDependency.insert("env_extend_gear_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_extend_gear_last" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"], //model_check_init_static - guardDependency.insert("evn_open_general_valve", HashSet::from(["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "evn_open_general_valve" => vec!["_check_inv_3"], //model_check_init_static - guardDependency.insert("land_plane", HashSet::from(["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"])); + "land_plane" => vec!["_check_inv_9"], //model_check_init_static - guardDependency.insert("con_stimulate_retract_gear_valve", HashSet::from(["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"])); + "con_stimulate_retract_gear_valve" => vec!["_check_inv_17", "_check_inv_8"], //model_check_init_static - guardDependency.insert("con_stimulate_general_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"])); + "con_stimulate_general_valve" => vec!["_check_inv_17", "_check_inv_2"], //model_check_init_static - guardDependency.insert("env_start_retracting_first", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_start_retracting_first" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"], //model_check_init_static - guardDependency.insert("env_retract_gear_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_retract_gear_skip" => vec!["_check_inv_19", "_check_inv_24", "_check_inv_23"], //model_check_init_static - guardDependency.insert("open_valve_extend_gear", HashSet::from(["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"])); + "open_valve_extend_gear" => vec!["_check_inv_11"], //model_check_init_static - guardDependency.insert("begin_flying", HashSet::from(["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"])); + "begin_flying" => vec!["_check_inv_9"], //model_check_init_static - guardDependency.insert("open_valve_retract_gear", HashSet::from(["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"])); + "open_valve_retract_gear" => vec!["_check_inv_13"], //model_check_init_static - guardDependency.insert("env_close_analogical_switch", HashSet::from(["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"])); + "env_close_analogical_switch" => vec!["_check_inv_1"], //model_check_init_static - guardDependency.insert("env_start_extending", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_start_extending" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"], //model_check_init_static - guardDependency.insert("open_valve_door_close", HashSet::from(["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"])); + "open_valve_door_close" => vec!["_check_inv_10"], //model_check_init_static - guardDependency.insert("con_stop_stimulate_open_door_valve", HashSet::from(["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"])); + "con_stop_stimulate_open_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_7"], //model_check_init_static - guardDependency.insert("con_stop_stimulate_extend_gear_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"])); + "con_stop_stimulate_extend_gear_valve" => vec!["_check_inv_17", "_check_inv_6"], //model_check_init_static - guardDependency.insert("evn_close_general_valve", HashSet::from(["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "evn_close_general_valve" => vec!["_check_inv_3"], //model_check_init_static - guardDependency.insert("close_valve_extend_gear", HashSet::from(["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"])); + "close_valve_extend_gear" => vec!["_check_inv_11"], //model_check_init_static - guardDependency.insert("con_stimulate_extend_gear_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"])); + "con_stimulate_extend_gear_valve" => vec!["_check_inv_17", "_check_inv_6"], //model_check_init_static - guardDependency.insert("close_valve_door_open", HashSet::from(["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"])); + "close_valve_door_open" => vec!["_check_inv_12"], //model_check_init_static - guardDependency.insert("con_stimulate_close_door_valve", HashSet::from(["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"])); + "con_stimulate_close_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_5"], //model_check_init_static - guardDependency.insert("env_extend_gear_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_extend_gear_skip" => vec!["_check_inv_19", "_check_inv_24", "_check_inv_23"], //model_check_init_static - guardDependency.insert("env_open_door_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); + "env_open_door_skip" => vec!["_check_inv_21", "_check_inv_20", "_check_inv_22"], //model_check_init_static - guardDependency.insert("env_start_open_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); + "env_start_open_door" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"], + _ => vec![], } + } - let transitions = Arc::new(AtomicI64::new(0)); + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { + let mut machine = LandingGear_R6::new(); - while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - let mut state = Self::next(Arc::clone(&collection_m), mc_type); + let mut all_states = HashSet::<LandingGear_R6>::new(); + all_states.insert(machine.clone()); - 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 states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(LandingGear_R6, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine.clone(), "")); - next_states.iter().cloned().for_each(|next_state| { - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection_m.lock().unwrap().push_back(next_state); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - }); + let num_transitions = Arc::new(AtomicU64::new(0)); + + let mut stop_threads = false; + + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions)); + if !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); + print!("DEADLOCK DETECTED"); + stop_threads = true; } - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| all_states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op))); + if all_states.len() % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } } - Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { @@ -3210,255 +2260,66 @@ impl LandingGear_R6 { let machine = LandingGear_R6::new(); + let all_states = Arc::new(DashSet::<LandingGear_R6>::new()); + all_states.insert(machine.clone()); - let invariant_violated_b = Arc::new(AtomicBool::new(false)); - let deadlock_detected_b = Arc::new(AtomicBool::new(false)); - let stop_threads_b = Arc::new(AtomicBool::new(false)); - let possible_queue_changes_b = Arc::new(AtomicI32::new(0)); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(LandingGear_R6, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() || !machine._check_inv_21() || !machine._check_inv_22() || !machine._check_inv_23() || !machine._check_inv_24() || !machine._check_inv_25() { - invariant_violated_b.store(true, Ordering::Release); - } - - let states_m = Arc::new(Mutex::new(HashSet::<LandingGear_R6>::new())); - states_m.lock().unwrap().insert(machine.clone()); - let number_states_arc = Arc::new(AtomicI64::new(1)); - - let collection_m = Arc::new(Mutex::new(LinkedList::<LandingGear_R6>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<LandingGear_R6, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<LandingGear_R6, HashSet<&str>>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<LandingGear_R6, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<LandingGear_R6, LandingGear_R6>::new())); - - if is_caching { - //model_check_init_static - invariantDependency.insert("close_valve_door_close", HashSet::from(["_check_inv_10"])); - //model_check_init_static - invariantDependency.insert("close_valve_retract_gear", HashSet::from(["_check_inv_13"])); - //model_check_init_static - invariantDependency.insert("con_stimulate_open_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_7"])); - //model_check_init_static - invariantDependency.insert("env_close_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"])); - //model_check_init_static - invariantDependency.insert("env_start_close_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"])); - //model_check_init_static - invariantDependency.insert("toggle_handle_up", HashSet::from(["_check_inv_4", "_check_inv_14"])); - //model_check_init_static - invariantDependency.insert("toggle_handle_down", HashSet::from(["_check_inv_4", "_check_inv_14"])); - //model_check_init_static - invariantDependency.insert("open_valve_door_open", HashSet::from(["_check_inv_12"])); - //model_check_init_static - invariantDependency.insert("env_retract_gear_last", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"])); - //model_check_init_static - invariantDependency.insert("env_open_door_last", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"])); - //model_check_init_static - invariantDependency.insert("con_stop_stimulate_retract_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_8"])); - //model_check_init_static - invariantDependency.insert("env_close_door_skip", HashSet::from(["_check_inv_21", "_check_inv_20", "_check_inv_22"])); - //model_check_init_static - invariantDependency.insert("con_stop_stimulate_close_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_5"])); - //model_check_init_static - invariantDependency.insert("env_open_analogical_switch", HashSet::from(["_check_inv_1"])); - //model_check_init_static - invariantDependency.insert("con_stop_stimulate_general_valve", HashSet::from(["_check_inv_17", "_check_inv_2", "_check_inv_4"])); - //model_check_init_static - invariantDependency.insert("env_extend_gear_last", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"])); - //model_check_init_static - invariantDependency.insert("evn_open_general_valve", HashSet::from(["_check_inv_3"])); - //model_check_init_static - invariantDependency.insert("land_plane", HashSet::from(["_check_inv_9"])); - //model_check_init_static - invariantDependency.insert("con_stimulate_retract_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_8"])); - //model_check_init_static - invariantDependency.insert("con_stimulate_general_valve", HashSet::from(["_check_inv_17", "_check_inv_2"])); - //model_check_init_static - invariantDependency.insert("env_start_retracting_first", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"])); - //model_check_init_static - invariantDependency.insert("env_retract_gear_skip", HashSet::from(["_check_inv_19", "_check_inv_24", "_check_inv_23"])); - //model_check_init_static - invariantDependency.insert("open_valve_extend_gear", HashSet::from(["_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("begin_flying", HashSet::from(["_check_inv_9"])); - //model_check_init_static - invariantDependency.insert("open_valve_retract_gear", HashSet::from(["_check_inv_13"])); - //model_check_init_static - invariantDependency.insert("env_close_analogical_switch", HashSet::from(["_check_inv_1"])); - //model_check_init_static - invariantDependency.insert("env_start_extending", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"])); - //model_check_init_static - invariantDependency.insert("open_valve_door_close", HashSet::from(["_check_inv_10"])); - //model_check_init_static - invariantDependency.insert("con_stop_stimulate_open_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_7"])); - //model_check_init_static - invariantDependency.insert("con_stop_stimulate_extend_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_6"])); - //model_check_init_static - invariantDependency.insert("evn_close_general_valve", HashSet::from(["_check_inv_3"])); - //model_check_init_static - invariantDependency.insert("close_valve_extend_gear", HashSet::from(["_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("con_stimulate_extend_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_6"])); - //model_check_init_static - invariantDependency.insert("close_valve_door_open", HashSet::from(["_check_inv_12"])); - //model_check_init_static - invariantDependency.insert("con_stimulate_close_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_5"])); - //model_check_init_static - invariantDependency.insert("env_extend_gear_skip", HashSet::from(["_check_inv_19", "_check_inv_24", "_check_inv_23"])); - //model_check_init_static - invariantDependency.insert("env_open_door_skip", HashSet::from(["_check_inv_21", "_check_inv_20", "_check_inv_22"])); - //model_check_init_static - invariantDependency.insert("env_start_open_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"])); - //model_check_init_static - guardDependency.insert("close_valve_door_close", HashSet::from(["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"])); - //model_check_init_static - guardDependency.insert("close_valve_retract_gear", HashSet::from(["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"])); - //model_check_init_static - guardDependency.insert("con_stimulate_open_door_valve", HashSet::from(["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"])); - //model_check_init_static - guardDependency.insert("env_close_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("env_start_close_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("toggle_handle_up", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"])); - //model_check_init_static - guardDependency.insert("toggle_handle_down", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"])); - //model_check_init_static - guardDependency.insert("open_valve_door_open", HashSet::from(["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"])); - //model_check_init_static - guardDependency.insert("env_retract_gear_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("env_open_door_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("con_stop_stimulate_retract_gear_valve", HashSet::from(["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"])); - //model_check_init_static - guardDependency.insert("env_close_door_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("con_stop_stimulate_close_door_valve", HashSet::from(["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"])); - //model_check_init_static - guardDependency.insert("env_open_analogical_switch", HashSet::from(["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"])); - //model_check_init_static - guardDependency.insert("con_stop_stimulate_general_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve"])); - //model_check_init_static - guardDependency.insert("env_extend_gear_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("evn_open_general_valve", HashSet::from(["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("land_plane", HashSet::from(["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"])); - //model_check_init_static - guardDependency.insert("con_stimulate_retract_gear_valve", HashSet::from(["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"])); - //model_check_init_static - guardDependency.insert("con_stimulate_general_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"])); - //model_check_init_static - guardDependency.insert("env_start_retracting_first", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("env_retract_gear_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("open_valve_extend_gear", HashSet::from(["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"])); - //model_check_init_static - guardDependency.insert("begin_flying", HashSet::from(["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"])); - //model_check_init_static - guardDependency.insert("open_valve_retract_gear", HashSet::from(["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"])); - //model_check_init_static - guardDependency.insert("env_close_analogical_switch", HashSet::from(["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"])); - //model_check_init_static - guardDependency.insert("env_start_extending", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("open_valve_door_close", HashSet::from(["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"])); - //model_check_init_static - guardDependency.insert("con_stop_stimulate_open_door_valve", HashSet::from(["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"])); - //model_check_init_static - guardDependency.insert("con_stop_stimulate_extend_gear_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"])); - //model_check_init_static - guardDependency.insert("evn_close_general_valve", HashSet::from(["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("close_valve_extend_gear", HashSet::from(["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"])); - //model_check_init_static - guardDependency.insert("con_stimulate_extend_gear_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"])); - //model_check_init_static - guardDependency.insert("close_valve_door_open", HashSet::from(["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"])); - //model_check_init_static - guardDependency.insert("con_stimulate_close_door_valve", HashSet::from(["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"])); - //model_check_init_static - guardDependency.insert("env_extend_gear_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("env_open_door_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - //model_check_init_static - guardDependency.insert("env_start_open_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } + let num_transitions = Arc::new(AtomicU64::new(0)); - let num_transitions = Arc::new(AtomicI64::new(0)); - let invariant_dependency_arc = Arc::new(invariantDependency); - let guard_dependency_arc = Arc::new(guardDependency); + let mut stop_threads = false; + let mut spawned_tasks: u64 = 0; + let mut finished_tasks: u64 = 0; let (tx, rx) = channel(); //println!("Thread {:?} starting threads", thread::current().id()); - while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - possible_queue_changes_b.fetch_add(1, Ordering::AcqRel); - let mut state = Self::next(Arc::clone(&collection_m), mc_type); - - let invariant_violated = Arc::clone(&invariant_violated_b); - let deadlock_detected = Arc::clone(&deadlock_detected_b); - let stop_threads = Arc::clone(&stop_threads_b); - let possible_queue_changes = Arc::clone(&possible_queue_changes_b); - let collection_m2 = Arc::clone(&collection_m); - 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); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let states_to_process = Arc::clone(&states_to_process_mutex); let transitions = Arc::clone(&num_transitions); - let states_m2 = Arc::clone(&states_m); - let number_states = Arc::clone(&number_states_arc); + let states = Arc::clone(&all_states); 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)); + if !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } + + let next_states = Self::generateNextStates(&mut state, is_caching, transitions); + if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } //println!("Thread {:?} executing", thread::current().id()); - next_states.iter().cloned().for_each(|next_state| { - { - let mut states = states_m2.lock().unwrap(); - let mut collection = collection_m2.lock().unwrap(); - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection.push_back(next_state); - //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len()); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - } - }); - possible_queue_changes.fetch_sub(1, Ordering::AcqRel); - - if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op))); - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } //println!("Thread {:?} done", thread::current().id()); - tx.send(1).expect(""); + let _ = tx.send(Ok(1)); }); - while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 { + + spawned_tasks += 1; + if spawned_tasks % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } + + while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 { //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id()); - rx.recv().expect("Waiting for a thread to finish: "); + match rx.recv_timeout(Duration::from_secs(1)) { + Ok(val) => match val { + Ok(_) => finished_tasks += 1, + Err(msg) => { println!("{}", msg); stop_threads = true; }, + }, + Err(_) => (), + } + if threadPool.panic_count() > 0 { stop_threads = true; } } } - Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } } diff --git a/benchmarks/model_checking/Rust/Lift_MC_Large.rs b/benchmarks/model_checking/Rust/Lift_MC_Large.rs index 7dd7d1805e110045aa7449333c85a835255128c0..3e458e750db453b1496c8f2180f4adad6cb05ba4 100644 --- a/benchmarks/model_checking/Rust/Lift_MC_Large.rs +++ b/benchmarks/model_checking/Rust/Lift_MC_Large.rs @@ -1,16 +1,17 @@ -#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ] +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] use std::env; -use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::thread; -use std::collections::{HashMap, HashSet, LinkedList}; -use im::HashMap as PersistentHashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, mpsc, Mutex}; +use std::collections::{HashSet, LinkedList}; +use dashmap::DashSet; use threadpool::ThreadPool; use std::sync::mpsc::channel; use derivative::Derivative; +use std::time::{Duration}; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; +use btypes::bboolean::{IntoBool, BBooleanT}; use btypes::binteger::BInteger; use btypes::bboolean::BBoolean; use btypes::btuple::BTuple; @@ -29,6 +30,15 @@ pub struct Lift_MC_Large { #[derivative(Hash="ignore", PartialEq="ignore")] _tr_cache_dec: Option<bool>,} +impl fmt::Display for Lift_MC_Large { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut result = "Lift_MC_Large: (".to_owned(); + result += &format!("_get_level: {}, ", self._get_level()); + result = result + ")"; + return write!(f, "{}", result); + } +} + impl Lift_MC_Large { pub fn new() -> Lift_MC_Large { @@ -41,7 +51,7 @@ impl Lift_MC_Large { self.level = BInteger::new(0); } - pub fn get_level(&self) -> BInteger { + pub fn _get_level(&self) -> BInteger { return self.level.clone(); } @@ -89,11 +99,10 @@ impl Lift_MC_Large { return self.level.lessEqual(&BInteger::new(1000000)).booleanValue(); } - fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) { + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { //calling the given functions without caching will recalculate them and cache them afterwards - //if caching is enabled globally, this will just prefill those, if caching is - for trans in to_invalidate.iter() { - match *trans { + for trans in to_invalidate { + match trans { "_tr_inc" => {self._tr_inc(false);}, "_tr_dec" => {self._tr_dec(false);}, _ => {}, @@ -104,111 +113,50 @@ impl Lift_MC_Large { //model_check_next_states fn generateNextStates(state: &mut Lift_MC_Large, isCaching: bool, - invariant_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_invariant_m: Arc<Mutex<HashMap<Lift_MC_Large, HashSet<&str>>>>, - guard_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_guard_m: Arc<Mutex<HashMap<Lift_MC_Large, HashSet<&str>>>>, - guardCache: Arc<Mutex<HashMap<Lift_MC_Large, PersistentHashMap<&str, bool>>>>, - parents_m: Arc<Mutex<HashMap<Lift_MC_Large, Lift_MC_Large>>>, - transitions: Arc<AtomicI64>) -> HashSet<Lift_MC_Large> { - let mut result = HashSet::<Lift_MC_Large>::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_inc(isCaching); - if _trid_1 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.inc(); - match guard_dependency.get("inc") { 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("inc").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("inc").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_dec(isCaching); - if _trid_2 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.dec(); - match guard_dependency.get("dec") { 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("dec").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("dec").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } + transitions: Arc<AtomicU64>) -> HashSet<(Lift_MC_Large, &'static str)> { + let mut result = HashSet::<(Lift_MC_Large, &'static str)>::new(); + let mut evaluated_transitions: u64 = 0; + //model_check_transition + if state._tr_inc(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.inc(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("inc")); } + result.insert((copiedState, "inc")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_dec(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.dec(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("dec")); } + result.insert((copiedState, "dec")); + evaluated_transitions += 1; + } - guardCache.lock().unwrap().insert(state.clone(), newCache); - } else { - //model_check_transition - if state._tr_inc(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.inc(); - match guard_dependency.get("inc") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_dec(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.dec(); - match guard_dependency.get("dec") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - } + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); return result; } //model_check_evaluate_state //model_check_invariants - pub fn checkInvariants(state: &Lift_MC_Large, - isCaching: bool, - dependent_invariant_m: Arc<Mutex<HashMap<Lift_MC_Large, 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(); + pub fn checkInvariants(state: &Lift_MC_Large, last_op: &'static str, isCaching: bool) -> bool { + if isCaching { + let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op); //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_1") { + if dependent_invariants_of_state.contains(&"_check_inv_1") { if !state._check_inv_1() { + println!("_check_inv_1 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_2") { + if dependent_invariants_of_state.contains(&"_check_inv_2") { if !state._check_inv_2() { + println!("_check_inv_2 failed!"); return false; } } @@ -218,16 +166,14 @@ impl Lift_MC_Large { } //model_check_print - fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) { - if deadlock_detected { println!("DEADLOCK DETECTED"); } - if invariant_violated { println!("INVARIANT VIOLATED"); } - if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); } + fn print_result(states: usize, transitions: u64, error_detected: bool) { + if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); } println!("Number of States: {}", states); println!("Number of Transitions: {}", transitions); } //model_check_main - fn next(collection_m: Arc<Mutex<LinkedList<Lift_MC_Large>>>, mc_type: MC_TYPE) -> Lift_MC_Large { + fn next(collection_m: Arc<Mutex<LinkedList<(Lift_MC_Large, &'static str)>>>, mc_type: MC_TYPE) -> (Lift_MC_Large, &'static str) { let mut collection = collection_m.lock().unwrap(); return match mc_type { MC_TYPE::BFS => collection.pop_front().unwrap(), @@ -236,76 +182,64 @@ impl Lift_MC_Large { }; } - fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { - let mut machine = Lift_MC_Large::new(); - - let invariant_violated = AtomicBool::new(false); - let deadlock_detected = AtomicBool::new(false); - let stop_threads = AtomicBool::new(false); - - if !machine._check_inv_1() || !machine._check_inv_2() { - invariant_violated.store(true, Ordering::Release); - } - - let mut states = HashSet::<Lift_MC_Large>::new(); - states.insert(machine.clone()); - let number_states = AtomicI64::new(1); - - let collection_m = Arc::new(Mutex::new(LinkedList::<Lift_MC_Large>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<Lift_MC_Large, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, HashSet<&str>>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, Lift_MC_Large>::new())); - - if is_caching { + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - invariantDependency.insert("dec", HashSet::from(["_check_inv_2", "_check_inv_1"])); + "dec" => vec!["_tr_dec", "_tr_inc"], //model_check_init_static - invariantDependency.insert("inc", HashSet::from(["_check_inv_2", "_check_inv_1"])); + "inc" => vec!["_tr_dec", "_tr_inc"], + _ => vec![], + } + } + + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - guardDependency.insert("dec", HashSet::from(["_tr_dec", "_tr_inc"])); + "dec" => vec!["_check_inv_2", "_check_inv_1"], //model_check_init_static - guardDependency.insert("inc", HashSet::from(["_tr_dec", "_tr_inc"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); + "inc" => vec!["_check_inv_2", "_check_inv_1"], + _ => vec![], } + } - let transitions = Arc::new(AtomicI64::new(0)); + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { + let mut machine = Lift_MC_Large::new(); - while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - let mut state = Self::next(Arc::clone(&collection_m), mc_type); + let mut all_states = HashSet::<Lift_MC_Large>::new(); + all_states.insert(machine.clone()); - 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 states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Lift_MC_Large, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine.clone(), "")); - next_states.iter().cloned().for_each(|next_state| { - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection_m.lock().unwrap().push_back(next_state); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - }); + let num_transitions = Arc::new(AtomicU64::new(0)); + + let mut stop_threads = false; + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions)); + + if !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); + print!("DEADLOCK DETECTED"); + stop_threads = true; } - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| all_states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op))); + if all_states.len() % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } } - Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { @@ -313,111 +247,66 @@ impl Lift_MC_Large { let machine = Lift_MC_Large::new(); + let all_states = Arc::new(DashSet::<Lift_MC_Large>::new()); + all_states.insert(machine.clone()); - let invariant_violated_b = Arc::new(AtomicBool::new(false)); - let deadlock_detected_b = Arc::new(AtomicBool::new(false)); - let stop_threads_b = Arc::new(AtomicBool::new(false)); - let possible_queue_changes_b = Arc::new(AtomicI32::new(0)); - - if !machine._check_inv_1() || !machine._check_inv_2() { - invariant_violated_b.store(true, Ordering::Release); - } - - let states_m = Arc::new(Mutex::new(HashSet::<Lift_MC_Large>::new())); - states_m.lock().unwrap().insert(machine.clone()); - let number_states_arc = Arc::new(AtomicI64::new(1)); - - let collection_m = Arc::new(Mutex::new(LinkedList::<Lift_MC_Large>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<Lift_MC_Large, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, HashSet<&str>>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, Lift_MC_Large>::new())); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Lift_MC_Large, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); - if is_caching { - //model_check_init_static - invariantDependency.insert("dec", HashSet::from(["_check_inv_2", "_check_inv_1"])); - //model_check_init_static - invariantDependency.insert("inc", HashSet::from(["_check_inv_2", "_check_inv_1"])); - //model_check_init_static - guardDependency.insert("dec", HashSet::from(["_tr_dec", "_tr_inc"])); - //model_check_init_static - guardDependency.insert("inc", HashSet::from(["_tr_dec", "_tr_inc"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } + let num_transitions = Arc::new(AtomicU64::new(0)); - let num_transitions = Arc::new(AtomicI64::new(0)); - let invariant_dependency_arc = Arc::new(invariantDependency); - let guard_dependency_arc = Arc::new(guardDependency); + let mut stop_threads = false; + let mut spawned_tasks: u64 = 0; + let mut finished_tasks: u64 = 0; let (tx, rx) = channel(); //println!("Thread {:?} starting threads", thread::current().id()); - while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - possible_queue_changes_b.fetch_add(1, Ordering::AcqRel); - let mut state = Self::next(Arc::clone(&collection_m), mc_type); - - let invariant_violated = Arc::clone(&invariant_violated_b); - let deadlock_detected = Arc::clone(&deadlock_detected_b); - let stop_threads = Arc::clone(&stop_threads_b); - let possible_queue_changes = Arc::clone(&possible_queue_changes_b); - let collection_m2 = Arc::clone(&collection_m); - 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); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let states_to_process = Arc::clone(&states_to_process_mutex); let transitions = Arc::clone(&num_transitions); - let states_m2 = Arc::clone(&states_m); - let number_states = Arc::clone(&number_states_arc); + let states = Arc::clone(&all_states); 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)); + if !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } + + let next_states = Self::generateNextStates(&mut state, is_caching, transitions); + if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } //println!("Thread {:?} executing", thread::current().id()); - next_states.iter().cloned().for_each(|next_state| { - { - let mut states = states_m2.lock().unwrap(); - let mut collection = collection_m2.lock().unwrap(); - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection.push_back(next_state); - //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len()); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - } - }); - possible_queue_changes.fetch_sub(1, Ordering::AcqRel); - - if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op))); - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } //println!("Thread {:?} done", thread::current().id()); - tx.send(1).expect(""); + let _ = tx.send(Ok(1)); }); - while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 { + + spawned_tasks += 1; + if spawned_tasks % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } + + while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 { //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id()); - rx.recv().expect("Waiting for a thread to finish: "); + match rx.recv_timeout(Duration::from_secs(1)) { + Ok(val) => match val { + Ok(_) => finished_tasks += 1, + Err(msg) => { println!("{}", msg); stop_threads = true; }, + }, + Err(_) => (), + } + if threadPool.panic_count() > 0 { stop_threads = true; } } } - Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } } diff --git a/benchmarks/model_checking/Rust/Makefile b/benchmarks/model_checking/Rust/Makefile index 16351e5c1940f9efdc694e66f4b5ca268bca06d6..439baef89facffe899bcdc95112140d51d761192 100644 --- a/benchmarks/model_checking/Rust/Makefile +++ b/benchmarks/model_checking/Rust/Makefile @@ -11,16 +11,16 @@ CARGO_BUILD=cargo build --release --manifest-path $(CARGO_PROJ_PATH)/Cargo.toml #CARGO_BUILD=minicargo build --offline --release --manifest-path $(CARGO_PROJ_PATH)/Cargo.toml STRATEGY=mixed THREADS=1 -CACHING=false +CACHING=true % : clean %.rs cp $(*).rs $(CARGO_PROJ_PATH)/src/main.rs $(CARGO_BUILD) - /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING) - /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING) - /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING) - /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING) - /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) $(STRATEGY) $(THREADS) $(CACHING) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) $(STRATEGY) $(THREADS) $(CACHING) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) $(STRATEGY) $(THREADS) $(CACHING) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) $(STRATEGY) $(THREADS) $(CACHING) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) $(STRATEGY) $(THREADS) $(CACHING) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING) clean: rm -f $(CARGO_PROJ_PATH)/src/*.rs \ No newline at end of file diff --git a/benchmarks/model_checking/Rust/QueensWithEvents_4.rs b/benchmarks/model_checking/Rust/QueensWithEvents_4.rs index 3a5756de83569b28e455355e481c0d28aa58b4e9..7af2de3e37a983b86532ea80f68806712bb7c82c 100644 --- a/benchmarks/model_checking/Rust/QueensWithEvents_4.rs +++ b/benchmarks/model_checking/Rust/QueensWithEvents_4.rs @@ -1,16 +1,17 @@ -#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ] +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] use std::env; -use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::thread; -use std::collections::{HashMap, HashSet, LinkedList}; -use im::HashMap as PersistentHashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, mpsc, Mutex}; +use std::collections::{HashSet, LinkedList}; +use dashmap::DashSet; use threadpool::ThreadPool; use std::sync::mpsc::channel; use derivative::Derivative; +use std::time::{Duration}; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; +use btypes::bboolean::{IntoBool, BBooleanT}; use btypes::binteger::BInteger; use btypes::bboolean::BBoolean; use btypes::brelation::BRelation; @@ -32,6 +33,15 @@ pub struct QueensWithEvents_4 { #[derivative(Hash="ignore", PartialEq="ignore")] _tr_cache_Solve: Option<BSet<BRelation<BInteger, BInteger>>>,} +impl fmt::Display for QueensWithEvents_4 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut result = "QueensWithEvents_4: (".to_owned(); + result += &format!("_get_queens: {}, ", self._get_queens()); + result = result + ")"; + return write!(f, "{}", result); + } +} + impl QueensWithEvents_4 { pub fn new() -> QueensWithEvents_4 { @@ -47,26 +57,26 @@ impl QueensWithEvents_4 { self.queens = BRelation::new(vec![]).clone().clone(); } - pub fn get_n(&self) -> BInteger { + pub fn _get_n(&self) -> BInteger { return self.n.clone(); } - pub fn get_interval(&self) -> BSet<BInteger> { + pub fn _get_interval(&self) -> BSet<BInteger> { return self.interval.clone(); } - pub fn get_allFields(&self) -> BSet<BRelation<BInteger, BInteger>> { + pub fn _get_allFields(&self) -> BSet<BRelation<BInteger, BInteger>> { return self.allFields.clone(); } - pub fn get_queens(&self) -> BRelation<BInteger, BInteger> { + pub fn _get_queens(&self) -> BRelation<BInteger, BInteger> { return self.queens.clone(); } pub fn Solve(&mut self, mut solution: BRelation<BInteger, BInteger>) -> () { //quantified_predicate let mut _ic_boolean_1 = BBoolean::new(true); - if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).booleanValue() { + if (solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)).booleanValue() { for _ic_x_1 in self.interval.clone().iter().cloned() { for _ic_y_1 in self.interval.clone().iter().cloned() { //quantified_predicate @@ -90,10 +100,10 @@ impl QueensWithEvents_4 { //quantified_predicate let mut _ic_boolean_2 = BBoolean::new(true); - if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).booleanValue() { + if ((solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)) && _ic_boolean_1).booleanValue() { for _ic_q1_1 in self.interval.clone().iter().cloned() { for _ic_q2_1 in self.interval.difference(&BSet::new(vec![BInteger::new(1)])).clone().iter().cloned() { - if !(_ic_q2_1.greater(&_ic_q1_1).implies(&solution.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1)).and(&solution.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1))))).booleanValue() { + if !(_ic_q2_1.greater(&_ic_q1_1).implies(&(solution.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1)) && solution.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1))))).booleanValue() { _ic_boolean_2 = BBoolean::new(false); break; } @@ -104,7 +114,7 @@ impl QueensWithEvents_4 { //quantified_predicate let mut _ic_boolean_3 = BBoolean::new(true); - if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).and(&_ic_boolean_2).booleanValue() { + if (((solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)) && _ic_boolean_1) && _ic_boolean_2).booleanValue() { for _ic_x_1 in self.queens.domain().clone().iter().cloned() { if !(solution.functionCall(&_ic_x_1).equal(&self.queens.functionCall(&_ic_x_1))).booleanValue() { _ic_boolean_3 = BBoolean::new(false); @@ -114,7 +124,7 @@ impl QueensWithEvents_4 { } } - if (self.allFields.elementOf(&solution).and(&solution.domain().equal(&self.interval)).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).and(&_ic_boolean_2).and(&_ic_boolean_3)).booleanValue() { + if ((((((self.allFields.elementOf(&solution) && solution.domain().equal(&self.interval)) && solution.range().equal(&self.interval)) && _ic_boolean_1) && _ic_boolean_2) && _ic_boolean_3)).booleanValue() { self.queens = solution.clone().clone(); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -129,7 +139,7 @@ impl QueensWithEvents_4 { for _ic_solution_1 in self.allFields.clone().iter().cloned() { //quantified_predicate let mut _ic_boolean_5 = BBoolean::new(true); - if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).booleanValue() { + if (_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)).booleanValue() { for _ic_x_1 in self.interval.clone().iter().cloned() { for _ic_y_1 in self.interval.clone().iter().cloned() { //quantified_predicate @@ -152,10 +162,10 @@ impl QueensWithEvents_4 { } //quantified_predicate let mut _ic_boolean_6 = BBoolean::new(true); - if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).booleanValue() { + if ((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5).booleanValue() { for _ic_q1_1 in self.interval.clone().iter().cloned() { for _ic_q2_1 in self.interval.difference(&BSet::new(vec![BInteger::new(1)])).clone().iter().cloned() { - if !(_ic_q2_1.greater(&_ic_q1_1).implies(&_ic_solution_1.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1)).and(&_ic_solution_1.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1))))).booleanValue() { + if !(_ic_q2_1.greater(&_ic_q1_1).implies(&(_ic_solution_1.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1)) && _ic_solution_1.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1))))).booleanValue() { _ic_boolean_6 = BBoolean::new(false); break; } @@ -165,7 +175,7 @@ impl QueensWithEvents_4 { } //quantified_predicate let mut _ic_boolean_7 = BBoolean::new(true); - if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).and(&_ic_boolean_6).booleanValue() { + if (((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5) && _ic_boolean_6).booleanValue() { for _ic_x_1 in self.queens.domain().clone().iter().cloned() { if !(_ic_solution_1.functionCall(&_ic_x_1).equal(&self.queens.functionCall(&_ic_x_1))).booleanValue() { _ic_boolean_7 = BBoolean::new(false); @@ -175,7 +185,7 @@ impl QueensWithEvents_4 { } } - if (_ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).and(&_ic_boolean_6).and(&_ic_boolean_7)).booleanValue() { + if (((((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5) && _ic_boolean_6) && _ic_boolean_7)).booleanValue() { _ic_set_4 = _ic_set_4._union(&BSet::new(vec![_ic_solution_1])); } @@ -192,11 +202,10 @@ impl QueensWithEvents_4 { return self.queens.checkDomain(&self.interval).and(&self.queens.checkRange(&self.interval)).and(&self.queens.isFunction()).and(&self.queens.isPartial(&self.interval)).booleanValue(); } - fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) { + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { //calling the given functions without caching will recalculate them and cache them afterwards - //if caching is enabled globally, this will just prefill those, if caching is - for trans in to_invalidate.iter() { - match *trans { + for trans in to_invalidate { + match trans { "_tr_Solve" => {self._tr_Solve(false);}, _ => {}, } @@ -206,78 +215,38 @@ impl QueensWithEvents_4 { //model_check_next_states fn generateNextStates(state: &mut QueensWithEvents_4, isCaching: bool, - invariant_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_invariant_m: Arc<Mutex<HashMap<QueensWithEvents_4, HashSet<&str>>>>, - guard_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_guard_m: Arc<Mutex<HashMap<QueensWithEvents_4, HashSet<&str>>>>, - guardCache: Arc<Mutex<HashMap<QueensWithEvents_4, PersistentHashMap<&str, bool>>>>, - parents_m: Arc<Mutex<HashMap<QueensWithEvents_4, QueensWithEvents_4>>>, - transitions: Arc<AtomicI64>) -> HashSet<QueensWithEvents_4> { - let mut result = HashSet::<QueensWithEvents_4>::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_Solve(isCaching); - for param in _trid_1.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.Solve(_tmp_1); - match guard_dependency.get("Solve") { 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("Solve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("Solve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } + transitions: Arc<AtomicU64>) -> HashSet<(QueensWithEvents_4, &'static str)> { + let mut result = HashSet::<(QueensWithEvents_4, &'static str)>::new(); + let mut evaluated_transitions: u64 = 0; + //model_check_transition + let mut _trid_1 = state._tr_Solve(isCaching); + for param in _trid_1.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.Solve(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("Solve")); } + result.insert((copiedState, "Solve")); + evaluated_transitions += 1; + } - guardCache.lock().unwrap().insert(state.clone(), newCache); - } else { - //model_check_transition - let mut _trid_1 = state._tr_Solve(isCaching); - for param in _trid_1.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.Solve(_tmp_1); - match guard_dependency.get("Solve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - } + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); return result; } //model_check_evaluate_state //model_check_invariants - pub fn checkInvariants(state: &QueensWithEvents_4, - isCaching: bool, - dependent_invariant_m: Arc<Mutex<HashMap<QueensWithEvents_4, 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(); + pub fn checkInvariants(state: &QueensWithEvents_4, last_op: &'static str, isCaching: bool) -> bool { + if isCaching { + let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op); //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_1") { + if dependent_invariants_of_state.contains(&"_check_inv_1") { if !state._check_inv_1() { + println!("_check_inv_1 failed!"); return false; } } @@ -287,16 +256,14 @@ impl QueensWithEvents_4 { } //model_check_print - fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) { - if deadlock_detected { println!("DEADLOCK DETECTED"); } - if invariant_violated { println!("INVARIANT VIOLATED"); } - if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); } + fn print_result(states: usize, transitions: u64, error_detected: bool) { + if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); } println!("Number of States: {}", states); println!("Number of Transitions: {}", transitions); } //model_check_main - fn next(collection_m: Arc<Mutex<LinkedList<QueensWithEvents_4>>>, mc_type: MC_TYPE) -> QueensWithEvents_4 { + fn next(collection_m: Arc<Mutex<LinkedList<(QueensWithEvents_4, &'static str)>>>, mc_type: MC_TYPE) -> (QueensWithEvents_4, &'static str) { let mut collection = collection_m.lock().unwrap(); return match mc_type { MC_TYPE::BFS => collection.pop_front().unwrap(), @@ -305,72 +272,60 @@ impl QueensWithEvents_4 { }; } - fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { - let mut machine = QueensWithEvents_4::new(); - - let invariant_violated = AtomicBool::new(false); - let deadlock_detected = AtomicBool::new(false); - let stop_threads = AtomicBool::new(false); + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "Solve" => vec!["_tr_Solve"], + _ => vec![], + } + } - if !machine._check_inv_1() { - invariant_violated.store(true, Ordering::Release); + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "Solve" => vec!["_check_inv_1"], + _ => vec![], } + } - let mut states = HashSet::<QueensWithEvents_4>::new(); - states.insert(machine.clone()); - let number_states = AtomicI64::new(1); + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { + let mut machine = QueensWithEvents_4::new(); - let collection_m = Arc::new(Mutex::new(LinkedList::<QueensWithEvents_4>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); + let mut all_states = HashSet::<QueensWithEvents_4>::new(); + all_states.insert(machine.clone()); - 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::<QueensWithEvents_4, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, HashSet<&str>>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, QueensWithEvents_4>::new())); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(QueensWithEvents_4, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine.clone(), "")); - if is_caching { - //model_check_init_static - invariantDependency.insert("Solve", HashSet::from(["_check_inv_1"])); - //model_check_init_static - guardDependency.insert("Solve", HashSet::from(["_tr_Solve"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } + let num_transitions = Arc::new(AtomicU64::new(0)); - let transitions = Arc::new(AtomicI64::new(0)); + let mut stop_threads = false; - while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - let mut state = Self::next(Arc::clone(&collection_m), mc_type); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), 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)); - - next_states.iter().cloned().for_each(|next_state| { - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection_m.lock().unwrap().push_back(next_state); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - }); + let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions)); + if !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); + print!("DEADLOCK DETECTED"); + stop_threads = true; } - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| all_states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op))); + if all_states.len() % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } } - Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { @@ -378,107 +333,66 @@ impl QueensWithEvents_4 { let machine = QueensWithEvents_4::new(); + let all_states = Arc::new(DashSet::<QueensWithEvents_4>::new()); + all_states.insert(machine.clone()); - let invariant_violated_b = Arc::new(AtomicBool::new(false)); - let deadlock_detected_b = Arc::new(AtomicBool::new(false)); - let stop_threads_b = Arc::new(AtomicBool::new(false)); - let possible_queue_changes_b = Arc::new(AtomicI32::new(0)); - - if !machine._check_inv_1() { - invariant_violated_b.store(true, Ordering::Release); - } - - let states_m = Arc::new(Mutex::new(HashSet::<QueensWithEvents_4>::new())); - states_m.lock().unwrap().insert(machine.clone()); - let number_states_arc = Arc::new(AtomicI64::new(1)); - - let collection_m = Arc::new(Mutex::new(LinkedList::<QueensWithEvents_4>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<QueensWithEvents_4, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, HashSet<&str>>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, QueensWithEvents_4>::new())); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(QueensWithEvents_4, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); - if is_caching { - //model_check_init_static - invariantDependency.insert("Solve", HashSet::from(["_check_inv_1"])); - //model_check_init_static - guardDependency.insert("Solve", HashSet::from(["_tr_Solve"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } + let num_transitions = Arc::new(AtomicU64::new(0)); - let num_transitions = Arc::new(AtomicI64::new(0)); - let invariant_dependency_arc = Arc::new(invariantDependency); - let guard_dependency_arc = Arc::new(guardDependency); + let mut stop_threads = false; + let mut spawned_tasks: u64 = 0; + let mut finished_tasks: u64 = 0; let (tx, rx) = channel(); //println!("Thread {:?} starting threads", thread::current().id()); - while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - possible_queue_changes_b.fetch_add(1, Ordering::AcqRel); - let mut state = Self::next(Arc::clone(&collection_m), mc_type); - - let invariant_violated = Arc::clone(&invariant_violated_b); - let deadlock_detected = Arc::clone(&deadlock_detected_b); - let stop_threads = Arc::clone(&stop_threads_b); - let possible_queue_changes = Arc::clone(&possible_queue_changes_b); - let collection_m2 = Arc::clone(&collection_m); - 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); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let states_to_process = Arc::clone(&states_to_process_mutex); let transitions = Arc::clone(&num_transitions); - let states_m2 = Arc::clone(&states_m); - let number_states = Arc::clone(&number_states_arc); + let states = Arc::clone(&all_states); 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)); + if !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } - //println!("Thread {:?} executing", thread::current().id()); - next_states.iter().cloned().for_each(|next_state| { - { - let mut states = states_m2.lock().unwrap(); - let mut collection = collection_m2.lock().unwrap(); - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection.push_back(next_state); - //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len()); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - } - }); - possible_queue_changes.fetch_sub(1, Ordering::AcqRel); + let next_states = Self::generateNextStates(&mut state, is_caching, transitions); + if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } - if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + //println!("Thread {:?} executing", thread::current().id()); + next_states.into_iter() + .filter(|(next_state, _)| states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op))); - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } //println!("Thread {:?} done", thread::current().id()); - tx.send(1).expect(""); + let _ = tx.send(Ok(1)); }); - while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 { + + spawned_tasks += 1; + if spawned_tasks % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } + + while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 { //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id()); - rx.recv().expect("Waiting for a thread to finish: "); + match rx.recv_timeout(Duration::from_secs(1)) { + Ok(val) => match val { + Ok(_) => finished_tasks += 1, + Err(msg) => { println!("{}", msg); stop_threads = true; }, + }, + Err(_) => (), + } + if threadPool.panic_count() > 0 { stop_threads = true; } } } - Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } } diff --git a/benchmarks/model_checking/Rust/QueensWithEvents_8.rs b/benchmarks/model_checking/Rust/QueensWithEvents_8.rs index a4855dd4df42e66d8adafe9f36f5ab32941858ce..ab2c086ae41125f80940cc9193ab0975768088c0 100644 --- a/benchmarks/model_checking/Rust/QueensWithEvents_8.rs +++ b/benchmarks/model_checking/Rust/QueensWithEvents_8.rs @@ -1,16 +1,17 @@ -#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ] +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] use std::env; -use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::thread; -use std::collections::{HashMap, HashSet, LinkedList}; -use im::HashMap as PersistentHashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, mpsc, Mutex}; +use std::collections::{HashSet, LinkedList}; +use dashmap::DashSet; use threadpool::ThreadPool; use std::sync::mpsc::channel; use derivative::Derivative; +use std::time::{Duration}; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; +use btypes::bboolean::{IntoBool, BBooleanT}; use btypes::binteger::BInteger; use btypes::bboolean::BBoolean; use btypes::brelation::BRelation; @@ -32,6 +33,15 @@ pub struct QueensWithEvents_8 { #[derivative(Hash="ignore", PartialEq="ignore")] _tr_cache_Solve: Option<BSet<BRelation<BInteger, BInteger>>>,} +impl fmt::Display for QueensWithEvents_8 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut result = "QueensWithEvents_8: (".to_owned(); + result += &format!("_get_queens: {}, ", self._get_queens()); + result = result + ")"; + return write!(f, "{}", result); + } +} + impl QueensWithEvents_8 { pub fn new() -> QueensWithEvents_8 { @@ -41,32 +51,32 @@ impl QueensWithEvents_8 { return m; } fn init(&mut self) { - self.n = BInteger::new(4); + self.n = BInteger::new(8); self.interval = BSet::<BInteger>::interval(&BInteger::new(1), &self.n); self.allFields = BRelation::cartesianProduct(&self.interval, &self.interval).pow(); self.queens = BRelation::new(vec![]).clone().clone(); } - pub fn get_n(&self) -> BInteger { + pub fn _get_n(&self) -> BInteger { return self.n.clone(); } - pub fn get_interval(&self) -> BSet<BInteger> { + pub fn _get_interval(&self) -> BSet<BInteger> { return self.interval.clone(); } - pub fn get_allFields(&self) -> BSet<BRelation<BInteger, BInteger>> { + pub fn _get_allFields(&self) -> BSet<BRelation<BInteger, BInteger>> { return self.allFields.clone(); } - pub fn get_queens(&self) -> BRelation<BInteger, BInteger> { + pub fn _get_queens(&self) -> BRelation<BInteger, BInteger> { return self.queens.clone(); } pub fn Solve(&mut self, mut solution: BRelation<BInteger, BInteger>) -> () { //quantified_predicate let mut _ic_boolean_1 = BBoolean::new(true); - if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).booleanValue() { + if (solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)).booleanValue() { for _ic_x_1 in self.interval.clone().iter().cloned() { for _ic_y_1 in self.interval.clone().iter().cloned() { //quantified_predicate @@ -90,10 +100,10 @@ impl QueensWithEvents_8 { //quantified_predicate let mut _ic_boolean_2 = BBoolean::new(true); - if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).booleanValue() { + if ((solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)) && _ic_boolean_1).booleanValue() { for _ic_q1_1 in self.interval.clone().iter().cloned() { for _ic_q2_1 in self.interval.difference(&BSet::new(vec![BInteger::new(1)])).clone().iter().cloned() { - if !(_ic_q2_1.greater(&_ic_q1_1).implies(&solution.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1)).and(&solution.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1))))).booleanValue() { + if !(_ic_q2_1.greater(&_ic_q1_1).implies(&(solution.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1)) && solution.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1))))).booleanValue() { _ic_boolean_2 = BBoolean::new(false); break; } @@ -104,7 +114,7 @@ impl QueensWithEvents_8 { //quantified_predicate let mut _ic_boolean_3 = BBoolean::new(true); - if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).and(&_ic_boolean_2).booleanValue() { + if (((solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)) && _ic_boolean_1) && _ic_boolean_2).booleanValue() { for _ic_x_1 in self.queens.domain().clone().iter().cloned() { if !(solution.functionCall(&_ic_x_1).equal(&self.queens.functionCall(&_ic_x_1))).booleanValue() { _ic_boolean_3 = BBoolean::new(false); @@ -114,7 +124,7 @@ impl QueensWithEvents_8 { } } - if (self.allFields.elementOf(&solution).and(&solution.domain().equal(&self.interval)).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).and(&_ic_boolean_2).and(&_ic_boolean_3)).booleanValue() { + if ((((((self.allFields.elementOf(&solution) && solution.domain().equal(&self.interval)) && solution.range().equal(&self.interval)) && _ic_boolean_1) && _ic_boolean_2) && _ic_boolean_3)).booleanValue() { self.queens = solution.clone().clone(); } else { panic!("ERROR: called SELECT-function with incompatible parameters!"); @@ -129,7 +139,7 @@ impl QueensWithEvents_8 { for _ic_solution_1 in self.allFields.clone().iter().cloned() { //quantified_predicate let mut _ic_boolean_5 = BBoolean::new(true); - if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).booleanValue() { + if (_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)).booleanValue() { for _ic_x_1 in self.interval.clone().iter().cloned() { for _ic_y_1 in self.interval.clone().iter().cloned() { //quantified_predicate @@ -152,10 +162,10 @@ impl QueensWithEvents_8 { } //quantified_predicate let mut _ic_boolean_6 = BBoolean::new(true); - if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).booleanValue() { + if ((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5).booleanValue() { for _ic_q1_1 in self.interval.clone().iter().cloned() { for _ic_q2_1 in self.interval.difference(&BSet::new(vec![BInteger::new(1)])).clone().iter().cloned() { - if !(_ic_q2_1.greater(&_ic_q1_1).implies(&_ic_solution_1.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1)).and(&_ic_solution_1.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1))))).booleanValue() { + if !(_ic_q2_1.greater(&_ic_q1_1).implies(&(_ic_solution_1.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1)) && _ic_solution_1.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1))))).booleanValue() { _ic_boolean_6 = BBoolean::new(false); break; } @@ -165,7 +175,7 @@ impl QueensWithEvents_8 { } //quantified_predicate let mut _ic_boolean_7 = BBoolean::new(true); - if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).and(&_ic_boolean_6).booleanValue() { + if (((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5) && _ic_boolean_6).booleanValue() { for _ic_x_1 in self.queens.domain().clone().iter().cloned() { if !(_ic_solution_1.functionCall(&_ic_x_1).equal(&self.queens.functionCall(&_ic_x_1))).booleanValue() { _ic_boolean_7 = BBoolean::new(false); @@ -175,7 +185,7 @@ impl QueensWithEvents_8 { } } - if (_ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).and(&_ic_boolean_6).and(&_ic_boolean_7)).booleanValue() { + if (((((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5) && _ic_boolean_6) && _ic_boolean_7)).booleanValue() { _ic_set_4 = _ic_set_4._union(&BSet::new(vec![_ic_solution_1])); } @@ -192,11 +202,10 @@ impl QueensWithEvents_8 { return self.queens.checkDomain(&self.interval).and(&self.queens.checkRange(&self.interval)).and(&self.queens.isFunction()).and(&self.queens.isPartial(&self.interval)).booleanValue(); } - fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) { + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { //calling the given functions without caching will recalculate them and cache them afterwards - //if caching is enabled globally, this will just prefill those, if caching is - for trans in to_invalidate.iter() { - match *trans { + for trans in to_invalidate { + match trans { "_tr_Solve" => {self._tr_Solve(false);}, _ => {}, } @@ -206,78 +215,38 @@ impl QueensWithEvents_8 { //model_check_next_states fn generateNextStates(state: &mut QueensWithEvents_8, isCaching: bool, - invariant_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_invariant_m: Arc<Mutex<HashMap<QueensWithEvents_8, HashSet<&str>>>>, - guard_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_guard_m: Arc<Mutex<HashMap<QueensWithEvents_8, HashSet<&str>>>>, - guardCache: Arc<Mutex<HashMap<QueensWithEvents_8, PersistentHashMap<&str, bool>>>>, - parents_m: Arc<Mutex<HashMap<QueensWithEvents_8, QueensWithEvents_8>>>, - transitions: Arc<AtomicI64>) -> HashSet<QueensWithEvents_8> { - let mut result = HashSet::<QueensWithEvents_8>::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_Solve(isCaching); - for param in _trid_1.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.Solve(_tmp_1); - match guard_dependency.get("Solve") { 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("Solve").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("Solve").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } + transitions: Arc<AtomicU64>) -> HashSet<(QueensWithEvents_8, &'static str)> { + let mut result = HashSet::<(QueensWithEvents_8, &'static str)>::new(); + let mut evaluated_transitions: u64 = 0; + //model_check_transition + let mut _trid_1 = state._tr_Solve(isCaching); + for param in _trid_1.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.Solve(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("Solve")); } + result.insert((copiedState, "Solve")); + evaluated_transitions += 1; + } - guardCache.lock().unwrap().insert(state.clone(), newCache); - } else { - //model_check_transition - let mut _trid_1 = state._tr_Solve(isCaching); - for param in _trid_1.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.Solve(_tmp_1); - match guard_dependency.get("Solve") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - } + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); return result; } //model_check_evaluate_state //model_check_invariants - pub fn checkInvariants(state: &QueensWithEvents_8, - isCaching: bool, - dependent_invariant_m: Arc<Mutex<HashMap<QueensWithEvents_8, 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(); + pub fn checkInvariants(state: &QueensWithEvents_8, last_op: &'static str, isCaching: bool) -> bool { + if isCaching { + let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op); //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_1") { + if dependent_invariants_of_state.contains(&"_check_inv_1") { if !state._check_inv_1() { + println!("_check_inv_1 failed!"); return false; } } @@ -287,16 +256,14 @@ impl QueensWithEvents_8 { } //model_check_print - fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) { - if deadlock_detected { println!("DEADLOCK DETECTED"); } - if invariant_violated { println!("INVARIANT VIOLATED"); } - if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); } + fn print_result(states: usize, transitions: u64, error_detected: bool) { + if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); } println!("Number of States: {}", states); println!("Number of Transitions: {}", transitions); } //model_check_main - fn next(collection_m: Arc<Mutex<LinkedList<QueensWithEvents_8>>>, mc_type: MC_TYPE) -> QueensWithEvents_8 { + fn next(collection_m: Arc<Mutex<LinkedList<(QueensWithEvents_8, &'static str)>>>, mc_type: MC_TYPE) -> (QueensWithEvents_8, &'static str) { let mut collection = collection_m.lock().unwrap(); return match mc_type { MC_TYPE::BFS => collection.pop_front().unwrap(), @@ -305,72 +272,60 @@ impl QueensWithEvents_8 { }; } - fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { - let mut machine = QueensWithEvents_8::new(); - - let invariant_violated = AtomicBool::new(false); - let deadlock_detected = AtomicBool::new(false); - let stop_threads = AtomicBool::new(false); + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "Solve" => vec!["_tr_Solve"], + _ => vec![], + } + } - if !machine._check_inv_1() { - invariant_violated.store(true, Ordering::Release); + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "Solve" => vec!["_check_inv_1"], + _ => vec![], } + } - let mut states = HashSet::<QueensWithEvents_8>::new(); - states.insert(machine.clone()); - let number_states = AtomicI64::new(1); + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { + let mut machine = QueensWithEvents_8::new(); - let collection_m = Arc::new(Mutex::new(LinkedList::<QueensWithEvents_8>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); + let mut all_states = HashSet::<QueensWithEvents_8>::new(); + all_states.insert(machine.clone()); - 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::<QueensWithEvents_8, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, HashSet<&str>>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, QueensWithEvents_8>::new())); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(QueensWithEvents_8, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine.clone(), "")); - if is_caching { - //model_check_init_static - invariantDependency.insert("Solve", HashSet::from(["_check_inv_1"])); - //model_check_init_static - guardDependency.insert("Solve", HashSet::from(["_tr_Solve"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } + let num_transitions = Arc::new(AtomicU64::new(0)); - let transitions = Arc::new(AtomicI64::new(0)); + let mut stop_threads = false; - while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - let mut state = Self::next(Arc::clone(&collection_m), mc_type); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), 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)); - - next_states.iter().cloned().for_each(|next_state| { - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection_m.lock().unwrap().push_back(next_state); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - }); + let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions)); + if !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); + print!("DEADLOCK DETECTED"); + stop_threads = true; } - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| all_states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op))); + if all_states.len() % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } } - Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { @@ -378,107 +333,66 @@ impl QueensWithEvents_8 { let machine = QueensWithEvents_8::new(); + let all_states = Arc::new(DashSet::<QueensWithEvents_8>::new()); + all_states.insert(machine.clone()); - let invariant_violated_b = Arc::new(AtomicBool::new(false)); - let deadlock_detected_b = Arc::new(AtomicBool::new(false)); - let stop_threads_b = Arc::new(AtomicBool::new(false)); - let possible_queue_changes_b = Arc::new(AtomicI32::new(0)); - - if !machine._check_inv_1() { - invariant_violated_b.store(true, Ordering::Release); - } - - let states_m = Arc::new(Mutex::new(HashSet::<QueensWithEvents_8>::new())); - states_m.lock().unwrap().insert(machine.clone()); - let number_states_arc = Arc::new(AtomicI64::new(1)); - - let collection_m = Arc::new(Mutex::new(LinkedList::<QueensWithEvents_8>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<QueensWithEvents_8, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, HashSet<&str>>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, QueensWithEvents_8>::new())); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(QueensWithEvents_8, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); - if is_caching { - //model_check_init_static - invariantDependency.insert("Solve", HashSet::from(["_check_inv_1"])); - //model_check_init_static - guardDependency.insert("Solve", HashSet::from(["_tr_Solve"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } + let num_transitions = Arc::new(AtomicU64::new(0)); - let num_transitions = Arc::new(AtomicI64::new(0)); - let invariant_dependency_arc = Arc::new(invariantDependency); - let guard_dependency_arc = Arc::new(guardDependency); + let mut stop_threads = false; + let mut spawned_tasks: u64 = 0; + let mut finished_tasks: u64 = 0; let (tx, rx) = channel(); //println!("Thread {:?} starting threads", thread::current().id()); - while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - possible_queue_changes_b.fetch_add(1, Ordering::AcqRel); - let mut state = Self::next(Arc::clone(&collection_m), mc_type); - - let invariant_violated = Arc::clone(&invariant_violated_b); - let deadlock_detected = Arc::clone(&deadlock_detected_b); - let stop_threads = Arc::clone(&stop_threads_b); - let possible_queue_changes = Arc::clone(&possible_queue_changes_b); - let collection_m2 = Arc::clone(&collection_m); - 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); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let states_to_process = Arc::clone(&states_to_process_mutex); let transitions = Arc::clone(&num_transitions); - let states_m2 = Arc::clone(&states_m); - let number_states = Arc::clone(&number_states_arc); + let states = Arc::clone(&all_states); 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)); + if !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } - //println!("Thread {:?} executing", thread::current().id()); - next_states.iter().cloned().for_each(|next_state| { - { - let mut states = states_m2.lock().unwrap(); - let mut collection = collection_m2.lock().unwrap(); - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection.push_back(next_state); - //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len()); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - } - }); - possible_queue_changes.fetch_sub(1, Ordering::AcqRel); + let next_states = Self::generateNextStates(&mut state, is_caching, transitions); + if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } - if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + //println!("Thread {:?} executing", thread::current().id()); + next_states.into_iter() + .filter(|(next_state, _)| states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op))); - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } //println!("Thread {:?} done", thread::current().id()); - tx.send(1).expect(""); + let _ = tx.send(Ok(1)); }); - while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 { + + spawned_tasks += 1; + if spawned_tasks % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } + + while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 { //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id()); - rx.recv().expect("Waiting for a thread to finish: "); + match rx.recv_timeout(Duration::from_secs(1)) { + Ok(val) => match val { + Ok(_) => finished_tasks += 1, + Err(msg) => { println!("{}", msg); stop_threads = true; }, + }, + Err(_) => (), + } + if threadPool.panic_count() > 0 { stop_threads = true; } } } - Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } } diff --git a/benchmarks/model_checking/Rust/Train1_Lukas_POR_v3.rs b/benchmarks/model_checking/Rust/Train1_Lukas_POR_v3.rs index f0674fe69405ad9c6a0a67e26bc2d2ea74b64846..52284d90848b429bfabb17488bac0f9601df55da 100644 --- a/benchmarks/model_checking/Rust/Train1_Lukas_POR_v3.rs +++ b/benchmarks/model_checking/Rust/Train1_Lukas_POR_v3.rs @@ -1,16 +1,17 @@ -#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ] +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] use std::env; -use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::thread; -use std::collections::{HashMap, HashSet, LinkedList}; -use im::HashMap as PersistentHashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, mpsc, Mutex}; +use std::collections::{HashSet, LinkedList}; +use dashmap::DashSet; use threadpool::ThreadPool; use std::sync::mpsc::channel; use derivative::Derivative; +use std::time::{Duration}; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; +use btypes::bboolean::{IntoBool, BBooleanT}; use btypes::bboolean::BBoolean; use btypes::brelation::BRelation; use btypes::bset::BSet; @@ -23,14 +24,14 @@ pub enum MC_TYPE { BFS, DFS, MIXED } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum BLOCKS { - A, - B, - C, - D, - E, - F, - G, - H, + A, + B, + C, + D, + E, + F, + G, + H, I } impl BLOCKS { @@ -43,29 +44,29 @@ impl Default for BLOCKS { } impl fmt::Display for BLOCKS { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - BLOCKS::A => write!(f, "A"), - BLOCKS::B => write!(f, "B"), - BLOCKS::C => write!(f, "C"), - BLOCKS::D => write!(f, "D"), - BLOCKS::E => write!(f, "E"), - BLOCKS::F => write!(f, "F"), - BLOCKS::G => write!(f, "G"), - BLOCKS::H => write!(f, "H"), - BLOCKS::I => write!(f, "I"), - } + match *self { + BLOCKS::A => write!(f, "A"), + BLOCKS::B => write!(f, "B"), + BLOCKS::C => write!(f, "C"), + BLOCKS::D => write!(f, "D"), + BLOCKS::E => write!(f, "E"), + BLOCKS::F => write!(f, "F"), + BLOCKS::G => write!(f, "G"), + BLOCKS::H => write!(f, "H"), + BLOCKS::I => write!(f, "I"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum ROUTES { - R1, - R2, - R3, - R4, - R5, - R6, - R7, + R1, + R2, + R3, + R4, + R5, + R6, + R7, R8 } impl ROUTES { @@ -78,16 +79,16 @@ impl Default for ROUTES { } impl fmt::Display for ROUTES { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - ROUTES::R1 => write!(f, "R1"), - ROUTES::R2 => write!(f, "R2"), - ROUTES::R3 => write!(f, "R3"), - ROUTES::R4 => write!(f, "R4"), - ROUTES::R5 => write!(f, "R5"), - ROUTES::R6 => write!(f, "R6"), - ROUTES::R7 => write!(f, "R7"), - ROUTES::R8 => write!(f, "R8"), - } + match *self { + ROUTES::R1 => write!(f, "R1"), + ROUTES::R2 => write!(f, "R2"), + ROUTES::R3 => write!(f, "R3"), + ROUTES::R4 => write!(f, "R4"), + ROUTES::R5 => write!(f, "R5"), + ROUTES::R6 => write!(f, "R6"), + ROUTES::R7 => write!(f, "R7"), + ROUTES::R8 => write!(f, "R8"), + } } } @@ -124,6 +125,21 @@ pub struct Train1_Lukas_POR_v3 { #[derivative(Hash="ignore", PartialEq="ignore")] _tr_cache_route_formation: Option<BSet<ROUTES>>,} +impl fmt::Display for Train1_Lukas_POR_v3 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut result = "Train1_Lukas_POR_v3: (".to_owned(); + result += &format!("_get_LBT: {}, ", self._get_LBT()); + result += &format!("_get_TRK: {}, ", self._get_TRK()); + result += &format!("_get_frm: {}, ", self._get_frm()); + result += &format!("_get_OCC: {}, ", self._get_OCC()); + result += &format!("_get_resbl: {}, ", self._get_resbl()); + result += &format!("_get_resrt: {}, ", self._get_resrt()); + result += &format!("_get_rsrtbl: {}, ", self._get_rsrtbl()); + result = result + ")"; + return write!(f, "{}", result); + } +} + impl Train1_Lukas_POR_v3 { pub fn new() -> Train1_Lukas_POR_v3 { @@ -133,12 +149,12 @@ impl Train1_Lukas_POR_v3 { return m; } fn init(&mut self) { + self._BLOCKS = BSet::new(vec![BLOCKS::A, BLOCKS::B, BLOCKS::C, BLOCKS::D, BLOCKS::E, BLOCKS::F, BLOCKS::G, BLOCKS::H, BLOCKS::I]); + self._ROUTES = BSet::new(vec![ROUTES::R1, ROUTES::R2, ROUTES::R3, ROUTES::R4, ROUTES::R5, ROUTES::R6, ROUTES::R7, ROUTES::R8]); self.nxt = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::A, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::C)])), BTuple::from_refs(&ROUTES::R2, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::A, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::F)])), BTuple::from_refs(&ROUTES::R3, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::H, &BLOCKS::G), BTuple::from_refs(&BLOCKS::G, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::F)])), BTuple::from_refs(&ROUTES::R4, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::I, &BLOCKS::G), BTuple::from_refs(&BLOCKS::G, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::F)])), BTuple::from_refs(&ROUTES::R5, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::C, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::A)])), BTuple::from_refs(&ROUTES::R6, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::F, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::A)])), BTuple::from_refs(&ROUTES::R7, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::F, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::G), BTuple::from_refs(&BLOCKS::G, &BLOCKS::H)])), BTuple::from_refs(&ROUTES::R8, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::F, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::G), BTuple::from_refs(&BLOCKS::G, &BLOCKS::I)]))]); self.fst = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BLOCKS::A), BTuple::from_refs(&ROUTES::R2, &BLOCKS::A), BTuple::from_refs(&ROUTES::R3, &BLOCKS::H), BTuple::from_refs(&ROUTES::R4, &BLOCKS::I), BTuple::from_refs(&ROUTES::R5, &BLOCKS::C), BTuple::from_refs(&ROUTES::R6, &BLOCKS::F), BTuple::from_refs(&ROUTES::R7, &BLOCKS::F), BTuple::from_refs(&ROUTES::R8, &BLOCKS::F)]); self.lst = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BLOCKS::C), BTuple::from_refs(&ROUTES::R2, &BLOCKS::F), BTuple::from_refs(&ROUTES::R3, &BLOCKS::F), BTuple::from_refs(&ROUTES::R4, &BLOCKS::F), BTuple::from_refs(&ROUTES::R5, &BLOCKS::A), BTuple::from_refs(&ROUTES::R6, &BLOCKS::A), BTuple::from_refs(&ROUTES::R7, &BLOCKS::H), BTuple::from_refs(&ROUTES::R8, &BLOCKS::I)]); self.rtbl = BRelation::new(vec![BTuple::from_refs(&BLOCKS::A, &ROUTES::R1), BTuple::from_refs(&BLOCKS::A, &ROUTES::R2), BTuple::from_refs(&BLOCKS::A, &ROUTES::R5), BTuple::from_refs(&BLOCKS::A, &ROUTES::R6), BTuple::from_refs(&BLOCKS::B, &ROUTES::R1), BTuple::from_refs(&BLOCKS::B, &ROUTES::R2), BTuple::from_refs(&BLOCKS::B, &ROUTES::R5), BTuple::from_refs(&BLOCKS::B, &ROUTES::R6), BTuple::from_refs(&BLOCKS::C, &ROUTES::R1), BTuple::from_refs(&BLOCKS::C, &ROUTES::R5), BTuple::from_refs(&BLOCKS::D, &ROUTES::R2), BTuple::from_refs(&BLOCKS::D, &ROUTES::R6), BTuple::from_refs(&BLOCKS::E, &ROUTES::R2), BTuple::from_refs(&BLOCKS::E, &ROUTES::R3), BTuple::from_refs(&BLOCKS::E, &ROUTES::R4), BTuple::from_refs(&BLOCKS::E, &ROUTES::R6), BTuple::from_refs(&BLOCKS::E, &ROUTES::R7), BTuple::from_refs(&BLOCKS::E, &ROUTES::R8), BTuple::from_refs(&BLOCKS::F, &ROUTES::R2), BTuple::from_refs(&BLOCKS::F, &ROUTES::R3), BTuple::from_refs(&BLOCKS::F, &ROUTES::R4), BTuple::from_refs(&BLOCKS::F, &ROUTES::R6), BTuple::from_refs(&BLOCKS::F, &ROUTES::R7), BTuple::from_refs(&BLOCKS::F, &ROUTES::R8), BTuple::from_refs(&BLOCKS::G, &ROUTES::R3), BTuple::from_refs(&BLOCKS::G, &ROUTES::R4), BTuple::from_refs(&BLOCKS::G, &ROUTES::R4), BTuple::from_refs(&BLOCKS::G, &ROUTES::R7), BTuple::from_refs(&BLOCKS::G, &ROUTES::R8), BTuple::from_refs(&BLOCKS::H, &ROUTES::R3), BTuple::from_refs(&BLOCKS::H, &ROUTES::R7), BTuple::from_refs(&BLOCKS::I, &ROUTES::R4), BTuple::from_refs(&BLOCKS::I, &ROUTES::R8)]); - self._BLOCKS = BSet::new(vec![BLOCKS::A, BLOCKS::B, BLOCKS::C, BLOCKS::D, BLOCKS::E, BLOCKS::F, BLOCKS::G, BLOCKS::H, BLOCKS::I]); - self._ROUTES = BSet::new(vec![ROUTES::R1, ROUTES::R2, ROUTES::R3, ROUTES::R4, ROUTES::R5, ROUTES::R6, ROUTES::R7, ROUTES::R8]); self.resrt = BSet::new(vec![]).clone().clone(); self.resbl = BSet::new(vec![]).clone().clone(); self.rsrtbl = BRelation::new(vec![]).clone().clone(); @@ -148,55 +164,55 @@ impl Train1_Lukas_POR_v3 { self.LBT = BSet::new(vec![]).clone().clone(); } - pub fn get_fst(&self) -> BRelation<ROUTES, BLOCKS> { + pub fn _get_fst(&self) -> BRelation<ROUTES, BLOCKS> { return self.fst.clone(); } - pub fn get_lst(&self) -> BRelation<ROUTES, BLOCKS> { + pub fn _get_lst(&self) -> BRelation<ROUTES, BLOCKS> { return self.lst.clone(); } - pub fn get_nxt(&self) -> BRelation<ROUTES, BRelation<BLOCKS, BLOCKS>> { + pub fn _get_nxt(&self) -> BRelation<ROUTES, BRelation<BLOCKS, BLOCKS>> { return self.nxt.clone(); } - pub fn get_rtbl(&self) -> BRelation<BLOCKS, ROUTES> { + pub fn _get_rtbl(&self) -> BRelation<BLOCKS, ROUTES> { return self.rtbl.clone(); } - pub fn get_LBT(&self) -> BSet<BLOCKS> { + pub fn _get_LBT(&self) -> BSet<BLOCKS> { return self.LBT.clone(); } - pub fn get_TRK(&self) -> BRelation<BLOCKS, BLOCKS> { + pub fn _get_TRK(&self) -> BRelation<BLOCKS, BLOCKS> { return self.TRK.clone(); } - pub fn get_frm(&self) -> BSet<ROUTES> { + pub fn _get_frm(&self) -> BSet<ROUTES> { return self.frm.clone(); } - pub fn get_OCC(&self) -> BSet<BLOCKS> { + pub fn _get_OCC(&self) -> BSet<BLOCKS> { return self.OCC.clone(); } - pub fn get_resbl(&self) -> BSet<BLOCKS> { + pub fn _get_resbl(&self) -> BSet<BLOCKS> { return self.resbl.clone(); } - pub fn get_resrt(&self) -> BSet<ROUTES> { + pub fn _get_resrt(&self) -> BSet<ROUTES> { return self.resrt.clone(); } - pub fn get_rsrtbl(&self) -> BRelation<BLOCKS, ROUTES> { + pub fn _get_rsrtbl(&self) -> BRelation<BLOCKS, ROUTES> { return self.rsrtbl.clone(); } - pub fn get__BLOCKS(&self) -> BSet<BLOCKS> { + pub fn _get__BLOCKS(&self) -> BSet<BLOCKS> { return self._BLOCKS.clone(); } - pub fn get__ROUTES(&self) -> BSet<ROUTES> { + pub fn _get__ROUTES(&self) -> BSet<ROUTES> { return self._ROUTES.clone(); } @@ -277,8 +293,9 @@ impl Train1_Lukas_POR_v3 { //transition if !is_caching || self._tr_cache_route_reservation.is_none() { let mut _ic_set_0: BSet<ROUTES> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_r_1 in self._ROUTES.difference(&self.resrt).clone().iter().cloned() { - if (self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).intersect(&self.resbl).equal(&BSet::new(vec![])).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { + if ((self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).intersect(&self.resbl).equal(&BSet::new(vec![])) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { _ic_set_0 = _ic_set_0._union(&BSet::new(vec![_ic_r_1])); } @@ -294,6 +311,7 @@ impl Train1_Lukas_POR_v3 { //transition if !is_caching || self._tr_cache_route_freeing.is_none() { let mut _ic_set_1: BSet<ROUTES> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_r_1 in self.resrt.difference(&self.rsrtbl.range()).clone().iter().cloned() { _ic_set_1 = _ic_set_1._union(&BSet::new(vec![_ic_r_1])); @@ -309,8 +327,9 @@ impl Train1_Lukas_POR_v3 { //transition if !is_caching || self._tr_cache_FRONT_MOVE_1.is_none() { let mut _ic_set_2: BSet<ROUTES> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_r_1 in self.frm.clone().iter().cloned() { - if (self.resbl.difference(&self.OCC).elementOf(&self.fst.functionCall(&_ic_r_1)).and(&_ic_r_1.equal(&self.rsrtbl.functionCall(&self.fst.functionCall(&_ic_r_1)))).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { + if (((self.resbl.difference(&self.OCC).elementOf(&self.fst.functionCall(&_ic_r_1)) && _ic_r_1.equal(&self.rsrtbl.functionCall(&self.fst.functionCall(&_ic_r_1)))) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { _ic_set_2 = _ic_set_2._union(&BSet::new(vec![_ic_r_1])); } @@ -326,8 +345,9 @@ impl Train1_Lukas_POR_v3 { //transition if !is_caching || self._tr_cache_FRONT_MOVE_2.is_none() { let mut _ic_set_3: BSet<BLOCKS> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_b_1 in self.OCC.intersect(&self.TRK.domain()).clone().iter().cloned() { - if (self.OCC.notElementOf(&self.TRK.functionCall(&_ic_b_1)).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { + if ((self.OCC.notElementOf(&self.TRK.functionCall(&_ic_b_1)) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { _ic_set_3 = _ic_set_3._union(&BSet::new(vec![_ic_b_1])); } @@ -343,6 +363,7 @@ impl Train1_Lukas_POR_v3 { //transition if !is_caching || self._tr_cache_BACK_MOVE_1.is_none() { let mut _ic_set_4: BSet<BLOCKS> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_b_1 in self.LBT.difference(&self.TRK.domain()).clone().iter().cloned() { if (BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range()))).booleanValue() { _ic_set_4 = _ic_set_4._union(&BSet::new(vec![_ic_b_1])); @@ -360,8 +381,9 @@ impl Train1_Lukas_POR_v3 { //transition if !is_caching || self._tr_cache_BACK_MOVE_2.is_none() { let mut _ic_set_5: BSet<BLOCKS> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_b_1 in self.LBT.intersect(&self.TRK.domain()).clone().iter().cloned() { - if (self.OCC.elementOf(&self.TRK.functionCall(&_ic_b_1)).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { + if ((self.OCC.elementOf(&self.TRK.functionCall(&_ic_b_1)) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { _ic_set_5 = _ic_set_5._union(&BSet::new(vec![_ic_b_1])); } @@ -377,6 +399,7 @@ impl Train1_Lukas_POR_v3 { //transition if !is_caching || self._tr_cache_point_positionning.is_none() { let mut _ic_set_6: BSet<ROUTES> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() { if (BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range()))).booleanValue() { _ic_set_6 = _ic_set_6._union(&BSet::new(vec![_ic_r_1])); @@ -394,8 +417,9 @@ impl Train1_Lukas_POR_v3 { //transition if !is_caching || self._tr_cache_route_formation.is_none() { let mut _ic_set_7: BSet<ROUTES> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() { - if (self.nxt.functionCall(&_ic_r_1).domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1]))).equal(&self.TRK.domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])))).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { + if ((self.nxt.functionCall(&_ic_r_1).domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1]))).equal(&self.TRK.domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])))) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { _ic_set_7 = _ic_set_7._union(&BSet::new(vec![_ic_r_1])); } @@ -414,6 +438,7 @@ impl Train1_Lukas_POR_v3 { pub fn _check_inv_2(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_8 = BBoolean::new(true); for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() { { @@ -425,14 +450,17 @@ impl Train1_Lukas_POR_v3 { } } + return _ic_boolean_8.booleanValue(); } pub fn _check_inv_3(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_10 = BBoolean::new(true); for _ic_x_1 in self.TRK.domain().clone().iter().cloned() { for _ic_y_1 in self.TRK.relationImage(&BSet::new(vec![_ic_x_1])).clone().iter().cloned() { + //quantified_predicate let mut _ic_boolean_9 = BBoolean::new(false); for _ic_r_1 in self._ROUTES.clone().iter().cloned() { if (self.nxt.functionCall(&_ic_r_1).elementOf(&BTuple::from_refs(&_ic_x_1, &_ic_y_1))).booleanValue() { @@ -441,6 +469,7 @@ impl Train1_Lukas_POR_v3 { } } + if !(_ic_boolean_9).booleanValue() { _ic_boolean_10 = BBoolean::new(false); break; @@ -448,11 +477,13 @@ impl Train1_Lukas_POR_v3 { } } + return _ic_boolean_10.booleanValue(); } pub fn _check_inv_4(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_11 = BBoolean::new(true); for _ic_r_1 in self.frm.clone().iter().cloned() { { @@ -464,6 +495,7 @@ impl Train1_Lukas_POR_v3 { } } + return _ic_boolean_11.booleanValue(); } @@ -474,6 +506,7 @@ impl Train1_Lukas_POR_v3 { pub fn _check_inv_6(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_12 = BBoolean::new(true); for _ic_a_1 in self.rsrtbl.domain().clone().iter().cloned() { for _ic_b_1 in self.LBT.clone().iter().cloned() { @@ -481,7 +514,7 @@ impl Train1_Lukas_POR_v3 { let mut _ic_c_1 = self.rsrtbl.functionCall(&_ic_b_1); { let mut _ic_d_1 = self.nxt.functionCall(&_ic_c_1); - if !(_ic_d_1.range().elementOf(&_ic_b_1).and(&_ic_a_1.equal(&_ic_d_1.inverse().functionCall(&_ic_b_1))).implies(&self.rsrtbl.functionCall(&_ic_a_1).unequal(&_ic_c_1))).booleanValue() { + if !((_ic_d_1.range().elementOf(&_ic_b_1) && _ic_a_1.equal(&_ic_d_1.inverse().functionCall(&_ic_b_1))).implies(&self.rsrtbl.functionCall(&_ic_a_1).unequal(&_ic_c_1))).booleanValue() { _ic_boolean_12 = BBoolean::new(false); break; } @@ -490,6 +523,7 @@ impl Train1_Lukas_POR_v3 { } } } + return _ic_boolean_12.booleanValue(); } @@ -510,6 +544,7 @@ impl Train1_Lukas_POR_v3 { pub fn _check_inv_10(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_13 = BBoolean::new(true); for _ic_r_1 in self._ROUTES.clone().iter().cloned() { { @@ -518,7 +553,7 @@ impl Train1_Lukas_POR_v3 { let mut _ic_b_1 = self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])); { let mut _ic_c_1 = _ic_b_1.difference(&self.OCC); - if !(_ic_a_1.relationImage(&self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).difference(&_ic_b_1)).intersect(&_ic_c_1).equal(&BSet::new(vec![])).and(&_ic_a_1.relationImage(&_ic_b_1).subset(&_ic_b_1)).and(&_ic_a_1.relationImage(&_ic_c_1).subset(&_ic_c_1))).booleanValue() { + if !(((_ic_a_1.relationImage(&self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).difference(&_ic_b_1)).intersect(&_ic_c_1).equal(&BSet::new(vec![])) && _ic_a_1.relationImage(&_ic_b_1).subset(&_ic_b_1)) && _ic_a_1.relationImage(&_ic_c_1).subset(&_ic_c_1))).booleanValue() { _ic_boolean_13 = BBoolean::new(false); break; } @@ -527,6 +562,7 @@ impl Train1_Lukas_POR_v3 { } } } + return _ic_boolean_13.booleanValue(); } @@ -540,11 +576,10 @@ impl Train1_Lukas_POR_v3 { return self.rsrtbl.relationImage(&self.OCC).subset(&self.frm).booleanValue(); } - fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) { + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { //calling the given functions without caching will recalculate them and cache them afterwards - //if caching is enabled globally, this will just prefill those, if caching is - for trans in to_invalidate.iter() { - match *trans { + for trans in to_invalidate { + match trans { "_tr_route_reservation" => {self._tr_route_reservation(false);}, "_tr_route_freeing" => {self._tr_route_freeing(false);}, "_tr_FRONT_MOVE_1" => {self._tr_FRONT_MOVE_1(false);}, @@ -561,431 +596,206 @@ impl Train1_Lukas_POR_v3 { //model_check_next_states fn generateNextStates(state: &mut Train1_Lukas_POR_v3, isCaching: bool, - invariant_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_invariant_m: Arc<Mutex<HashMap<Train1_Lukas_POR_v3, HashSet<&str>>>>, - guard_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_guard_m: Arc<Mutex<HashMap<Train1_Lukas_POR_v3, HashSet<&str>>>>, - guardCache: Arc<Mutex<HashMap<Train1_Lukas_POR_v3, PersistentHashMap<&str, bool>>>>, - parents_m: Arc<Mutex<HashMap<Train1_Lukas_POR_v3, Train1_Lukas_POR_v3>>>, - transitions: Arc<AtomicI64>) -> HashSet<Train1_Lukas_POR_v3> { - let mut result = HashSet::<Train1_Lukas_POR_v3>::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_route_reservation(isCaching); - for param in _trid_1.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_reservation(_tmp_1); - match guard_dependency.get("route_reservation") { 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("route_reservation").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_reservation").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_route_freeing(isCaching); - for param in _trid_2.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_freeing(_tmp_1); - match guard_dependency.get("route_freeing") { 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("route_freeing").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_freeing").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching); - for param in _trid_3.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.FRONT_MOVE_1(_tmp_1); - match guard_dependency.get("FRONT_MOVE_1") { 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("FRONT_MOVE_1").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("FRONT_MOVE_1").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching); - for param in _trid_4.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.FRONT_MOVE_2(_tmp_1); - match guard_dependency.get("FRONT_MOVE_2") { 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("FRONT_MOVE_2").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("FRONT_MOVE_2").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching); - for param in _trid_5.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.BACK_MOVE_1(_tmp_1); - match guard_dependency.get("BACK_MOVE_1") { 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("BACK_MOVE_1").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("BACK_MOVE_1").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching); - for param in _trid_6.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.BACK_MOVE_2(_tmp_1); - match guard_dependency.get("BACK_MOVE_2") { 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("BACK_MOVE_2").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("BACK_MOVE_2").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_7 = state._tr_point_positionning(isCaching); - for param in _trid_7.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.point_positionning(_tmp_1); - match guard_dependency.get("point_positionning") { 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("point_positionning").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("point_positionning").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_8 = state._tr_route_formation(isCaching); - for param in _trid_8.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_formation(_tmp_1); - match guard_dependency.get("route_formation") { 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("route_formation").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_formation").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } + transitions: Arc<AtomicU64>) -> HashSet<(Train1_Lukas_POR_v3, &'static str)> { + let mut result = HashSet::<(Train1_Lukas_POR_v3, &'static str)>::new(); + let mut evaluated_transitions: u64 = 0; + //model_check_transition + let mut _trid_1 = state._tr_route_reservation(isCaching); + for param in _trid_1.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.route_reservation(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_reservation")); } + result.insert((copiedState, "route_reservation")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_2 = state._tr_route_freeing(isCaching); + for param in _trid_2.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.route_freeing(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_freeing")); } + result.insert((copiedState, "route_freeing")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching); + for param in _trid_3.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.FRONT_MOVE_1(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("FRONT_MOVE_1")); } + result.insert((copiedState, "FRONT_MOVE_1")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching); + for param in _trid_4.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.FRONT_MOVE_2(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("FRONT_MOVE_2")); } + result.insert((copiedState, "FRONT_MOVE_2")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching); + for param in _trid_5.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.BACK_MOVE_1(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("BACK_MOVE_1")); } + result.insert((copiedState, "BACK_MOVE_1")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching); + for param in _trid_6.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.BACK_MOVE_2(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("BACK_MOVE_2")); } + result.insert((copiedState, "BACK_MOVE_2")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_7 = state._tr_point_positionning(isCaching); + for param in _trid_7.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.point_positionning(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("point_positionning")); } + result.insert((copiedState, "point_positionning")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_8 = state._tr_route_formation(isCaching); + for param in _trid_8.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.route_formation(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_formation")); } + result.insert((copiedState, "route_formation")); + evaluated_transitions += 1; + } - guardCache.lock().unwrap().insert(state.clone(), newCache); - } else { - //model_check_transition - let mut _trid_1 = state._tr_route_reservation(isCaching); - for param in _trid_1.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_reservation(_tmp_1); - match guard_dependency.get("route_reservation") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_route_freeing(isCaching); - for param in _trid_2.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_freeing(_tmp_1); - match guard_dependency.get("route_freeing") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching); - for param in _trid_3.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.FRONT_MOVE_1(_tmp_1); - match guard_dependency.get("FRONT_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching); - for param in _trid_4.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.FRONT_MOVE_2(_tmp_1); - match guard_dependency.get("FRONT_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching); - for param in _trid_5.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.BACK_MOVE_1(_tmp_1); - match guard_dependency.get("BACK_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching); - for param in _trid_6.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.BACK_MOVE_2(_tmp_1); - match guard_dependency.get("BACK_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_7 = state._tr_point_positionning(isCaching); - for param in _trid_7.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.point_positionning(_tmp_1); - match guard_dependency.get("point_positionning") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_8 = state._tr_route_formation(isCaching); - for param in _trid_8.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_formation(_tmp_1); - match guard_dependency.get("route_formation") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - } + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); return result; } //model_check_evaluate_state //model_check_invariants - pub fn checkInvariants(state: &Train1_Lukas_POR_v3, - isCaching: bool, - dependent_invariant_m: Arc<Mutex<HashMap<Train1_Lukas_POR_v3, 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(); + pub fn checkInvariants(state: &Train1_Lukas_POR_v3, last_op: &'static str, isCaching: bool) -> bool { + if isCaching { + let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op); //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_1") { + if dependent_invariants_of_state.contains(&"_check_inv_1") { if !state._check_inv_1() { + println!("_check_inv_1 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_2") { + if dependent_invariants_of_state.contains(&"_check_inv_2") { if !state._check_inv_2() { + println!("_check_inv_2 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_3") { + if dependent_invariants_of_state.contains(&"_check_inv_3") { if !state._check_inv_3() { + println!("_check_inv_3 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_4") { + if dependent_invariants_of_state.contains(&"_check_inv_4") { if !state._check_inv_4() { + println!("_check_inv_4 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_5") { + if dependent_invariants_of_state.contains(&"_check_inv_5") { if !state._check_inv_5() { + println!("_check_inv_5 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_6") { + if dependent_invariants_of_state.contains(&"_check_inv_6") { if !state._check_inv_6() { + println!("_check_inv_6 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_7") { + if dependent_invariants_of_state.contains(&"_check_inv_7") { if !state._check_inv_7() { + println!("_check_inv_7 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_8") { + if dependent_invariants_of_state.contains(&"_check_inv_8") { if !state._check_inv_8() { + println!("_check_inv_8 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_9") { + if dependent_invariants_of_state.contains(&"_check_inv_9") { if !state._check_inv_9() { + println!("_check_inv_9 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_10") { + if dependent_invariants_of_state.contains(&"_check_inv_10") { if !state._check_inv_10() { + println!("_check_inv_10 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_11") { + if dependent_invariants_of_state.contains(&"_check_inv_11") { if !state._check_inv_11() { + println!("_check_inv_11 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_12") { + if dependent_invariants_of_state.contains(&"_check_inv_12") { if !state._check_inv_12() { + println!("_check_inv_12 failed!"); return false; } } @@ -995,16 +805,14 @@ impl Train1_Lukas_POR_v3 { } //model_check_print - fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) { - if deadlock_detected { println!("DEADLOCK DETECTED"); } - if invariant_violated { println!("INVARIANT VIOLATED"); } - if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); } + fn print_result(states: usize, transitions: u64, error_detected: bool) { + if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); } println!("Number of States: {}", states); println!("Number of Transitions: {}", transitions); } //model_check_main - fn next(collection_m: Arc<Mutex<LinkedList<Train1_Lukas_POR_v3>>>, mc_type: MC_TYPE) -> Train1_Lukas_POR_v3 { + fn next(collection_m: Arc<Mutex<LinkedList<(Train1_Lukas_POR_v3, &'static str)>>>, mc_type: MC_TYPE) -> (Train1_Lukas_POR_v3, &'static str) { let mut collection = collection_m.lock().unwrap(); return match mc_type { MC_TYPE::BFS => collection.pop_front().unwrap(), @@ -1013,100 +821,88 @@ impl Train1_Lukas_POR_v3 { }; } - fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { - let mut machine = Train1_Lukas_POR_v3::new(); - - let invariant_violated = AtomicBool::new(false); - let deadlock_detected = AtomicBool::new(false); - let stop_threads = AtomicBool::new(false); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() { - invariant_violated.store(true, Ordering::Release); - } - - let mut states = HashSet::<Train1_Lukas_POR_v3>::new(); - states.insert(machine.clone()); - let number_states = AtomicI64::new(1); - - let collection_m = Arc::new(Mutex::new(LinkedList::<Train1_Lukas_POR_v3>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<Train1_Lukas_POR_v3, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, HashSet<&str>>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, Train1_Lukas_POR_v3>::new())); - - if is_caching { + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - invariantDependency.insert("point_positionning", HashSet::from(["_check_inv_3", "_check_inv_1", "_check_inv_4"])); + "point_positionning" => vec!["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("route_reservation", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"])); + "route_reservation" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("FRONT_MOVE_1", HashSet::from(["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"])); + "FRONT_MOVE_1" => vec!["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("BACK_MOVE_1", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"])); + "BACK_MOVE_1" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("FRONT_MOVE_2", HashSet::from(["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"])); + "FRONT_MOVE_2" => vec!["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("route_formation", HashSet::from(["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"])); + "route_formation" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"], //model_check_init_static - invariantDependency.insert("route_freeing", HashSet::from(["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"])); + "route_freeing" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("BACK_MOVE_2", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"])); + "BACK_MOVE_2" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], + _ => vec![], + } + } + + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - guardDependency.insert("point_positionning", HashSet::from(["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); + "point_positionning" => vec!["_check_inv_3", "_check_inv_1", "_check_inv_4"], //model_check_init_static - guardDependency.insert("route_reservation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); + "route_reservation" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"], //model_check_init_static - guardDependency.insert("FRONT_MOVE_1", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); + "FRONT_MOVE_1" => vec!["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"], //model_check_init_static - guardDependency.insert("BACK_MOVE_1", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); + "BACK_MOVE_1" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"], //model_check_init_static - guardDependency.insert("FRONT_MOVE_2", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); + "FRONT_MOVE_2" => vec!["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"], //model_check_init_static - guardDependency.insert("route_formation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"])); + "route_formation" => vec!["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"], //model_check_init_static - guardDependency.insert("route_freeing", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); + "route_freeing" => vec!["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"], //model_check_init_static - guardDependency.insert("BACK_MOVE_2", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); + "BACK_MOVE_2" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"], + _ => vec![], } + } - let transitions = Arc::new(AtomicI64::new(0)); + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { + let mut machine = Train1_Lukas_POR_v3::new(); - while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - let mut state = Self::next(Arc::clone(&collection_m), mc_type); + let mut all_states = HashSet::<Train1_Lukas_POR_v3>::new(); + all_states.insert(machine.clone()); - 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 states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Train1_Lukas_POR_v3, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine.clone(), "")); - next_states.iter().cloned().for_each(|next_state| { - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection_m.lock().unwrap().push_back(next_state); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - }); + let num_transitions = Arc::new(AtomicU64::new(0)); + let mut stop_threads = false; + + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions)); + + if !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); + print!("DEADLOCK DETECTED"); + stop_threads = true; } - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| all_states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op))); + if all_states.len() % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } } - Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { @@ -1114,135 +910,66 @@ impl Train1_Lukas_POR_v3 { let machine = Train1_Lukas_POR_v3::new(); + let all_states = Arc::new(DashSet::<Train1_Lukas_POR_v3>::new()); + all_states.insert(machine.clone()); - let invariant_violated_b = Arc::new(AtomicBool::new(false)); - let deadlock_detected_b = Arc::new(AtomicBool::new(false)); - let stop_threads_b = Arc::new(AtomicBool::new(false)); - let possible_queue_changes_b = Arc::new(AtomicI32::new(0)); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() { - invariant_violated_b.store(true, Ordering::Release); - } - - let states_m = Arc::new(Mutex::new(HashSet::<Train1_Lukas_POR_v3>::new())); - states_m.lock().unwrap().insert(machine.clone()); - let number_states_arc = Arc::new(AtomicI64::new(1)); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Train1_Lukas_POR_v3, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); - let collection_m = Arc::new(Mutex::new(LinkedList::<Train1_Lukas_POR_v3>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); + let num_transitions = Arc::new(AtomicU64::new(0)); - 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::<Train1_Lukas_POR_v3, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, HashSet<&str>>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, Train1_Lukas_POR_v3>::new())); - - if is_caching { - //model_check_init_static - invariantDependency.insert("point_positionning", HashSet::from(["_check_inv_3", "_check_inv_1", "_check_inv_4"])); - //model_check_init_static - invariantDependency.insert("route_reservation", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("FRONT_MOVE_1", HashSet::from(["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"])); - //model_check_init_static - invariantDependency.insert("BACK_MOVE_1", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"])); - //model_check_init_static - invariantDependency.insert("FRONT_MOVE_2", HashSet::from(["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"])); - //model_check_init_static - invariantDependency.insert("route_formation", HashSet::from(["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("route_freeing", HashSet::from(["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("BACK_MOVE_2", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"])); - //model_check_init_static - guardDependency.insert("point_positionning", HashSet::from(["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("route_reservation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("FRONT_MOVE_1", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("BACK_MOVE_1", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("FRONT_MOVE_2", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("route_formation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"])); - //model_check_init_static - guardDependency.insert("route_freeing", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("BACK_MOVE_2", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } - - let num_transitions = Arc::new(AtomicI64::new(0)); - let invariant_dependency_arc = Arc::new(invariantDependency); - let guard_dependency_arc = Arc::new(guardDependency); + let mut stop_threads = false; + let mut spawned_tasks: u64 = 0; + let mut finished_tasks: u64 = 0; let (tx, rx) = channel(); //println!("Thread {:?} starting threads", thread::current().id()); - while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - possible_queue_changes_b.fetch_add(1, Ordering::AcqRel); - let mut state = Self::next(Arc::clone(&collection_m), mc_type); - - let invariant_violated = Arc::clone(&invariant_violated_b); - let deadlock_detected = Arc::clone(&deadlock_detected_b); - let stop_threads = Arc::clone(&stop_threads_b); - let possible_queue_changes = Arc::clone(&possible_queue_changes_b); - let collection_m2 = Arc::clone(&collection_m); - 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); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let states_to_process = Arc::clone(&states_to_process_mutex); let transitions = Arc::clone(&num_transitions); - let states_m2 = Arc::clone(&states_m); - let number_states = Arc::clone(&number_states_arc); + let states = Arc::clone(&all_states); 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)); + if !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } - //println!("Thread {:?} executing", thread::current().id()); - next_states.iter().cloned().for_each(|next_state| { - { - let mut states = states_m2.lock().unwrap(); - let mut collection = collection_m2.lock().unwrap(); - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection.push_back(next_state); - //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len()); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - } - }); - possible_queue_changes.fetch_sub(1, Ordering::AcqRel); + let next_states = Self::generateNextStates(&mut state, is_caching, transitions); + if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } - if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + //println!("Thread {:?} executing", thread::current().id()); + next_states.into_iter() + .filter(|(next_state, _)| states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op))); - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } //println!("Thread {:?} done", thread::current().id()); - tx.send(1).expect(""); + let _ = tx.send(Ok(1)); }); - while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 { + + spawned_tasks += 1; + if spawned_tasks % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } + + while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 { //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id()); - rx.recv().expect("Waiting for a thread to finish: "); + match rx.recv_timeout(Duration::from_secs(1)) { + Ok(val) => match val { + Ok(_) => finished_tasks += 1, + Err(msg) => { println!("{}", msg); stop_threads = true; }, + }, + Err(_) => (), + } + if threadPool.panic_count() > 0 { stop_threads = true; } } } - Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } } diff --git a/benchmarks/model_checking/Rust/Train_1_beebook_deterministic_MC_POR_v2.rs b/benchmarks/model_checking/Rust/Train_1_beebook_deterministic_MC_POR_v2.rs index 9460794f2f66d49a4f939825975f203dc3dc8993..b74c92f7d41671bae902e106caef881648b1e5bf 100644 --- a/benchmarks/model_checking/Rust/Train_1_beebook_deterministic_MC_POR_v2.rs +++ b/benchmarks/model_checking/Rust/Train_1_beebook_deterministic_MC_POR_v2.rs @@ -1,16 +1,17 @@ -#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ] +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] use std::env; -use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::thread; -use std::collections::{HashMap, HashSet, LinkedList}; -use im::HashMap as PersistentHashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, mpsc, Mutex}; +use std::collections::{HashSet, LinkedList}; +use dashmap::DashSet; use threadpool::ThreadPool; use std::sync::mpsc::channel; use derivative::Derivative; +use std::time::{Duration}; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; +use btypes::bboolean::{IntoBool, BBooleanT}; use btypes::bboolean::BBoolean; use btypes::brelation::BRelation; use btypes::bset::BSet; @@ -23,19 +24,19 @@ pub enum MC_TYPE { BFS, DFS, MIXED } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum BLOCKS { - A, - B, - C, - D, - E, - F, - G, - H, - I, - J, - K, - L, - M, + A, + B, + C, + D, + E, + F, + G, + H, + I, + J, + K, + L, + M, N } impl BLOCKS { @@ -48,36 +49,36 @@ impl Default for BLOCKS { } impl fmt::Display for BLOCKS { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - BLOCKS::A => write!(f, "A"), - BLOCKS::B => write!(f, "B"), - BLOCKS::C => write!(f, "C"), - BLOCKS::D => write!(f, "D"), - BLOCKS::E => write!(f, "E"), - BLOCKS::F => write!(f, "F"), - BLOCKS::G => write!(f, "G"), - BLOCKS::H => write!(f, "H"), - BLOCKS::I => write!(f, "I"), - BLOCKS::J => write!(f, "J"), - BLOCKS::K => write!(f, "K"), - BLOCKS::L => write!(f, "L"), - BLOCKS::M => write!(f, "M"), - BLOCKS::N => write!(f, "N"), - } + match *self { + BLOCKS::A => write!(f, "A"), + BLOCKS::B => write!(f, "B"), + BLOCKS::C => write!(f, "C"), + BLOCKS::D => write!(f, "D"), + BLOCKS::E => write!(f, "E"), + BLOCKS::F => write!(f, "F"), + BLOCKS::G => write!(f, "G"), + BLOCKS::H => write!(f, "H"), + BLOCKS::I => write!(f, "I"), + BLOCKS::J => write!(f, "J"), + BLOCKS::K => write!(f, "K"), + BLOCKS::L => write!(f, "L"), + BLOCKS::M => write!(f, "M"), + BLOCKS::N => write!(f, "N"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum ROUTES { - R1, - R2, - R3, - R4, - R5, - R6, - R7, - R8, - R9, + R1, + R2, + R3, + R4, + R5, + R6, + R7, + R8, + R9, R10 } impl ROUTES { @@ -90,18 +91,18 @@ impl Default for ROUTES { } impl fmt::Display for ROUTES { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - ROUTES::R1 => write!(f, "R1"), - ROUTES::R2 => write!(f, "R2"), - ROUTES::R3 => write!(f, "R3"), - ROUTES::R4 => write!(f, "R4"), - ROUTES::R5 => write!(f, "R5"), - ROUTES::R6 => write!(f, "R6"), - ROUTES::R7 => write!(f, "R7"), - ROUTES::R8 => write!(f, "R8"), - ROUTES::R9 => write!(f, "R9"), - ROUTES::R10 => write!(f, "R10"), - } + match *self { + ROUTES::R1 => write!(f, "R1"), + ROUTES::R2 => write!(f, "R2"), + ROUTES::R3 => write!(f, "R3"), + ROUTES::R4 => write!(f, "R4"), + ROUTES::R5 => write!(f, "R5"), + ROUTES::R6 => write!(f, "R6"), + ROUTES::R7 => write!(f, "R7"), + ROUTES::R8 => write!(f, "R8"), + ROUTES::R9 => write!(f, "R9"), + ROUTES::R10 => write!(f, "R10"), + } } } @@ -138,6 +139,21 @@ pub struct Train_1_beebook_deterministic_MC_POR_v2 { #[derivative(Hash="ignore", PartialEq="ignore")] _tr_cache_route_formation: Option<BSet<ROUTES>>,} +impl fmt::Display for Train_1_beebook_deterministic_MC_POR_v2 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut result = "Train_1_beebook_deterministic_MC_POR_v2: (".to_owned(); + result += &format!("_get_LBT: {}, ", self._get_LBT()); + result += &format!("_get_TRK: {}, ", self._get_TRK()); + result += &format!("_get_frm: {}, ", self._get_frm()); + result += &format!("_get_OCC: {}, ", self._get_OCC()); + result += &format!("_get_resbl: {}, ", self._get_resbl()); + result += &format!("_get_resrt: {}, ", self._get_resrt()); + result += &format!("_get_rsrtbl: {}, ", self._get_rsrtbl()); + result = result + ")"; + return write!(f, "{}", result); + } +} + impl Train_1_beebook_deterministic_MC_POR_v2 { pub fn new() -> Train_1_beebook_deterministic_MC_POR_v2 { @@ -147,21 +163,21 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { return m; } fn init(&mut self) { + self._BLOCKS = BSet::new(vec![BLOCKS::A, BLOCKS::B, BLOCKS::C, BLOCKS::D, BLOCKS::E, BLOCKS::F, BLOCKS::G, BLOCKS::H, BLOCKS::I, BLOCKS::J, BLOCKS::K, BLOCKS::L, BLOCKS::M, BLOCKS::N]); + self._ROUTES = BSet::new(vec![ROUTES::R1, ROUTES::R2, ROUTES::R3, ROUTES::R4, ROUTES::R5, ROUTES::R6, ROUTES::R7, ROUTES::R8, ROUTES::R9, ROUTES::R10]); self.nxt = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::L, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::C)])), BTuple::from_refs(&ROUTES::R2, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::L, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::F), BTuple::from_refs(&BLOCKS::F, &BLOCKS::G)])), BTuple::from_refs(&ROUTES::R3, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::L, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::K), BTuple::from_refs(&BLOCKS::K, &BLOCKS::J), BTuple::from_refs(&BLOCKS::J, &BLOCKS::N)])), BTuple::from_refs(&ROUTES::R4, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::M, &BLOCKS::H), BTuple::from_refs(&BLOCKS::H, &BLOCKS::I), BTuple::from_refs(&BLOCKS::I, &BLOCKS::K), BTuple::from_refs(&BLOCKS::K, &BLOCKS::F), BTuple::from_refs(&BLOCKS::F, &BLOCKS::G)])), BTuple::from_refs(&ROUTES::R5, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::M, &BLOCKS::H), BTuple::from_refs(&BLOCKS::H, &BLOCKS::I), BTuple::from_refs(&BLOCKS::I, &BLOCKS::J), BTuple::from_refs(&BLOCKS::J, &BLOCKS::N)])), BTuple::from_refs(&ROUTES::R6, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::C, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::L)])), BTuple::from_refs(&ROUTES::R7, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::G, &BLOCKS::F), BTuple::from_refs(&BLOCKS::F, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::L)])), BTuple::from_refs(&ROUTES::R8, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::N, &BLOCKS::J), BTuple::from_refs(&BLOCKS::J, &BLOCKS::K), BTuple::from_refs(&BLOCKS::K, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::L)])), BTuple::from_refs(&ROUTES::R9, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::G, &BLOCKS::F), BTuple::from_refs(&BLOCKS::F, &BLOCKS::K), BTuple::from_refs(&BLOCKS::K, &BLOCKS::I), BTuple::from_refs(&BLOCKS::I, &BLOCKS::H), BTuple::from_refs(&BLOCKS::H, &BLOCKS::M)])), BTuple::from_refs(&ROUTES::R10, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::N, &BLOCKS::J), BTuple::from_refs(&BLOCKS::J, &BLOCKS::I), BTuple::from_refs(&BLOCKS::I, &BLOCKS::H), BTuple::from_refs(&BLOCKS::H, &BLOCKS::M)]))]); self.fst = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BLOCKS::L), BTuple::from_refs(&ROUTES::R2, &BLOCKS::L), BTuple::from_refs(&ROUTES::R3, &BLOCKS::L), BTuple::from_refs(&ROUTES::R4, &BLOCKS::M), BTuple::from_refs(&ROUTES::R5, &BLOCKS::M), BTuple::from_refs(&ROUTES::R6, &BLOCKS::C), BTuple::from_refs(&ROUTES::R7, &BLOCKS::G), BTuple::from_refs(&ROUTES::R8, &BLOCKS::N), BTuple::from_refs(&ROUTES::R9, &BLOCKS::G), BTuple::from_refs(&ROUTES::R10, &BLOCKS::N)]); self.lst = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BLOCKS::C), BTuple::from_refs(&ROUTES::R2, &BLOCKS::G), BTuple::from_refs(&ROUTES::R3, &BLOCKS::N), BTuple::from_refs(&ROUTES::R4, &BLOCKS::G), BTuple::from_refs(&ROUTES::R5, &BLOCKS::N), BTuple::from_refs(&ROUTES::R6, &BLOCKS::L), BTuple::from_refs(&ROUTES::R7, &BLOCKS::L), BTuple::from_refs(&ROUTES::R8, &BLOCKS::L), BTuple::from_refs(&ROUTES::R9, &BLOCKS::M), BTuple::from_refs(&ROUTES::R10, &BLOCKS::M)]); let mut _ic_set_0 = BRelation::<BLOCKS, ROUTES>::new(vec![]); for _ic_b_1 in self._BLOCKS.clone().iter().cloned() { for _ic_r_1 in self._ROUTES.clone().iter().cloned() { - if (self.nxt.domain().elementOf(&_ic_r_1).and(&self.nxt.functionCall(&_ic_r_1).domain().elementOf(&_ic_b_1).or(&self.nxt.functionCall(&_ic_r_1).range().elementOf(&_ic_b_1)))).booleanValue() { + if ((self.nxt.domain().elementOf(&_ic_r_1) && (self.nxt.functionCall(&_ic_r_1).domain().elementOf(&_ic_b_1) || self.nxt.functionCall(&_ic_r_1).range().elementOf(&_ic_b_1)))).booleanValue() { _ic_set_0 = _ic_set_0._union(&BRelation::<BLOCKS, ROUTES>::new(vec![BTuple::from_refs(&_ic_b_1, &_ic_r_1)])); } } } self.rtbl = _ic_set_0; - self._BLOCKS = BSet::new(vec![BLOCKS::A, BLOCKS::B, BLOCKS::C, BLOCKS::D, BLOCKS::E, BLOCKS::F, BLOCKS::G, BLOCKS::H, BLOCKS::I, BLOCKS::J, BLOCKS::K, BLOCKS::L, BLOCKS::M, BLOCKS::N]); - self._ROUTES = BSet::new(vec![ROUTES::R1, ROUTES::R2, ROUTES::R3, ROUTES::R4, ROUTES::R5, ROUTES::R6, ROUTES::R7, ROUTES::R8, ROUTES::R9, ROUTES::R10]); self.resrt = BSet::new(vec![]).clone().clone(); self.resbl = BSet::new(vec![]).clone().clone(); self.rsrtbl = BRelation::new(vec![]).clone().clone(); @@ -171,55 +187,55 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { self.LBT = BSet::new(vec![]).clone().clone(); } - pub fn get_fst(&self) -> BRelation<ROUTES, BLOCKS> { + pub fn _get_fst(&self) -> BRelation<ROUTES, BLOCKS> { return self.fst.clone(); } - pub fn get_lst(&self) -> BRelation<ROUTES, BLOCKS> { + pub fn _get_lst(&self) -> BRelation<ROUTES, BLOCKS> { return self.lst.clone(); } - pub fn get_nxt(&self) -> BRelation<ROUTES, BRelation<BLOCKS, BLOCKS>> { + pub fn _get_nxt(&self) -> BRelation<ROUTES, BRelation<BLOCKS, BLOCKS>> { return self.nxt.clone(); } - pub fn get_rtbl(&self) -> BRelation<BLOCKS, ROUTES> { + pub fn _get_rtbl(&self) -> BRelation<BLOCKS, ROUTES> { return self.rtbl.clone(); } - pub fn get_LBT(&self) -> BSet<BLOCKS> { + pub fn _get_LBT(&self) -> BSet<BLOCKS> { return self.LBT.clone(); } - pub fn get_TRK(&self) -> BRelation<BLOCKS, BLOCKS> { + pub fn _get_TRK(&self) -> BRelation<BLOCKS, BLOCKS> { return self.TRK.clone(); } - pub fn get_frm(&self) -> BSet<ROUTES> { + pub fn _get_frm(&self) -> BSet<ROUTES> { return self.frm.clone(); } - pub fn get_OCC(&self) -> BSet<BLOCKS> { + pub fn _get_OCC(&self) -> BSet<BLOCKS> { return self.OCC.clone(); } - pub fn get_resbl(&self) -> BSet<BLOCKS> { + pub fn _get_resbl(&self) -> BSet<BLOCKS> { return self.resbl.clone(); } - pub fn get_resrt(&self) -> BSet<ROUTES> { + pub fn _get_resrt(&self) -> BSet<ROUTES> { return self.resrt.clone(); } - pub fn get_rsrtbl(&self) -> BRelation<BLOCKS, ROUTES> { + pub fn _get_rsrtbl(&self) -> BRelation<BLOCKS, ROUTES> { return self.rsrtbl.clone(); } - pub fn get__BLOCKS(&self) -> BSet<BLOCKS> { + pub fn _get__BLOCKS(&self) -> BSet<BLOCKS> { return self._BLOCKS.clone(); } - pub fn get__ROUTES(&self) -> BSet<ROUTES> { + pub fn _get__ROUTES(&self) -> BSet<ROUTES> { return self._ROUTES.clone(); } @@ -300,8 +316,9 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { //transition if !is_caching || self._tr_cache_route_reservation.is_none() { let mut _ic_set_1: BSet<ROUTES> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_r_1 in self._ROUTES.difference(&self.resrt).clone().iter().cloned() { - if (self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).intersect(&self.resbl).equal(&BSet::new(vec![])).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { + if ((self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).intersect(&self.resbl).equal(&BSet::new(vec![])) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { _ic_set_1 = _ic_set_1._union(&BSet::new(vec![_ic_r_1])); } @@ -317,6 +334,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { //transition if !is_caching || self._tr_cache_route_freeing.is_none() { let mut _ic_set_2: BSet<ROUTES> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_r_1 in self.resrt.difference(&self.rsrtbl.range()).clone().iter().cloned() { _ic_set_2 = _ic_set_2._union(&BSet::new(vec![_ic_r_1])); @@ -332,8 +350,9 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { //transition if !is_caching || self._tr_cache_FRONT_MOVE_1.is_none() { let mut _ic_set_3: BSet<ROUTES> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_r_1 in self.frm.clone().iter().cloned() { - if (self.resbl.difference(&self.OCC).elementOf(&self.fst.functionCall(&_ic_r_1)).and(&_ic_r_1.equal(&self.rsrtbl.functionCall(&self.fst.functionCall(&_ic_r_1)))).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { + if (((self.resbl.difference(&self.OCC).elementOf(&self.fst.functionCall(&_ic_r_1)) && _ic_r_1.equal(&self.rsrtbl.functionCall(&self.fst.functionCall(&_ic_r_1)))) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { _ic_set_3 = _ic_set_3._union(&BSet::new(vec![_ic_r_1])); } @@ -349,6 +368,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { //transition if !is_caching || self._tr_cache_FRONT_MOVE_2.is_none() { let mut _ic_set_4: BSet<BLOCKS> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_b_1 in self.OCC.intersect(&self.TRK.domain()).clone().iter().cloned() { if (self.OCC.notElementOf(&self.TRK.functionCall(&_ic_b_1))).booleanValue() { _ic_set_4 = _ic_set_4._union(&BSet::new(vec![_ic_b_1])); @@ -366,6 +386,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { //transition if !is_caching || self._tr_cache_BACK_MOVE_1.is_none() { let mut _ic_set_5: BSet<BLOCKS> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_b_1 in self.LBT.difference(&self.TRK.domain()).clone().iter().cloned() { if (BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range()))).booleanValue() { _ic_set_5 = _ic_set_5._union(&BSet::new(vec![_ic_b_1])); @@ -383,8 +404,9 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { //transition if !is_caching || self._tr_cache_BACK_MOVE_2.is_none() { let mut _ic_set_6: BSet<BLOCKS> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_b_1 in self.LBT.intersect(&self.TRK.domain()).clone().iter().cloned() { - if (self.OCC.elementOf(&self.TRK.functionCall(&_ic_b_1)).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { + if ((self.OCC.elementOf(&self.TRK.functionCall(&_ic_b_1)) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { _ic_set_6 = _ic_set_6._union(&BSet::new(vec![_ic_b_1])); } @@ -400,6 +422,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { //transition if !is_caching || self._tr_cache_point_positionning.is_none() { let mut _ic_set_7: BSet<ROUTES> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() { if (BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range()))).booleanValue() { _ic_set_7 = _ic_set_7._union(&BSet::new(vec![_ic_r_1])); @@ -417,8 +440,9 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { //transition if !is_caching || self._tr_cache_route_formation.is_none() { let mut _ic_set_8: BSet<ROUTES> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() { - if (self.nxt.functionCall(&_ic_r_1).domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1]))).equal(&self.TRK.domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])))).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { + if ((self.nxt.functionCall(&_ic_r_1).domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1]))).equal(&self.TRK.domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])))) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() { _ic_set_8 = _ic_set_8._union(&BSet::new(vec![_ic_r_1])); } @@ -437,6 +461,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { pub fn _check_inv_2(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_9 = BBoolean::new(true); for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() { { @@ -448,14 +473,17 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { } } + return _ic_boolean_9.booleanValue(); } pub fn _check_inv_3(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_11 = BBoolean::new(true); for _ic_x_1 in self.TRK.domain().clone().iter().cloned() { for _ic_y_1 in self.TRK.relationImage(&BSet::new(vec![_ic_x_1])).clone().iter().cloned() { + //quantified_predicate let mut _ic_boolean_10 = BBoolean::new(false); for _ic_r_1 in self._ROUTES.clone().iter().cloned() { if (self.nxt.functionCall(&_ic_r_1).elementOf(&BTuple::from_refs(&_ic_x_1, &_ic_y_1))).booleanValue() { @@ -464,6 +492,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { } } + if !(_ic_boolean_10).booleanValue() { _ic_boolean_11 = BBoolean::new(false); break; @@ -471,11 +500,13 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { } } + return _ic_boolean_11.booleanValue(); } pub fn _check_inv_4(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_12 = BBoolean::new(true); for _ic_r_1 in self.frm.clone().iter().cloned() { { @@ -487,6 +518,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { } } + return _ic_boolean_12.booleanValue(); } @@ -497,6 +529,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { pub fn _check_inv_6(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_13 = BBoolean::new(true); for _ic_a_1 in self.rsrtbl.domain().clone().iter().cloned() { for _ic_b_1 in self.LBT.clone().iter().cloned() { @@ -504,7 +537,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { let mut _ic_c_1 = self.rsrtbl.functionCall(&_ic_b_1); { let mut _ic_d_1 = self.nxt.functionCall(&_ic_c_1); - if !(_ic_d_1.range().elementOf(&_ic_b_1).and(&_ic_a_1.equal(&_ic_d_1.inverse().functionCall(&_ic_b_1))).implies(&self.rsrtbl.functionCall(&_ic_a_1).unequal(&_ic_c_1))).booleanValue() { + if !((_ic_d_1.range().elementOf(&_ic_b_1) && _ic_a_1.equal(&_ic_d_1.inverse().functionCall(&_ic_b_1))).implies(&self.rsrtbl.functionCall(&_ic_a_1).unequal(&_ic_c_1))).booleanValue() { _ic_boolean_13 = BBoolean::new(false); break; } @@ -513,6 +546,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { } } } + return _ic_boolean_13.booleanValue(); } @@ -533,6 +567,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { pub fn _check_inv_10(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_14 = BBoolean::new(true); for _ic_r_1 in self._ROUTES.clone().iter().cloned() { { @@ -541,7 +576,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { let mut _ic_b_1 = self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])); { let mut _ic_c_1 = _ic_b_1.difference(&self.OCC); - if !(_ic_a_1.relationImage(&self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).difference(&_ic_b_1)).intersect(&_ic_c_1).equal(&BSet::new(vec![])).and(&_ic_a_1.relationImage(&_ic_b_1).subset(&_ic_b_1)).and(&_ic_a_1.relationImage(&_ic_c_1).subset(&_ic_c_1))).booleanValue() { + if !(((_ic_a_1.relationImage(&self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).difference(&_ic_b_1)).intersect(&_ic_c_1).equal(&BSet::new(vec![])) && _ic_a_1.relationImage(&_ic_b_1).subset(&_ic_b_1)) && _ic_a_1.relationImage(&_ic_c_1).subset(&_ic_c_1))).booleanValue() { _ic_boolean_14 = BBoolean::new(false); break; } @@ -550,6 +585,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { } } } + return _ic_boolean_14.booleanValue(); } @@ -563,11 +599,10 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { return self.rsrtbl.relationImage(&self.OCC).subset(&self.frm).booleanValue(); } - fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) { + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { //calling the given functions without caching will recalculate them and cache them afterwards - //if caching is enabled globally, this will just prefill those, if caching is - for trans in to_invalidate.iter() { - match *trans { + for trans in to_invalidate { + match trans { "_tr_route_reservation" => {self._tr_route_reservation(false);}, "_tr_route_freeing" => {self._tr_route_freeing(false);}, "_tr_FRONT_MOVE_1" => {self._tr_FRONT_MOVE_1(false);}, @@ -584,431 +619,206 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { //model_check_next_states fn generateNextStates(state: &mut Train_1_beebook_deterministic_MC_POR_v2, isCaching: bool, - invariant_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_invariant_m: Arc<Mutex<HashMap<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>>>, - guard_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_guard_m: Arc<Mutex<HashMap<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>>>, - guardCache: Arc<Mutex<HashMap<Train_1_beebook_deterministic_MC_POR_v2, PersistentHashMap<&str, bool>>>>, - parents_m: Arc<Mutex<HashMap<Train_1_beebook_deterministic_MC_POR_v2, Train_1_beebook_deterministic_MC_POR_v2>>>, - transitions: Arc<AtomicI64>) -> HashSet<Train_1_beebook_deterministic_MC_POR_v2> { - let mut result = HashSet::<Train_1_beebook_deterministic_MC_POR_v2>::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_route_reservation(isCaching); - for param in _trid_1.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_reservation(_tmp_1); - match guard_dependency.get("route_reservation") { 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("route_reservation").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_reservation").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_route_freeing(isCaching); - for param in _trid_2.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_freeing(_tmp_1); - match guard_dependency.get("route_freeing") { 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("route_freeing").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_freeing").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching); - for param in _trid_3.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.FRONT_MOVE_1(_tmp_1); - match guard_dependency.get("FRONT_MOVE_1") { 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("FRONT_MOVE_1").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("FRONT_MOVE_1").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching); - for param in _trid_4.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.FRONT_MOVE_2(_tmp_1); - match guard_dependency.get("FRONT_MOVE_2") { 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("FRONT_MOVE_2").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("FRONT_MOVE_2").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching); - for param in _trid_5.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.BACK_MOVE_1(_tmp_1); - match guard_dependency.get("BACK_MOVE_1") { 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("BACK_MOVE_1").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("BACK_MOVE_1").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching); - for param in _trid_6.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.BACK_MOVE_2(_tmp_1); - match guard_dependency.get("BACK_MOVE_2") { 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("BACK_MOVE_2").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("BACK_MOVE_2").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_7 = state._tr_point_positionning(isCaching); - for param in _trid_7.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.point_positionning(_tmp_1); - match guard_dependency.get("point_positionning") { 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("point_positionning").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("point_positionning").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_8 = state._tr_route_formation(isCaching); - for param in _trid_8.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_formation(_tmp_1); - match guard_dependency.get("route_formation") { 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("route_formation").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_formation").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } + transitions: Arc<AtomicU64>) -> HashSet<(Train_1_beebook_deterministic_MC_POR_v2, &'static str)> { + let mut result = HashSet::<(Train_1_beebook_deterministic_MC_POR_v2, &'static str)>::new(); + let mut evaluated_transitions: u64 = 0; + //model_check_transition + let mut _trid_1 = state._tr_route_reservation(isCaching); + for param in _trid_1.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.route_reservation(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_reservation")); } + result.insert((copiedState, "route_reservation")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_2 = state._tr_route_freeing(isCaching); + for param in _trid_2.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.route_freeing(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_freeing")); } + result.insert((copiedState, "route_freeing")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching); + for param in _trid_3.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.FRONT_MOVE_1(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("FRONT_MOVE_1")); } + result.insert((copiedState, "FRONT_MOVE_1")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching); + for param in _trid_4.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.FRONT_MOVE_2(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("FRONT_MOVE_2")); } + result.insert((copiedState, "FRONT_MOVE_2")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching); + for param in _trid_5.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.BACK_MOVE_1(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("BACK_MOVE_1")); } + result.insert((copiedState, "BACK_MOVE_1")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching); + for param in _trid_6.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.BACK_MOVE_2(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("BACK_MOVE_2")); } + result.insert((copiedState, "BACK_MOVE_2")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_7 = state._tr_point_positionning(isCaching); + for param in _trid_7.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.point_positionning(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("point_positionning")); } + result.insert((copiedState, "point_positionning")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_8 = state._tr_route_formation(isCaching); + for param in _trid_8.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.route_formation(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_formation")); } + result.insert((copiedState, "route_formation")); + evaluated_transitions += 1; + } - guardCache.lock().unwrap().insert(state.clone(), newCache); - } else { - //model_check_transition - let mut _trid_1 = state._tr_route_reservation(isCaching); - for param in _trid_1.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_reservation(_tmp_1); - match guard_dependency.get("route_reservation") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_route_freeing(isCaching); - for param in _trid_2.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_freeing(_tmp_1); - match guard_dependency.get("route_freeing") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching); - for param in _trid_3.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.FRONT_MOVE_1(_tmp_1); - match guard_dependency.get("FRONT_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching); - for param in _trid_4.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.FRONT_MOVE_2(_tmp_1); - match guard_dependency.get("FRONT_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching); - for param in _trid_5.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.BACK_MOVE_1(_tmp_1); - match guard_dependency.get("BACK_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching); - for param in _trid_6.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.BACK_MOVE_2(_tmp_1); - match guard_dependency.get("BACK_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_7 = state._tr_point_positionning(isCaching); - for param in _trid_7.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.point_positionning(_tmp_1); - match guard_dependency.get("point_positionning") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_8 = state._tr_route_formation(isCaching); - for param in _trid_8.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.route_formation(_tmp_1); - match guard_dependency.get("route_formation") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - } + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); return result; } //model_check_evaluate_state //model_check_invariants - pub fn checkInvariants(state: &Train_1_beebook_deterministic_MC_POR_v2, - isCaching: bool, - dependent_invariant_m: Arc<Mutex<HashMap<Train_1_beebook_deterministic_MC_POR_v2, 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(); + pub fn checkInvariants(state: &Train_1_beebook_deterministic_MC_POR_v2, last_op: &'static str, isCaching: bool) -> bool { + if isCaching { + let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op); //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_1") { + if dependent_invariants_of_state.contains(&"_check_inv_1") { if !state._check_inv_1() { + println!("_check_inv_1 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_2") { + if dependent_invariants_of_state.contains(&"_check_inv_2") { if !state._check_inv_2() { + println!("_check_inv_2 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_3") { + if dependent_invariants_of_state.contains(&"_check_inv_3") { if !state._check_inv_3() { + println!("_check_inv_3 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_4") { + if dependent_invariants_of_state.contains(&"_check_inv_4") { if !state._check_inv_4() { + println!("_check_inv_4 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_5") { + if dependent_invariants_of_state.contains(&"_check_inv_5") { if !state._check_inv_5() { + println!("_check_inv_5 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_6") { + if dependent_invariants_of_state.contains(&"_check_inv_6") { if !state._check_inv_6() { + println!("_check_inv_6 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_7") { + if dependent_invariants_of_state.contains(&"_check_inv_7") { if !state._check_inv_7() { + println!("_check_inv_7 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_8") { + if dependent_invariants_of_state.contains(&"_check_inv_8") { if !state._check_inv_8() { + println!("_check_inv_8 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_9") { + if dependent_invariants_of_state.contains(&"_check_inv_9") { if !state._check_inv_9() { + println!("_check_inv_9 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_10") { + if dependent_invariants_of_state.contains(&"_check_inv_10") { if !state._check_inv_10() { + println!("_check_inv_10 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_11") { + if dependent_invariants_of_state.contains(&"_check_inv_11") { if !state._check_inv_11() { + println!("_check_inv_11 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_12") { + if dependent_invariants_of_state.contains(&"_check_inv_12") { if !state._check_inv_12() { + println!("_check_inv_12 failed!"); return false; } } @@ -1018,16 +828,14 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { } //model_check_print - fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) { - if deadlock_detected { println!("DEADLOCK DETECTED"); } - if invariant_violated { println!("INVARIANT VIOLATED"); } - if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); } + fn print_result(states: usize, transitions: u64, error_detected: bool) { + if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); } println!("Number of States: {}", states); println!("Number of Transitions: {}", transitions); } //model_check_main - fn next(collection_m: Arc<Mutex<LinkedList<Train_1_beebook_deterministic_MC_POR_v2>>>, mc_type: MC_TYPE) -> Train_1_beebook_deterministic_MC_POR_v2 { + fn next(collection_m: Arc<Mutex<LinkedList<(Train_1_beebook_deterministic_MC_POR_v2, &'static str)>>>, mc_type: MC_TYPE) -> (Train_1_beebook_deterministic_MC_POR_v2, &'static str) { let mut collection = collection_m.lock().unwrap(); return match mc_type { MC_TYPE::BFS => collection.pop_front().unwrap(), @@ -1036,100 +844,88 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { }; } - fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { - let mut machine = Train_1_beebook_deterministic_MC_POR_v2::new(); - - let invariant_violated = AtomicBool::new(false); - let deadlock_detected = AtomicBool::new(false); - let stop_threads = AtomicBool::new(false); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() { - invariant_violated.store(true, Ordering::Release); - } - - let mut states = HashSet::<Train_1_beebook_deterministic_MC_POR_v2>::new(); - states.insert(machine.clone()); - let number_states = AtomicI64::new(1); - - let collection_m = Arc::new(Mutex::new(LinkedList::<Train_1_beebook_deterministic_MC_POR_v2>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, Train_1_beebook_deterministic_MC_POR_v2>::new())); - - if is_caching { + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - invariantDependency.insert("point_positionning", HashSet::from(["_check_inv_3", "_check_inv_1", "_check_inv_4"])); + "point_positionning" => vec!["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("route_reservation", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"])); + "route_reservation" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("FRONT_MOVE_1", HashSet::from(["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"])); + "FRONT_MOVE_1" => vec!["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("BACK_MOVE_1", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"])); + "BACK_MOVE_1" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("FRONT_MOVE_2", HashSet::from(["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"])); + "FRONT_MOVE_2" => vec!["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("route_formation", HashSet::from(["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"])); + "route_formation" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"], //model_check_init_static - invariantDependency.insert("route_freeing", HashSet::from(["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"])); + "route_freeing" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"], //model_check_init_static - invariantDependency.insert("BACK_MOVE_2", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"])); + "BACK_MOVE_2" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], + _ => vec![], + } + } + + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - guardDependency.insert("point_positionning", HashSet::from(["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); + "point_positionning" => vec!["_check_inv_3", "_check_inv_1", "_check_inv_4"], //model_check_init_static - guardDependency.insert("route_reservation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"])); + "route_reservation" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"], //model_check_init_static - guardDependency.insert("FRONT_MOVE_1", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); + "FRONT_MOVE_1" => vec!["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"], //model_check_init_static - guardDependency.insert("BACK_MOVE_1", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); + "BACK_MOVE_1" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"], //model_check_init_static - guardDependency.insert("FRONT_MOVE_2", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); + "FRONT_MOVE_2" => vec!["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"], //model_check_init_static - guardDependency.insert("route_formation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"])); + "route_formation" => vec!["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"], //model_check_init_static - guardDependency.insert("route_freeing", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"])); + "route_freeing" => vec!["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"], //model_check_init_static - guardDependency.insert("BACK_MOVE_2", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); + "BACK_MOVE_2" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"], + _ => vec![], } + } - let transitions = Arc::new(AtomicI64::new(0)); + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { + let mut machine = Train_1_beebook_deterministic_MC_POR_v2::new(); - while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - let mut state = Self::next(Arc::clone(&collection_m), mc_type); + let mut all_states = HashSet::<Train_1_beebook_deterministic_MC_POR_v2>::new(); + all_states.insert(machine.clone()); - 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 states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Train_1_beebook_deterministic_MC_POR_v2, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine.clone(), "")); - next_states.iter().cloned().for_each(|next_state| { - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection_m.lock().unwrap().push_back(next_state); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - }); + let num_transitions = Arc::new(AtomicU64::new(0)); + let mut stop_threads = false; + + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions)); + + if !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); + print!("DEADLOCK DETECTED"); + stop_threads = true; } - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| all_states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op))); + if all_states.len() % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } } - Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { @@ -1137,135 +933,66 @@ impl Train_1_beebook_deterministic_MC_POR_v2 { let machine = Train_1_beebook_deterministic_MC_POR_v2::new(); + let all_states = Arc::new(DashSet::<Train_1_beebook_deterministic_MC_POR_v2>::new()); + all_states.insert(machine.clone()); - let invariant_violated_b = Arc::new(AtomicBool::new(false)); - let deadlock_detected_b = Arc::new(AtomicBool::new(false)); - let stop_threads_b = Arc::new(AtomicBool::new(false)); - let possible_queue_changes_b = Arc::new(AtomicI32::new(0)); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() { - invariant_violated_b.store(true, Ordering::Release); - } - - let states_m = Arc::new(Mutex::new(HashSet::<Train_1_beebook_deterministic_MC_POR_v2>::new())); - states_m.lock().unwrap().insert(machine.clone()); - let number_states_arc = Arc::new(AtomicI64::new(1)); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Train_1_beebook_deterministic_MC_POR_v2, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); - let collection_m = Arc::new(Mutex::new(LinkedList::<Train_1_beebook_deterministic_MC_POR_v2>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); + let num_transitions = Arc::new(AtomicU64::new(0)); - 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::<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, Train_1_beebook_deterministic_MC_POR_v2>::new())); - - if is_caching { - //model_check_init_static - invariantDependency.insert("point_positionning", HashSet::from(["_check_inv_3", "_check_inv_1", "_check_inv_4"])); - //model_check_init_static - invariantDependency.insert("route_reservation", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("FRONT_MOVE_1", HashSet::from(["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"])); - //model_check_init_static - invariantDependency.insert("BACK_MOVE_1", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"])); - //model_check_init_static - invariantDependency.insert("FRONT_MOVE_2", HashSet::from(["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"])); - //model_check_init_static - invariantDependency.insert("route_formation", HashSet::from(["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("route_freeing", HashSet::from(["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("BACK_MOVE_2", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"])); - //model_check_init_static - guardDependency.insert("point_positionning", HashSet::from(["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("route_reservation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("FRONT_MOVE_1", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("BACK_MOVE_1", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("FRONT_MOVE_2", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("route_formation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"])); - //model_check_init_static - guardDependency.insert("route_freeing", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"])); - //model_check_init_static - guardDependency.insert("BACK_MOVE_2", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } - - let num_transitions = Arc::new(AtomicI64::new(0)); - let invariant_dependency_arc = Arc::new(invariantDependency); - let guard_dependency_arc = Arc::new(guardDependency); + let mut stop_threads = false; + let mut spawned_tasks: u64 = 0; + let mut finished_tasks: u64 = 0; let (tx, rx) = channel(); //println!("Thread {:?} starting threads", thread::current().id()); - while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - possible_queue_changes_b.fetch_add(1, Ordering::AcqRel); - let mut state = Self::next(Arc::clone(&collection_m), mc_type); - - let invariant_violated = Arc::clone(&invariant_violated_b); - let deadlock_detected = Arc::clone(&deadlock_detected_b); - let stop_threads = Arc::clone(&stop_threads_b); - let possible_queue_changes = Arc::clone(&possible_queue_changes_b); - let collection_m2 = Arc::clone(&collection_m); - 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); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let states_to_process = Arc::clone(&states_to_process_mutex); let transitions = Arc::clone(&num_transitions); - let states_m2 = Arc::clone(&states_m); - let number_states = Arc::clone(&number_states_arc); + let states = Arc::clone(&all_states); 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)); + if !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } - //println!("Thread {:?} executing", thread::current().id()); - next_states.iter().cloned().for_each(|next_state| { - { - let mut states = states_m2.lock().unwrap(); - let mut collection = collection_m2.lock().unwrap(); - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection.push_back(next_state); - //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len()); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - } - }); - possible_queue_changes.fetch_sub(1, Ordering::AcqRel); + let next_states = Self::generateNextStates(&mut state, is_caching, transitions); + if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } - if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + //println!("Thread {:?} executing", thread::current().id()); + next_states.into_iter() + .filter(|(next_state, _)| states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op))); - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } //println!("Thread {:?} done", thread::current().id()); - tx.send(1).expect(""); + let _ = tx.send(Ok(1)); }); - while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 { + + spawned_tasks += 1; + if spawned_tasks % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } + + while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 { //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id()); - rx.recv().expect("Waiting for a thread to finish: "); + match rx.recv_timeout(Duration::from_secs(1)) { + Ok(val) => match val { + Ok(_) => finished_tasks += 1, + Err(msg) => { println!("{}", msg); stop_threads = true; }, + }, + Err(_) => (), + } + if threadPool.panic_count() > 0 { stop_threads = true; } } } - Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } } diff --git a/benchmarks/model_checking/Rust/nota_v2.rs b/benchmarks/model_checking/Rust/nota_v2.rs index 326000b96f82db5469dcc99f9be83cbc5e34bc52..e4be01aa8806f081bb2e82ecdd48c11871f6c6c7 100644 --- a/benchmarks/model_checking/Rust/nota_v2.rs +++ b/benchmarks/model_checking/Rust/nota_v2.rs @@ -1,16 +1,17 @@ -#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments, unused ) ] +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] use std::env; -use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::thread; -use std::collections::{HashMap, HashSet, LinkedList}; -use im::HashMap as PersistentHashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, mpsc, Mutex}; +use std::collections::{HashSet, LinkedList}; +use dashmap::DashSet; use threadpool::ThreadPool; use std::sync::mpsc::channel; use derivative::Derivative; +use std::time::{Duration}; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; +use btypes::bboolean::{IntoBool, BBooleanT}; use btypes::bboolean::BBoolean; use btypes::binteger::BInteger; use btypes::brelation::BRelation; @@ -62,7 +63,8 @@ impl _Struct5 { } - pub fn equal(&self, other: &_Struct5) -> BBoolean { + pub fn equal( + &self, other: &_Struct5) -> BBoolean { return BBoolean::new(self.soc == other.soc && self.err == other.err); } @@ -73,23 +75,23 @@ impl _Struct5 { } #[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub struct _Struct3 { +pub struct _Struct1 { sid: BSet<SID>, - err: IN_ERROR_CODES, + err: RM_ERROR_CODES, } -impl fmt::Display for _Struct3 { +impl fmt::Display for _Struct1 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "sid: {},err: {}", self.sid ,self.err) } } -impl BObject for _Struct3 {} -impl BStruct for _Struct3 {} +impl BObject for _Struct1 {} +impl BStruct for _Struct1 {} -impl _Struct3 { - pub fn new(mut sid: BSet<SID>, mut err: IN_ERROR_CODES) -> _Struct3 { - let mut m: _Struct3 = Default::default(); +impl _Struct1 { + pub fn new(mut sid: BSet<SID>, mut err: RM_ERROR_CODES) -> _Struct1 { + let mut m: _Struct1 = Default::default(); m.sid = sid;m.err = err; return m; } @@ -98,48 +100,49 @@ impl _Struct3 { return self.sid.clone(); } - pub fn get_err(&self) -> IN_ERROR_CODES { + pub fn get_err(&self) -> RM_ERROR_CODES { return self.err.clone(); } - pub fn override_sid(&self, sid: BSet<SID>) -> _Struct3 { - return _Struct3::new(sid.clone(), self.err.clone()); + pub fn override_sid(&self, sid: BSet<SID>) -> _Struct1 { + return _Struct1::new(sid.clone(), self.err.clone()); } - pub fn override_err(&self, err: IN_ERROR_CODES) -> _Struct3 { - return _Struct3::new(self.sid.clone(), err.clone()); + pub fn override_err(&self, err: RM_ERROR_CODES) -> _Struct1 { + return _Struct1::new(self.sid.clone(), err.clone()); } - pub fn equal(&self, other: &_Struct3) -> BBoolean { + pub fn equal( + &self, other: &_Struct1) -> BBoolean { return BBoolean::new(self.sid == other.sid && self.err == other.err); } - pub fn unequal(&self, other: &_Struct3) -> BBoolean { + pub fn unequal(&self, other: &_Struct1) -> BBoolean { return BBoolean::new(self.sid != other.sid || self.err != other.err); } } #[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub struct _Struct1 { +pub struct _Struct3 { sid: BSet<SID>, - err: RM_ERROR_CODES, + err: IN_ERROR_CODES, } -impl fmt::Display for _Struct1 { +impl fmt::Display for _Struct3 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "sid: {},err: {}", self.sid ,self.err) } } -impl BObject for _Struct1 {} -impl BStruct for _Struct1 {} +impl BObject for _Struct3 {} +impl BStruct for _Struct3 {} -impl _Struct1 { - pub fn new(mut sid: BSet<SID>, mut err: RM_ERROR_CODES) -> _Struct1 { - let mut m: _Struct1 = Default::default(); +impl _Struct3 { + pub fn new(mut sid: BSet<SID>, mut err: IN_ERROR_CODES) -> _Struct3 { + let mut m: _Struct3 = Default::default(); m.sid = sid;m.err = err; return m; } @@ -148,25 +151,26 @@ impl _Struct1 { return self.sid.clone(); } - pub fn get_err(&self) -> RM_ERROR_CODES { + pub fn get_err(&self) -> IN_ERROR_CODES { return self.err.clone(); } - pub fn override_sid(&self, sid: BSet<SID>) -> _Struct1 { - return _Struct1::new(sid.clone(), self.err.clone()); + pub fn override_sid(&self, sid: BSet<SID>) -> _Struct3 { + return _Struct3::new(sid.clone(), self.err.clone()); } - pub fn override_err(&self, err: RM_ERROR_CODES) -> _Struct1 { - return _Struct1::new(self.sid.clone(), err.clone()); + pub fn override_err(&self, err: IN_ERROR_CODES) -> _Struct3 { + return _Struct3::new(self.sid.clone(), err.clone()); } - pub fn equal(&self, other: &_Struct1) -> BBoolean { + pub fn equal( + &self, other: &_Struct3) -> BBoolean { return BBoolean::new(self.sid == other.sid && self.err == other.err); } - pub fn unequal(&self, other: &_Struct1) -> BBoolean { + pub fn unequal(&self, other: &_Struct3) -> BBoolean { return BBoolean::new(self.sid != other.sid || self.err != other.err); } @@ -174,7 +178,7 @@ impl _Struct1 { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum INTERCONNECTNODE { - node1, + node1, node2 } impl INTERCONNECTNODE { @@ -187,16 +191,16 @@ impl Default for INTERCONNECTNODE { } impl fmt::Display for INTERCONNECTNODE { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - INTERCONNECTNODE::node1 => write!(f, "node1"), - INTERCONNECTNODE::node2 => write!(f, "node2"), - } + match *self { + INTERCONNECTNODE::node1 => write!(f, "node1"), + INTERCONNECTNODE::node2 => write!(f, "node2"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum SOCKET { - socket1, + socket1, socket2 } impl SOCKET { @@ -209,16 +213,16 @@ impl Default for SOCKET { } impl fmt::Display for SOCKET { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - SOCKET::socket1 => write!(f, "socket1"), - SOCKET::socket2 => write!(f, "socket2"), - } + match *self { + SOCKET::socket1 => write!(f, "socket1"), + SOCKET::socket2 => write!(f, "socket2"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum SERVICE { - service1, + service1, service2 } impl SERVICE { @@ -231,16 +235,16 @@ impl Default for SERVICE { } impl fmt::Display for SERVICE { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - SERVICE::service1 => write!(f, "service1"), - SERVICE::service2 => write!(f, "service2"), - } + match *self { + SERVICE::service1 => write!(f, "service1"), + SERVICE::service2 => write!(f, "service2"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum RESOURCEMANAGER { - resource1, + resource1, resource2 } impl RESOURCEMANAGER { @@ -253,16 +257,16 @@ impl Default for RESOURCEMANAGER { } impl fmt::Display for RESOURCEMANAGER { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - RESOURCEMANAGER::resource1 => write!(f, "resource1"), - RESOURCEMANAGER::resource2 => write!(f, "resource2"), - } + match *self { + RESOURCEMANAGER::resource1 => write!(f, "resource1"), + RESOURCEMANAGER::resource2 => write!(f, "resource2"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum SID { - SID1, + SID1, SID2 } impl SID { @@ -275,16 +279,16 @@ impl Default for SID { } impl fmt::Display for SID { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - SID::SID1 => write!(f, "SID1"), - SID::SID2 => write!(f, "SID2"), - } + match *self { + SID::SID1 => write!(f, "SID1"), + SID::SID2 => write!(f, "SID2"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum RM_ERROR_CODES { - RM_SERVICE_FOUND, + RM_SERVICE_FOUND, RM_SERVICE_NOT_FOUND } impl RM_ERROR_CODES { @@ -297,24 +301,24 @@ impl Default for RM_ERROR_CODES { } impl fmt::Display for RM_ERROR_CODES { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - RM_ERROR_CODES::RM_SERVICE_FOUND => write!(f, "RM_SERVICE_FOUND"), - RM_ERROR_CODES::RM_SERVICE_NOT_FOUND => write!(f, "RM_SERVICE_NOT_FOUND"), - } + match *self { + RM_ERROR_CODES::RM_SERVICE_FOUND => write!(f, "RM_SERVICE_FOUND"), + RM_ERROR_CODES::RM_SERVICE_NOT_FOUND => write!(f, "RM_SERVICE_NOT_FOUND"), + } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum IN_ERROR_CODES { - IN_REGISTRATION_OK, - IN_REGISTRATION_FAILED, - IN_DEREGISTRATION_OK, - IN_DEREGISTRATION_FAILED, - IN_NO_SOCKET_CONNECTION, - IN_SOCKET_CONNECTION_OK, - IN_NO_AVAILABLE_SERVICE, - IN_SERVICE_AVAILABLE, - IN_TARGET_SOCKET_GRANTED, + IN_REGISTRATION_OK, + IN_REGISTRATION_FAILED, + IN_DEREGISTRATION_OK, + IN_DEREGISTRATION_FAILED, + IN_NO_SOCKET_CONNECTION, + IN_SOCKET_CONNECTION_OK, + IN_NO_AVAILABLE_SERVICE, + IN_SERVICE_AVAILABLE, + IN_TARGET_SOCKET_GRANTED, IN_TARGET_SOCKET_NOT_GRANTED } impl IN_ERROR_CODES { @@ -327,18 +331,18 @@ impl Default for IN_ERROR_CODES { } impl fmt::Display for IN_ERROR_CODES { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - IN_ERROR_CODES::IN_REGISTRATION_OK => write!(f, "IN_REGISTRATION_OK"), - IN_ERROR_CODES::IN_REGISTRATION_FAILED => write!(f, "IN_REGISTRATION_FAILED"), - IN_ERROR_CODES::IN_DEREGISTRATION_OK => write!(f, "IN_DEREGISTRATION_OK"), - IN_ERROR_CODES::IN_DEREGISTRATION_FAILED => write!(f, "IN_DEREGISTRATION_FAILED"), - IN_ERROR_CODES::IN_NO_SOCKET_CONNECTION => write!(f, "IN_NO_SOCKET_CONNECTION"), - IN_ERROR_CODES::IN_SOCKET_CONNECTION_OK => write!(f, "IN_SOCKET_CONNECTION_OK"), - IN_ERROR_CODES::IN_NO_AVAILABLE_SERVICE => write!(f, "IN_NO_AVAILABLE_SERVICE"), - IN_ERROR_CODES::IN_SERVICE_AVAILABLE => write!(f, "IN_SERVICE_AVAILABLE"), - IN_ERROR_CODES::IN_TARGET_SOCKET_GRANTED => write!(f, "IN_TARGET_SOCKET_GRANTED"), - IN_ERROR_CODES::IN_TARGET_SOCKET_NOT_GRANTED => write!(f, "IN_TARGET_SOCKET_NOT_GRANTED"), - } + match *self { + IN_ERROR_CODES::IN_REGISTRATION_OK => write!(f, "IN_REGISTRATION_OK"), + IN_ERROR_CODES::IN_REGISTRATION_FAILED => write!(f, "IN_REGISTRATION_FAILED"), + IN_ERROR_CODES::IN_DEREGISTRATION_OK => write!(f, "IN_DEREGISTRATION_OK"), + IN_ERROR_CODES::IN_DEREGISTRATION_FAILED => write!(f, "IN_DEREGISTRATION_FAILED"), + IN_ERROR_CODES::IN_NO_SOCKET_CONNECTION => write!(f, "IN_NO_SOCKET_CONNECTION"), + IN_ERROR_CODES::IN_SOCKET_CONNECTION_OK => write!(f, "IN_SOCKET_CONNECTION_OK"), + IN_ERROR_CODES::IN_NO_AVAILABLE_SERVICE => write!(f, "IN_NO_AVAILABLE_SERVICE"), + IN_ERROR_CODES::IN_SERVICE_AVAILABLE => write!(f, "IN_SERVICE_AVAILABLE"), + IN_ERROR_CODES::IN_TARGET_SOCKET_GRANTED => write!(f, "IN_TARGET_SOCKET_GRANTED"), + IN_ERROR_CODES::IN_TARGET_SOCKET_NOT_GRANTED => write!(f, "IN_TARGET_SOCKET_NOT_GRANTED"), + } } } @@ -397,6 +401,30 @@ pub struct nota_v2 { #[derivative(Hash="ignore", PartialEq="ignore")] _tr_cache_svc_register: Option<BSet<SERVICE>>,} +impl fmt::Display for nota_v2 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut result = "nota_v2: (".to_owned(); + result += &format!("_get_interconnectNodes: {}, ", self._get_interconnectNodes()); + result += &format!("_get_sockets: {}, ", self._get_sockets()); + result += &format!("_get_services: {}, ", self._get_services()); + result += &format!("_get_resourceManagers: {}, ", self._get_resourceManagers()); + result += &format!("_get_sids: {}, ", self._get_sids()); + result += &format!("_get_rm_services: {}, ", self._get_rm_services()); + result += &format!("_get_rm_sids: {}, ", self._get_rm_sids()); + result += &format!("_get_in_localServices: {}, ", self._get_in_localServices()); + result += &format!("_get_in_sockets: {}, ", self._get_in_sockets()); + result += &format!("_get_in_resourceManager: {}, ", self._get_in_resourceManager()); + result += &format!("_get_soc_to: {}, ", self._get_soc_to()); + result += &format!("_get_soc_from: {}, ", self._get_soc_from()); + result += &format!("_get_svc_serviceID: {}, ", self._get_svc_serviceID()); + result += &format!("_get_svc_sockets: {}, ", self._get_svc_sockets()); + result += &format!("_get_svc_ICNode: {}, ", self._get_svc_ICNode()); + result += &format!("_get_svc_registered: {}, ", self._get_svc_registered()); + result = result + ")"; + return write!(f, "{}", result); + } +} + impl nota_v2 { pub fn new() -> nota_v2 { @@ -431,95 +459,95 @@ impl nota_v2 { self.svc_registered = BRelation::new(vec![]).clone().clone(); } - pub fn get_interconnectNodes(&self) -> BSet<INTERCONNECTNODE> { + pub fn _get_interconnectNodes(&self) -> BSet<INTERCONNECTNODE> { return self.interconnectNodes.clone(); } - pub fn get_sockets(&self) -> BSet<SOCKET> { + pub fn _get_sockets(&self) -> BSet<SOCKET> { return self.sockets.clone(); } - pub fn get_services(&self) -> BSet<SERVICE> { + pub fn _get_services(&self) -> BSet<SERVICE> { return self.services.clone(); } - pub fn get_resourceManagers(&self) -> BSet<RESOURCEMANAGER> { + pub fn _get_resourceManagers(&self) -> BSet<RESOURCEMANAGER> { return self.resourceManagers.clone(); } - pub fn get_sids(&self) -> BSet<SID> { + pub fn _get_sids(&self) -> BSet<SID> { return self.sids.clone(); } - pub fn get_rm_services(&self) -> BRelation<RESOURCEMANAGER, BSet<SERVICE>> { + pub fn _get_rm_services(&self) -> BRelation<RESOURCEMANAGER, BSet<SERVICE>> { return self.rm_services.clone(); } - pub fn get_rm_sids(&self) -> BRelation<SERVICE, SID> { + pub fn _get_rm_sids(&self) -> BRelation<SERVICE, SID> { return self.rm_sids.clone(); } - pub fn get_in_localServices(&self) -> BRelation<SID, INTERCONNECTNODE> { + pub fn _get_in_localServices(&self) -> BRelation<SID, INTERCONNECTNODE> { return self.in_localServices.clone(); } - pub fn get_in_sockets(&self) -> BRelation<SOCKET, INTERCONNECTNODE> { + pub fn _get_in_sockets(&self) -> BRelation<SOCKET, INTERCONNECTNODE> { return self.in_sockets.clone(); } - pub fn get_in_resourceManager(&self) -> BRelation<INTERCONNECTNODE, BSet<RESOURCEMANAGER>> { + pub fn _get_in_resourceManager(&self) -> BRelation<INTERCONNECTNODE, BSet<RESOURCEMANAGER>> { return self.in_resourceManager.clone(); } - pub fn get_soc_to(&self) -> BRelation<SOCKET, SID> { + pub fn _get_soc_to(&self) -> BRelation<SOCKET, SID> { return self.soc_to.clone(); } - pub fn get_soc_from(&self) -> BRelation<SOCKET, SID> { + pub fn _get_soc_from(&self) -> BRelation<SOCKET, SID> { return self.soc_from.clone(); } - pub fn get_svc_serviceID(&self) -> BRelation<SERVICE, SID> { + pub fn _get_svc_serviceID(&self) -> BRelation<SERVICE, SID> { return self.svc_serviceID.clone(); } - pub fn get_svc_sockets(&self) -> BRelation<SERVICE, BSet<SOCKET>> { + pub fn _get_svc_sockets(&self) -> BRelation<SERVICE, BSet<SOCKET>> { return self.svc_sockets.clone(); } - pub fn get_svc_ICNode(&self) -> BRelation<SERVICE, INTERCONNECTNODE> { + pub fn _get_svc_ICNode(&self) -> BRelation<SERVICE, INTERCONNECTNODE> { return self.svc_ICNode.clone(); } - pub fn get_svc_registered(&self) -> BRelation<SERVICE, BBoolean> { + pub fn _get_svc_registered(&self) -> BRelation<SERVICE, BBoolean> { return self.svc_registered.clone(); } - pub fn get__INTERCONNECTNODE(&self) -> BSet<INTERCONNECTNODE> { + pub fn _get__INTERCONNECTNODE(&self) -> BSet<INTERCONNECTNODE> { return self._INTERCONNECTNODE.clone(); } - pub fn get__SOCKET(&self) -> BSet<SOCKET> { + pub fn _get__SOCKET(&self) -> BSet<SOCKET> { return self._SOCKET.clone(); } - pub fn get__SERVICE(&self) -> BSet<SERVICE> { + pub fn _get__SERVICE(&self) -> BSet<SERVICE> { return self._SERVICE.clone(); } - pub fn get__RESOURCEMANAGER(&self) -> BSet<RESOURCEMANAGER> { + pub fn _get__RESOURCEMANAGER(&self) -> BSet<RESOURCEMANAGER> { return self._RESOURCEMANAGER.clone(); } - pub fn get__SID(&self) -> BSet<SID> { + pub fn _get__SID(&self) -> BSet<SID> { return self._SID.clone(); } - pub fn get__RM_ERROR_CODES(&self) -> BSet<RM_ERROR_CODES> { + pub fn _get__RM_ERROR_CODES(&self) -> BSet<RM_ERROR_CODES> { return self._RM_ERROR_CODES.clone(); } - pub fn get__IN_ERROR_CODES(&self) -> BSet<IN_ERROR_CODES> { + pub fn _get__IN_ERROR_CODES(&self) -> BSet<IN_ERROR_CODES> { return self._IN_ERROR_CODES.clone(); } @@ -671,6 +699,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_constructor_interconnectNode.is_none() { let mut _ic_set_0: BSet<INTERCONNECTNODE> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_newic_1 in self._INTERCONNECTNODE.difference(&self.interconnectNodes).clone().iter().cloned() { _ic_set_0 = _ic_set_0._union(&BSet::new(vec![_ic_newic_1])); @@ -686,8 +715,9 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_constructor_resourceManager.is_none() { let mut _ic_set_1: BSet<RESOURCEMANAGER> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_newrm_1 in self._RESOURCEMANAGER.difference(&self.resourceManagers).clone().iter().cloned() { - if (self.rm_services.domain().notElementOf(&_ic_newrm_1).and(&self.resourceManagers.equal(&BSet::new(vec![])))).booleanValue() { + if ((self.rm_services.domain().notElementOf(&_ic_newrm_1) && self.resourceManagers.equal(&BSet::new(vec![])))).booleanValue() { _ic_set_1 = _ic_set_1._union(&BSet::new(vec![_ic_newrm_1])); } @@ -703,6 +733,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_constructor_service.is_none() { let mut _ic_set_2: BSet<BTuple<INTERCONNECTNODE, SERVICE>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() { for _ic_newsvc_1 in self._SERVICE.difference(&self.services).clone().iter().cloned() { _ic_set_2 = _ic_set_2._union(&BSet::new(vec![BTuple::from_refs(&_ic_ii_1, &_ic_newsvc_1)])); @@ -720,6 +751,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_constructor_socket.is_none() { let mut _ic_set_3: BSet<BTuple<BTuple<BTuple<INTERCONNECTNODE, SID>, SID>, SOCKET>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() { for _ic_srcsid_1 in self.sids.clone().iter().cloned() { for _ic_targsid_1 in self.sids.clone().iter().cloned() { @@ -741,6 +773,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_rm_register.is_none() { let mut _ic_set_4: BSet<BTuple<BTuple<RESOURCEMANAGER, SERVICE>, INTERCONNECTNODE>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_self_1 in self.resourceManagers.clone().iter().cloned() { for _ic_ss_1 in self.services.clone().iter().cloned() { for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() { @@ -760,6 +793,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_rm_deregister.is_none() { let mut _ic_set_5: BSet<BTuple<BTuple<RESOURCEMANAGER, SERVICE>, INTERCONNECTNODE>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_self_1 in self.resourceManagers.clone().iter().cloned() { for _ic_ss_1 in self.services.clone().iter().cloned() { for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() { @@ -779,6 +813,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_rm_getSid.is_none() { let mut _ic_set_6: BSet<BTuple<RESOURCEMANAGER, SERVICE>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_self_1 in self.resourceManagers.clone().iter().cloned() { for _ic_ss_1 in self.services.clone().iter().cloned() { if (self.rm_sids.domain().elementOf(&_ic_ss_1)).booleanValue() { @@ -798,6 +833,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_rm_getSid_Not_Found.is_none() { let mut _ic_set_7: BSet<BTuple<RESOURCEMANAGER, SERVICE>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_self_1 in self.resourceManagers.clone().iter().cloned() { for _ic_ss_1 in self.services.clone().iter().cloned() { _ic_set_7 = _ic_set_7._union(&BSet::new(vec![BTuple::from_refs(&_ic_self_1, &_ic_ss_1)])); @@ -815,6 +851,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_in_announceResourceManager.is_none() { let mut _ic_set_8: BSet<BTuple<INTERCONNECTNODE, RESOURCEMANAGER>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_self_1 in self.interconnectNodes.clone().iter().cloned() { for _ic_rm_1 in self.resourceManagers.clone().iter().cloned() { if (self.in_resourceManager.functionCall(&_ic_self_1).equal(&BSet::new(vec![]))).booleanValue() { @@ -834,6 +871,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_in_register_success.is_none() { let mut _ic_set_9: BSet<BTuple<BTuple<INTERCONNECTNODE, SERVICE>, SID>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_self_1 in self.interconnectNodes.clone().iter().cloned() { for _ic_ss_1 in self.services.clone().iter().cloned() { for _ic_si_1 in self._SID.difference(&self.sids).clone().iter().cloned() { @@ -855,6 +893,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_in_register_failed.is_none() { let mut _ic_set_10: BSet<BTuple<INTERCONNECTNODE, SERVICE>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_self_1 in self.interconnectNodes.clone().iter().cloned() { for _ic_ss_1 in self.services.clone().iter().cloned() { _ic_set_10 = _ic_set_10._union(&BSet::new(vec![BTuple::from_refs(&_ic_self_1, &_ic_ss_1)])); @@ -872,13 +911,14 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_in_requestTargetSocket_Granted.is_none() { let mut _ic_set_11: BSet<BTuple<BTuple<BTuple<BTuple<BTuple<INTERCONNECTNODE, INTERCONNECTNODE>, SOCKET>, SID>, SID>, SOCKET>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_self_1 in self.interconnectNodes.clone().iter().cloned() { for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() { for _ic_srcsoc_1 in self.sockets.clone().iter().cloned() { for _ic_srcsid_1 in self.sids.clone().iter().cloned() { for _ic_targsid_1 in self.sids.clone().iter().cloned() { for _ic_newsoc_1 in self._SOCKET.difference(&self.sockets).clone().iter().cloned() { - if (_ic_self_1.unequal(&_ic_ii_1).and(&self.in_sockets.functionCall(&_ic_srcsoc_1).equal(&_ic_ii_1))).booleanValue() { + if ((_ic_self_1.unequal(&_ic_ii_1) && self.in_sockets.functionCall(&_ic_srcsoc_1).equal(&_ic_ii_1))).booleanValue() { _ic_set_11 = _ic_set_11._union(&BSet::new(vec![BTuple::from_refs(&BTuple::from_refs(&BTuple::from_refs(&BTuple::from_refs(&BTuple::from_refs(&_ic_self_1, &_ic_ii_1), &_ic_srcsoc_1), &_ic_srcsid_1), &_ic_targsid_1), &_ic_newsoc_1)])); } @@ -899,12 +939,13 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_in_requestTargetSocket_NotGranted.is_none() { let mut _ic_set_12: BSet<BTuple<BTuple<BTuple<BTuple<INTERCONNECTNODE, INTERCONNECTNODE>, SOCKET>, SID>, SID>> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_self_1 in self.interconnectNodes.clone().iter().cloned() { for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() { for _ic_srcsoc_1 in self.sockets.clone().iter().cloned() { for _ic_srcsid_1 in self.sids.clone().iter().cloned() { for _ic_targsid_1 in self.sids.clone().iter().cloned() { - if (_ic_self_1.unequal(&_ic_ii_1).and(&self.in_sockets.functionCall(&_ic_srcsoc_1).equal(&_ic_ii_1))).booleanValue() { + if ((_ic_self_1.unequal(&_ic_ii_1) && self.in_sockets.functionCall(&_ic_srcsoc_1).equal(&_ic_ii_1))).booleanValue() { _ic_set_12 = _ic_set_12._union(&BSet::new(vec![BTuple::from_refs(&BTuple::from_refs(&BTuple::from_refs(&BTuple::from_refs(&_ic_self_1, &_ic_ii_1), &_ic_srcsoc_1), &_ic_srcsid_1), &_ic_targsid_1)])); } @@ -924,6 +965,7 @@ impl nota_v2 { //transition if !is_caching || self._tr_cache_svc_register.is_none() { let mut _ic_set_13: BSet<SERVICE> = BSet::new(vec![]); + //transition, parameters, no condidtion for _ic_self_1 in self.services.clone().iter().cloned() { if (self.svc_registered.functionCall(&_ic_self_1).equal(&BBoolean::new(false))).booleanValue() { _ic_set_13 = _ic_set_13._union(&BSet::new(vec![_ic_self_1])); @@ -969,6 +1011,7 @@ impl nota_v2 { pub fn _check_inv_7(&self) -> bool { //invariant + //quantified_predicate let mut _ic_boolean_14 = BBoolean::new(true); for _ic_a1_1 in self.rm_services.domain().clone().iter().cloned() { for _ic_a2_1 in self.rm_services.domain().clone().iter().cloned() { @@ -979,6 +1022,7 @@ impl nota_v2 { } } + return _ic_boolean_14.booleanValue(); } @@ -1037,11 +1081,10 @@ impl nota_v2 { return self.resourceManagers.equal(&BSet::new(vec![])).not().implies(&self.resourceManagers.card().equal(&BInteger::new(1))).booleanValue(); } - fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) { + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { //calling the given functions without caching will recalculate them and cache them afterwards - //if caching is enabled globally, this will just prefill those, if caching is - for trans in to_invalidate.iter() { - match *trans { + for trans in to_invalidate { + match trans { "_tr_constructor_interconnectNode" => {self._tr_constructor_interconnectNode(false);}, "_tr_constructor_resourceManager" => {self._tr_constructor_resourceManager(false);}, "_tr_constructor_service" => {self._tr_constructor_service(false);}, @@ -1064,853 +1107,396 @@ impl nota_v2 { //model_check_next_states fn generateNextStates(state: &mut nota_v2, isCaching: bool, - invariant_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_invariant_m: Arc<Mutex<HashMap<nota_v2, HashSet<&str>>>>, - guard_dependency: &HashMap<&str, HashSet<&'static str>>, - dependent_guard_m: Arc<Mutex<HashMap<nota_v2, HashSet<&str>>>>, - guardCache: Arc<Mutex<HashMap<nota_v2, PersistentHashMap<&str, bool>>>>, - parents_m: Arc<Mutex<HashMap<nota_v2, nota_v2>>>, - transitions: Arc<AtomicI64>) -> HashSet<nota_v2> { - let mut result = HashSet::<nota_v2>::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_constructor_interconnectNode(isCaching); - for param in _trid_1.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.constructor_interconnectNode(_tmp_1); - match guard_dependency.get("constructor_interconnectNode") { 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("constructor_interconnectNode").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("constructor_interconnectNode").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_constructor_resourceManager(isCaching); - for param in _trid_2.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.constructor_resourceManager(_tmp_1); - match guard_dependency.get("constructor_resourceManager") { 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("constructor_resourceManager").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("constructor_resourceManager").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_constructor_service(isCaching); - for param in _trid_3.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.constructor_service(_tmp_2, _tmp_1); - match guard_dependency.get("constructor_service") { 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("constructor_service").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("constructor_service").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_constructor_socket(isCaching); - for param in _trid_4.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - //model_check_transition_param_assignment - let mut _tmp_5 = _tmp_4.projection2(); - //model_check_transition_param_assignment - let mut _tmp_6 = _tmp_4.projection1(); - - let mut copiedState = state.clone(); - copiedState.constructor_socket(_tmp_6, _tmp_5, _tmp_3, _tmp_1); - match guard_dependency.get("constructor_socket") { 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("constructor_socket").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("constructor_socket").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_5 = state._tr_rm_register(isCaching); - for param in _trid_5.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - - let mut copiedState = state.clone(); - copiedState.rm_register(_tmp_4, _tmp_3, _tmp_1); - match guard_dependency.get("rm_register") { 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("rm_register").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("rm_register").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_rm_deregister(isCaching); - for param in _trid_6.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - - let mut copiedState = state.clone(); - copiedState.rm_deregister(_tmp_4, _tmp_3, _tmp_1); - match guard_dependency.get("rm_deregister") { 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("rm_deregister").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("rm_deregister").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_7 = state._tr_rm_getSid(isCaching); - for param in _trid_7.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.rm_getSid(_tmp_2, _tmp_1); - match guard_dependency.get("rm_getSid") { 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("rm_getSid").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("rm_getSid").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_8 = state._tr_rm_getSid_Not_Found(isCaching); - for param in _trid_8.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.rm_getSid_Not_Found(_tmp_2, _tmp_1); - match guard_dependency.get("rm_getSid_Not_Found") { 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("rm_getSid_Not_Found").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("rm_getSid_Not_Found").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_9 = state._tr_in_announceResourceManager(isCaching); - for param in _trid_9.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.in_announceResourceManager(_tmp_2, _tmp_1); - match guard_dependency.get("in_announceResourceManager") { 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("in_announceResourceManager").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("in_announceResourceManager").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_10 = state._tr_in_register_success(isCaching); - for param in _trid_10.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - - let mut copiedState = state.clone(); - copiedState.in_register_success(_tmp_4, _tmp_3, _tmp_1); - match guard_dependency.get("in_register_success") { 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("in_register_success").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("in_register_success").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_11 = state._tr_in_register_failed(isCaching); - for param in _trid_11.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.in_register_failed(_tmp_2, _tmp_1); - match guard_dependency.get("in_register_failed") { 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("in_register_failed").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("in_register_failed").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_12 = state._tr_in_requestTargetSocket_Granted(isCaching); - for param in _trid_12.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - //model_check_transition_param_assignment - let mut _tmp_5 = _tmp_4.projection2(); - //model_check_transition_param_assignment - let mut _tmp_6 = _tmp_4.projection1(); - //model_check_transition_param_assignment - let mut _tmp_7 = _tmp_6.projection2(); - //model_check_transition_param_assignment - let mut _tmp_8 = _tmp_6.projection1(); - //model_check_transition_param_assignment - let mut _tmp_9 = _tmp_8.projection2(); - //model_check_transition_param_assignment - let mut _tmp_10 = _tmp_8.projection1(); - - let mut copiedState = state.clone(); - copiedState.in_requestTargetSocket_Granted(_tmp_10, _tmp_9, _tmp_7, _tmp_5, _tmp_3, _tmp_1); - match guard_dependency.get("in_requestTargetSocket_Granted") { 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("in_requestTargetSocket_Granted").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("in_requestTargetSocket_Granted").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_13 = state._tr_in_requestTargetSocket_NotGranted(isCaching); - for param in _trid_13.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - //model_check_transition_param_assignment - let mut _tmp_5 = _tmp_4.projection2(); - //model_check_transition_param_assignment - let mut _tmp_6 = _tmp_4.projection1(); - //model_check_transition_param_assignment - let mut _tmp_7 = _tmp_6.projection2(); - //model_check_transition_param_assignment - let mut _tmp_8 = _tmp_6.projection1(); - - let mut copiedState = state.clone(); - copiedState.in_requestTargetSocket_NotGranted(_tmp_8, _tmp_7, _tmp_5, _tmp_3, _tmp_1); - match guard_dependency.get("in_requestTargetSocket_NotGranted") { 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("in_requestTargetSocket_NotGranted").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("in_requestTargetSocket_NotGranted").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_14 = state._tr_svc_register(isCaching); - for param in _trid_14.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.svc_register(_tmp_1); - match guard_dependency.get("svc_register") { 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("svc_register").unwrap().clone()); - } - if !dependent_guard.contains_key(&copiedState) { - dependent_guard.insert(copiedState.clone(), guard_dependency.get("svc_register").unwrap().clone()); - } - if !parents.contains_key(&copiedState) { - parents.insert(copiedState.clone(), state.clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } + transitions: Arc<AtomicU64>) -> HashSet<(nota_v2, &'static str)> { + let mut result = HashSet::<(nota_v2, &'static str)>::new(); + let mut evaluated_transitions: u64 = 0; + //model_check_transition + let mut _trid_1 = state._tr_constructor_interconnectNode(isCaching); + for param in _trid_1.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.constructor_interconnectNode(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("constructor_interconnectNode")); } + result.insert((copiedState, "constructor_interconnectNode")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_2 = state._tr_constructor_resourceManager(isCaching); + for param in _trid_2.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.constructor_resourceManager(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("constructor_resourceManager")); } + result.insert((copiedState, "constructor_resourceManager")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_3 = state._tr_constructor_service(isCaching); + for param in _trid_3.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.constructor_service(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("constructor_service")); } + result.insert((copiedState, "constructor_service")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_4 = state._tr_constructor_socket(isCaching); + for param in _trid_4.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + //model_check_transition_param_assignment + let mut _tmp_3 = _tmp_2.projection2(); + //model_check_transition_param_assignment + let mut _tmp_4 = _tmp_2.projection1(); + //model_check_transition_param_assignment + let mut _tmp_5 = _tmp_4.projection2(); + //model_check_transition_param_assignment + let mut _tmp_6 = _tmp_4.projection1(); + + let mut copiedState = state.clone(); + copiedState.constructor_socket(_tmp_6, _tmp_5, _tmp_3, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("constructor_socket")); } + result.insert((copiedState, "constructor_socket")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_5 = state._tr_rm_register(isCaching); + for param in _trid_5.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + //model_check_transition_param_assignment + let mut _tmp_3 = _tmp_2.projection2(); + //model_check_transition_param_assignment + let mut _tmp_4 = _tmp_2.projection1(); + + let mut copiedState = state.clone(); + copiedState.rm_register(_tmp_4, _tmp_3, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("rm_register")); } + result.insert((copiedState, "rm_register")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_6 = state._tr_rm_deregister(isCaching); + for param in _trid_6.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + //model_check_transition_param_assignment + let mut _tmp_3 = _tmp_2.projection2(); + //model_check_transition_param_assignment + let mut _tmp_4 = _tmp_2.projection1(); + + let mut copiedState = state.clone(); + copiedState.rm_deregister(_tmp_4, _tmp_3, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("rm_deregister")); } + result.insert((copiedState, "rm_deregister")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_7 = state._tr_rm_getSid(isCaching); + for param in _trid_7.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.rm_getSid(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("rm_getSid")); } + result.insert((copiedState, "rm_getSid")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_8 = state._tr_rm_getSid_Not_Found(isCaching); + for param in _trid_8.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.rm_getSid_Not_Found(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("rm_getSid_Not_Found")); } + result.insert((copiedState, "rm_getSid_Not_Found")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_9 = state._tr_in_announceResourceManager(isCaching); + for param in _trid_9.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.in_announceResourceManager(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("in_announceResourceManager")); } + result.insert((copiedState, "in_announceResourceManager")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_10 = state._tr_in_register_success(isCaching); + for param in _trid_10.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + //model_check_transition_param_assignment + let mut _tmp_3 = _tmp_2.projection2(); + //model_check_transition_param_assignment + let mut _tmp_4 = _tmp_2.projection1(); + + let mut copiedState = state.clone(); + copiedState.in_register_success(_tmp_4, _tmp_3, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("in_register_success")); } + result.insert((copiedState, "in_register_success")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_11 = state._tr_in_register_failed(isCaching); + for param in _trid_11.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + + let mut copiedState = state.clone(); + copiedState.in_register_failed(_tmp_2, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("in_register_failed")); } + result.insert((copiedState, "in_register_failed")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_12 = state._tr_in_requestTargetSocket_Granted(isCaching); + for param in _trid_12.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + //model_check_transition_param_assignment + let mut _tmp_3 = _tmp_2.projection2(); + //model_check_transition_param_assignment + let mut _tmp_4 = _tmp_2.projection1(); + //model_check_transition_param_assignment + let mut _tmp_5 = _tmp_4.projection2(); + //model_check_transition_param_assignment + let mut _tmp_6 = _tmp_4.projection1(); + //model_check_transition_param_assignment + let mut _tmp_7 = _tmp_6.projection2(); + //model_check_transition_param_assignment + let mut _tmp_8 = _tmp_6.projection1(); + //model_check_transition_param_assignment + let mut _tmp_9 = _tmp_8.projection2(); + //model_check_transition_param_assignment + let mut _tmp_10 = _tmp_8.projection1(); + + let mut copiedState = state.clone(); + copiedState.in_requestTargetSocket_Granted(_tmp_10, _tmp_9, _tmp_7, _tmp_5, _tmp_3, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("in_requestTargetSocket_Granted")); } + result.insert((copiedState, "in_requestTargetSocket_Granted")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_13 = state._tr_in_requestTargetSocket_NotGranted(isCaching); + for param in _trid_13.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param.projection2(); + //model_check_transition_param_assignment + let mut _tmp_2 = param.projection1(); + //model_check_transition_param_assignment + let mut _tmp_3 = _tmp_2.projection2(); + //model_check_transition_param_assignment + let mut _tmp_4 = _tmp_2.projection1(); + //model_check_transition_param_assignment + let mut _tmp_5 = _tmp_4.projection2(); + //model_check_transition_param_assignment + let mut _tmp_6 = _tmp_4.projection1(); + //model_check_transition_param_assignment + let mut _tmp_7 = _tmp_6.projection2(); + //model_check_transition_param_assignment + let mut _tmp_8 = _tmp_6.projection1(); + + let mut copiedState = state.clone(); + copiedState.in_requestTargetSocket_NotGranted(_tmp_8, _tmp_7, _tmp_5, _tmp_3, _tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("in_requestTargetSocket_NotGranted")); } + result.insert((copiedState, "in_requestTargetSocket_NotGranted")); + evaluated_transitions += 1; + } + //model_check_transition + let mut _trid_14 = state._tr_svc_register(isCaching); + for param in _trid_14.iter().cloned() { + //model_check_transition_body + //model_check_transition_param_assignment + let mut _tmp_1 = param; + + let mut copiedState = state.clone(); + copiedState.svc_register(_tmp_1); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("svc_register")); } + result.insert((copiedState, "svc_register")); + evaluated_transitions += 1; + } - guardCache.lock().unwrap().insert(state.clone(), newCache); - } else { - //model_check_transition - let mut _trid_1 = state._tr_constructor_interconnectNode(isCaching); - for param in _trid_1.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.constructor_interconnectNode(_tmp_1); - match guard_dependency.get("constructor_interconnectNode") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_constructor_resourceManager(isCaching); - for param in _trid_2.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.constructor_resourceManager(_tmp_1); - match guard_dependency.get("constructor_resourceManager") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_constructor_service(isCaching); - for param in _trid_3.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.constructor_service(_tmp_2, _tmp_1); - match guard_dependency.get("constructor_service") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_constructor_socket(isCaching); - for param in _trid_4.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - //model_check_transition_param_assignment - let mut _tmp_5 = _tmp_4.projection2(); - //model_check_transition_param_assignment - let mut _tmp_6 = _tmp_4.projection1(); - - let mut copiedState = state.clone(); - copiedState.constructor_socket(_tmp_6, _tmp_5, _tmp_3, _tmp_1); - match guard_dependency.get("constructor_socket") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_5 = state._tr_rm_register(isCaching); - for param in _trid_5.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - - let mut copiedState = state.clone(); - copiedState.rm_register(_tmp_4, _tmp_3, _tmp_1); - match guard_dependency.get("rm_register") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_6 = state._tr_rm_deregister(isCaching); - for param in _trid_6.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - - let mut copiedState = state.clone(); - copiedState.rm_deregister(_tmp_4, _tmp_3, _tmp_1); - match guard_dependency.get("rm_deregister") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_7 = state._tr_rm_getSid(isCaching); - for param in _trid_7.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.rm_getSid(_tmp_2, _tmp_1); - match guard_dependency.get("rm_getSid") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_8 = state._tr_rm_getSid_Not_Found(isCaching); - for param in _trid_8.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.rm_getSid_Not_Found(_tmp_2, _tmp_1); - match guard_dependency.get("rm_getSid_Not_Found") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_9 = state._tr_in_announceResourceManager(isCaching); - for param in _trid_9.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.in_announceResourceManager(_tmp_2, _tmp_1); - match guard_dependency.get("in_announceResourceManager") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_10 = state._tr_in_register_success(isCaching); - for param in _trid_10.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - - let mut copiedState = state.clone(); - copiedState.in_register_success(_tmp_4, _tmp_3, _tmp_1); - match guard_dependency.get("in_register_success") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_11 = state._tr_in_register_failed(isCaching); - for param in _trid_11.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - - let mut copiedState = state.clone(); - copiedState.in_register_failed(_tmp_2, _tmp_1); - match guard_dependency.get("in_register_failed") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_12 = state._tr_in_requestTargetSocket_Granted(isCaching); - for param in _trid_12.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - //model_check_transition_param_assignment - let mut _tmp_5 = _tmp_4.projection2(); - //model_check_transition_param_assignment - let mut _tmp_6 = _tmp_4.projection1(); - //model_check_transition_param_assignment - let mut _tmp_7 = _tmp_6.projection2(); - //model_check_transition_param_assignment - let mut _tmp_8 = _tmp_6.projection1(); - //model_check_transition_param_assignment - let mut _tmp_9 = _tmp_8.projection2(); - //model_check_transition_param_assignment - let mut _tmp_10 = _tmp_8.projection1(); - - let mut copiedState = state.clone(); - copiedState.in_requestTargetSocket_Granted(_tmp_10, _tmp_9, _tmp_7, _tmp_5, _tmp_3, _tmp_1); - match guard_dependency.get("in_requestTargetSocket_Granted") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_13 = state._tr_in_requestTargetSocket_NotGranted(isCaching); - for param in _trid_13.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param.projection2(); - //model_check_transition_param_assignment - let mut _tmp_2 = param.projection1(); - //model_check_transition_param_assignment - let mut _tmp_3 = _tmp_2.projection2(); - //model_check_transition_param_assignment - let mut _tmp_4 = _tmp_2.projection1(); - //model_check_transition_param_assignment - let mut _tmp_5 = _tmp_4.projection2(); - //model_check_transition_param_assignment - let mut _tmp_6 = _tmp_4.projection1(); - //model_check_transition_param_assignment - let mut _tmp_7 = _tmp_6.projection2(); - //model_check_transition_param_assignment - let mut _tmp_8 = _tmp_6.projection1(); - - let mut copiedState = state.clone(); - copiedState.in_requestTargetSocket_NotGranted(_tmp_8, _tmp_7, _tmp_5, _tmp_3, _tmp_1); - match guard_dependency.get("in_requestTargetSocket_NotGranted") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_14 = state._tr_svc_register(isCaching); - for param in _trid_14.iter().cloned() { - //model_check_transition_body - //model_check_transition_param_assignment - let mut _tmp_1 = param; - - let mut copiedState = state.clone(); - copiedState.svc_register(_tmp_1); - match guard_dependency.get("svc_register") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - } + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); return result; } //model_check_evaluate_state //model_check_invariants - pub fn checkInvariants(state: ¬a_v2, - isCaching: bool, - dependent_invariant_m: Arc<Mutex<HashMap<nota_v2, 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(); + pub fn checkInvariants(state: ¬a_v2, last_op: &'static str, isCaching: bool) -> bool { + if isCaching { + let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op); //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_1") { + if dependent_invariants_of_state.contains(&"_check_inv_1") { if !state._check_inv_1() { + println!("_check_inv_1 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_2") { + if dependent_invariants_of_state.contains(&"_check_inv_2") { if !state._check_inv_2() { + println!("_check_inv_2 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_3") { + if dependent_invariants_of_state.contains(&"_check_inv_3") { if !state._check_inv_3() { + println!("_check_inv_3 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_4") { + if dependent_invariants_of_state.contains(&"_check_inv_4") { if !state._check_inv_4() { + println!("_check_inv_4 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_5") { + if dependent_invariants_of_state.contains(&"_check_inv_5") { if !state._check_inv_5() { + println!("_check_inv_5 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_6") { + if dependent_invariants_of_state.contains(&"_check_inv_6") { if !state._check_inv_6() { + println!("_check_inv_6 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_7") { + if dependent_invariants_of_state.contains(&"_check_inv_7") { if !state._check_inv_7() { + println!("_check_inv_7 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_8") { + if dependent_invariants_of_state.contains(&"_check_inv_8") { if !state._check_inv_8() { + println!("_check_inv_8 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_9") { + if dependent_invariants_of_state.contains(&"_check_inv_9") { if !state._check_inv_9() { + println!("_check_inv_9 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_10") { + if dependent_invariants_of_state.contains(&"_check_inv_10") { if !state._check_inv_10() { + println!("_check_inv_10 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_11") { + if dependent_invariants_of_state.contains(&"_check_inv_11") { if !state._check_inv_11() { + println!("_check_inv_11 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_12") { + if dependent_invariants_of_state.contains(&"_check_inv_12") { if !state._check_inv_12() { + println!("_check_inv_12 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_13") { + if dependent_invariants_of_state.contains(&"_check_inv_13") { if !state._check_inv_13() { + println!("_check_inv_13 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_14") { + if dependent_invariants_of_state.contains(&"_check_inv_14") { if !state._check_inv_14() { + println!("_check_inv_14 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_15") { + if dependent_invariants_of_state.contains(&"_check_inv_15") { if !state._check_inv_15() { + println!("_check_inv_15 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_16") { + if dependent_invariants_of_state.contains(&"_check_inv_16") { if !state._check_inv_16() { + println!("_check_inv_16 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_17") { + if dependent_invariants_of_state.contains(&"_check_inv_17") { if !state._check_inv_17() { + println!("_check_inv_17 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_18") { + if dependent_invariants_of_state.contains(&"_check_inv_18") { if !state._check_inv_18() { + println!("_check_inv_18 failed!"); return false; } } @@ -1920,16 +1506,14 @@ impl nota_v2 { } //model_check_print - fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) { - if deadlock_detected { println!("DEADLOCK DETECTED"); } - if invariant_violated { println!("INVARIANT VIOLATED"); } - if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); } + fn print_result(states: usize, transitions: u64, error_detected: bool) { + if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); } println!("Number of States: {}", states); println!("Number of Transitions: {}", transitions); } //model_check_main - fn next(collection_m: Arc<Mutex<LinkedList<nota_v2>>>, mc_type: MC_TYPE) -> nota_v2 { + fn next(collection_m: Arc<Mutex<LinkedList<(nota_v2, &'static str)>>>, mc_type: MC_TYPE) -> (nota_v2, &'static str) { let mut collection = collection_m.lock().unwrap(); return match mc_type { MC_TYPE::BFS => collection.pop_front().unwrap(), @@ -1938,124 +1522,112 @@ impl nota_v2 { }; } - fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { - let mut machine = nota_v2::new(); - - let invariant_violated = AtomicBool::new(false); - let deadlock_detected = AtomicBool::new(false); - let stop_threads = AtomicBool::new(false); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() { - invariant_violated.store(true, Ordering::Release); - } - - let mut states = HashSet::<nota_v2>::new(); - states.insert(machine.clone()); - let number_states = AtomicI64::new(1); - - let collection_m = Arc::new(Mutex::new(LinkedList::<nota_v2>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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::<nota_v2, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<nota_v2, HashSet<&str>>::new())); - let mut guard_cache = Arc::new(Mutex::new(HashMap::<nota_v2, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<nota_v2, nota_v2>::new())); - - if is_caching { + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - invariantDependency.insert("in_register_success", HashSet::from(["_check_inv_5", "_check_inv_14", "_check_inv_13", "_check_inv_8", "_check_inv_12", "_check_inv_9"])); + "in_register_success" => vec!["_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"], //model_check_init_static - invariantDependency.insert("in_announceResourceManager", HashSet::from(["_check_inv_11"])); + "in_announceResourceManager" => vec!["_tr_in_announceResourceManager"], //model_check_init_static - invariantDependency.insert("in_requestTargetSocket_Granted", HashSet::from(["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"])); + "in_requestTargetSocket_Granted" => vec!["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"], //model_check_init_static - invariantDependency.insert("constructor_service", HashSet::from(["_check_inv_17", "_check_inv_16", "_check_inv_15", "_check_inv_3", "_check_inv_6", "_check_inv_14", "_check_inv_8"])); + "constructor_service" => vec!["_tr_constructor_service", "_tr_rm_getSid", "_tr_in_register_success", "_tr_svc_register", "_tr_in_register_failed", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister"], //model_check_init_static - invariantDependency.insert("constructor_socket", HashSet::from(["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"])); + "constructor_socket" => vec!["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"], //model_check_init_static - invariantDependency.insert("in_requestTargetSocket_NotGranted", HashSet::from([])); + "in_requestTargetSocket_NotGranted" => vec![], //model_check_init_static - invariantDependency.insert("constructor_interconnectNode", HashSet::from(["_check_inv_16", "_check_inv_1", "_check_inv_10", "_check_inv_9", "_check_inv_11"])); + "constructor_interconnectNode" => vec!["_tr_constructor_service", "_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_register_failed", "_tr_rm_register", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket", "_tr_rm_deregister", "_tr_constructor_interconnectNode", "_tr_in_announceResourceManager"], //model_check_init_static - invariantDependency.insert("rm_getSid", HashSet::from([])); + "rm_getSid" => vec![], //model_check_init_static - invariantDependency.insert("rm_deregister", HashSet::from([])); + "rm_deregister" => vec![], //model_check_init_static - invariantDependency.insert("constructor_resourceManager", HashSet::from(["_check_inv_18", "_check_inv_6", "_check_inv_7", "_check_inv_4", "_check_inv_11"])); + "constructor_resourceManager" => vec!["_tr_rm_getSid", "_tr_constructor_resourceManager", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister", "_tr_in_announceResourceManager"], //model_check_init_static - invariantDependency.insert("in_register_failed", HashSet::from([])); + "in_register_failed" => vec![], //model_check_init_static - invariantDependency.insert("rm_register", HashSet::from([])); + "rm_register" => vec![], //model_check_init_static - invariantDependency.insert("rm_getSid_Not_Found", HashSet::from([])); + "rm_getSid_Not_Found" => vec![], //model_check_init_static - invariantDependency.insert("svc_register", HashSet::from(["_check_inv_17"])); + "svc_register" => vec!["_tr_svc_register"], + _ => vec![], + } + } + + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - guardDependency.insert("in_register_success", HashSet::from(["_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"])); + "in_register_success" => vec!["_check_inv_5", "_check_inv_14", "_check_inv_13", "_check_inv_8", "_check_inv_12", "_check_inv_9"], //model_check_init_static - guardDependency.insert("in_announceResourceManager", HashSet::from(["_tr_in_announceResourceManager"])); + "in_announceResourceManager" => vec!["_check_inv_11"], //model_check_init_static - guardDependency.insert("in_requestTargetSocket_Granted", HashSet::from(["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"])); + "in_requestTargetSocket_Granted" => vec!["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"], //model_check_init_static - guardDependency.insert("constructor_service", HashSet::from(["_tr_constructor_service", "_tr_rm_getSid", "_tr_in_register_success", "_tr_svc_register", "_tr_in_register_failed", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister"])); + "constructor_service" => vec!["_check_inv_17", "_check_inv_16", "_check_inv_15", "_check_inv_3", "_check_inv_6", "_check_inv_14", "_check_inv_8"], //model_check_init_static - guardDependency.insert("constructor_socket", HashSet::from(["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"])); + "constructor_socket" => vec!["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"], //model_check_init_static - guardDependency.insert("in_requestTargetSocket_NotGranted", HashSet::from([])); + "in_requestTargetSocket_NotGranted" => vec![], //model_check_init_static - guardDependency.insert("constructor_interconnectNode", HashSet::from(["_tr_constructor_service", "_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_register_failed", "_tr_rm_register", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket", "_tr_rm_deregister", "_tr_constructor_interconnectNode", "_tr_in_announceResourceManager"])); + "constructor_interconnectNode" => vec!["_check_inv_16", "_check_inv_1", "_check_inv_10", "_check_inv_9", "_check_inv_11"], //model_check_init_static - guardDependency.insert("rm_getSid", HashSet::from([])); + "rm_getSid" => vec![], //model_check_init_static - guardDependency.insert("rm_deregister", HashSet::from([])); + "rm_deregister" => vec![], //model_check_init_static - guardDependency.insert("constructor_resourceManager", HashSet::from(["_tr_rm_getSid", "_tr_constructor_resourceManager", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister", "_tr_in_announceResourceManager"])); + "constructor_resourceManager" => vec!["_check_inv_18", "_check_inv_6", "_check_inv_7", "_check_inv_4", "_check_inv_11"], //model_check_init_static - guardDependency.insert("in_register_failed", HashSet::from([])); + "in_register_failed" => vec![], //model_check_init_static - guardDependency.insert("rm_register", HashSet::from([])); + "rm_register" => vec![], //model_check_init_static - guardDependency.insert("rm_getSid_Not_Found", HashSet::from([])); + "rm_getSid_Not_Found" => vec![], //model_check_init_static - guardDependency.insert("svc_register", HashSet::from(["_tr_svc_register"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); + "svc_register" => vec!["_check_inv_17"], + _ => vec![], } + } + + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { + let mut machine = nota_v2::new(); - let transitions = Arc::new(AtomicI64::new(0)); + let mut all_states = HashSet::<nota_v2>::new(); + all_states.insert(machine.clone()); - while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - let mut state = Self::next(Arc::clone(&collection_m), mc_type); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(nota_v2, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine.clone(), "")); - 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 num_transitions = Arc::new(AtomicU64::new(0)); - next_states.iter().cloned().for_each(|next_state| { - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection_m.lock().unwrap().push_back(next_state); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - }); + let mut stop_threads = false; + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions)); + + if !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); + print!("DEADLOCK DETECTED"); + stop_threads = true; } - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| all_states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op))); + if all_states.len() % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } } - Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { @@ -2063,159 +1635,66 @@ impl nota_v2 { let machine = nota_v2::new(); + let all_states = Arc::new(DashSet::<nota_v2>::new()); + all_states.insert(machine.clone()); - let invariant_violated_b = Arc::new(AtomicBool::new(false)); - let deadlock_detected_b = Arc::new(AtomicBool::new(false)); - let stop_threads_b = Arc::new(AtomicBool::new(false)); - let possible_queue_changes_b = Arc::new(AtomicI32::new(0)); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() { - invariant_violated_b.store(true, Ordering::Release); - } - - let states_m = Arc::new(Mutex::new(HashSet::<nota_v2>::new())); - states_m.lock().unwrap().insert(machine.clone()); - let number_states_arc = Arc::new(AtomicI64::new(1)); - - let collection_m = Arc::new(Mutex::new(LinkedList::<nota_v2>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(nota_v2, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); - 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::<nota_v2, HashSet<&str>>::new())); - let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<nota_v2, HashSet<&str>>::new())); - let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<nota_v2, PersistentHashMap<&'static str, bool>>::new())); - let mut parents_m = Arc::new(Mutex::new(HashMap::<nota_v2, nota_v2>::new())); - - if is_caching { - //model_check_init_static - invariantDependency.insert("in_register_success", HashSet::from(["_check_inv_5", "_check_inv_14", "_check_inv_13", "_check_inv_8", "_check_inv_12", "_check_inv_9"])); - //model_check_init_static - invariantDependency.insert("in_announceResourceManager", HashSet::from(["_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("in_requestTargetSocket_Granted", HashSet::from(["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"])); - //model_check_init_static - invariantDependency.insert("constructor_service", HashSet::from(["_check_inv_17", "_check_inv_16", "_check_inv_15", "_check_inv_3", "_check_inv_6", "_check_inv_14", "_check_inv_8"])); - //model_check_init_static - invariantDependency.insert("constructor_socket", HashSet::from(["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"])); - //model_check_init_static - invariantDependency.insert("in_requestTargetSocket_NotGranted", HashSet::from([])); - //model_check_init_static - invariantDependency.insert("constructor_interconnectNode", HashSet::from(["_check_inv_16", "_check_inv_1", "_check_inv_10", "_check_inv_9", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("rm_getSid", HashSet::from([])); - //model_check_init_static - invariantDependency.insert("rm_deregister", HashSet::from([])); - //model_check_init_static - invariantDependency.insert("constructor_resourceManager", HashSet::from(["_check_inv_18", "_check_inv_6", "_check_inv_7", "_check_inv_4", "_check_inv_11"])); - //model_check_init_static - invariantDependency.insert("in_register_failed", HashSet::from([])); - //model_check_init_static - invariantDependency.insert("rm_register", HashSet::from([])); - //model_check_init_static - invariantDependency.insert("rm_getSid_Not_Found", HashSet::from([])); - //model_check_init_static - invariantDependency.insert("svc_register", HashSet::from(["_check_inv_17"])); - //model_check_init_static - guardDependency.insert("in_register_success", HashSet::from(["_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"])); - //model_check_init_static - guardDependency.insert("in_announceResourceManager", HashSet::from(["_tr_in_announceResourceManager"])); - //model_check_init_static - guardDependency.insert("in_requestTargetSocket_Granted", HashSet::from(["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"])); - //model_check_init_static - guardDependency.insert("constructor_service", HashSet::from(["_tr_constructor_service", "_tr_rm_getSid", "_tr_in_register_success", "_tr_svc_register", "_tr_in_register_failed", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister"])); - //model_check_init_static - guardDependency.insert("constructor_socket", HashSet::from(["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"])); - //model_check_init_static - guardDependency.insert("in_requestTargetSocket_NotGranted", HashSet::from([])); - //model_check_init_static - guardDependency.insert("constructor_interconnectNode", HashSet::from(["_tr_constructor_service", "_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_register_failed", "_tr_rm_register", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket", "_tr_rm_deregister", "_tr_constructor_interconnectNode", "_tr_in_announceResourceManager"])); - //model_check_init_static - guardDependency.insert("rm_getSid", HashSet::from([])); - //model_check_init_static - guardDependency.insert("rm_deregister", HashSet::from([])); - //model_check_init_static - guardDependency.insert("constructor_resourceManager", HashSet::from(["_tr_rm_getSid", "_tr_constructor_resourceManager", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister", "_tr_in_announceResourceManager"])); - //model_check_init_static - guardDependency.insert("in_register_failed", HashSet::from([])); - //model_check_init_static - guardDependency.insert("rm_register", HashSet::from([])); - //model_check_init_static - guardDependency.insert("rm_getSid_Not_Found", HashSet::from([])); - //model_check_init_static - guardDependency.insert("svc_register", HashSet::from(["_tr_svc_register"])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - parents_m.lock().unwrap().remove(&machine); - } + let num_transitions = Arc::new(AtomicU64::new(0)); - let num_transitions = Arc::new(AtomicI64::new(0)); - let invariant_dependency_arc = Arc::new(invariantDependency); - let guard_dependency_arc = Arc::new(guardDependency); + let mut stop_threads = false; + let mut spawned_tasks: u64 = 0; + let mut finished_tasks: u64 = 0; let (tx, rx) = channel(); //println!("Thread {:?} starting threads", thread::current().id()); - while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - possible_queue_changes_b.fetch_add(1, Ordering::AcqRel); - let mut state = Self::next(Arc::clone(&collection_m), mc_type); - - let invariant_violated = Arc::clone(&invariant_violated_b); - let deadlock_detected = Arc::clone(&deadlock_detected_b); - let stop_threads = Arc::clone(&stop_threads_b); - let possible_queue_changes = Arc::clone(&possible_queue_changes_b); - let collection_m2 = Arc::clone(&collection_m); - 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); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let states_to_process = Arc::clone(&states_to_process_mutex); let transitions = Arc::clone(&num_transitions); - let states_m2 = Arc::clone(&states_m); - let number_states = Arc::clone(&number_states_arc); + let states = Arc::clone(&all_states); 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)); + if !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } - //println!("Thread {:?} executing", thread::current().id()); - next_states.iter().cloned().for_each(|next_state| { - { - let mut states = states_m2.lock().unwrap(); - let mut collection = collection_m2.lock().unwrap(); - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection.push_back(next_state); - //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len()); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - } - }); - possible_queue_changes.fetch_sub(1, Ordering::AcqRel); + let next_states = Self::generateNextStates(&mut state, is_caching, transitions); + if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } - if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + //println!("Thread {:?} executing", thread::current().id()); + next_states.into_iter() + .filter(|(next_state, _)| states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op))); - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } //println!("Thread {:?} done", thread::current().id()); - tx.send(1).expect(""); + let _ = tx.send(Ok(1)); }); - while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 { + + spawned_tasks += 1; + if spawned_tasks % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } + + while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 { //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id()); - rx.recv().expect("Waiting for a thread to finish: "); + match rx.recv_timeout(Duration::from_secs(1)) { + Ok(val) => match val { + Ok(_) => finished_tasks += 1, + Err(msg) => { println!("{}", msg); stop_threads = true; }, + }, + Err(_) => (), + } + if threadPool.panic_count() > 0 { stop_threads = true; } } } - Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } } diff --git a/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs b/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs index bc8cc4dd755e5ab00183959d4befe3b4449a4966..73fe42acfa8168b695363fadb0193e6783041433 100644 --- a/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs +++ b/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs @@ -1,17 +1,17 @@ -#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ] +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] use std::env; -use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; -use std::thread; -use std::collections::{HashMap, HashSet, LinkedList}; -use im::HashMap as PersistentHashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, mpsc, Mutex}; +use std::collections::{HashSet, LinkedList}; +use dashmap::DashSet; use threadpool::ThreadPool; use std::sync::mpsc::channel; use derivative::Derivative; +use std::time::{Duration}; use std::fmt; use rand::{thread_rng, Rng}; use btypes::butils; -use btypes::bboolean::IntoBool; +use btypes::bboolean::{IntoBool, BBooleanT}; use btypes::binteger::BInteger; use btypes::bboolean::BBoolean; use btypes::brelation::BRelation; @@ -41,6 +41,18 @@ pub struct sort_m2_data1000_MC { #[derivative(Hash="ignore", PartialEq="ignore")] _tr_cache_final_evt: Option<bool>,} +impl fmt::Display for sort_m2_data1000_MC { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut result = "sort_m2_data1000_MC: (".to_owned(); + result += &format!("_get_j: {}, ", self._get_j()); + result += &format!("_get_k: {}, ", self._get_k()); + result += &format!("_get_l: {}, ", self._get_l()); + result += &format!("_get_g: {}, ", self._get_g()); + result = result + ")"; + return write!(f, "{}", result); + } +} + impl sort_m2_data1000_MC { pub fn new() -> sort_m2_data1000_MC { @@ -50,7 +62,7 @@ impl sort_m2_data1000_MC { return m; } fn init(&mut self) { - self.n = BInteger::new(300); + self.n = BInteger::new(1000); 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))])); @@ -63,32 +75,32 @@ impl sort_m2_data1000_MC { self.j = BInteger::new(1); } - pub fn get_n(&self) -> BInteger { + pub fn _get_n(&self) -> BInteger { return self.n.clone(); } - pub fn get_f(&self) -> BRelation<BInteger, BInteger> { + pub fn _get_f(&self) -> BRelation<BInteger, BInteger> { return self.f.clone(); } - pub fn get_j(&self) -> BInteger { + pub fn _get_j(&self) -> BInteger { return self.j.clone(); } - pub fn get_k(&self) -> BInteger { + pub fn _get_k(&self) -> BInteger { return self.k.clone(); } - pub fn get_l(&self) -> BInteger { + pub fn _get_l(&self) -> BInteger { return self.l.clone(); } - pub fn get_g(&self) -> BRelation<BInteger, BInteger> { + pub fn _get_g(&self) -> BRelation<BInteger, BInteger> { return self.g.clone(); } pub fn progress(&mut self) -> () { - if (self.k.unequal(&self.n).booleanValue() && self.j.equal(&self.n).booleanValue()).booleanValue() { + if ((self.k.unequal(&self.n) && self.j.equal(&self.n))).booleanValue() { let mut _ld_g = self.g.clone(); let mut _ld_k = self.k.clone(); let mut _ld_l = self.l.clone(); @@ -102,7 +114,7 @@ impl sort_m2_data1000_MC { } pub fn prog1(&mut self) -> () { - 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() { + if (((self.k.unequal(&self.n) && self.j.unequal(&self.n)) && self.g.functionCall(&self.l).lessEqual(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))))).booleanValue() { let mut _ld_j = self.j.clone(); let mut _ld_l = self.l.clone(); self.l = _ld_l; @@ -113,7 +125,7 @@ impl sort_m2_data1000_MC { } pub fn prog2(&mut self) -> () { - 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() { + if (((self.k.unequal(&self.n) && self.j.unequal(&self.n)) && self.g.functionCall(&self.l).greater(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))))).booleanValue() { let mut _ld_j = self.j.clone(); self.j = _ld_j.plus(&BInteger::new(1)); self.l = _ld_j.plus(&BInteger::new(1)); @@ -132,7 +144,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).booleanValue() && self.j.equal(&self.n).booleanValue().booleanValue(); + let mut __tmp__val__ = (self.k.unequal(&self.n) && self.j.equal(&self.n)).booleanValue(); self._tr_cache_progress = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -143,7 +155,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).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 __tmp__val__ = ((self.k.unequal(&self.n) && self.j.unequal(&self.n)) && self.g.functionCall(&self.l).lessEqual(&self.g.functionCall(&self.j.plus(&BInteger::new(1))))).booleanValue(); self._tr_cache_prog1 = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -154,7 +166,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).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 __tmp__val__ = ((self.k.unequal(&self.n) && self.j.unequal(&self.n)) && self.g.functionCall(&self.l).greater(&self.g.functionCall(&self.j.plus(&BInteger::new(1))))).booleanValue(); self._tr_cache_prog2 = Option::Some(__tmp__val__); return __tmp__val__; } else { @@ -203,11 +215,10 @@ impl sort_m2_data1000_MC { return self.g.checkDomain(&BSet::<BInteger>::interval(&BInteger::new(1), &self.n)).and(&self.g.checkRangeNatural()).and(&self.g.isFunction()).and(&self.g.isTotal(&BSet::<BInteger>::interval(&BInteger::new(1), &self.n))).booleanValue(); } - fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) { + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { //calling the given functions without caching will recalculate them and cache them afterwards - //if caching is enabled globally, this will just prefill those, if caching is - for trans in to_invalidate.iter() { - match *trans { + for trans in to_invalidate { + match trans { "_tr_progress" => {self._tr_progress(false);}, "_tr_prog1" => {self._tr_prog1(false);}, "_tr_prog2" => {self._tr_prog2(false);}, @@ -220,165 +231,96 @@ impl sort_m2_data1000_MC { //model_check_next_states fn generateNextStates(state: &mut sort_m2_data1000_MC, isCaching: bool, - 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>>, - transitions: Arc<AtomicI64>) -> HashSet<sort_m2_data1000_MC> { - let mut result = HashSet::<sort_m2_data1000_MC>::new(); - if isCaching { - //model_check_transition - let mut _trid_1 = state._tr_progress(isCaching); - if _trid_1 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.progress(); - match guard_dependency.get("progress") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - { - let mut dependent_invariant = dependent_invariant_m.lock().unwrap(); - - if !dependent_invariant.contains_key(&copiedState) { - dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("progress").unwrap().clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_2 = state._tr_prog1(isCaching); - if _trid_2 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.prog1(); - match guard_dependency.get("prog1") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - { - let mut dependent_invariant = dependent_invariant_m.lock().unwrap(); - - if !dependent_invariant.contains_key(&copiedState) { - dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("prog1").unwrap().clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_3 = state._tr_prog2(isCaching); - if _trid_3 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.prog2(); - match guard_dependency.get("prog2") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - { - let mut dependent_invariant = dependent_invariant_m.lock().unwrap(); - - if !dependent_invariant.contains_key(&copiedState) { - dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("prog2").unwrap().clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - let mut _trid_4 = state._tr_final_evt(isCaching); - if _trid_4 { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.final_evt(); - match guard_dependency.get("final_evt") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - { - let mut dependent_invariant = dependent_invariant_m.lock().unwrap(); - - if !dependent_invariant.contains_key(&copiedState) { - dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("final_evt").unwrap().clone()); - } - } - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - } else { - //model_check_transition - if state._tr_progress(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.progress(); - match guard_dependency.get("progress") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_prog1(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.prog1(); - match guard_dependency.get("prog1") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_prog2(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.prog2(); - match guard_dependency.get("prog2") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - //model_check_transition - if state._tr_final_evt(isCaching) { - //model_check_transition_body - let mut copiedState = state.clone(); - copiedState.final_evt(); - match guard_dependency.get("final_evt") { Some(map) => copiedState.invalidate_caches(map), _ => (),} - result.insert(copiedState); - transitions.fetch_add(1, Ordering::AcqRel); - } - + transitions: Arc<AtomicU64>) -> HashSet<(sort_m2_data1000_MC, &'static str)> { + let mut result = HashSet::<(sort_m2_data1000_MC, &'static str)>::new(); + let mut evaluated_transitions: u64 = 0; + //model_check_transition + if state._tr_progress(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.progress(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("progress")); } + result.insert((copiedState, "progress")); + evaluated_transitions += 1; } + //model_check_transition + if state._tr_prog1(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.prog1(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("prog1")); } + result.insert((copiedState, "prog1")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_prog2(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.prog2(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("prog2")); } + result.insert((copiedState, "prog2")); + evaluated_transitions += 1; + } + //model_check_transition + if state._tr_final_evt(isCaching) { + //model_check_transition_body + let mut copiedState = state.clone(); + copiedState.final_evt(); + if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("final_evt")); } + result.insert((copiedState, "final_evt")); + evaluated_transitions += 1; + } + + + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); return result; } //model_check_evaluate_state //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 - { - 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(); + pub fn checkInvariants(state: &sort_m2_data1000_MC, last_op: &'static str, isCaching: bool) -> bool { + if isCaching { + let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op); //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_1") { + if dependent_invariants_of_state.contains(&"_check_inv_1") { if !state._check_inv_1() { + println!("_check_inv_1 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_2") { + if dependent_invariants_of_state.contains(&"_check_inv_2") { if !state._check_inv_2() { + println!("_check_inv_2 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_3") { + if dependent_invariants_of_state.contains(&"_check_inv_3") { if !state._check_inv_3() { + println!("_check_inv_3 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_4") { + if dependent_invariants_of_state.contains(&"_check_inv_4") { if !state._check_inv_4() { + println!("_check_inv_4 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_5") { + if dependent_invariants_of_state.contains(&"_check_inv_5") { if !state._check_inv_5() { + println!("_check_inv_5 failed!"); return false; } } //model_check_invariant - if dependent_invariants_of_state.contains("_check_inv_6") { + if dependent_invariants_of_state.contains(&"_check_inv_6") { if !state._check_inv_6() { + println!("_check_inv_6 failed!"); return false; } } @@ -388,16 +330,14 @@ impl sort_m2_data1000_MC { } //model_check_print - fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) { - if deadlock_detected { println!("DEADLOCK DETECTED"); } - if invariant_violated { println!("INVARIANT VIOLATED"); } - if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); } + fn print_result(states: usize, transitions: u64, error_detected: bool) { + if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); } println!("Number of States: {}", states); println!("Number of Transitions: {}", transitions); } //model_check_main - fn next(collection_m: Arc<Mutex<LinkedList<sort_m2_data1000_MC>>>, mc_type: MC_TYPE) -> sort_m2_data1000_MC { + fn next(collection_m: Arc<Mutex<LinkedList<(sort_m2_data1000_MC, &'static str)>>>, mc_type: MC_TYPE) -> (sort_m2_data1000_MC, &'static str) { let mut collection = collection_m.lock().unwrap(); return match mc_type { MC_TYPE::BFS => collection.pop_front().unwrap(), @@ -406,80 +346,72 @@ impl sort_m2_data1000_MC { }; } - fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { - let mut machine = sort_m2_data1000_MC::new(); - - let invariant_violated = AtomicBool::new(false); - let deadlock_detected = AtomicBool::new(false); - let stop_threads = AtomicBool::new(false); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() { - invariant_violated.store(true, Ordering::Release); - } - - let mut states = HashSet::<sort_m2_data1000_MC>::new(); - states.insert(machine.clone()); - let number_states = AtomicI64::new(1); - - let collection_m = Arc::new(Mutex::new(LinkedList::<sort_m2_data1000_MC>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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())); - - if is_caching { + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - invariantDependency.insert("prog2", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"])); + "prog2" => vec!["_tr_progress", "_tr_prog1", "_tr_prog2"], //model_check_init_static - invariantDependency.insert("prog1", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"])); + "prog1" => vec!["_tr_progress", "_tr_prog1", "_tr_prog2"], //model_check_init_static - invariantDependency.insert("progress", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_6", "_check_inv_4", "_check_inv_5"])); + "progress" => vec!["_tr_final_evt", "_tr_progress", "_tr_prog1", "_tr_prog2"], //model_check_init_static - invariantDependency.insert("final_evt", HashSet::from([])); + "final_evt" => vec![], + _ => vec![], + } + } + + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { //model_check_init_static - guardDependency.insert("prog2", HashSet::from(["_tr_progress", "_tr_prog1", "_tr_prog2"])); + "prog2" => vec!["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"], //model_check_init_static - guardDependency.insert("prog1", HashSet::from(["_tr_progress", "_tr_prog1", "_tr_prog2"])); + "prog1" => vec!["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"], //model_check_init_static - guardDependency.insert("progress", HashSet::from(["_tr_final_evt", "_tr_progress", "_tr_prog1", "_tr_prog2"])); + "progress" => vec!["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_6", "_check_inv_4", "_check_inv_5"], //model_check_init_static - guardDependency.insert("final_evt", HashSet::from([])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); + "final_evt" => vec![], + _ => vec![], } + } - let transitions = Arc::new(AtomicI64::new(0)); + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) { + let mut machine = sort_m2_data1000_MC::new(); - while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - let mut state = Self::next(Arc::clone(&collection_m), mc_type); + let mut all_states = HashSet::<sort_m2_data1000_MC>::new(); + all_states.insert(machine.clone()); - let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&transitions)); + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(sort_m2_data1000_MC, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine.clone(), "")); - next_states.iter().cloned().for_each(|next_state| { - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection_m.lock().unwrap().push_back(next_state); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - }); + let num_transitions = Arc::new(AtomicU64::new(0)); + + let mut stop_threads = false; + + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions)); + if !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); + print!("DEADLOCK DETECTED"); + stop_threads = true; } - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| all_states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op))); + if all_states.len() % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } } - Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) { @@ -487,112 +419,66 @@ impl sort_m2_data1000_MC { let machine = sort_m2_data1000_MC::new(); + let all_states = Arc::new(DashSet::<sort_m2_data1000_MC>::new()); + all_states.insert(machine.clone()); - let invariant_violated_b = Arc::new(AtomicBool::new(false)); - let deadlock_detected_b = Arc::new(AtomicBool::new(false)); - let stop_threads_b = Arc::new(AtomicBool::new(false)); - let possible_queue_changes_b = Arc::new(AtomicI32::new(0)); - - if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() { - invariant_violated_b.store(true, Ordering::Release); - } + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(sort_m2_data1000_MC, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); - let states_m = Arc::new(Mutex::new(HashSet::<sort_m2_data1000_MC>::new())); - states_m.lock().unwrap().insert(machine.clone()); - let number_states_arc = Arc::new(AtomicI64::new(1)); + let num_transitions = Arc::new(AtomicU64::new(0)); - let collection_m = Arc::new(Mutex::new(LinkedList::<sort_m2_data1000_MC>::new())); - collection_m.lock().unwrap().push_back(machine.clone()); - - 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())); - - if is_caching { - //model_check_init_static - invariantDependency.insert("prog2", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"])); - //model_check_init_static - invariantDependency.insert("prog1", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"])); - //model_check_init_static - invariantDependency.insert("progress", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_6", "_check_inv_4", "_check_inv_5"])); - //model_check_init_static - invariantDependency.insert("final_evt", HashSet::from([])); - //model_check_init_static - guardDependency.insert("prog2", HashSet::from(["_tr_progress", "_tr_prog1", "_tr_prog2"])); - //model_check_init_static - guardDependency.insert("prog1", HashSet::from(["_tr_progress", "_tr_prog1", "_tr_prog2"])); - //model_check_init_static - guardDependency.insert("progress", HashSet::from(["_tr_final_evt", "_tr_progress", "_tr_prog1", "_tr_prog2"])); - //model_check_init_static - guardDependency.insert("final_evt", HashSet::from([])); - dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new()); - } - - let num_transitions = Arc::new(AtomicI64::new(0)); - let invariant_dependency_arc = Arc::new(invariantDependency); - let guard_dependency_arc = Arc::new(guardDependency); + let mut stop_threads = false; + let mut spawned_tasks: u64 = 0; + let mut finished_tasks: u64 = 0; let (tx, rx) = channel(); //println!("Thread {:?} starting threads", thread::current().id()); - while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() { - possible_queue_changes_b.fetch_add(1, Ordering::AcqRel); - let mut state = Self::next(Arc::clone(&collection_m), mc_type); - - let invariant_violated = Arc::clone(&invariant_violated_b); - let deadlock_detected = Arc::clone(&deadlock_detected_b); - let stop_threads = Arc::clone(&stop_threads_b); - let possible_queue_changes = Arc::clone(&possible_queue_changes_b); - let collection_m2 = Arc::clone(&collection_m); - 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); + while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() { + let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type); + + let states_to_process = Arc::clone(&states_to_process_mutex); let transitions = Arc::clone(&num_transitions); - let states_m2 = Arc::clone(&states_m); - let number_states = Arc::clone(&number_states_arc); + let states = Arc::clone(&all_states); 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, Arc::clone(&transitions)); + if !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } + + let next_states = Self::generateNextStates(&mut state, is_caching, transitions); + if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } //println!("Thread {:?} executing", thread::current().id()); - next_states.iter().cloned().for_each(|next_state| { - { - let mut states = states_m2.lock().unwrap(); - let mut collection = collection_m2.lock().unwrap(); - if !states.contains(&next_state) { - let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1; - states.insert(next_state.clone()); - collection.push_back(next_state); - //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len()); - if cnum_states % 50000 == 0 { - println!("VISITED STATES: {}", cnum_states); - println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire)); - println!("-------------------"); - } - } - } - }); - possible_queue_changes.fetch_sub(1, Ordering::AcqRel); - - if next_states.is_empty() { - deadlock_detected.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } + next_states.into_iter() + .filter(|(next_state, _)| states.insert((*next_state).clone())) + .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op))); - if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) { - invariant_violated.store(true, Ordering::Release); - stop_threads.store(true, Ordering::Release); - } //println!("Thread {:?} done", thread::current().id()); - tx.send(1).expect(""); + let _ = tx.send(Ok(1)); }); - while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 { + + spawned_tasks += 1; + if spawned_tasks % 50000 == 0 { + println!("VISITED STATES: {}", all_states.len()); + println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire)); + println!("-------------------"); + } + + while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 { //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id()); - rx.recv().expect("Waiting for a thread to finish: "); + match rx.recv_timeout(Duration::from_secs(1)) { + Ok(val) => match val { + Ok(_) => finished_tasks += 1, + Err(msg) => { println!("{}", msg); stop_threads = true; }, + }, + Err(_) => (), + } + if threadPool.panic_count() > 0 { stop_threads = true; } } } - Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire)); + Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); } } diff --git a/src/test/resources/de/hhu/stups/codegenerator/sort_m2_data1000_MC.out b/src/test/resources/de/hhu/stups/codegenerator/sort_m2_data1000_MC.out index cdab9af7d103feaa7f788086a4915c638620e08b..6676f294021b657c18976461533924a4c6b53266 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/sort_m2_data1000_MC.out +++ b/src/test/resources/de/hhu/stups/codegenerator/sort_m2_data1000_MC.out @@ -1,3 +1,3 @@ MODEL CHECKING SUCCESSFUL -Number of States: 500501 +Number of States: 500500 Number of Transitions: 500500 \ No newline at end of file