From 97aaec464cb6dd7e491abd05b1619936f10eb12e Mon Sep 17 00:00:00 2001 From: Cookiebowser <lucas.doering@live.de> Date: Thu, 11 May 2023 14:33:40 +0200 Subject: [PATCH] added MC-benchmarks for rust-embedded --- .../Rust_embedded/CAN_BUS_tlc.rs | 1700 +++++++++++ .../Cruise_finite1_deterministic_MC.rs | 2011 ++++++++++++ .../Rust_embedded/LandingGear_R6.rs | 2717 +++++++++++++++++ .../Rust_embedded/Lift_MC_Large.rs | 354 +++ .../model_checking/Rust_embedded/Makefile | 32 + .../Rust_embedded/Train1_Lukas_POR_v3.rs | 1386 +++++++++ ...Train_1_beebook_deterministic_MC_POR_v2.rs | 1671 ++++++++++ .../model_checking/Rust_embedded/nota_v2.rs | 2112 +++++++++++++ 8 files changed, 11983 insertions(+) create mode 100644 benchmarks/model_checking/Rust_embedded/CAN_BUS_tlc.rs create mode 100644 benchmarks/model_checking/Rust_embedded/Cruise_finite1_deterministic_MC.rs create mode 100644 benchmarks/model_checking/Rust_embedded/LandingGear_R6.rs create mode 100644 benchmarks/model_checking/Rust_embedded/Lift_MC_Large.rs create mode 100644 benchmarks/model_checking/Rust_embedded/Makefile create mode 100644 benchmarks/model_checking/Rust_embedded/Train1_Lukas_POR_v3.rs create mode 100644 benchmarks/model_checking/Rust_embedded/Train_1_beebook_deterministic_MC_POR_v2.rs create mode 100644 benchmarks/model_checking/Rust_embedded/nota_v2.rs diff --git a/benchmarks/model_checking/Rust_embedded/CAN_BUS_tlc.rs b/benchmarks/model_checking/Rust_embedded/CAN_BUS_tlc.rs new file mode 100644 index 000000000..72637d9c5 --- /dev/null +++ b/benchmarks/model_checking/Rust_embedded/CAN_BUS_tlc.rs @@ -0,0 +1,1700 @@ +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] +//#![no_std] //std is enabled for the generated machine by default, since without it there is no println which makes unit-testing very difficult +use btypes::{bset, brel}; +use btypes::bset::BSet; +use btypes::bset::SetItem; +use btypes::bset::PowSetItem; +use btypes::bset::PowAble; +use btypes::bset::NestedSet; +use btypes::brelation::BRelation; +use btypes::brelation::RelLeftItem; +use btypes::brelation::RelPowAble; +use btypes::bboolean::BBoolean; +use btypes::bboolean::BBool; +use btypes::bboolean::BOOL; +use btypes::binteger::BInteger; +use btypes::binteger::BInt; +use btypes::binteger::set_BInteger; +use btypes::btuple::BTuple; + +use std::env; +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}; + + + +#[derive(Clone, Copy)] +pub enum MC_TYPE { BFS, DFS, MIXED } + + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum T1state { + #[default] + T1_EN = 0, + T1_CALC = 1, + T1_SEND = 2, + T1_WAIT = 3 +} + +impl T1state { + pub fn equal(&self, other: &T1state) -> bool { *self == *other } + pub fn unequal(&self, other: &T1state) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::T1_EN, + 1 => Self::T1_CALC, + 2 => Self::T1_SEND, + 3 => Self::T1_WAIT, + _ => panic!("T1state index out of range! {:?}", idx) + } + } +} + +impl SetItem<4> for T1state { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_T1state = BSet<T1state, 4>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum T2mode { + #[default] + T2MODE_SENSE = 0, + T2MODE_TRANSMIT = 1, + T2MODE_RELEASE = 2 +} + +impl T2mode { + pub fn equal(&self, other: &T2mode) -> bool { *self == *other } + pub fn unequal(&self, other: &T2mode) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::T2MODE_SENSE, + 1 => Self::T2MODE_TRANSMIT, + 2 => Self::T2MODE_RELEASE, + _ => panic!("T2mode index out of range! {:?}", idx) + } + } +} + +impl SetItem<3> for T2mode { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_T2mode = BSet<T2mode, 3>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum T2state { + #[default] + T2_EN = 0, + T2_RCV = 1, + T2_PROC = 2, + T2_CALC = 3, + T2_SEND = 4, + T2_WAIT = 5, + T2_RELEASE = 6 +} + +impl T2state { + pub fn equal(&self, other: &T2state) -> bool { *self == *other } + pub fn unequal(&self, other: &T2state) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::T2_EN, + 1 => Self::T2_RCV, + 2 => Self::T2_PROC, + 3 => Self::T2_CALC, + 4 => Self::T2_SEND, + 5 => Self::T2_WAIT, + 6 => Self::T2_RELEASE, + _ => panic!("T2state index out of range! {:?}", idx) + } + } +} + +impl SetItem<7> for T2state { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_T2state = BSet<T2state, 7>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum T3state { + #[default] + T3_READY = 0, + T3_WRITE = 1, + T3_RELEASE = 2, + T3_READ = 3, + T3_PROC = 4, + T3_WAIT = 5 +} + +impl T3state { + pub fn equal(&self, other: &T3state) -> bool { *self == *other } + pub fn unequal(&self, other: &T3state) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::T3_READY, + 1 => Self::T3_WRITE, + 2 => Self::T3_RELEASE, + 3 => Self::T3_READ, + 4 => Self::T3_PROC, + 5 => Self::T3_WAIT, + _ => panic!("T3state index out of range! {:?}", idx) + } + } +} + +impl SetItem<6> for T3state { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_T3state = BSet<T3state, 6>; +//set_enum_declaration done + +//relation_declaration +type rel_BInteger_X_BInteger = BRelation<BInteger, { BInteger::VARIANTS }, BInteger, { BInteger::VARIANTS }, 0>; +//relation_declaration done + + + + + + + + + +#[derive(Derivative)] +#[derivative(Clone, Default, Debug, Hash, PartialEq, Eq)] +pub struct CAN_BUS_tlc { + /*declarations*/BUSpriority: BInteger, + BUSvalue: BInteger, + BUSwrite: rel_BInteger_X_BInteger, + T1_state: T1state, + T1_timer: BInteger, + T1_writevalue: BInteger, + T2_mode: T2mode, + T2_readpriority: BInteger, + T2_readvalue: BInteger, + T2_state: T2state, + T2_timer: BInteger, + T2_writevalue: BInteger, + T2v: BInteger, + T3_enabled: BBoolean, + T3_evaluated: BBoolean, + T3_readpriority: BInteger, + T3_readvalue: BInteger, + T3_state: T3state, + /*constant_declarations*/NATSET: set_BInteger, + /*sets*//*set_declaration*/_T1state: set_T1state, + /*set_declaration*/_T2mode: set_T2mode, + /*set_declaration*/_T2state: set_T2state, + /*set_declaration*/_T3state: set_T3state, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T1Evaluate: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T1Calculate: Option<HashSet<BInteger>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T1SendResult: Option<HashSet<(BInteger, BInteger)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T1Wait: Option<HashSet<BInteger>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T2Evaluate: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T2ReadBus: Option<HashSet<(BInteger, BInteger)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T2Reset: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T2Complete: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T2ReleaseBus: Option<HashSet<BInteger>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T2Calculate: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T2WriteBus: Option<HashSet<(BInteger, BInteger)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T2Wait: Option<HashSet<BInteger>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T3Initiate: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T3Evaluate: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T3writebus: Option<HashSet<(BInteger, BInteger)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T3Read: Option<HashSet<(BInteger, BInteger)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T3Poll: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T3ReleaseBus: Option<HashSet<BInteger>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T3Wait: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_T3ReEnableWait: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_Update: Option<HashSet<BInteger>>,} + + +impl CAN_BUS_tlc { + + pub fn new() -> CAN_BUS_tlc { + //values: '' + let mut m: CAN_BUS_tlc = Default::default(); + m.init(); + return m; + } + fn init(&mut self) { + /*set_initializations*///set_initialization + self._T1state = bset![T1state, /*enum_call*/T1state::T1_EN, /*enum_call*/T1state::T1_CALC, /*enum_call*/T1state::T1_SEND, /*enum_call*/T1state::T1_WAIT]; + //set_initialization + self._T2mode = bset![T2mode, /*enum_call*/T2mode::T2MODE_SENSE, /*enum_call*/T2mode::T2MODE_TRANSMIT, /*enum_call*/T2mode::T2MODE_RELEASE]; + //set_initialization + self._T2state = bset![T2state, /*enum_call*/T2state::T2_EN, /*enum_call*/T2state::T2_RCV, /*enum_call*/T2state::T2_PROC, /*enum_call*/T2state::T2_CALC, /*enum_call*/T2state::T2_SEND, /*enum_call*/T2state::T2_WAIT, /*enum_call*/T2state::T2_RELEASE]; + //set_initialization + self._T3state = bset![T3state, /*enum_call*/T3state::T3_READY, /*enum_call*/T3state::T3_WRITE, /*enum_call*/T3state::T3_RELEASE, /*enum_call*/T3state::T3_READ, /*enum_call*/T3state::T3_PROC, /*enum_call*/T3state::T3_WAIT]; + /*properties*///constant_initialization + self.NATSET = set_BInteger::interval(&0, &5); + /*body*/self.T2v = 0; + self.T3_evaluated = true; + self.T3_enabled = true; + self.T1_state = /*enum_call*/T1state::T1_EN; + self.T2_state = /*enum_call*/T2state::T2_EN; + self.T3_state = /*enum_call*/T3state::T3_READY; + self.T1_writevalue = 0; + self.T2_writevalue = 0; + self.T2_readvalue = 0; + self.T2_readpriority = 0; + self.T3_readvalue = 0; + self.T3_readpriority = 0; + self.T1_timer = 2; + self.T2_timer = 3; + self.BUSwrite = brel![rel_BInteger_X_BInteger, (0.clone(), 0.clone())].clone().clone(); + self.BUSvalue = 0; + self.BUSpriority = 0; + self.T2_mode = /*enum_call*/T2mode::T2MODE_SENSE; + /*includesInitialization*/ + } + + pub fn get_NATSET(&self) -> set_BInteger { + return self.NATSET.clone(); + } + + pub fn get_BUSpriority(&self) -> BInteger { + return self.BUSpriority.clone(); + } + + pub fn get_BUSvalue(&self) -> BInteger { + return self.BUSvalue.clone(); + } + + pub fn get_BUSwrite(&self) -> rel_BInteger_X_BInteger { + return self.BUSwrite.clone(); + } + + pub fn get_T1_state(&self) -> T1state { + return self.T1_state.clone(); + } + + pub fn get_T1_timer(&self) -> BInteger { + return self.T1_timer.clone(); + } + + pub fn get_T1_writevalue(&self) -> BInteger { + return self.T1_writevalue.clone(); + } + + pub fn get_T2_mode(&self) -> T2mode { + return self.T2_mode.clone(); + } + + pub fn get_T2_readpriority(&self) -> BInteger { + return self.T2_readpriority.clone(); + } + + pub fn get_T2_readvalue(&self) -> BInteger { + return self.T2_readvalue.clone(); + } + + pub fn get_T2_state(&self) -> T2state { + return self.T2_state.clone(); + } + + pub fn get_T2_timer(&self) -> BInteger { + return self.T2_timer.clone(); + } + + pub fn get_T2_writevalue(&self) -> BInteger { + return self.T2_writevalue.clone(); + } + + pub fn get_T2v(&self) -> BInteger { + return self.T2v.clone(); + } + + pub fn get_T3_enabled(&self) -> BBoolean { + return self.T3_enabled.clone(); + } + + pub fn get_T3_evaluated(&self) -> BBoolean { + return self.T3_evaluated.clone(); + } + + pub fn get_T3_readpriority(&self) -> BInteger { + return self.T3_readpriority.clone(); + } + + pub fn get_T3_readvalue(&self) -> BInteger { + return self.T3_readvalue.clone(); + } + + pub fn get_T3_state(&self) -> T3state { + return self.T3_state.clone(); + } + + pub fn get__T1state(&self) -> set_T1state { + return self._T1state.clone(); + } + + pub fn get__T2mode(&self) -> set_T2mode { + return self._T2mode.clone(); + } + + pub fn get__T2state(&self) -> set_T2state { + return self._T2state.clone(); + } + + pub fn get__T3state(&self) -> set_T3state { + return self._T3state.clone(); + } + + pub fn T1Evaluate(&mut self) -> () { + //pre_assert + self.T1_timer = 0; + self.T1_state = /*enum_call*/T1state::T1_CALC; + + } + + pub fn T1Calculate(&mut self, mut p: BInteger) -> () { + //pre_assert + self.T1_writevalue = p; + self.T1_state = /*enum_call*/T1state::T1_SEND; + + } + + pub fn T1SendResult(&mut self, mut ppriority: BInteger, mut pv: BInteger) -> () { + //pre_assert + let mut _ld_BUSwrite = self.BUSwrite.clone(); + self.BUSwrite = _ld_BUSwrite._override(&brel![rel_BInteger_X_BInteger, (ppriority.clone(), pv.clone())]).clone().clone(); + self.T1_state = /*enum_call*/T1state::T1_WAIT; + + } + + pub fn T1Wait(&mut self, mut pt: BInteger) -> () { + //pre_assert + self.T1_timer = pt; + self.T1_state = /*enum_call*/T1state::T1_EN; + + } + + pub fn T2Evaluate(&mut self) -> () { + //pre_assert + self.T2_timer = 0; + self.T2_state = /*enum_call*/T2state::T2_RCV; + + } + + pub fn T2ReadBus(&mut self, mut ppriority: BInteger, mut pv: BInteger) -> () { + //pre_assert + self.T2_readvalue = pv; + self.T2_readpriority = ppriority; + self.T2_state = /*enum_call*/T2state::T2_PROC; + + } + + pub fn T2Reset(&mut self) -> () { + //pre_assert + let mut _ld_T2v = self.T2v.clone(); + self.T2_writevalue = _ld_T2v; + self.T2v = 0; + self.T2_state = /*enum_call*/T2state::T2_SEND; + self.T2_mode = /*enum_call*/T2mode::T2MODE_TRANSMIT; + + } + + pub fn T2Complete(&mut self) -> () { + //pre_assert + self.T2_state = /*enum_call*/T2state::T2_RELEASE; + self.T2_mode = /*enum_call*/T2mode::T2MODE_SENSE; + + } + + pub fn T2ReleaseBus(&mut self, mut ppriority: BInteger) -> () { + //pre_assert + let mut _ld_BUSwrite = self.BUSwrite.clone(); + self.BUSwrite = _ld_BUSwrite.domainSubstraction(&bset![BInteger, ppriority]).clone().clone(); + self.T2_state = /*enum_call*/T2state::T2_WAIT; + + } + + pub fn T2Calculate(&mut self) -> () { + //pre_assert + self.T2v = self.T2_readvalue; + self.T2_state = /*enum_call*/T2state::T2_WAIT; + + } + + pub fn T2WriteBus(&mut self, mut ppriority: BInteger, mut pv: BInteger) -> () { + //pre_assert + let mut _ld_BUSwrite = self.BUSwrite.clone(); + self.BUSwrite = _ld_BUSwrite._override(&brel![rel_BInteger_X_BInteger, (ppriority.clone(), pv.clone())]).clone().clone(); + self.T2_state = /*enum_call*/T2state::T2_WAIT; + + } + + pub fn T2Wait(&mut self, mut pt: BInteger) -> () { + //pre_assert + self.T2_timer = pt; + self.T2_state = /*enum_call*/T2state::T2_EN; + + } + + pub fn T3Initiate(&mut self) -> () { + //pre_assert + self.T3_state = /*enum_call*/T3state::T3_WRITE; + self.T3_enabled = false; + + } + + pub fn T3Evaluate(&mut self) -> () { + //pre_assert + self.T3_state = /*enum_call*/T3state::T3_READ; + + } + + pub fn T3writebus(&mut self, mut ppriority: BInteger, mut pv: BInteger) -> () { + //pre_assert + let mut _ld_BUSwrite = self.BUSwrite.clone(); + self.BUSwrite = _ld_BUSwrite._override(&brel![rel_BInteger_X_BInteger, (ppriority.clone(), pv.clone())]).clone().clone(); + self.T3_state = /*enum_call*/T3state::T3_WAIT; + + } + + pub fn T3Read(&mut self, mut ppriority: BInteger, mut pv: BInteger) -> () { + //pre_assert + self.T3_readvalue = pv; + self.T3_readpriority = ppriority; + self.T3_state = /*enum_call*/T3state::T3_PROC; + + } + + pub fn T3Poll(&mut self) -> () { + //pre_assert + self.T3_state = /*enum_call*/T3state::T3_WAIT; + + } + + pub fn T3ReleaseBus(&mut self, mut ppriority: BInteger) -> () { + //pre_assert + let mut _ld_BUSwrite = self.BUSwrite.clone(); + self.BUSwrite = _ld_BUSwrite.domainSubstraction(&bset![BInteger, ppriority]).clone().clone(); + self.T3_state = /*enum_call*/T3state::T3_RELEASE; + + } + + pub fn T3Wait(&mut self) -> () { + //pre_assert + self.T3_state = /*enum_call*/T3state::T3_READY; + self.T3_evaluated = true; + + } + + pub fn T3ReEnableWait(&mut self) -> () { + //pre_assert + self.T3_state = /*enum_call*/T3state::T3_READY; + self.T3_evaluated = true; + self.T3_enabled = true; + + } + + pub fn Update(&mut self, mut pmax: BInteger) -> () { + //pre_assert + let mut _ld_T1_timer = self.T1_timer.clone(); + let mut _ld_T2_timer = self.T2_timer.clone(); + self.BUSvalue = self.BUSwrite.functionCall(&pmax); + self.BUSpriority = pmax; + self.T1_timer = _ld_T1_timer.minus(&1); + self.T2_timer = _ld_T2_timer.minus(&1); + self.T3_evaluated = false; + + } + + 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(&0) && self.T1_state.equal(&/*enum_call*/T1state::T1_EN)); + self._tr_cache_T1Evaluate = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_T1Evaluate.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T1Calculate(&mut self, is_caching: bool) -> HashSet<BInteger> { + //transition + if !is_caching || self._tr_cache_T1Calculate.is_none() { + let mut _ic_set_1: HashSet<BInteger> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_p_1 in set_BInteger::interval(&1.negative(), &3).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if self.T1_state.equal(&/*enum_call*/T1state::T1_CALC) { + _ic_set_1.insert(_ic_p_1); + } + + } + self._tr_cache_T1Calculate = Option::Some(_ic_set_1.clone()); + return _ic_set_1; + } else { + return self._tr_cache_T1Calculate.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T1SendResult(&mut self, is_caching: bool) -> HashSet<(BInteger, BInteger)> { + //transition + if !is_caching || self._tr_cache_T1SendResult.is_none() { + let mut _ic_set_2: HashSet<(BInteger, BInteger)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_assignment + { + let mut _ic_ppriority_1 = 3; + //iteration_construct_assignment + { + let mut _ic_pv_1 = self.T1_writevalue; + //parameter_combination_predicate TODO: FASTER + if self.T1_state.equal(&/*enum_call*/T1state::T1_SEND) { + _ic_set_2.insert((_ic_ppriority_1.clone(), _ic_pv_1.clone())); + } + + } + } + self._tr_cache_T1SendResult = Option::Some(_ic_set_2.clone()); + return _ic_set_2; + } else { + return self._tr_cache_T1SendResult.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T1Wait(&mut self, is_caching: bool) -> HashSet<BInteger> { + //transition + if !is_caching || self._tr_cache_T1Wait.is_none() { + let mut _ic_set_3: HashSet<BInteger> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_assignment + { + let mut _ic_pt_1 = 2; + //parameter_combination_predicate TODO: FASTER + if self.T1_state.equal(&/*enum_call*/T1state::T1_WAIT) { + _ic_set_3.insert(_ic_pt_1); + } + + } + self._tr_cache_T1Wait = Option::Some(_ic_set_3.clone()); + return _ic_set_3; + } else { + return self._tr_cache_T1Wait.as_ref().unwrap().clone(); + } + } + + 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(&0) && self.T2_state.equal(&/*enum_call*/T2state::T2_EN)); + self._tr_cache_T2Evaluate = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_T2Evaluate.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T2ReadBus(&mut self, is_caching: bool) -> HashSet<(BInteger, BInteger)> { + //transition + if !is_caching || self._tr_cache_T2ReadBus.is_none() { + let mut _ic_set_5: HashSet<(BInteger, BInteger)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_assignment + { + let mut _ic_ppriority_1 = self.BUSpriority; + //iteration_construct_assignment + { + let mut _ic_pv_1 = self.BUSvalue; + //parameter_combination_predicate TODO: FASTER + if self.T2_state.equal(&/*enum_call*/T2state::T2_RCV) { + _ic_set_5.insert((_ic_ppriority_1.clone(), _ic_pv_1.clone())); + } + + } + } + self._tr_cache_T2ReadBus = Option::Some(_ic_set_5.clone()); + return _ic_set_5; + } else { + return self._tr_cache_T2ReadBus.as_ref().unwrap().clone(); + } + } + + 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(&4) && self.T2_state.equal(&/*enum_call*/T2state::T2_PROC)); + self._tr_cache_T2Reset = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_T2Reset.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/T2state::T2_PROC) && self.T2_readpriority.equal(&5)) && self.T2_mode.equal(&/*enum_call*/T2mode::T2MODE_TRANSMIT)); + self._tr_cache_T2Complete = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_T2Complete.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T2ReleaseBus(&mut self, is_caching: bool) -> HashSet<BInteger> { + //transition + if !is_caching || self._tr_cache_T2ReleaseBus.is_none() { + let mut _ic_set_8: HashSet<BInteger> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_assignment + { + let mut _ic_ppriority_1 = self.T2_readpriority; + //parameter_combination_predicate TODO: FASTER + if (self.BUSwrite.domain().elementOf(&_ic_ppriority_1) && self.T2_state.equal(&/*enum_call*/T2state::T2_RELEASE)) { + _ic_set_8.insert(_ic_ppriority_1); + } + + } + self._tr_cache_T2ReleaseBus = Option::Some(_ic_set_8.clone()); + return _ic_set_8; + } else { + return self._tr_cache_T2ReleaseBus.as_ref().unwrap().clone(); + } + } + + 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(&3) && self.T2_state.equal(&/*enum_call*/T2state::T2_PROC)); + self._tr_cache_T2Calculate = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_T2Calculate.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T2WriteBus(&mut self, is_caching: bool) -> HashSet<(BInteger, BInteger)> { + //transition + if !is_caching || self._tr_cache_T2WriteBus.is_none() { + let mut _ic_set_10: HashSet<(BInteger, BInteger)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_assignment + { + let mut _ic_ppriority_1 = 5; + //iteration_construct_assignment + { + let mut _ic_pv_1 = self.T2_writevalue; + //parameter_combination_predicate TODO: FASTER + if self.T2_state.equal(&/*enum_call*/T2state::T2_SEND) { + _ic_set_10.insert((_ic_ppriority_1.clone(), _ic_pv_1.clone())); + } + + } + } + self._tr_cache_T2WriteBus = Option::Some(_ic_set_10.clone()); + return _ic_set_10; + } else { + return self._tr_cache_T2WriteBus.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T2Wait(&mut self, is_caching: bool) -> HashSet<BInteger> { + //transition + if !is_caching || self._tr_cache_T2Wait.is_none() { + let mut _ic_set_11: HashSet<BInteger> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_assignment + { + let mut _ic_pt_1 = 3; + //parameter_combination_predicate TODO: FASTER + if self.T2_state.equal(&/*enum_call*/T2state::T2_WAIT) { + _ic_set_11.insert(_ic_pt_1); + } + + } + self._tr_cache_T2Wait = Option::Some(_ic_set_11.clone()); + return _ic_set_11; + } else { + return self._tr_cache_T2Wait.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/T3state::T3_READY) && self.T3_evaluated.equal(&false)) && self.T3_enabled.equal(&true)); + self._tr_cache_T3Initiate = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_T3Initiate.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/T3state::T3_READY) && self.T3_evaluated.equal(&false)) && self.T3_enabled.equal(&false)); + self._tr_cache_T3Evaluate = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_T3Evaluate.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T3writebus(&mut self, is_caching: bool) -> HashSet<(BInteger, BInteger)> { + //transition + if !is_caching || self._tr_cache_T3writebus.is_none() { + let mut _ic_set_14: HashSet<(BInteger, BInteger)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_assignment + { + let mut _ic_ppriority_1 = 4; + //iteration_construct_assignment + { + let mut _ic_pv_1 = 0; + //parameter_combination_predicate TODO: FASTER + if self.T3_state.equal(&/*enum_call*/T3state::T3_WRITE) { + _ic_set_14.insert((_ic_ppriority_1.clone(), _ic_pv_1.clone())); + } + + } + } + self._tr_cache_T3writebus = Option::Some(_ic_set_14.clone()); + return _ic_set_14; + } else { + return self._tr_cache_T3writebus.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T3Read(&mut self, is_caching: bool) -> HashSet<(BInteger, BInteger)> { + //transition + if !is_caching || self._tr_cache_T3Read.is_none() { + let mut _ic_set_15: HashSet<(BInteger, BInteger)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_assignment + { + let mut _ic_ppriority_1 = self.BUSpriority; + //iteration_construct_assignment + { + let mut _ic_pv_1 = self.BUSvalue; + //parameter_combination_predicate TODO: FASTER + if self.T3_state.equal(&/*enum_call*/T3state::T3_READ) { + _ic_set_15.insert((_ic_ppriority_1.clone(), _ic_pv_1.clone())); + } + + } + } + self._tr_cache_T3Read = Option::Some(_ic_set_15.clone()); + return _ic_set_15; + } else { + return self._tr_cache_T3Read.as_ref().unwrap().clone(); + } + } + + 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(&5) && self.T3_state.equal(&/*enum_call*/T3state::T3_PROC)); + self._tr_cache_T3Poll = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_T3Poll.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T3ReleaseBus(&mut self, is_caching: bool) -> HashSet<BInteger> { + //transition + if !is_caching || self._tr_cache_T3ReleaseBus.is_none() { + let mut _ic_set_17: HashSet<BInteger> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_assignment + { + let mut _ic_ppriority_1 = 4; + //parameter_combination_predicate TODO: FASTER + if (self.T3_readpriority.equal(&5) && self.T3_state.equal(&/*enum_call*/T3state::T3_PROC)) { + _ic_set_17.insert(_ic_ppriority_1); + } + + } + self._tr_cache_T3ReleaseBus = Option::Some(_ic_set_17.clone()); + return _ic_set_17; + } else { + return self._tr_cache_T3ReleaseBus.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T3Wait(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_T3Wait.is_none() { + let mut __tmp__val__ = self.T3_state.equal(&/*enum_call*/T3state::T3_WAIT); + self._tr_cache_T3Wait = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_T3Wait.as_ref().unwrap().clone(); + } + } + + pub fn _tr_T3ReEnableWait(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_T3ReEnableWait.is_none() { + let mut __tmp__val__ = self.T3_state.equal(&/*enum_call*/T3state::T3_RELEASE); + self._tr_cache_T3ReEnableWait = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_T3ReEnableWait.as_ref().unwrap().clone(); + } + } + + pub fn _tr_Update(&mut self, is_caching: bool) -> HashSet<BInteger> { + //transition + if !is_caching || self._tr_cache_Update.is_none() { + let mut _ic_set_20: HashSet<BInteger> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_assignment + { + let mut _ic_pmax_1 = self.BUSwrite.domain()._max(); + //parameter_combination_predicate TODO: FASTER + if ((self.T1_timer.greater(&0) && self.T2_timer.greater(&0)) && (self.T3_enabled.equal(&true) || self.T3_evaluated.equal(&true))) { + _ic_set_20.insert(_ic_pmax_1); + } + + } + self._tr_cache_Update = Option::Some(_ic_set_20.clone()); + return _ic_set_20; + } else { + return self._tr_cache_Update.as_ref().unwrap().clone(); + } + } + + pub fn _check_inv_1(&self) -> bool { + //invariant + return self.T2v.isInteger(); + } + + pub fn _check_inv_2(&self) -> bool { + //invariant + return BOOL.elementOf(&self.T3_evaluated); + } + + pub fn _check_inv_3(&self) -> bool { + //invariant + return BOOL.elementOf(&self.T3_enabled); + } + + pub fn _check_inv_4(&self) -> bool { + //invariant + return self._T1state.elementOf(&self.T1_state); + } + + pub fn _check_inv_5(&self) -> bool { + //invariant + return self._T2state.elementOf(&self.T2_state); + } + + pub fn _check_inv_6(&self) -> bool { + //invariant + return self._T3state.elementOf(&self.T3_state); + } + + pub fn _check_inv_7(&self) -> bool { + //invariant + return self.T1_writevalue.isInteger(); + } + + pub fn _check_inv_8(&self) -> bool { + //invariant + return self.T2_writevalue.isInteger(); + } + + pub fn _check_inv_9(&self) -> bool { + //invariant + return self.T2_readvalue.isInteger(); + } + + pub fn _check_inv_10(&self) -> bool { + //invariant + return self.T1_timer.isNatural(); + } + + pub fn _check_inv_11(&self) -> bool { + //invariant + return self.T2_timer.isNatural(); + } + + pub fn _check_inv_12(&self) -> bool { + //invariant + return self._T2mode.elementOf(&self.T2_mode); + } + + pub fn _check_inv_13(&self) -> bool { + //invariant + return self.BUSvalue.isInteger(); + } + + pub fn _check_inv_14(&self) -> bool { + //invariant + return self.NATSET.elementOf(&self.BUSpriority); + } + + pub fn _check_inv_15(&self) -> bool { + //invariant + return self.T3_readvalue.isInteger(); + } + + pub fn _check_inv_16(&self) -> bool { + //invariant + return self.NATSET.elementOf(&self.T3_readpriority); + } + + pub fn _check_inv_17(&self) -> bool { + //invariant + return self.NATSET.elementOf(&self.T2_readpriority); + } + + pub fn _check_inv_18(&self) -> bool { + //invariant + return self.NATSET.check_domain_of(&self.BUSwrite).and(&self.BUSwrite.checkRangeInteger()).and(&self.BUSwrite.isFunction()).and(&self.NATSET.check_partial_of(&self.BUSwrite)); + } + + pub fn _check_inv_19(&self) -> bool { + //invariant + return self.BUSwrite.unequal(&brel![rel_BInteger_X_BInteger]); + } + + pub fn _check_inv_20(&self) -> bool { + //invariant + return self.BUSwrite.domain().elementOf(&0); + } + + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { + //calling the given functions without caching will recalculate them and cache them afterwards + 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);}, + "_tr_T1Wait" => {self._tr_T1Wait(false);}, + "_tr_T2Evaluate" => {self._tr_T2Evaluate(false);}, + "_tr_T2ReadBus" => {self._tr_T2ReadBus(false);}, + "_tr_T2Reset" => {self._tr_T2Reset(false);}, + "_tr_T2Complete" => {self._tr_T2Complete(false);}, + "_tr_T2ReleaseBus" => {self._tr_T2ReleaseBus(false);}, + "_tr_T2Calculate" => {self._tr_T2Calculate(false);}, + "_tr_T2WriteBus" => {self._tr_T2WriteBus(false);}, + "_tr_T2Wait" => {self._tr_T2Wait(false);}, + "_tr_T3Initiate" => {self._tr_T3Initiate(false);}, + "_tr_T3Evaluate" => {self._tr_T3Evaluate(false);}, + "_tr_T3writebus" => {self._tr_T3writebus(false);}, + "_tr_T3Read" => {self._tr_T3Read(false);}, + "_tr_T3Poll" => {self._tr_T3Poll(false);}, + "_tr_T3ReleaseBus" => {self._tr_T3ReleaseBus(false);}, + "_tr_T3Wait" => {self._tr_T3Wait(false);}, + "_tr_T3ReEnableWait" => {self._tr_T3ReEnableWait(false);}, + "_tr_Update" => {self._tr_Update(false);}, + _ => {}, + } + } + } + + //model_check_next_states + fn generateNextStates(state: &mut CAN_BUS_tlc, + isCaching: bool, + 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; + } + + + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); + return result; + } + + //model_check_invariants + 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 !state._check_inv_1() { + println!("_check_inv_1 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_3() { + println!("_check_inv_3 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_5() { + println!("_check_inv_5 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_7() { + println!("_check_inv_7 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_9() { + println!("_check_inv_9 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_11() { + println!("_check_inv_11 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_13() { + println!("_check_inv_13 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_15() { + println!("_check_inv_15 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_17() { + println!("_check_inv_17 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_19() { + println!("_check_inv_19 failed!"); + return false; + } + } + //model_check_invariant + if dependent_invariants_of_state.contains(&"_check_inv_20") { + if !state._check_inv_20() { + println!("_check_inv_20 failed!"); + return false; + } + } + return true; + } + return !(!state._check_inv_1() || !state._check_inv_2() || !state._check_inv_3() || !state._check_inv_4() || !state._check_inv_5() || !state._check_inv_6() || !state._check_inv_7() || !state._check_inv_8() || !state._check_inv_9() || !state._check_inv_10() || !state._check_inv_11() || !state._check_inv_12() || !state._check_inv_13() || !state._check_inv_14() || !state._check_inv_15() || !state._check_inv_16() || !state._check_inv_17() || !state._check_inv_18() || !state._check_inv_19() || !state._check_inv_20()); + } + + //model_check_print + 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, &'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(), + MC_TYPE::DFS => collection.pop_back().unwrap(), + MC_TYPE::MIXED => if collection.len() % 2 == 0 { collection.pop_front().unwrap() } else { collection.pop_back().unwrap() } + }; + } + + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "T1Wait" => vec!["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"], + //model_check_init_static + "T1Calculate" => vec!["_tr_T1Evaluate", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"], + //model_check_init_static + "T1SendResult" => vec!["_tr_T1Evaluate", "_tr_T2ReleaseBus", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"], + //model_check_init_static + "T2ReadBus" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], + //model_check_init_static + "T2Reset" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], + //model_check_init_static + "T2Complete" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], + //model_check_init_static + "T2Evaluate" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], + //model_check_init_static + "T3Evaluate" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], + //model_check_init_static + "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 + "T1Evaluate" => vec!["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"], + //model_check_init_static + "T3Initiate" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], + //model_check_init_static + "T3ReEnableWait" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], + //model_check_init_static + "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 + "Update" => vec!["_tr_T1Evaluate", "_tr_T3Read", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T3Evaluate", "_tr_T3Initiate"], + //model_check_init_static + "T2ReleaseBus" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], + //model_check_init_static + "T2Wait" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], + //model_check_init_static + "T3Poll" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], + //model_check_init_static + "T2Calculate" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"], + //model_check_init_static + "T3Read" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], + //model_check_init_static + "T3Wait" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"], + //model_check_init_static + "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 + "T1Wait" => vec!["_check_inv_10", "_check_inv_4"], + //model_check_init_static + "T1Calculate" => vec!["_check_inv_7", "_check_inv_4"], + //model_check_init_static + "T1SendResult" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_4"], + //model_check_init_static + "T2ReadBus" => vec!["_check_inv_17", "_check_inv_5", "_check_inv_9"], + //model_check_init_static + "T2Reset" => vec!["_check_inv_1", "_check_inv_5", "_check_inv_8", "_check_inv_12"], + //model_check_init_static + "T2Complete" => vec!["_check_inv_5", "_check_inv_12"], + //model_check_init_static + "T2Evaluate" => vec!["_check_inv_5", "_check_inv_11"], + //model_check_init_static + "T3Evaluate" => vec!["_check_inv_6"], + //model_check_init_static + "T3ReleaseBus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"], + //model_check_init_static + "T1Evaluate" => vec!["_check_inv_10", "_check_inv_4"], + //model_check_init_static + "T3Initiate" => vec!["_check_inv_3", "_check_inv_6"], + //model_check_init_static + "T3ReEnableWait" => vec!["_check_inv_2", "_check_inv_3", "_check_inv_6"], + //model_check_init_static + "T3writebus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"], + //model_check_init_static + "Update" => vec!["_check_inv_2", "_check_inv_10", "_check_inv_14", "_check_inv_13", "_check_inv_11"], + //model_check_init_static + "T2ReleaseBus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"], + //model_check_init_static + "T2Wait" => vec!["_check_inv_5", "_check_inv_11"], + //model_check_init_static + "T3Poll" => vec!["_check_inv_6"], + //model_check_init_static + "T2Calculate" => vec!["_check_inv_1", "_check_inv_5"], + //model_check_init_static + "T3Read" => vec!["_check_inv_16", "_check_inv_15", "_check_inv_6"], + //model_check_init_static + "T3Wait" => vec!["_check_inv_2", "_check_inv_6"], + //model_check_init_static + "T2WriteBus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"], + _ => vec![], + } + } + + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool, no_dead: bool, no_inv: bool) { + let mut machine = CAN_BUS_tlc::new(); + + let mut all_states = HashSet::<CAN_BUS_tlc>::new(); + all_states.insert(machine.clone()); + + 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(), "")); + + 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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } + if !no_dead && next_states.is_empty() { + print!("DEADLOCK DETECTED"); + stop_threads = true; + } + + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + + fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool, no_dead: bool, no_inv: bool) { + let threadPool = ThreadPool::new(threads); + + let machine = CAN_BUS_tlc::new(); + + let all_states = Arc::new(DashSet::<CAN_BUS_tlc>::new()); + all_states.insert(machine.clone()); + + 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 num_transitions = Arc::new(AtomicU64::new(0)); + + 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 && !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 = 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, transitions); + if !no_dead && next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } + + //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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } + //println!("Thread {:?} done", thread::current().id()); + let _ = tx.send(Ok(1)); + }); + + 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()); + match rx.try_recv() { + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + +} + + +fn main() { + let args: Vec<String> = env::args().collect(); + if args.len() < 4 { panic!("Number of arguments errorneous"); } + + let threads = args.get(2).unwrap().parse::<usize>().unwrap(); + if threads <= 0 { panic!("Input for number of threads is wrong."); } + + let is_caching = args.get(3).unwrap().parse::<bool>().unwrap(); + let mc_type = match args.get(1).unwrap().as_str() { + "mixed" => MC_TYPE::MIXED, + "bf" => MC_TYPE::BFS, + "df" => MC_TYPE::DFS, + _ => panic!("Input for strategy is wrong.") + }; + + let mut no_dead = false; + let mut no_inv = false; + + if args.len() > 4 { + for arg in args.iter().skip(4) { + match arg.as_str() { + "-nodead" => no_dead = true, + "-noinv" => no_inv = true, + _ => {} + } + } + } + + if threads == 1 { + CAN_BUS_tlc::model_check_single_threaded(mc_type, is_caching, no_dead, no_inv); + } else { + CAN_BUS_tlc::modelCheckMultiThreaded(mc_type, threads, is_caching, no_dead, no_inv); + } +} diff --git a/benchmarks/model_checking/Rust_embedded/Cruise_finite1_deterministic_MC.rs b/benchmarks/model_checking/Rust_embedded/Cruise_finite1_deterministic_MC.rs new file mode 100644 index 000000000..ce8b06988 --- /dev/null +++ b/benchmarks/model_checking/Rust_embedded/Cruise_finite1_deterministic_MC.rs @@ -0,0 +1,2011 @@ +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] +//#![no_std] //std is enabled for the generated machine by default, since without it there is no println which makes unit-testing very difficult +use btypes::{bset, brel}; +use btypes::bset::BSet; +use btypes::bset::SetItem; +use btypes::bset::PowSetItem; +use btypes::bset::PowAble; +use btypes::bset::NestedSet; +use btypes::brelation::BRelation; +use btypes::brelation::RelLeftItem; +use btypes::brelation::RelPowAble; +use btypes::bboolean::BBoolean; +use btypes::bboolean::BBool; +use btypes::bboolean::BOOL; +use btypes::binteger::BInteger; +use btypes::binteger::BInt; +use btypes::binteger::set_BInteger; +use btypes::btuple::BTuple; + +use std::env; +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}; + + + +#[derive(Clone, Copy)] +pub enum MC_TYPE { BFS, DFS, MIXED } + + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum RSset { + #[default] + RSnone = 0, + RSpos = 1, + RSneg = 2, + RSequal = 3 +} + +impl RSset { + pub fn equal(&self, other: &RSset) -> bool { *self == *other } + pub fn unequal(&self, other: &RSset) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::RSnone, + 1 => Self::RSpos, + 2 => Self::RSneg, + 3 => Self::RSequal, + _ => panic!("RSset index out of range! {:?}", idx) + } + } +} + +impl SetItem<4> for RSset { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_RSset = BSet<RSset, 4>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum ODset { + #[default] + ODnone = 0, + ODclose = 1, + ODveryclose = 2 +} + +impl ODset { + pub fn equal(&self, other: &ODset) -> bool { *self == *other } + pub fn unequal(&self, other: &ODset) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::ODnone, + 1 => Self::ODclose, + 2 => Self::ODveryclose, + _ => panic!("ODset index out of range! {:?}", idx) + } + } +} + +impl SetItem<3> for ODset { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_ODset = BSet<ODset, 3>; +//set_enum_declaration done + + +#[derive(Derivative)] +#[derivative(Clone, Default, Debug, Hash, PartialEq, Eq)] +pub struct Cruise_finite1_deterministic_MC { + /*declarations*/CruiseAllowed: BBoolean, + CruiseActive: BBoolean, + VehicleAtCruiseSpeed: BBoolean, + VehicleCanKeepSpeed: BBoolean, + VehicleTryKeepSpeed: BBoolean, + SpeedAboveMax: BBoolean, + VehicleTryKeepTimeGap: BBoolean, + CruiseSpeedAtMax: BBoolean, + ObstaclePresent: BBoolean, + ObstacleDistance: ODset, + ObstacleRelativeSpeed: RSset, + ObstacleStatusJustChanged: BBoolean, + CCInitialisationInProgress: BBoolean, + CruiseSpeedChangeInProgress: BBoolean, + NumberOfSetCruise: BInteger, + /*sets*//*set_declaration*/_RSset: set_RSset, + /*set_declaration*/_ODset: set_ODset, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_CruiseBecomesNotAllowed: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_CruiseBecomesAllowed: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_SetCruiseSpeed: Option<HashSet<(BBoolean, BBoolean)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_CCInitialisationFinished: Option<HashSet<(BBoolean, BBoolean)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_CCInitialisationDelayFinished: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_CruiseSpeedChangeFinished: Option<HashSet<(BBoolean, BBoolean)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_CruiseSpeedChangeDelayFinished: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_CruiseOff: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ExternalForcesBecomesExtreme: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ExternalForcesBecomesNormal: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_VehicleLeavesCruiseSpeed: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_VehicleReachesCruiseSpeed: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_VehicleExceedsMaxCruiseSpeed: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_VehicleFallsBelowMaxCruiseSpeed: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleDistanceBecomesVeryClose: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleDistanceBecomesClose: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleDistanceBecomesBig: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleStartsTravelFaster: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleStopsTravelFaster: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleStartsTravelSlower: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleStopsTravelSlower: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleAppearsWhenCruiseActive: Option<HashSet<(RSset, ODset)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleAppearsWhenCruiseInactive: Option<HashSet<RSset>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleDisappears: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_VehicleManageObstacle: Option<HashSet<(BBoolean, BBoolean)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_ObstacleBecomesOld: Option<bool>,} + + +impl Cruise_finite1_deterministic_MC { + + pub fn new() -> Cruise_finite1_deterministic_MC { + //values: '' + let mut m: Cruise_finite1_deterministic_MC = Default::default(); + m.init(); + return m; + } + fn init(&mut self) { + /*set_initializations*///set_initialization + self._RSset = bset![RSset, /*enum_call*/RSset::RSnone, /*enum_call*/RSset::RSpos, /*enum_call*/RSset::RSneg, /*enum_call*/RSset::RSequal]; + //set_initialization + self._ODset = bset![ODset, /*enum_call*/ODset::ODnone, /*enum_call*/ODset::ODclose, /*enum_call*/ODset::ODveryclose]; + /*properties*/ + /*body*/self.CruiseAllowed = true; + self.CruiseActive = false; + self.VehicleAtCruiseSpeed = false; + self.VehicleCanKeepSpeed = false; + self.VehicleTryKeepSpeed = false; + self.SpeedAboveMax = false; + self.VehicleTryKeepTimeGap = false; + self.NumberOfSetCruise = 0; + self.CruiseSpeedAtMax = false; + self.ObstacleDistance = /*enum_call*/ODset::ODnone; + self.ObstacleStatusJustChanged = false; + self.CCInitialisationInProgress = false; + self.CruiseSpeedChangeInProgress = false; + self.ObstaclePresent = false; + self.ObstacleRelativeSpeed = /*enum_call*/RSset::RSnone; + /*includesInitialization*/ + } + + pub fn get_CruiseAllowed(&self) -> BBoolean { + return self.CruiseAllowed.clone(); + } + + pub fn get_CruiseActive(&self) -> BBoolean { + return self.CruiseActive.clone(); + } + + pub fn get_VehicleAtCruiseSpeed(&self) -> BBoolean { + return self.VehicleAtCruiseSpeed.clone(); + } + + pub fn get_VehicleCanKeepSpeed(&self) -> BBoolean { + return self.VehicleCanKeepSpeed.clone(); + } + + pub fn get_VehicleTryKeepSpeed(&self) -> BBoolean { + return self.VehicleTryKeepSpeed.clone(); + } + + pub fn get_SpeedAboveMax(&self) -> BBoolean { + return self.SpeedAboveMax.clone(); + } + + pub fn get_VehicleTryKeepTimeGap(&self) -> BBoolean { + return self.VehicleTryKeepTimeGap.clone(); + } + + pub fn get_CruiseSpeedAtMax(&self) -> BBoolean { + return self.CruiseSpeedAtMax.clone(); + } + + pub fn get_ObstaclePresent(&self) -> BBoolean { + return self.ObstaclePresent.clone(); + } + + pub fn get_ObstacleDistance(&self) -> ODset { + return self.ObstacleDistance.clone(); + } + + pub fn get_ObstacleRelativeSpeed(&self) -> RSset { + return self.ObstacleRelativeSpeed.clone(); + } + + pub fn get_ObstacleStatusJustChanged(&self) -> BBoolean { + return self.ObstacleStatusJustChanged.clone(); + } + + pub fn get_CCInitialisationInProgress(&self) -> BBoolean { + return self.CCInitialisationInProgress.clone(); + } + + pub fn get_CruiseSpeedChangeInProgress(&self) -> BBoolean { + return self.CruiseSpeedChangeInProgress.clone(); + } + + pub fn get_NumberOfSetCruise(&self) -> BInteger { + return self.NumberOfSetCruise.clone(); + } + + pub fn get__RSset(&self) -> set_RSset { + return self._RSset.clone(); + } + + pub fn get__ODset(&self) -> set_ODset { + return self._ODset.clone(); + } + + pub fn CruiseBecomesNotAllowed(&mut self) -> () { + //select + if self.CruiseAllowed.equal(&true) { + self.CruiseAllowed = false; + self.CruiseActive = false; + self.VehicleCanKeepSpeed = false; + self.VehicleTryKeepSpeed = false; + self.VehicleAtCruiseSpeed = false; + self.VehicleTryKeepTimeGap = false; + self.CruiseSpeedAtMax = false; + self.ObstacleDistance = /*enum_call*/ODset::ODnone; + self.NumberOfSetCruise = 0; + self.ObstacleStatusJustChanged = false; + self.CCInitialisationInProgress = false; + self.CruiseSpeedChangeInProgress = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn CruiseBecomesAllowed(&mut self) -> () { + //select + if self.CruiseAllowed.equal(&false) { + self.CruiseAllowed = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn SetCruiseSpeed(&mut self, mut vcks: BBoolean, mut csam: BBoolean) -> () { + //pre_assert + let mut _ld_NumberOfSetCruise = self.NumberOfSetCruise.clone(); + let mut _ld_CruiseActive = self.CruiseActive.clone(); + self.CruiseActive = true; + self.VehicleCanKeepSpeed = vcks; + //if + if self.SpeedAboveMax.equal(&false) { + self.VehicleAtCruiseSpeed = true; + self.CruiseSpeedAtMax = csam; + } //else + else { + self.CruiseSpeedAtMax = true; + } + self.ObstacleStatusJustChanged = true; + //if + if _ld_CruiseActive.equal(&true) { + self.CruiseSpeedChangeInProgress = true; + } //else + else { + self.CCInitialisationInProgress = true; + } + //if + if _ld_NumberOfSetCruise.less(&1) { + self.NumberOfSetCruise = _ld_NumberOfSetCruise.plus(&1); + } + + } + + pub fn CCInitialisationFinished(&mut self, mut vtks: BBoolean, mut vtktg: BBoolean) -> () { + //pre_assert + self.VehicleTryKeepTimeGap = vtktg; + self.VehicleTryKeepSpeed = vtks; + + } + + pub fn CCInitialisationDelayFinished(&mut self) -> () { + //select + if (((((self.CCInitialisationInProgress.equal(&true) && (((self.VehicleTryKeepSpeed.equal(&true) || self.VehicleTryKeepTimeGap.equal(&true)) || self.ObstacleStatusJustChanged.equal(&true)) || self.CruiseSpeedChangeInProgress.equal(&true))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| self.VehicleTryKeepSpeed.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepSpeed.equal(&true))) { + self.CCInitialisationInProgress = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn CruiseSpeedChangeFinished(&mut self, mut vtks: BBoolean, mut vtktg: BBoolean) -> () { + //select + if (((((((((((BOOL.elementOf(&vtks) && BOOL.elementOf(&vtktg)) && (((vtks.equal(&true) || vtktg.equal(&true)) || self.ObstacleStatusJustChanged.equal(&true)) || self.CCInitialisationInProgress.equal(&true))) && self.ObstaclePresent.equal(&false).implies(|| vtktg.equal(&false))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| vtks.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| vtktg.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| vtktg.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| vtks.equal(&true))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSequal) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| vtktg.equal(&false))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| vtktg.equal(&false))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)).implies(|| vtktg.equal(&false))) && self.CruiseSpeedChangeInProgress.equal(&true)) { + self.VehicleTryKeepTimeGap = vtktg; + self.VehicleTryKeepSpeed = vtks; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn CruiseSpeedChangeDelayFinished(&mut self) -> () { + //select + if (((((self.CruiseSpeedChangeInProgress.equal(&true) && (((self.VehicleTryKeepSpeed.equal(&true) || self.VehicleTryKeepTimeGap.equal(&true)) || self.ObstacleStatusJustChanged.equal(&true)) || self.CCInitialisationInProgress.equal(&true))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| self.VehicleTryKeepSpeed.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| self.VehicleTryKeepSpeed.equal(&true))) { + self.CruiseSpeedChangeInProgress = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn CruiseOff(&mut self) -> () { + //select + if self.CruiseActive.equal(&true) { + self.CruiseActive = false; + self.VehicleCanKeepSpeed = false; + self.VehicleTryKeepSpeed = false; + self.VehicleAtCruiseSpeed = false; + self.VehicleTryKeepTimeGap = false; + self.CruiseSpeedAtMax = false; + self.ObstacleDistance = /*enum_call*/ODset::ODnone; + self.NumberOfSetCruise = 0; + self.ObstacleStatusJustChanged = false; + self.CCInitialisationInProgress = false; + self.CruiseSpeedChangeInProgress = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ExternalForcesBecomesExtreme(&mut self) -> () { + //select + if self.VehicleCanKeepSpeed.equal(&true) { + self.VehicleCanKeepSpeed = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ExternalForcesBecomesNormal(&mut self) -> () { + //select + if (self.CruiseActive.equal(&true) && self.VehicleCanKeepSpeed.equal(&false)) { + self.VehicleCanKeepSpeed = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn VehicleLeavesCruiseSpeed(&mut self) -> () { + //select + if ((self.VehicleAtCruiseSpeed.equal(&true) && (self.VehicleCanKeepSpeed.equal(&false) && self.VehicleTryKeepSpeed.equal(&true))) || self.VehicleTryKeepSpeed.equal(&false)) { + self.VehicleAtCruiseSpeed = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn VehicleReachesCruiseSpeed(&mut self) -> () { + //select + if ((self.CruiseActive.equal(&true) && self.VehicleAtCruiseSpeed.equal(&false)) && self.SpeedAboveMax.equal(&false)) { + self.VehicleAtCruiseSpeed = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn VehicleExceedsMaxCruiseSpeed(&mut self) -> () { + //select + if (self.SpeedAboveMax.equal(&false) && ((self.CruiseActive.equal(&false) || self.VehicleCanKeepSpeed.equal(&false)) || ((self.ObstacleStatusJustChanged.equal(&false) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)))) { + self.SpeedAboveMax = true; + self.VehicleAtCruiseSpeed = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn VehicleFallsBelowMaxCruiseSpeed(&mut self) -> () { + //select + if self.SpeedAboveMax.equal(&true) { + self.SpeedAboveMax = false; + //if + if (self.CruiseActive.equal(&true) && self.CruiseSpeedAtMax.equal(&true)) { + self.VehicleAtCruiseSpeed = true; + } + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ObstacleDistanceBecomesVeryClose(&mut self) -> () { + //select + if (self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg)) { + self.ObstacleDistance = /*enum_call*/ODset::ODveryclose; + self.ObstacleStatusJustChanged = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ObstacleDistanceBecomesClose(&mut self) -> () { + //select + if ((self.ObstaclePresent.equal(&true) && self.CruiseActive.equal(&true)) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos)) || (self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone) && self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg)))) { + self.ObstacleDistance = /*enum_call*/ODset::ODclose; + self.ObstacleStatusJustChanged = true; + //if + if self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) { + self.VehicleTryKeepTimeGap = false; + } + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ObstacleDistanceBecomesBig(&mut self) -> () { + //select + if (self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos)) { + self.ObstacleStatusJustChanged = true; + self.ObstacleDistance = /*enum_call*/ODset::ODnone; + self.VehicleTryKeepTimeGap = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ObstacleStartsTravelFaster(&mut self) -> () { + //select + if (self.ObstaclePresent.equal(&true) && self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSequal)) { + self.ObstacleRelativeSpeed = /*enum_call*/RSset::RSpos; + //if + if self.CruiseActive.equal(&true) { + self.ObstacleStatusJustChanged = true; + } + //if + if self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose) { + self.VehicleTryKeepTimeGap = false; + } + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ObstacleStopsTravelFaster(&mut self) -> () { + //select + if self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) { + self.ObstacleRelativeSpeed = /*enum_call*/RSset::RSequal; + //if + if self.CruiseActive.equal(&true) { + self.ObstacleStatusJustChanged = true; + } + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ObstacleStartsTravelSlower(&mut self) -> () { + //select + if self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSequal) { + self.ObstacleRelativeSpeed = /*enum_call*/RSset::RSneg; + //if + if self.CruiseActive.equal(&true) { + self.ObstacleStatusJustChanged = true; + } + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ObstacleStopsTravelSlower(&mut self) -> () { + //select + if self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg) { + self.ObstacleRelativeSpeed = /*enum_call*/RSset::RSequal; + //if + if self.CruiseActive.equal(&true) { + self.ObstacleStatusJustChanged = true; + } + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ObstacleAppearsWhenCruiseActive(&mut self, mut ors: RSset, mut od: ODset) -> () { + //pre_assert + self.ObstaclePresent = true; + self.ObstacleStatusJustChanged = true; + self.ObstacleRelativeSpeed = ors; + self.ObstacleDistance = od; + + } + + pub fn ObstacleAppearsWhenCruiseInactive(&mut self, mut ors: RSset) -> () { + //pre_assert + self.ObstaclePresent = true; + self.ObstacleRelativeSpeed = ors; + self.ObstacleDistance = /*enum_call*/ODset::ODnone; + + } + + pub fn ObstacleDisappears(&mut self) -> () { + //select + if self.ObstaclePresent.equal(&true) { + self.ObstaclePresent = false; + self.ObstacleRelativeSpeed = /*enum_call*/RSset::RSnone; + //if + if self.CruiseActive.equal(&true) { + self.ObstacleStatusJustChanged = true; + } + self.ObstacleDistance = /*enum_call*/ODset::ODnone; + self.VehicleTryKeepTimeGap = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn VehicleManageObstacle(&mut self, mut vtks: BBoolean, mut vtktg: BBoolean) -> () { + //select + if (((((((((((BOOL.elementOf(&vtks) && BOOL.elementOf(&vtktg)) && (((vtks.equal(&true) || vtktg.equal(&true)) || self.CCInitialisationInProgress.equal(&true)) || self.CruiseSpeedChangeInProgress.equal(&true))) && self.ObstaclePresent.equal(&false).implies(|| vtktg.equal(&false))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| vtks.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| vtktg.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| vtktg.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| vtks.equal(&true))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSequal) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| vtktg.equal(&false))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| vtktg.equal(&false))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)).implies(|| vtktg.equal(&false))) && self.ObstacleStatusJustChanged.equal(&true)) { + self.VehicleTryKeepTimeGap = vtktg; + self.VehicleTryKeepSpeed = vtks; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn ObstacleBecomesOld(&mut self) -> () { + //select + if (((((self.ObstacleStatusJustChanged.equal(&true) && (((self.VehicleTryKeepSpeed.equal(&true) || self.VehicleTryKeepTimeGap.equal(&true)) || self.CCInitialisationInProgress.equal(&true)) || self.CruiseSpeedChangeInProgress.equal(&true))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| self.VehicleTryKeepSpeed.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepSpeed.equal(&true))) { + self.ObstacleStatusJustChanged = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn _tr_CruiseBecomesNotAllowed(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_CruiseBecomesNotAllowed.is_none() { + let mut __tmp__val__ = self.CruiseAllowed.equal(&true); + self._tr_cache_CruiseBecomesNotAllowed = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_CruiseBecomesNotAllowed.as_ref().unwrap().clone(); + } + } + + pub fn _tr_CruiseBecomesAllowed(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_CruiseBecomesAllowed.is_none() { + let mut __tmp__val__ = self.CruiseAllowed.equal(&false); + self._tr_cache_CruiseBecomesAllowed = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_CruiseBecomesAllowed.as_ref().unwrap().clone(); + } + } + + pub fn _tr_SetCruiseSpeed(&mut self, is_caching: bool) -> HashSet<(BBoolean, BBoolean)> { + //transition + if !is_caching || self._tr_cache_SetCruiseSpeed.is_none() { + let mut _ic_set_2: HashSet<(BBoolean, BBoolean)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_vcks_1 in BOOL.clone().iter() { + //iteration_construct_enumeration + for _ic_csam_1 in BOOL.clone().iter() { + //parameter_combination_predicate TODO: FASTER + if self.CruiseAllowed.equal(&true) { + _ic_set_2.insert((_ic_vcks_1.clone(), _ic_csam_1.clone())); + } + + } + } + self._tr_cache_SetCruiseSpeed = Option::Some(_ic_set_2.clone()); + return _ic_set_2; + } else { + return self._tr_cache_SetCruiseSpeed.as_ref().unwrap().clone(); + } + } + + pub fn _tr_CCInitialisationFinished(&mut self, is_caching: bool) -> HashSet<(BBoolean, BBoolean)> { + //transition + if !is_caching || self._tr_cache_CCInitialisationFinished.is_none() { + let mut _ic_set_3: HashSet<(BBoolean, BBoolean)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_vtks_1 in BOOL.clone().iter() { + //iteration_construct_enumeration + for _ic_vtktg_1 in BOOL.clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((((((((((_ic_vtks_1.equal(&true) || _ic_vtktg_1.equal(&true)) || self.ObstacleStatusJustChanged.equal(&true)) || self.CruiseSpeedChangeInProgress.equal(&true)) && self.ObstaclePresent.equal(&false).implies(|| _ic_vtktg_1.equal(&false))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| _ic_vtks_1.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| _ic_vtktg_1.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| _ic_vtktg_1.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| _ic_vtks_1.equal(&true))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSequal) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| _ic_vtktg_1.equal(&false))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| _ic_vtktg_1.equal(&false))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)).implies(|| _ic_vtktg_1.equal(&false))) && self.CCInitialisationInProgress.equal(&true)) { + _ic_set_3.insert((_ic_vtks_1.clone(), _ic_vtktg_1.clone())); + } + + } + } + self._tr_cache_CCInitialisationFinished = Option::Some(_ic_set_3.clone()); + return _ic_set_3; + } else { + return self._tr_cache_CCInitialisationFinished.as_ref().unwrap().clone(); + } + } + + 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(&true) && (((self.VehicleTryKeepSpeed.equal(&true) || self.VehicleTryKeepTimeGap.equal(&true)) || self.ObstacleStatusJustChanged.equal(&true)) || self.CruiseSpeedChangeInProgress.equal(&true))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| self.VehicleTryKeepSpeed.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepSpeed.equal(&true))); + self._tr_cache_CCInitialisationDelayFinished = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_CCInitialisationDelayFinished.as_ref().unwrap().clone(); + } + } + + pub fn _tr_CruiseSpeedChangeFinished(&mut self, is_caching: bool) -> HashSet<(BBoolean, BBoolean)> { + //transition + if !is_caching || self._tr_cache_CruiseSpeedChangeFinished.is_none() { + let mut _ic_set_5: HashSet<(BBoolean, BBoolean)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_vtks_1 in BOOL.clone().iter() { + //iteration_construct_enumeration + for _ic_vtktg_1 in BOOL.clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((((((((((_ic_vtks_1.equal(&true) || _ic_vtktg_1.equal(&true)) || self.ObstacleStatusJustChanged.equal(&true)) || self.CCInitialisationInProgress.equal(&true)) && self.ObstaclePresent.equal(&false).implies(|| _ic_vtktg_1.equal(&false))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| _ic_vtks_1.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| _ic_vtktg_1.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| _ic_vtktg_1.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| _ic_vtks_1.equal(&true))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSequal) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| _ic_vtktg_1.equal(&false))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| _ic_vtktg_1.equal(&false))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)).implies(|| _ic_vtktg_1.equal(&false))) && self.CruiseSpeedChangeInProgress.equal(&true)) { + _ic_set_5.insert((_ic_vtks_1.clone(), _ic_vtktg_1.clone())); + } + + } + } + self._tr_cache_CruiseSpeedChangeFinished = Option::Some(_ic_set_5.clone()); + return _ic_set_5; + } else { + return self._tr_cache_CruiseSpeedChangeFinished.as_ref().unwrap().clone(); + } + } + + 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(&true) && (((self.VehicleTryKeepSpeed.equal(&true) || self.VehicleTryKeepTimeGap.equal(&true)) || self.ObstacleStatusJustChanged.equal(&true)) || self.CCInitialisationInProgress.equal(&true))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| self.VehicleTryKeepSpeed.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&false)) && self.CCInitialisationInProgress.equal(&false)).implies(|| self.VehicleTryKeepSpeed.equal(&true))); + self._tr_cache_CruiseSpeedChangeDelayFinished = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_CruiseSpeedChangeDelayFinished.as_ref().unwrap().clone(); + } + } + + pub fn _tr_CruiseOff(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_CruiseOff.is_none() { + let mut __tmp__val__ = self.CruiseActive.equal(&true); + self._tr_cache_CruiseOff = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_CruiseOff.as_ref().unwrap().clone(); + } + } + + pub fn _tr_ExternalForcesBecomesExtreme(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_ExternalForcesBecomesExtreme.is_none() { + let mut __tmp__val__ = self.VehicleCanKeepSpeed.equal(&true); + self._tr_cache_ExternalForcesBecomesExtreme = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ExternalForcesBecomesExtreme.as_ref().unwrap().clone(); + } + } + + 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(&true) && self.VehicleCanKeepSpeed.equal(&false)); + self._tr_cache_ExternalForcesBecomesNormal = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ExternalForcesBecomesNormal.as_ref().unwrap().clone(); + } + } + + 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(&true) && (self.VehicleCanKeepSpeed.equal(&false) && self.VehicleTryKeepSpeed.equal(&true))) || self.VehicleTryKeepSpeed.equal(&false)); + self._tr_cache_VehicleLeavesCruiseSpeed = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_VehicleLeavesCruiseSpeed.as_ref().unwrap().clone(); + } + } + + 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(&true) && self.VehicleAtCruiseSpeed.equal(&false)) && self.SpeedAboveMax.equal(&false)); + self._tr_cache_VehicleReachesCruiseSpeed = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_VehicleReachesCruiseSpeed.as_ref().unwrap().clone(); + } + } + + 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(&false) && ((self.CruiseActive.equal(&false) || self.VehicleCanKeepSpeed.equal(&false)) || ((self.ObstacleStatusJustChanged.equal(&false) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)))); + self._tr_cache_VehicleExceedsMaxCruiseSpeed = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_VehicleExceedsMaxCruiseSpeed.as_ref().unwrap().clone(); + } + } + + pub fn _tr_VehicleFallsBelowMaxCruiseSpeed(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_VehicleFallsBelowMaxCruiseSpeed.is_none() { + let mut __tmp__val__ = self.SpeedAboveMax.equal(&true); + self._tr_cache_VehicleFallsBelowMaxCruiseSpeed = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_VehicleFallsBelowMaxCruiseSpeed.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg)); + self._tr_cache_ObstacleDistanceBecomesVeryClose = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ObstacleDistanceBecomesVeryClose.as_ref().unwrap().clone(); + } + } + + 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(&true) && self.CruiseActive.equal(&true)) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos)) || (self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone) && self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg)))); + self._tr_cache_ObstacleDistanceBecomesClose = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ObstacleDistanceBecomesClose.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos)); + self._tr_cache_ObstacleDistanceBecomesBig = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ObstacleDistanceBecomesBig.as_ref().unwrap().clone(); + } + } + + 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(&true) && self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSequal)); + self._tr_cache_ObstacleStartsTravelFaster = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ObstacleStartsTravelFaster.as_ref().unwrap().clone(); + } + } + + pub fn _tr_ObstacleStopsTravelFaster(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_ObstacleStopsTravelFaster.is_none() { + let mut __tmp__val__ = self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos); + self._tr_cache_ObstacleStopsTravelFaster = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ObstacleStopsTravelFaster.as_ref().unwrap().clone(); + } + } + + pub fn _tr_ObstacleStartsTravelSlower(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_ObstacleStartsTravelSlower.is_none() { + let mut __tmp__val__ = self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSequal); + self._tr_cache_ObstacleStartsTravelSlower = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ObstacleStartsTravelSlower.as_ref().unwrap().clone(); + } + } + + pub fn _tr_ObstacleStopsTravelSlower(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_ObstacleStopsTravelSlower.is_none() { + let mut __tmp__val__ = self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg); + self._tr_cache_ObstacleStopsTravelSlower = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ObstacleStopsTravelSlower.as_ref().unwrap().clone(); + } + } + + pub fn _tr_ObstacleAppearsWhenCruiseActive(&mut self, is_caching: bool) -> HashSet<(RSset, ODset)> { + //transition + if !is_caching || self._tr_cache_ObstacleAppearsWhenCruiseActive.is_none() { + let mut _ic_set_21: HashSet<(RSset, ODset)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_ors_1 in self._RSset.difference(&bset![RSset, /*enum_call*/RSset::RSnone]).clone().iter() { + //iteration_construct_enumeration + for _ic_od_1 in self._ODset.difference(&bset![ODset, /*enum_call*/ODset::ODnone]).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (self.ObstaclePresent.equal(&false) && self.CruiseActive.equal(&true)) { + _ic_set_21.insert((_ic_ors_1.clone(), _ic_od_1.clone())); + } + + } + } + self._tr_cache_ObstacleAppearsWhenCruiseActive = Option::Some(_ic_set_21.clone()); + return _ic_set_21; + } else { + return self._tr_cache_ObstacleAppearsWhenCruiseActive.as_ref().unwrap().clone(); + } + } + + pub fn _tr_ObstacleAppearsWhenCruiseInactive(&mut self, is_caching: bool) -> HashSet<RSset> { + //transition + if !is_caching || self._tr_cache_ObstacleAppearsWhenCruiseInactive.is_none() { + let mut _ic_set_22: HashSet<RSset> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_ors_1 in self._RSset.difference(&bset![RSset, /*enum_call*/RSset::RSnone]).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (self.ObstaclePresent.equal(&false) && self.CruiseActive.equal(&false)) { + _ic_set_22.insert(_ic_ors_1); + } + + } + self._tr_cache_ObstacleAppearsWhenCruiseInactive = Option::Some(_ic_set_22.clone()); + return _ic_set_22; + } else { + return self._tr_cache_ObstacleAppearsWhenCruiseInactive.as_ref().unwrap().clone(); + } + } + + pub fn _tr_ObstacleDisappears(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_ObstacleDisappears.is_none() { + let mut __tmp__val__ = self.ObstaclePresent.equal(&true); + self._tr_cache_ObstacleDisappears = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ObstacleDisappears.as_ref().unwrap().clone(); + } + } + + pub fn _tr_VehicleManageObstacle(&mut self, is_caching: bool) -> HashSet<(BBoolean, BBoolean)> { + //transition + if !is_caching || self._tr_cache_VehicleManageObstacle.is_none() { + let mut _ic_set_24: HashSet<(BBoolean, BBoolean)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_vtks_1 in BOOL.clone().iter() { + //iteration_construct_enumeration + for _ic_vtktg_1 in BOOL.clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((((((((((_ic_vtks_1.equal(&true) || _ic_vtktg_1.equal(&true)) || self.CCInitialisationInProgress.equal(&true)) || self.CruiseSpeedChangeInProgress.equal(&true)) && self.ObstaclePresent.equal(&false).implies(|| _ic_vtktg_1.equal(&false))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| _ic_vtks_1.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| _ic_vtktg_1.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| _ic_vtktg_1.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| _ic_vtks_1.equal(&true))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSequal) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| _ic_vtktg_1.equal(&false))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| _ic_vtktg_1.equal(&false))) && (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)).implies(|| _ic_vtktg_1.equal(&false))) && self.ObstacleStatusJustChanged.equal(&true)) { + _ic_set_24.insert((_ic_vtks_1.clone(), _ic_vtktg_1.clone())); + } + + } + } + self._tr_cache_VehicleManageObstacle = Option::Some(_ic_set_24.clone()); + return _ic_set_24; + } else { + return self._tr_cache_VehicleManageObstacle.as_ref().unwrap().clone(); + } + } + + 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(&true) && (((self.VehicleTryKeepSpeed.equal(&true) || self.VehicleTryKeepTimeGap.equal(&true)) || self.CCInitialisationInProgress.equal(&true)) || self.CruiseSpeedChangeInProgress.equal(&true))) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone).implies(|| self.VehicleTryKeepSpeed.equal(&true))) && (((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepTimeGap.equal(&true))) && (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).implies(|| self.VehicleTryKeepSpeed.equal(&true))); + self._tr_cache_ObstacleBecomesOld = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_ObstacleBecomesOld.as_ref().unwrap().clone(); + } + } + + pub fn _check_inv_1(&self) -> bool { + //invariant + return BOOL.elementOf(&self.CruiseAllowed); + } + + pub fn _check_inv_2(&self) -> bool { + //invariant + return BOOL.elementOf(&self.CruiseActive); + } + + pub fn _check_inv_3(&self) -> bool { + //invariant + return BOOL.elementOf(&self.VehicleAtCruiseSpeed); + } + + pub fn _check_inv_4(&self) -> bool { + //invariant + return BOOL.elementOf(&self.VehicleCanKeepSpeed); + } + + pub fn _check_inv_5(&self) -> bool { + //invariant + return BOOL.elementOf(&self.VehicleTryKeepSpeed); + } + + pub fn _check_inv_6(&self) -> bool { + //invariant + return BOOL.elementOf(&self.SpeedAboveMax); + } + + pub fn _check_inv_7(&self) -> bool { + //invariant + return BOOL.elementOf(&self.VehicleTryKeepTimeGap); + } + + pub fn _check_inv_8(&self) -> bool { + //invariant + return BOOL.elementOf(&self.CruiseSpeedAtMax); + } + + pub fn _check_inv_9(&self) -> bool { + //invariant + return self.NumberOfSetCruise.isNatural(); + } + + pub fn _check_inv_10(&self) -> bool { + //invariant + return set_BInteger::interval(&0, &1).elementOf(&self.NumberOfSetCruise); + } + + pub fn _check_inv_11(&self) -> bool { + //invariant + return BOOL.elementOf(&self.ObstaclePresent); + } + + pub fn _check_inv_12(&self) -> bool { + //invariant + return self._ODset.elementOf(&self.ObstacleDistance); + } + + pub fn _check_inv_13(&self) -> bool { + //invariant + return self._RSset.elementOf(&self.ObstacleRelativeSpeed); + } + + pub fn _check_inv_14(&self) -> bool { + //invariant + return BOOL.elementOf(&self.ObstacleStatusJustChanged); + } + + pub fn _check_inv_15(&self) -> bool { + //invariant + return BOOL.elementOf(&self.CCInitialisationInProgress); + } + + pub fn _check_inv_16(&self) -> bool { + //invariant + return BOOL.elementOf(&self.CruiseSpeedChangeInProgress); + } + + pub fn _check_inv_17(&self) -> bool { + //invariant + return self.CruiseActive.equal(&false).implies(|| self.VehicleAtCruiseSpeed.equal(&false)); + } + + pub fn _check_inv_18(&self) -> bool { + //invariant + return self.CruiseActive.equal(&false).implies(|| self.VehicleCanKeepSpeed.equal(&false)); + } + + pub fn _check_inv_19(&self) -> bool { + //invariant + return self.CruiseActive.equal(&false).implies(|| self.VehicleTryKeepSpeed.equal(&false)); + } + + pub fn _check_inv_20(&self) -> bool { + //invariant + return self.NumberOfSetCruise.equal(&0).equivalent(&self.CruiseActive.equal(&false)); + } + + pub fn _check_inv_21(&self) -> bool { + //invariant + return self.CruiseActive.equal(&false).implies(|| self.VehicleTryKeepTimeGap.equal(&false)); + } + + pub fn _check_inv_22(&self) -> bool { + //invariant + return self.CruiseActive.equal(&false).implies(|| self.CruiseSpeedAtMax.equal(&false)); + } + + pub fn _check_inv_23(&self) -> bool { + //invariant + return self.CruiseActive.equal(&false).implies(|| self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)); + } + + pub fn _check_inv_24(&self) -> bool { + //invariant + return self.CruiseActive.equal(&false).implies(|| self.ObstacleStatusJustChanged.equal(&false)); + } + + pub fn _check_inv_25(&self) -> bool { + //invariant + return self.CruiseActive.equal(&false).implies(|| self.CCInitialisationInProgress.equal(&false)); + } + + pub fn _check_inv_26(&self) -> bool { + //invariant + return self.CruiseActive.equal(&false).implies(|| self.CruiseSpeedChangeInProgress.equal(&false)); + } + + pub fn _check_inv_27(&self) -> bool { + //invariant + return self.ObstaclePresent.equal(&false).implies(|| self.VehicleTryKeepTimeGap.equal(&false)); + } + + pub fn _check_inv_28(&self) -> bool { + //invariant + return self.ObstaclePresent.equal(&false).implies(|| self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)); + } + + pub fn _check_inv_29(&self) -> bool { + //invariant + return self.ObstaclePresent.equal(&false).equivalent(&self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSnone)); + } + + pub fn _check_inv_30(&self) -> bool { + //invariant + return (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSequal) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| self.VehicleTryKeepTimeGap.equal(&false)); + } + + pub fn _check_inv_31(&self) -> bool { + //invariant + return (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSneg) && self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone)).implies(|| self.VehicleTryKeepTimeGap.equal(&false)); + } + + pub fn _check_inv_32(&self) -> bool { + //invariant + return (self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)).implies(|| self.VehicleTryKeepTimeGap.equal(&false)); + } + + pub fn _check_inv_33(&self) -> bool { + //invariant + return self.CruiseAllowed.equal(&false).implies(|| self.CruiseActive.equal(&false)); + } + + pub fn _check_inv_34(&self) -> bool { + //invariant + return self.SpeedAboveMax.equal(&true).implies(|| self.VehicleAtCruiseSpeed.equal(&false)); + } + + pub fn _check_inv_35(&self) -> bool { + //invariant + return self.CruiseActive.equal(&true).implies(|| ((self.VehicleTryKeepSpeed.equal(&true) || self.VehicleTryKeepTimeGap.equal(&true)) || ((self.ObstacleStatusJustChanged.equal(&false) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false)).not())); + } + + pub fn _check_inv_36(&self) -> bool { + //invariant + return ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODnone) && self.CruiseActive.equal(&true)) && ((self.ObstacleStatusJustChanged.equal(&false) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false))).implies(|| self.VehicleTryKeepSpeed.equal(&true)); + } + + pub fn _check_inv_37(&self) -> bool { + //invariant + return ((self.ObstacleDistance.equal(&/*enum_call*/ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&/*enum_call*/RSset::RSpos)) && ((self.ObstacleStatusJustChanged.equal(&false) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false))).implies(|| self.VehicleTryKeepTimeGap.equal(&true)); + } + + pub fn _check_inv_38(&self) -> bool { + //invariant + return (self.ObstacleDistance.equal(&/*enum_call*/ODset::ODveryclose) && ((self.ObstacleStatusJustChanged.equal(&false) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false))).implies(|| self.VehicleTryKeepTimeGap.equal(&true)); + } + + pub fn _check_inv_39(&self) -> bool { + //invariant + return (((self.ObstacleRelativeSpeed.equal(&/*enum_call*/RSset::RSpos) && self.ObstacleDistance.unequal(&/*enum_call*/ODset::ODveryclose)) && self.CruiseActive.equal(&true)) && ((self.ObstacleStatusJustChanged.equal(&false) && self.CCInitialisationInProgress.equal(&false)) && self.CruiseSpeedChangeInProgress.equal(&false))).implies(|| self.VehicleTryKeepSpeed.equal(&true)); + } + + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { + //calling the given functions without caching will recalculate them and cache them afterwards + 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);}, + "_tr_CCInitialisationFinished" => {self._tr_CCInitialisationFinished(false);}, + "_tr_CCInitialisationDelayFinished" => {self._tr_CCInitialisationDelayFinished(false);}, + "_tr_CruiseSpeedChangeFinished" => {self._tr_CruiseSpeedChangeFinished(false);}, + "_tr_CruiseSpeedChangeDelayFinished" => {self._tr_CruiseSpeedChangeDelayFinished(false);}, + "_tr_CruiseOff" => {self._tr_CruiseOff(false);}, + "_tr_ExternalForcesBecomesExtreme" => {self._tr_ExternalForcesBecomesExtreme(false);}, + "_tr_ExternalForcesBecomesNormal" => {self._tr_ExternalForcesBecomesNormal(false);}, + "_tr_VehicleLeavesCruiseSpeed" => {self._tr_VehicleLeavesCruiseSpeed(false);}, + "_tr_VehicleReachesCruiseSpeed" => {self._tr_VehicleReachesCruiseSpeed(false);}, + "_tr_VehicleExceedsMaxCruiseSpeed" => {self._tr_VehicleExceedsMaxCruiseSpeed(false);}, + "_tr_VehicleFallsBelowMaxCruiseSpeed" => {self._tr_VehicleFallsBelowMaxCruiseSpeed(false);}, + "_tr_ObstacleDistanceBecomesVeryClose" => {self._tr_ObstacleDistanceBecomesVeryClose(false);}, + "_tr_ObstacleDistanceBecomesClose" => {self._tr_ObstacleDistanceBecomesClose(false);}, + "_tr_ObstacleDistanceBecomesBig" => {self._tr_ObstacleDistanceBecomesBig(false);}, + "_tr_ObstacleStartsTravelFaster" => {self._tr_ObstacleStartsTravelFaster(false);}, + "_tr_ObstacleStopsTravelFaster" => {self._tr_ObstacleStopsTravelFaster(false);}, + "_tr_ObstacleStartsTravelSlower" => {self._tr_ObstacleStartsTravelSlower(false);}, + "_tr_ObstacleStopsTravelSlower" => {self._tr_ObstacleStopsTravelSlower(false);}, + "_tr_ObstacleAppearsWhenCruiseActive" => {self._tr_ObstacleAppearsWhenCruiseActive(false);}, + "_tr_ObstacleAppearsWhenCruiseInactive" => {self._tr_ObstacleAppearsWhenCruiseInactive(false);}, + "_tr_ObstacleDisappears" => {self._tr_ObstacleDisappears(false);}, + "_tr_VehicleManageObstacle" => {self._tr_VehicleManageObstacle(false);}, + "_tr_ObstacleBecomesOld" => {self._tr_ObstacleBecomesOld(false);}, + _ => {}, + } + } + } + + //model_check_next_states + fn generateNextStates(state: &mut Cruise_finite1_deterministic_MC, + isCaching: bool, + 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; + } + + + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); + return result; + } + + //model_check_invariants + 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 !state._check_inv_1() { + println!("_check_inv_1 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_3() { + println!("_check_inv_3 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_5() { + println!("_check_inv_5 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_7() { + println!("_check_inv_7 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_9() { + println!("_check_inv_9 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_11() { + println!("_check_inv_11 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_13() { + println!("_check_inv_13 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_15() { + println!("_check_inv_15 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_17() { + println!("_check_inv_17 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_19() { + println!("_check_inv_19 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_21() { + println!("_check_inv_21 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_23() { + println!("_check_inv_23 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_25() { + println!("_check_inv_25 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_27() { + println!("_check_inv_27 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_29() { + println!("_check_inv_29 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_31() { + println!("_check_inv_31 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_33() { + println!("_check_inv_33 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_35() { + println!("_check_inv_35 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_37() { + println!("_check_inv_37 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_39() { + println!("_check_inv_39 failed!"); + return false; + } + } + return true; + } + return !(!state._check_inv_1() || !state._check_inv_2() || !state._check_inv_3() || !state._check_inv_4() || !state._check_inv_5() || !state._check_inv_6() || !state._check_inv_7() || !state._check_inv_8() || !state._check_inv_9() || !state._check_inv_10() || !state._check_inv_11() || !state._check_inv_12() || !state._check_inv_13() || !state._check_inv_14() || !state._check_inv_15() || !state._check_inv_16() || !state._check_inv_17() || !state._check_inv_18() || !state._check_inv_19() || !state._check_inv_20() || !state._check_inv_21() || !state._check_inv_22() || !state._check_inv_23() || !state._check_inv_24() || !state._check_inv_25() || !state._check_inv_26() || !state._check_inv_27() || !state._check_inv_28() || !state._check_inv_29() || !state._check_inv_30() || !state._check_inv_31() || !state._check_inv_32() || !state._check_inv_33() || !state._check_inv_34() || !state._check_inv_35() || !state._check_inv_36() || !state._check_inv_37() || !state._check_inv_38() || !state._check_inv_39()); + } + + //model_check_print + 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, &'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(), + MC_TYPE::DFS => collection.pop_back().unwrap(), + MC_TYPE::MIXED => if collection.len() % 2 == 0 { collection.pop_front().unwrap() } else { collection.pop_back().unwrap() } + }; + } + + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "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 + "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 + "VehicleLeavesCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"], + //model_check_init_static + "VehicleFallsBelowMaxCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"], + //model_check_init_static + "CCInitialisationFinished" => vec!["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"], + //model_check_init_static + "VehicleReachesCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"], + //model_check_init_static + "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 + "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 + "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 + "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 + "CCInitialisationDelayFinished" => vec!["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"], + //model_check_init_static + "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 + "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 + "ExternalForcesBecomesExtreme" => vec!["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"], + //model_check_init_static + "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 + "CruiseSpeedChangeDelayFinished" => vec!["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"], + //model_check_init_static + "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 + "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 + "VehicleManageObstacle" => vec!["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"], + //model_check_init_static + "CruiseBecomesAllowed" => vec!["_tr_SetCruiseSpeed", "_tr_CruiseBecomesAllowed", "_tr_CruiseBecomesNotAllowed"], + //model_check_init_static + "VehicleExceedsMaxCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"], + //model_check_init_static + "CruiseSpeedChangeFinished" => vec!["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"], + //model_check_init_static + "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 + "ExternalForcesBecomesNormal" => vec!["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"], + //model_check_init_static + "ObstacleBecomesOld" => vec!["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"], + //model_check_init_static + "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 + "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 + "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 + "VehicleLeavesCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_34"], + //model_check_init_static + "VehicleFallsBelowMaxCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"], + //model_check_init_static + "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 + "VehicleReachesCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_34"], + //model_check_init_static + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "ExternalForcesBecomesExtreme" => vec!["_check_inv_18", "_check_inv_4"], + //model_check_init_static + "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 + "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 + "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 + "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 + "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 + "CruiseBecomesAllowed" => vec!["_check_inv_1", "_check_inv_33"], + //model_check_init_static + "VehicleExceedsMaxCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"], + //model_check_init_static + "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 + "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 + "ExternalForcesBecomesNormal" => vec!["_check_inv_18", "_check_inv_4"], + //model_check_init_static + "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 + "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![], + } + } + + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool, no_dead: bool, no_inv: bool) { + let mut machine = Cruise_finite1_deterministic_MC::new(); + + let mut all_states = HashSet::<Cruise_finite1_deterministic_MC>::new(); + all_states.insert(machine.clone()); + + 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(), "")); + + 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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } + if !no_dead && next_states.is_empty() { + print!("DEADLOCK DETECTED"); + stop_threads = true; + } + + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + + fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool, no_dead: bool, no_inv: bool) { + let threadPool = ThreadPool::new(threads); + + let machine = Cruise_finite1_deterministic_MC::new(); + + let all_states = Arc::new(DashSet::<Cruise_finite1_deterministic_MC>::new()); + all_states.insert(machine.clone()); + + 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 num_transitions = Arc::new(AtomicU64::new(0)); + + 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 && !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 = 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, transitions); + if !no_dead && next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } + + //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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } + //println!("Thread {:?} done", thread::current().id()); + let _ = tx.send(Ok(1)); + }); + + 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()); + match rx.try_recv() { + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + +} + + +fn main() { + let args: Vec<String> = env::args().collect(); + if args.len() < 4 { panic!("Number of arguments errorneous"); } + + let threads = args.get(2).unwrap().parse::<usize>().unwrap(); + if threads <= 0 { panic!("Input for number of threads is wrong."); } + + let is_caching = args.get(3).unwrap().parse::<bool>().unwrap(); + let mc_type = match args.get(1).unwrap().as_str() { + "mixed" => MC_TYPE::MIXED, + "bf" => MC_TYPE::BFS, + "df" => MC_TYPE::DFS, + _ => panic!("Input for strategy is wrong.") + }; + + let mut no_dead = false; + let mut no_inv = false; + + if args.len() > 4 { + for arg in args.iter().skip(4) { + match arg.as_str() { + "-nodead" => no_dead = true, + "-noinv" => no_inv = true, + _ => {} + } + } + } + + if threads == 1 { + Cruise_finite1_deterministic_MC::model_check_single_threaded(mc_type, is_caching, no_dead, no_inv); + } else { + Cruise_finite1_deterministic_MC::modelCheckMultiThreaded(mc_type, threads, is_caching, no_dead, no_inv); + } +} diff --git a/benchmarks/model_checking/Rust_embedded/LandingGear_R6.rs b/benchmarks/model_checking/Rust_embedded/LandingGear_R6.rs new file mode 100644 index 000000000..9869748f8 --- /dev/null +++ b/benchmarks/model_checking/Rust_embedded/LandingGear_R6.rs @@ -0,0 +1,2717 @@ +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] +//#![no_std] //std is enabled for the generated machine by default, since without it there is no println which makes unit-testing very difficult +use btypes::{bset, brel}; +use btypes::bset::BSet; +use btypes::bset::SetItem; +use btypes::bset::PowSetItem; +use btypes::bset::PowAble; +use btypes::bset::NestedSet; +use btypes::brelation::BRelation; +use btypes::brelation::RelLeftItem; +use btypes::brelation::RelPowAble; +use btypes::bboolean::BBoolean; +use btypes::bboolean::BBool; +use btypes::bboolean::BOOL; +use btypes::binteger::BInteger; +use btypes::binteger::BInt; +use btypes::binteger::set_BInteger; +use btypes::btuple::BTuple; + +use std::env; +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}; + + + +#[derive(Clone, Copy)] +pub enum MC_TYPE { BFS, DFS, MIXED } + + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum DOOR_STATE { + #[default] + open = 0, + closed = 1, + door_moving = 2 +} + +impl DOOR_STATE { + pub fn equal(&self, other: &DOOR_STATE) -> bool { *self == *other } + pub fn unequal(&self, other: &DOOR_STATE) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::open, + 1 => Self::closed, + 2 => Self::door_moving, + _ => panic!("DOOR_STATE index out of range! {:?}", idx) + } + } +} + +impl SetItem<3> for DOOR_STATE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_DOOR_STATE = BSet<DOOR_STATE, 3>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum GEAR_STATE { + #[default] + retracted = 0, + extended = 1, + gear_moving = 2 +} + +impl GEAR_STATE { + pub fn equal(&self, other: &GEAR_STATE) -> bool { *self == *other } + pub fn unequal(&self, other: &GEAR_STATE) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::retracted, + 1 => Self::extended, + 2 => Self::gear_moving, + _ => panic!("GEAR_STATE index out of range! {:?}", idx) + } + } +} + +impl SetItem<3> for GEAR_STATE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_GEAR_STATE = BSet<GEAR_STATE, 3>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum HANDLE_STATE { + #[default] + up = 0, + down = 1 +} + +impl HANDLE_STATE { + pub fn equal(&self, other: &HANDLE_STATE) -> bool { *self == *other } + pub fn unequal(&self, other: &HANDLE_STATE) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::up, + 1 => Self::down, + _ => panic!("HANDLE_STATE index out of range! {:?}", idx) + } + } +} + +impl SetItem<2> for HANDLE_STATE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_HANDLE_STATE = BSet<HANDLE_STATE, 2>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum POSITION { + #[default] + fr = 0, + lt = 1, + rt = 2 +} + +impl POSITION { + pub fn equal(&self, other: &POSITION) -> bool { *self == *other } + pub fn unequal(&self, other: &POSITION) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::fr, + 1 => Self::lt, + 2 => Self::rt, + _ => panic!("POSITION index out of range! {:?}", idx) + } + } +} + +impl SetItem<3> for POSITION { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_POSITION = BSet<POSITION, 3>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SWITCH_STATE { + #[default] + switch_open = 0, + switch_closed = 1 +} + +impl SWITCH_STATE { + pub fn equal(&self, other: &SWITCH_STATE) -> bool { *self == *other } + pub fn unequal(&self, other: &SWITCH_STATE) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::switch_open, + 1 => Self::switch_closed, + _ => panic!("SWITCH_STATE index out of range! {:?}", idx) + } + } +} + +impl SetItem<2> for SWITCH_STATE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_SWITCH_STATE = BSet<SWITCH_STATE, 2>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum PLANE_STATE { + #[default] + ground = 0, + flight = 1 +} + +impl PLANE_STATE { + pub fn equal(&self, other: &PLANE_STATE) -> bool { *self == *other } + pub fn unequal(&self, other: &PLANE_STATE) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::ground, + 1 => Self::flight, + _ => panic!("PLANE_STATE index out of range! {:?}", idx) + } + } +} + +impl SetItem<2> for PLANE_STATE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_PLANE_STATE = BSet<PLANE_STATE, 2>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum VALVE_STATE { + #[default] + valve_open = 0, + valve_closed = 1 +} + +impl VALVE_STATE { + pub fn equal(&self, other: &VALVE_STATE) -> bool { *self == *other } + pub fn unequal(&self, other: &VALVE_STATE) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::valve_open, + 1 => Self::valve_closed, + _ => panic!("VALVE_STATE index out of range! {:?}", idx) + } + } +} + +impl SetItem<2> for VALVE_STATE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_VALVE_STATE = BSet<VALVE_STATE, 2>; +//set_enum_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum POSITION_X_DOOR_STATE { + #[default] + fr_open = 0, + fr_closed = 1, + fr_door_moving = 2, + lt_open = 3, + lt_closed = 4, + lt_door_moving = 5, + rt_open = 6, + rt_closed = 7, + rt_door_moving = 8 +} +type rel_POSITION_X_DOOR_STATE = BRelation<POSITION, { POSITION::VARIANTS }, DOOR_STATE, { DOOR_STATE::VARIANTS }, 9>; +//relation_declaration done + + + + + + + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum POSITION_X_GEAR_STATE { + #[default] + fr_retracted = 0, + fr_extended = 1, + fr_gear_moving = 2, + lt_retracted = 3, + lt_extended = 4, + lt_gear_moving = 5, + rt_retracted = 6, + rt_extended = 7, + rt_gear_moving = 8 +} +type rel_POSITION_X_GEAR_STATE = BRelation<POSITION, { POSITION::VARIANTS }, GEAR_STATE, { GEAR_STATE::VARIANTS }, 9>; +//relation_declaration done + + + + + + + +//enum_set_declaration start +#[derive(Default, Debug, Clone, Copy)] +// each enum value corresponds to one BSet +pub enum SetGEAR_STATE { + #[default] + SET_SET__TES_TES = 0, + SET_SET_retracted_TES_TES = 1, + SET_SET_extended_TES_TES = 2, + SET_SET_retracted__extended_TES_TES = 3, + SET_SET_gear_moving_TES_TES = 4, + SET_SET_retracted__gear_moving_TES_TES = 5, + SET_SET_extended__gear_moving_TES_TES = 6, + SET_SET_retracted__extended__gear_moving_TES_TES = 7 +} +type set_SetGEAR_STATE = BSet<set_GEAR_STATE, 8>; + +impl PowSetItem<8, 3> for GEAR_STATE { + type SetRepr = SetGEAR_STATE; + fn arr_to_idx(set: [bool; 3]) -> usize { + match set { + [false, false, false] => 0, + [true, false, false] => 1, + [false, true, false] => 2, + [true, true, false] => 3, + [false, false, true] => 4, + [true, false, true] => 5, + [false, true, true] => 6, + [true, true, true] => 7, + _ => panic!("Attempting to convert non-existing set to index!") // only happens if this is a const-set and code-generation missed a necessary value + } + } + fn idx_to_arr(idx: usize) -> [bool; 3] { + match idx { + 0 => [false, false, false], + 1 => [true, false, false], + 2 => [false, true, false], + 3 => [true, true, false], + 4 => [false, false, true], + 5 => [true, false, true], + 6 => [false, true, true], + 7 => [true, true, true], + _ => panic!("SetGEAR_STATE index out of range! {:?}", idx) + } + } +} +impl SetGEAR_STATE { + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::SET_SET__TES_TES, + 1 => Self::SET_SET_retracted_TES_TES, + 2 => Self::SET_SET_extended_TES_TES, + 3 => Self::SET_SET_retracted__extended_TES_TES, + 4 => Self::SET_SET_gear_moving_TES_TES, + 5 => Self::SET_SET_retracted__gear_moving_TES_TES, + 6 => Self::SET_SET_extended__gear_moving_TES_TES, + 7 => Self::SET_SET_retracted__extended__gear_moving_TES_TES, + _ => panic!("SetGEAR_STATE index out of range! {:?}", idx) + } + } +} + +impl SetItem<8> for SetGEAR_STATE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +//enum_set_declaration done + +//enum_set_declaration start +#[derive(Default, Debug, Clone, Copy)] +// each enum value corresponds to one BSet +pub enum SetDOOR_STATE { + #[default] + SET_SET__TES_TES = 0, + SET_SET_open_TES_TES = 1, + SET_SET_closed_TES_TES = 2, + SET_SET_open__closed_TES_TES = 3, + SET_SET_door_moving_TES_TES = 4, + SET_SET_open__door_moving_TES_TES = 5, + SET_SET_closed__door_moving_TES_TES = 6, + SET_SET_open__closed__door_moving_TES_TES = 7 +} +type set_SetDOOR_STATE = BSet<set_DOOR_STATE, 8>; + +impl PowSetItem<8, 3> for DOOR_STATE { + type SetRepr = SetDOOR_STATE; + fn arr_to_idx(set: [bool; 3]) -> usize { + match set { + [false, false, false] => 0, + [true, false, false] => 1, + [false, true, false] => 2, + [true, true, false] => 3, + [false, false, true] => 4, + [true, false, true] => 5, + [false, true, true] => 6, + [true, true, true] => 7, + _ => panic!("Attempting to convert non-existing set to index!") // only happens if this is a const-set and code-generation missed a necessary value + } + } + fn idx_to_arr(idx: usize) -> [bool; 3] { + match idx { + 0 => [false, false, false], + 1 => [true, false, false], + 2 => [false, true, false], + 3 => [true, true, false], + 4 => [false, false, true], + 5 => [true, false, true], + 6 => [false, true, true], + 7 => [true, true, true], + _ => panic!("SetDOOR_STATE index out of range! {:?}", idx) + } + } +} +impl SetDOOR_STATE { + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::SET_SET__TES_TES, + 1 => Self::SET_SET_open_TES_TES, + 2 => Self::SET_SET_closed_TES_TES, + 3 => Self::SET_SET_open__closed_TES_TES, + 4 => Self::SET_SET_door_moving_TES_TES, + 5 => Self::SET_SET_open__door_moving_TES_TES, + 6 => Self::SET_SET_closed__door_moving_TES_TES, + 7 => Self::SET_SET_open__closed__door_moving_TES_TES, + _ => panic!("SetDOOR_STATE index out of range! {:?}", idx) + } + } +} + +impl SetItem<8> for SetDOOR_STATE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +//enum_set_declaration done + +//enum_set_declaration start +#[derive(Default, Debug, Clone, Copy)] +// each enum value corresponds to one BSet +pub enum SetPOSITION { + #[default] + SET_SET__TES_TES = 0, + SET_SET_fr_TES_TES = 1, + SET_SET_lt_TES_TES = 2, + SET_SET_fr__lt_TES_TES = 3, + SET_SET_rt_TES_TES = 4, + SET_SET_fr__rt_TES_TES = 5, + SET_SET_lt__rt_TES_TES = 6, + SET_SET_fr__lt__rt_TES_TES = 7 +} +type set_SetPOSITION = BSet<set_POSITION, 8>; + +impl PowSetItem<8, 3> for POSITION { + type SetRepr = SetPOSITION; + fn arr_to_idx(set: [bool; 3]) -> usize { + match set { + [false, false, false] => 0, + [true, false, false] => 1, + [false, true, false] => 2, + [true, true, false] => 3, + [false, false, true] => 4, + [true, false, true] => 5, + [false, true, true] => 6, + [true, true, true] => 7, + _ => panic!("Attempting to convert non-existing set to index!") // only happens if this is a const-set and code-generation missed a necessary value + } + } + fn idx_to_arr(idx: usize) -> [bool; 3] { + match idx { + 0 => [false, false, false], + 1 => [true, false, false], + 2 => [false, true, false], + 3 => [true, true, false], + 4 => [false, false, true], + 5 => [true, false, true], + 6 => [false, true, true], + 7 => [true, true, true], + _ => panic!("SetPOSITION index out of range! {:?}", idx) + } + } +} +impl SetPOSITION { + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::SET_SET__TES_TES, + 1 => Self::SET_SET_fr_TES_TES, + 2 => Self::SET_SET_lt_TES_TES, + 3 => Self::SET_SET_fr__lt_TES_TES, + 4 => Self::SET_SET_rt_TES_TES, + 5 => Self::SET_SET_fr__rt_TES_TES, + 6 => Self::SET_SET_lt__rt_TES_TES, + 7 => Self::SET_SET_fr__lt__rt_TES_TES, + _ => panic!("SetPOSITION index out of range! {:?}", idx) + } + } +} + +impl SetItem<8> for SetPOSITION { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +//enum_set_declaration done + +#[derive(Derivative)] +#[derivative(Clone, Default, Debug, Hash, PartialEq, Eq)] +pub struct LandingGear_R6 { + /*declarations*/analogical_switch: SWITCH_STATE, + general_EV: BBoolean, + general_valve: VALVE_STATE, + handle_move: BBoolean, + close_EV: BBoolean, + extend_EV: BBoolean, + open_EV: BBoolean, + retract_EV: BBoolean, + shock_absorber: PLANE_STATE, + valve_close_door: VALVE_STATE, + valve_extend_gear: VALVE_STATE, + valve_open_door: VALVE_STATE, + valve_retract_gear: VALVE_STATE, + doors: rel_POSITION_X_DOOR_STATE, + gears: rel_POSITION_X_GEAR_STATE, + handle: HANDLE_STATE, + door: DOOR_STATE, + gear: GEAR_STATE, + /*sets*//*set_declaration*/_DOOR_STATE: set_DOOR_STATE, + /*set_declaration*/_GEAR_STATE: set_GEAR_STATE, + /*set_declaration*/_HANDLE_STATE: set_HANDLE_STATE, + /*set_declaration*/_POSITION: set_POSITION, + /*set_declaration*/_SWITCH_STATE: set_SWITCH_STATE, + /*set_declaration*/_PLANE_STATE: set_PLANE_STATE, + /*set_declaration*/_VALVE_STATE: set_VALVE_STATE, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_begin_flying: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_land_plane: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_open_valve_door_open: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_close_valve_door_open: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_open_valve_door_close: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_close_valve_door_close: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_open_valve_retract_gear: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_close_valve_retract_gear: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_open_valve_extend_gear: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_close_valve_extend_gear: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_con_stimulate_open_door_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_con_stop_stimulate_open_door_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_con_stimulate_close_door_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_con_stop_stimulate_close_door_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_con_stimulate_retract_gear_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_con_stop_stimulate_retract_gear_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_con_stimulate_extend_gear_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_con_stop_stimulate_extend_gear_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_start_retracting_first: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_retract_gear_skip: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_retract_gear_last: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_start_extending: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_extend_gear_last: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_extend_gear_skip: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_start_open_door: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_open_door_last: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_open_door_skip: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_start_close_door: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_close_door: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_close_door_skip: Option<HashSet<POSITION>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_toggle_handle_up: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_toggle_handle_down: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_con_stimulate_general_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_con_stop_stimulate_general_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_evn_open_general_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_evn_close_general_valve: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_close_analogical_switch: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_env_open_analogical_switch: Option<bool>,} + + +impl LandingGear_R6 { + + pub fn new() -> LandingGear_R6 { + //values: '' + let mut m: LandingGear_R6 = Default::default(); + m.init(); + return m; + } + fn init(&mut self) { + /*set_initializations*///set_initialization + self._DOOR_STATE = bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open, /*enum_call*/DOOR_STATE::closed, /*enum_call*/DOOR_STATE::door_moving]; + //set_initialization + self._GEAR_STATE = bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted, /*enum_call*/GEAR_STATE::extended, /*enum_call*/GEAR_STATE::gear_moving]; + //set_initialization + self._HANDLE_STATE = bset![HANDLE_STATE, /*enum_call*/HANDLE_STATE::up, /*enum_call*/HANDLE_STATE::down]; + //set_initialization + self._POSITION = bset![POSITION, /*enum_call*/POSITION::fr, /*enum_call*/POSITION::lt, /*enum_call*/POSITION::rt]; + //set_initialization + self._SWITCH_STATE = bset![SWITCH_STATE, /*enum_call*/SWITCH_STATE::switch_open, /*enum_call*/SWITCH_STATE::switch_closed]; + //set_initialization + self._PLANE_STATE = bset![PLANE_STATE, /*enum_call*/PLANE_STATE::ground, /*enum_call*/PLANE_STATE::flight]; + //set_initialization + self._VALVE_STATE = bset![VALVE_STATE, /*enum_call*/VALVE_STATE::valve_open, /*enum_call*/VALVE_STATE::valve_closed]; + /*properties*/ + /*body*/self.gears = rel_POSITION_X_GEAR_STATE::cartesian_product(&self._POSITION, &bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]).clone().clone(); + self.doors = rel_POSITION_X_DOOR_STATE::cartesian_product(&self._POSITION, &bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed]).clone().clone(); + self.handle = /*enum_call*/HANDLE_STATE::down; + self.valve_extend_gear = /*enum_call*/VALVE_STATE::valve_closed; + self.valve_retract_gear = /*enum_call*/VALVE_STATE::valve_closed; + self.valve_open_door = /*enum_call*/VALVE_STATE::valve_closed; + self.valve_close_door = /*enum_call*/VALVE_STATE::valve_closed; + self.open_EV = false; + self.close_EV = false; + self.retract_EV = false; + self.extend_EV = false; + self.shock_absorber = /*enum_call*/PLANE_STATE::ground; + self.general_EV = false; + self.general_valve = /*enum_call*/VALVE_STATE::valve_closed; + self.analogical_switch = /*enum_call*/SWITCH_STATE::switch_open; + self.handle_move = false; + self.gear = /*enum_call*/GEAR_STATE::extended; + self.door = /*enum_call*/DOOR_STATE::closed; + /*includesInitialization*/ + } + + pub fn get_analogical_switch(&self) -> SWITCH_STATE { + return self.analogical_switch.clone(); + } + + pub fn get_general_EV(&self) -> BBoolean { + return self.general_EV.clone(); + } + + pub fn get_general_valve(&self) -> VALVE_STATE { + return self.general_valve.clone(); + } + + pub fn get_handle_move(&self) -> BBoolean { + return self.handle_move.clone(); + } + + pub fn get_close_EV(&self) -> BBoolean { + return self.close_EV.clone(); + } + + pub fn get_extend_EV(&self) -> BBoolean { + return self.extend_EV.clone(); + } + + pub fn get_open_EV(&self) -> BBoolean { + return self.open_EV.clone(); + } + + pub fn get_retract_EV(&self) -> BBoolean { + return self.retract_EV.clone(); + } + + pub fn get_shock_absorber(&self) -> PLANE_STATE { + return self.shock_absorber.clone(); + } + + pub fn get_valve_close_door(&self) -> VALVE_STATE { + return self.valve_close_door.clone(); + } + + pub fn get_valve_extend_gear(&self) -> VALVE_STATE { + return self.valve_extend_gear.clone(); + } + + pub fn get_valve_open_door(&self) -> VALVE_STATE { + return self.valve_open_door.clone(); + } + + pub fn get_valve_retract_gear(&self) -> VALVE_STATE { + return self.valve_retract_gear.clone(); + } + + pub fn get_doors(&self) -> rel_POSITION_X_DOOR_STATE { + return self.doors.clone(); + } + + pub fn get_gears(&self) -> rel_POSITION_X_GEAR_STATE { + return self.gears.clone(); + } + + pub fn get_handle(&self) -> HANDLE_STATE { + return self.handle.clone(); + } + + pub fn get_door(&self) -> DOOR_STATE { + return self.door.clone(); + } + + pub fn get_gear(&self) -> GEAR_STATE { + return self.gear.clone(); + } + + pub fn get__DOOR_STATE(&self) -> set_DOOR_STATE { + return self._DOOR_STATE.clone(); + } + + pub fn get__GEAR_STATE(&self) -> set_GEAR_STATE { + return self._GEAR_STATE.clone(); + } + + pub fn get__HANDLE_STATE(&self) -> set_HANDLE_STATE { + return self._HANDLE_STATE.clone(); + } + + pub fn get__POSITION(&self) -> set_POSITION { + return self._POSITION.clone(); + } + + pub fn get__SWITCH_STATE(&self) -> set_SWITCH_STATE { + return self._SWITCH_STATE.clone(); + } + + pub fn get__PLANE_STATE(&self) -> set_PLANE_STATE { + return self._PLANE_STATE.clone(); + } + + pub fn get__VALVE_STATE(&self) -> set_VALVE_STATE { + return self._VALVE_STATE.clone(); + } + + pub fn begin_flying(&mut self) -> () { + //select + if self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground) { + self.shock_absorber = /*enum_call*/PLANE_STATE::flight; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn land_plane(&mut self) -> () { + //select + if self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::flight) { + self.shock_absorber = /*enum_call*/PLANE_STATE::ground; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn open_valve_door_open(&mut self) -> () { + //select + if (self.valve_open_door.equal(&/*enum_call*/VALVE_STATE::valve_closed) && self.open_EV.equal(&true)) { + self.valve_open_door = /*enum_call*/VALVE_STATE::valve_open; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn close_valve_door_open(&mut self) -> () { + //select + if (self.valve_open_door.equal(&/*enum_call*/VALVE_STATE::valve_open) && self.open_EV.equal(&false)) { + self.valve_open_door = /*enum_call*/VALVE_STATE::valve_closed; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn open_valve_door_close(&mut self) -> () { + //select + if (self.valve_close_door.equal(&/*enum_call*/VALVE_STATE::valve_closed) && self.close_EV.equal(&true)) { + self.valve_close_door = /*enum_call*/VALVE_STATE::valve_open; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn close_valve_door_close(&mut self) -> () { + //select + if (self.valve_close_door.equal(&/*enum_call*/VALVE_STATE::valve_open) && self.close_EV.equal(&false)) { + self.valve_close_door = /*enum_call*/VALVE_STATE::valve_closed; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn open_valve_retract_gear(&mut self) -> () { + //select + if (self.valve_retract_gear.equal(&/*enum_call*/VALVE_STATE::valve_closed) && self.retract_EV.equal(&true)) { + self.valve_retract_gear = /*enum_call*/VALVE_STATE::valve_open; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn close_valve_retract_gear(&mut self) -> () { + //select + if (self.valve_retract_gear.equal(&/*enum_call*/VALVE_STATE::valve_open) && self.retract_EV.equal(&false)) { + self.valve_retract_gear = /*enum_call*/VALVE_STATE::valve_closed; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn open_valve_extend_gear(&mut self) -> () { + //select + if (self.valve_extend_gear.equal(&/*enum_call*/VALVE_STATE::valve_closed) && self.extend_EV.equal(&true)) { + self.valve_extend_gear = /*enum_call*/VALVE_STATE::valve_open; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn close_valve_extend_gear(&mut self) -> () { + //select + if (self.valve_extend_gear.equal(&/*enum_call*/VALVE_STATE::valve_open) && self.extend_EV.equal(&false)) { + self.valve_extend_gear = /*enum_call*/VALVE_STATE::valve_closed; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn con_stimulate_open_door_valve(&mut self) -> () { + //select + if (((self.open_EV.equal(&false) && self.close_EV.equal(&false)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]).not()) || ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]).not()) && (self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open]) && self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground)).not()))) && self.general_EV.equal(&true)) { + self.open_EV = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn con_stop_stimulate_open_door_valve(&mut self) -> () { + //select + if ((((self.open_EV.equal(&true) && self.extend_EV.equal(&false)) && self.retract_EV.equal(&false)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) || ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground))) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])))) && self.general_EV.equal(&true)) { + self.open_EV = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn con_stimulate_close_door_valve(&mut self) -> () { + //select + if ((((((self.close_EV.equal(&false) && self.open_EV.equal(&false)) && self.extend_EV.equal(&false)) && self.retract_EV.equal(&false)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground))))) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed]).not()) && self.general_EV.equal(&true)) { + self.close_EV = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn con_stop_stimulate_close_door_valve(&mut self) -> () { + //select + if ((self.close_EV.equal(&true) && (((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) || ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground))) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])))) && self.general_EV.equal(&true)) { + self.close_EV = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn con_stimulate_retract_gear_valve(&mut self) -> () { + //select + if (((((((self.retract_EV.equal(&false) && self.extend_EV.equal(&false)) && self.open_EV.equal(&true)) && self.handle.equal(&/*enum_call*/HANDLE_STATE::up)) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]).not()) && self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::flight)) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && self.general_EV.equal(&true)) { + self.retract_EV = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn con_stop_stimulate_retract_gear_valve(&mut self) -> () { + //select + if ((self.retract_EV.equal(&true) && (self.handle.equal(&/*enum_call*/HANDLE_STATE::down) || self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]))) && self.general_EV.equal(&true)) { + self.retract_EV = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn con_stimulate_extend_gear_valve(&mut self) -> () { + //select + if ((((((self.extend_EV.equal(&false) && self.retract_EV.equal(&false)) && self.open_EV.equal(&true)) && self.handle.equal(&/*enum_call*/HANDLE_STATE::down)) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]).not()) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && self.general_EV.equal(&true)) { + self.extend_EV = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn con_stop_stimulate_extend_gear_valve(&mut self) -> () { + //select + if ((self.extend_EV.equal(&true) && (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) || self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]))) && self.general_EV.equal(&true)) { + self.extend_EV = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_start_retracting_first(&mut self, mut gr: POSITION) -> () { + //select + if (((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && self.handle.equal(&/*enum_call*/HANDLE_STATE::up)) && self.gears.functionCall(&gr).equal(&/*enum_call*/GEAR_STATE::extended)) && self.valve_retract_gear.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended, /*enum_call*/GEAR_STATE::gear_moving].elementOf(&self.gear)) && self.door.equal(&/*enum_call*/DOOR_STATE::open)) { + let mut _ld_gears = self.gears.clone(); + self.gears = _ld_gears._override(&brel![rel_POSITION_X_GEAR_STATE, (gr.clone(), /*enum_call*/GEAR_STATE::gear_moving.clone())]).clone().clone(); + self.gear = /*enum_call*/GEAR_STATE::gear_moving; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_retract_gear_skip(&mut self, mut gr: POSITION) -> () { + //select + if (((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && self.gears.relationImage(&self._POSITION.difference(&bset![POSITION, gr])).unequal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) && self.handle.equal(&/*enum_call*/HANDLE_STATE::up)) && self.gears.functionCall(&gr).equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) { + self.gears = self.gears._override(&brel![rel_POSITION_X_GEAR_STATE, (gr.clone(), /*enum_call*/GEAR_STATE::retracted.clone())]).clone().clone(); + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_retract_gear_last(&mut self, mut gr: POSITION) -> () { + //select + if (((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && self.gears.relationImage(&self._POSITION.difference(&bset![POSITION, gr])).equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) && self.handle.equal(&/*enum_call*/HANDLE_STATE::up)) && self.gears.functionCall(&gr).equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.gear.equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.door.equal(&/*enum_call*/DOOR_STATE::open)) { + let mut _ld_gears = self.gears.clone(); + self.gears = _ld_gears._override(&brel![rel_POSITION_X_GEAR_STATE, (gr.clone(), /*enum_call*/GEAR_STATE::retracted.clone())]).clone().clone(); + self.gear = /*enum_call*/GEAR_STATE::retracted; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_start_extending(&mut self, mut gr: POSITION) -> () { + //select + if (((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && self.handle.equal(&/*enum_call*/HANDLE_STATE::down)) && self.gears.functionCall(&gr).equal(&/*enum_call*/GEAR_STATE::retracted)) && self.valve_extend_gear.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && bset![GEAR_STATE, /*enum_call*/GEAR_STATE::gear_moving, /*enum_call*/GEAR_STATE::retracted].elementOf(&self.gear)) && self.door.equal(&/*enum_call*/DOOR_STATE::open)) { + let mut _ld_gears = self.gears.clone(); + self.gears = _ld_gears._override(&brel![rel_POSITION_X_GEAR_STATE, (gr.clone(), /*enum_call*/GEAR_STATE::gear_moving.clone())]).clone().clone(); + self.gear = /*enum_call*/GEAR_STATE::gear_moving; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_extend_gear_last(&mut self, mut gr: POSITION) -> () { + //select + if (((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && self.handle.equal(&/*enum_call*/HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&bset![POSITION, gr])).equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) && self.gears.functionCall(&gr).equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.gear.equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.door.equal(&/*enum_call*/DOOR_STATE::open)) { + let mut _ld_gears = self.gears.clone(); + self.gears = _ld_gears._override(&brel![rel_POSITION_X_GEAR_STATE, (gr.clone(), /*enum_call*/GEAR_STATE::extended.clone())]).clone().clone(); + self.gear = /*enum_call*/GEAR_STATE::extended; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_extend_gear_skip(&mut self, mut gr: POSITION) -> () { + //select + if (((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && self.handle.equal(&/*enum_call*/HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&bset![POSITION, gr])).unequal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) && self.gears.functionCall(&gr).equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) { + self.gears = self.gears._override(&brel![rel_POSITION_X_GEAR_STATE, (gr.clone(), /*enum_call*/GEAR_STATE::extended.clone())]).clone().clone(); + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_start_open_door(&mut self, mut gr: POSITION) -> () { + //select + if (((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&/*enum_call*/DOOR_STATE::closed)) && self.gears.functionCall(&gr).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_open_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed, /*enum_call*/DOOR_STATE::door_moving].elementOf(&self.door)) && self.gear.unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gear.equal(&/*enum_call*/GEAR_STATE::retracted)) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gear.equal(&/*enum_call*/GEAR_STATE::extended)))) { + let mut _ld_doors = self.doors.clone(); + self.doors = _ld_doors._override(&brel![rel_POSITION_X_DOOR_STATE, (gr.clone(), /*enum_call*/DOOR_STATE::door_moving.clone())]).clone().clone(); + self.door = /*enum_call*/DOOR_STATE::door_moving; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_open_door_last(&mut self, mut gr: POSITION) -> () { + //select + if ((((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&/*enum_call*/DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&/*enum_call*/GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&bset![POSITION, gr])).equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_open_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.door.equal(&/*enum_call*/DOOR_STATE::door_moving)) && self.gear.unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gear.equal(&/*enum_call*/GEAR_STATE::retracted)) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gear.equal(&/*enum_call*/GEAR_STATE::extended)))) { + let mut _ld_doors = self.doors.clone(); + self.doors = _ld_doors._override(&brel![rel_POSITION_X_DOOR_STATE, (gr.clone(), /*enum_call*/DOOR_STATE::open.clone())]).clone().clone(); + self.door = /*enum_call*/DOOR_STATE::open; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_open_door_skip(&mut self, mut gr: POSITION) -> () { + //select + if (((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&/*enum_call*/DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&/*enum_call*/GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&bset![POSITION, gr])).unequal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_open_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) { + self.doors = self.doors._override(&brel![rel_POSITION_X_DOOR_STATE, (gr.clone(), /*enum_call*/DOOR_STATE::open.clone())]).clone().clone(); + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_start_close_door(&mut self, mut gr: POSITION) -> () { + //select + if ((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&/*enum_call*/DOOR_STATE::open)) && self.gears.functionCall(&gr).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]))) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_close_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && bset![DOOR_STATE, /*enum_call*/DOOR_STATE::door_moving, /*enum_call*/DOOR_STATE::open].elementOf(&self.door)) && self.gear.unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gear.equal(&/*enum_call*/GEAR_STATE::extended)) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended, /*enum_call*/GEAR_STATE::retracted].elementOf(&self.gear)))) { + let mut _ld_doors = self.doors.clone(); + self.doors = _ld_doors._override(&brel![rel_POSITION_X_DOOR_STATE, (gr.clone(), /*enum_call*/DOOR_STATE::door_moving.clone())]).clone().clone(); + self.door = /*enum_call*/DOOR_STATE::door_moving; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_close_door(&mut self, mut gr: POSITION) -> () { + //select + if (((((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&/*enum_call*/DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&/*enum_call*/GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&bset![POSITION, gr])).equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]))) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_close_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])).implies(|| self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground))) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.door.equal(&/*enum_call*/DOOR_STATE::door_moving)) && self.gear.unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gear.equal(&/*enum_call*/GEAR_STATE::extended)) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended, /*enum_call*/GEAR_STATE::retracted].elementOf(&self.gear)))) { + let mut _ld_doors = self.doors.clone(); + self.doors = _ld_doors._override(&brel![rel_POSITION_X_DOOR_STATE, (gr.clone(), /*enum_call*/DOOR_STATE::closed.clone())]).clone().clone(); + self.door = /*enum_call*/DOOR_STATE::closed; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_close_door_skip(&mut self, mut gr: POSITION) -> () { + //select + if ((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&/*enum_call*/DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&/*enum_call*/GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&bset![POSITION, gr])).unequal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]))) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_close_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])).implies(|| self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground))) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) { + self.doors = self.doors._override(&brel![rel_POSITION_X_DOOR_STATE, (gr.clone(), /*enum_call*/DOOR_STATE::closed.clone())]).clone().clone(); + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn toggle_handle_up(&mut self) -> () { + //select + if self.handle.equal(&/*enum_call*/HANDLE_STATE::down) { + self.handle = /*enum_call*/HANDLE_STATE::up; + self.handle_move = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn toggle_handle_down(&mut self) -> () { + //select + if self.handle.equal(&/*enum_call*/HANDLE_STATE::up) { + self.handle = /*enum_call*/HANDLE_STATE::down; + self.handle_move = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn con_stimulate_general_valve(&mut self) -> () { + //select + if (self.general_EV.equal(&false) && self.handle_move.equal(&true)) { + self.general_EV = true; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn con_stop_stimulate_general_valve(&mut self) -> () { + //select + if ((((((self.general_EV.equal(&true) && self.open_EV.equal(&false)) && self.close_EV.equal(&false)) && self.retract_EV.equal(&false)) && self.extend_EV.equal(&false)) && self.close_EV.equal(&false)) && (((((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) && self.open_EV.equal(&false)) || (((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) && self.open_EV.equal(&false))) || (((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) && self.open_EV.equal(&false)))) { + self.general_EV = false; + self.handle_move = false; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn evn_open_general_valve(&mut self) -> () { + //select + if ((self.general_EV.equal(&true) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_closed)) && self.analogical_switch.equal(&/*enum_call*/SWITCH_STATE::switch_closed)) { + self.general_valve = /*enum_call*/VALVE_STATE::valve_open; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn evn_close_general_valve(&mut self) -> () { + //select + if ((self.general_EV.equal(&false) || self.analogical_switch.equal(&/*enum_call*/SWITCH_STATE::switch_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) { + self.general_valve = /*enum_call*/VALVE_STATE::valve_closed; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_close_analogical_switch(&mut self) -> () { + //select + if (self.analogical_switch.equal(&/*enum_call*/SWITCH_STATE::switch_open) && self.handle_move.equal(&true)) { + self.analogical_switch = /*enum_call*/SWITCH_STATE::switch_closed; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn env_open_analogical_switch(&mut self) -> () { + //select + if self.analogical_switch.equal(&/*enum_call*/SWITCH_STATE::switch_closed) { + self.analogical_switch = /*enum_call*/SWITCH_STATE::switch_open; + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + } + + pub fn _tr_begin_flying(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_begin_flying.is_none() { + let mut __tmp__val__ = self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground); + self._tr_cache_begin_flying = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_begin_flying.as_ref().unwrap().clone(); + } + } + + pub fn _tr_land_plane(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_land_plane.is_none() { + let mut __tmp__val__ = self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::flight); + self._tr_cache_land_plane = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_land_plane.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/VALVE_STATE::valve_closed) && self.open_EV.equal(&true)); + self._tr_cache_open_valve_door_open = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_open_valve_door_open.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/VALVE_STATE::valve_open) && self.open_EV.equal(&false)); + self._tr_cache_close_valve_door_open = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_close_valve_door_open.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/VALVE_STATE::valve_closed) && self.close_EV.equal(&true)); + self._tr_cache_open_valve_door_close = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_open_valve_door_close.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/VALVE_STATE::valve_open) && self.close_EV.equal(&false)); + self._tr_cache_close_valve_door_close = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_close_valve_door_close.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/VALVE_STATE::valve_closed) && self.retract_EV.equal(&true)); + self._tr_cache_open_valve_retract_gear = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_open_valve_retract_gear.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/VALVE_STATE::valve_open) && self.retract_EV.equal(&false)); + self._tr_cache_close_valve_retract_gear = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_close_valve_retract_gear.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/VALVE_STATE::valve_closed) && self.extend_EV.equal(&true)); + self._tr_cache_open_valve_extend_gear = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_open_valve_extend_gear.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/VALVE_STATE::valve_open) && self.extend_EV.equal(&false)); + self._tr_cache_close_valve_extend_gear = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_close_valve_extend_gear.as_ref().unwrap().clone(); + } + } + + 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(&false) && self.close_EV.equal(&false)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]).not()) || ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]).not()) && (self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open]) && self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground)).not()))) && self.general_EV.equal(&true)); + self._tr_cache_con_stimulate_open_door_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_con_stimulate_open_door_valve.as_ref().unwrap().clone(); + } + } + + 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(&true) && self.extend_EV.equal(&false)) && self.retract_EV.equal(&false)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) || ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground))) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])))) && self.general_EV.equal(&true)); + self._tr_cache_con_stop_stimulate_open_door_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_con_stop_stimulate_open_door_valve.as_ref().unwrap().clone(); + } + } + + 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(&false) && self.open_EV.equal(&false)) && self.extend_EV.equal(&false)) && self.retract_EV.equal(&false)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground))))) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed]).not()) && self.general_EV.equal(&true)); + self._tr_cache_con_stimulate_close_door_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_con_stimulate_close_door_valve.as_ref().unwrap().clone(); + } + } + + 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(&true) && (((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) || ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground))) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])))) && self.general_EV.equal(&true)); + self._tr_cache_con_stop_stimulate_close_door_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_con_stop_stimulate_close_door_valve.as_ref().unwrap().clone(); + } + } + + 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(&false) && self.extend_EV.equal(&false)) && self.open_EV.equal(&true)) && self.handle.equal(&/*enum_call*/HANDLE_STATE::up)) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]).not()) && self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::flight)) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && self.general_EV.equal(&true)); + self._tr_cache_con_stimulate_retract_gear_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_con_stimulate_retract_gear_valve.as_ref().unwrap().clone(); + } + } + + 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(&true) && (self.handle.equal(&/*enum_call*/HANDLE_STATE::down) || self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]))) && self.general_EV.equal(&true)); + self._tr_cache_con_stop_stimulate_retract_gear_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_con_stop_stimulate_retract_gear_valve.as_ref().unwrap().clone(); + } + } + + 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(&false) && self.retract_EV.equal(&false)) && self.open_EV.equal(&true)) && self.handle.equal(&/*enum_call*/HANDLE_STATE::down)) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]).not()) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && self.general_EV.equal(&true)); + self._tr_cache_con_stimulate_extend_gear_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_con_stimulate_extend_gear_valve.as_ref().unwrap().clone(); + } + } + + 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(&true) && (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) || self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]))) && self.general_EV.equal(&true)); + self._tr_cache_con_stop_stimulate_extend_gear_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_con_stop_stimulate_extend_gear_valve.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_start_retracting_first(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_start_retracting_first.is_none() { + let mut _ic_set_18: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((((self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open]) && self.handle.equal(&/*enum_call*/HANDLE_STATE::up)) && self.gears.functionCall(&_ic_gr_1).equal(&/*enum_call*/GEAR_STATE::extended)) && self.valve_retract_gear.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended, /*enum_call*/GEAR_STATE::gear_moving].elementOf(&self.gear)) && self.door.equal(&/*enum_call*/DOOR_STATE::open)) { + _ic_set_18.insert(_ic_gr_1); + } + + } + self._tr_cache_env_start_retracting_first = Option::Some(_ic_set_18.clone()); + return _ic_set_18; + } else { + return self._tr_cache_env_start_retracting_first.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_retract_gear_skip(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_retract_gear_skip.is_none() { + let mut _ic_set_19: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open]) && self.gears.relationImage(&self._POSITION.difference(&bset![POSITION, _ic_gr_1])).unequal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) && self.handle.equal(&/*enum_call*/HANDLE_STATE::up)) && self.gears.functionCall(&_ic_gr_1).equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) { + _ic_set_19.insert(_ic_gr_1); + } + + } + self._tr_cache_env_retract_gear_skip = Option::Some(_ic_set_19.clone()); + return _ic_set_19; + } else { + return self._tr_cache_env_retract_gear_skip.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_retract_gear_last(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_retract_gear_last.is_none() { + let mut _ic_set_20: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((((self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open]) && self.gears.relationImage(&self._POSITION.difference(&bset![POSITION, _ic_gr_1])).equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) && self.handle.equal(&/*enum_call*/HANDLE_STATE::up)) && self.gears.functionCall(&_ic_gr_1).equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.gear.equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.door.equal(&/*enum_call*/DOOR_STATE::open)) { + _ic_set_20.insert(_ic_gr_1); + } + + } + self._tr_cache_env_retract_gear_last = Option::Some(_ic_set_20.clone()); + return _ic_set_20; + } else { + return self._tr_cache_env_retract_gear_last.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_start_extending(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_start_extending.is_none() { + let mut _ic_set_21: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((((self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open]) && self.handle.equal(&/*enum_call*/HANDLE_STATE::down)) && self.gears.functionCall(&_ic_gr_1).equal(&/*enum_call*/GEAR_STATE::retracted)) && self.valve_extend_gear.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && bset![GEAR_STATE, /*enum_call*/GEAR_STATE::gear_moving, /*enum_call*/GEAR_STATE::retracted].elementOf(&self.gear)) && self.door.equal(&/*enum_call*/DOOR_STATE::open)) { + _ic_set_21.insert(_ic_gr_1); + } + + } + self._tr_cache_env_start_extending = Option::Some(_ic_set_21.clone()); + return _ic_set_21; + } else { + return self._tr_cache_env_start_extending.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_extend_gear_last(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_extend_gear_last.is_none() { + let mut _ic_set_22: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((((self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open]) && self.handle.equal(&/*enum_call*/HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&bset![POSITION, _ic_gr_1])).equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) && self.gears.functionCall(&_ic_gr_1).equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.gear.equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.door.equal(&/*enum_call*/DOOR_STATE::open)) { + _ic_set_22.insert(_ic_gr_1); + } + + } + self._tr_cache_env_extend_gear_last = Option::Some(_ic_set_22.clone()); + return _ic_set_22; + } else { + return self._tr_cache_env_extend_gear_last.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_extend_gear_skip(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_extend_gear_skip.is_none() { + let mut _ic_set_23: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open]) && self.handle.equal(&/*enum_call*/HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&bset![POSITION, _ic_gr_1])).unequal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) && self.gears.functionCall(&_ic_gr_1).equal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) { + _ic_set_23.insert(_ic_gr_1); + } + + } + self._tr_cache_env_extend_gear_skip = Option::Some(_ic_set_23.clone()); + return _ic_set_23; + } else { + return self._tr_cache_env_extend_gear_skip.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_start_open_door(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_start_open_door.is_none() { + let mut _ic_set_24: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((((((self.doors.functionCall(&_ic_gr_1).equal(&/*enum_call*/DOOR_STATE::closed) && self.gears.functionCall(&_ic_gr_1).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_open_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed, /*enum_call*/DOOR_STATE::door_moving].elementOf(&self.door)) && self.gear.unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gear.equal(&/*enum_call*/GEAR_STATE::retracted)) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gear.equal(&/*enum_call*/GEAR_STATE::extended)))) { + _ic_set_24.insert(_ic_gr_1); + } + + } + self._tr_cache_env_start_open_door = Option::Some(_ic_set_24.clone()); + return _ic_set_24; + } else { + return self._tr_cache_env_start_open_door.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_open_door_last(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_open_door_last.is_none() { + let mut _ic_set_25: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (((((((((self.doors.functionCall(&_ic_gr_1).equal(&/*enum_call*/DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&/*enum_call*/GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&bset![POSITION, _ic_gr_1])).equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_open_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.door.equal(&/*enum_call*/DOOR_STATE::door_moving)) && self.gear.unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gear.equal(&/*enum_call*/GEAR_STATE::retracted)) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gear.equal(&/*enum_call*/GEAR_STATE::extended)))) { + _ic_set_25.insert(_ic_gr_1); + } + + } + self._tr_cache_env_open_door_last = Option::Some(_ic_set_25.clone()); + return _ic_set_25; + } else { + return self._tr_cache_env_open_door_last.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_open_door_skip(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_open_door_skip.is_none() { + let mut _ic_set_26: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((((self.doors.functionCall(&_ic_gr_1).equal(&/*enum_call*/DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&/*enum_call*/GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&bset![POSITION, _ic_gr_1])).unequal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_open_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) { + _ic_set_26.insert(_ic_gr_1); + } + + } + self._tr_cache_env_open_door_skip = Option::Some(_ic_set_26.clone()); + return _ic_set_26; + } else { + return self._tr_cache_env_open_door_skip.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_start_close_door(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_start_close_door.is_none() { + let mut _ic_set_27: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (((((((self.doors.functionCall(&_ic_gr_1).equal(&/*enum_call*/DOOR_STATE::open) && self.gears.functionCall(&_ic_gr_1).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]))) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_close_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && bset![DOOR_STATE, /*enum_call*/DOOR_STATE::door_moving, /*enum_call*/DOOR_STATE::open].elementOf(&self.door)) && self.gear.unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gear.equal(&/*enum_call*/GEAR_STATE::extended)) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended, /*enum_call*/GEAR_STATE::retracted].elementOf(&self.gear)))) { + _ic_set_27.insert(_ic_gr_1); + } + + } + self._tr_cache_env_start_close_door = Option::Some(_ic_set_27.clone()); + return _ic_set_27; + } else { + return self._tr_cache_env_start_close_door.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_close_door(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_close_door.is_none() { + let mut _ic_set_28: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if ((((((((((self.doors.functionCall(&_ic_gr_1).equal(&/*enum_call*/DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&/*enum_call*/GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&bset![POSITION, _ic_gr_1])).equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]))) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_close_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])).implies(|| self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground))) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) && self.door.equal(&/*enum_call*/DOOR_STATE::door_moving)) && self.gear.unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gear.equal(&/*enum_call*/GEAR_STATE::extended)) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended, /*enum_call*/GEAR_STATE::retracted].elementOf(&self.gear)))) { + _ic_set_28.insert(_ic_gr_1); + } + + } + self._tr_cache_env_close_door = Option::Some(_ic_set_28.clone()); + return _ic_set_28; + } else { + return self._tr_cache_env_close_door.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_close_door_skip(&mut self, is_caching: bool) -> HashSet<POSITION> { + //transition + if !is_caching || self._tr_cache_env_close_door_skip.is_none() { + let mut _ic_set_29: HashSet<POSITION> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_gr_1 in self.gears.domain().clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (((((((self.doors.functionCall(&_ic_gr_1).equal(&/*enum_call*/DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&/*enum_call*/GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&/*enum_call*/GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&bset![POSITION, _ic_gr_1])).unequal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) && ((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && (self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted]) || self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended]))) || (self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])))) && self.valve_close_door.equal(&/*enum_call*/VALVE_STATE::valve_open)) && (self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])).implies(|| self.shock_absorber.equal(&/*enum_call*/PLANE_STATE::ground))) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)) { + _ic_set_29.insert(_ic_gr_1); + } + + } + self._tr_cache_env_close_door_skip = Option::Some(_ic_set_29.clone()); + return _ic_set_29; + } else { + return self._tr_cache_env_close_door_skip.as_ref().unwrap().clone(); + } + } + + pub fn _tr_toggle_handle_up(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_toggle_handle_up.is_none() { + let mut __tmp__val__ = self.handle.equal(&/*enum_call*/HANDLE_STATE::down); + self._tr_cache_toggle_handle_up = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_toggle_handle_up.as_ref().unwrap().clone(); + } + } + + pub fn _tr_toggle_handle_down(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_toggle_handle_down.is_none() { + let mut __tmp__val__ = self.handle.equal(&/*enum_call*/HANDLE_STATE::up); + self._tr_cache_toggle_handle_down = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_toggle_handle_down.as_ref().unwrap().clone(); + } + } + + 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(&false) && self.handle_move.equal(&true)); + self._tr_cache_con_stimulate_general_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_con_stimulate_general_valve.as_ref().unwrap().clone(); + } + } + + 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(&true) && self.open_EV.equal(&false)) && self.close_EV.equal(&false)) && self.retract_EV.equal(&false)) && self.extend_EV.equal(&false)) && self.close_EV.equal(&false)) && (((((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) && self.open_EV.equal(&false)) || (((self.handle.equal(&/*enum_call*/HANDLE_STATE::down) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) && self.open_EV.equal(&false))) || (((self.handle.equal(&/*enum_call*/HANDLE_STATE::up) && self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])) && self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])) && self.open_EV.equal(&false)))); + self._tr_cache_con_stop_stimulate_general_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_con_stop_stimulate_general_valve.as_ref().unwrap().clone(); + } + } + + 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(&true) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_closed)) && self.analogical_switch.equal(&/*enum_call*/SWITCH_STATE::switch_closed)); + self._tr_cache_evn_open_general_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_evn_open_general_valve.as_ref().unwrap().clone(); + } + } + + 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(&false) || self.analogical_switch.equal(&/*enum_call*/SWITCH_STATE::switch_open)) && self.general_valve.equal(&/*enum_call*/VALVE_STATE::valve_open)); + self._tr_cache_evn_close_general_valve = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_evn_close_general_valve.as_ref().unwrap().clone(); + } + } + + 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(&/*enum_call*/SWITCH_STATE::switch_open) && self.handle_move.equal(&true)); + self._tr_cache_env_close_analogical_switch = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_env_close_analogical_switch.as_ref().unwrap().clone(); + } + } + + pub fn _tr_env_open_analogical_switch(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_env_open_analogical_switch.is_none() { + let mut __tmp__val__ = self.analogical_switch.equal(&/*enum_call*/SWITCH_STATE::switch_closed); + self._tr_cache_env_open_analogical_switch = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_env_open_analogical_switch.as_ref().unwrap().clone(); + } + } + + pub fn _check_inv_1(&self) -> bool { + //invariant + return self._SWITCH_STATE.elementOf(&self.analogical_switch); + } + + pub fn _check_inv_2(&self) -> bool { + //invariant + return BOOL.elementOf(&self.general_EV); + } + + pub fn _check_inv_3(&self) -> bool { + //invariant + return self._VALVE_STATE.elementOf(&self.general_valve); + } + + pub fn _check_inv_4(&self) -> bool { + //invariant + return BOOL.elementOf(&self.handle_move); + } + + pub fn _check_inv_5(&self) -> bool { + //invariant + return BOOL.elementOf(&self.close_EV); + } + + pub fn _check_inv_6(&self) -> bool { + //invariant + return BOOL.elementOf(&self.extend_EV); + } + + pub fn _check_inv_7(&self) -> bool { + //invariant + return BOOL.elementOf(&self.open_EV); + } + + pub fn _check_inv_8(&self) -> bool { + //invariant + return BOOL.elementOf(&self.retract_EV); + } + + pub fn _check_inv_9(&self) -> bool { + //invariant + return self._PLANE_STATE.elementOf(&self.shock_absorber); + } + + pub fn _check_inv_10(&self) -> bool { + //invariant + return self._VALVE_STATE.elementOf(&self.valve_close_door); + } + + pub fn _check_inv_11(&self) -> bool { + //invariant + return self._VALVE_STATE.elementOf(&self.valve_extend_gear); + } + + pub fn _check_inv_12(&self) -> bool { + //invariant + return self._VALVE_STATE.elementOf(&self.valve_open_door); + } + + pub fn _check_inv_13(&self) -> bool { + //invariant + return self._VALVE_STATE.elementOf(&self.valve_retract_gear); + } + + pub fn _check_inv_14(&self) -> bool { + //invariant + return self._HANDLE_STATE.elementOf(&self.handle); + } + + pub fn _check_inv_15(&self) -> bool { + //invariant + return self._DOOR_STATE.elementOf(&self.door); + } + + pub fn _check_inv_16(&self) -> bool { + //invariant + return self._GEAR_STATE.elementOf(&self.gear); + } + + pub fn _check_inv_17(&self) -> bool { + //invariant + return (((self.open_EV.equal(&true) || self.close_EV.equal(&true)) || self.retract_EV.equal(&true)) || self.extend_EV.equal(&true)).implies(|| self.general_EV.equal(&true)); + } + + pub fn _check_inv_18(&self) -> bool { + //invariant + return (self.open_EV.equal(&true) && self.close_EV.equal(&true)).not(); + } + + pub fn _check_inv_19(&self) -> bool { + //invariant + return self._POSITION.check_domain_of(&self.gears).and(&self._GEAR_STATE.check_range_of(&self.gears)).and(&self.gears.isFunction()).and(&self._POSITION.check_total_of(&self.gears)); + } + + pub fn _check_inv_20(&self) -> bool { + //invariant + return self._POSITION.check_domain_of(&self.doors).and(&self._DOOR_STATE.check_range_of(&self.doors)).and(&self.doors.isFunction()).and(&self._POSITION.check_total_of(&self.doors)); + } + + pub fn _check_inv_21(&self) -> bool { + //invariant + return self.door.equal(&/*enum_call*/DOOR_STATE::closed).equivalent(&self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::closed])); + } + + pub fn _check_inv_22(&self) -> bool { + //invariant + return self.door.equal(&/*enum_call*/DOOR_STATE::open).equivalent(&self.doors.range().equal(&bset![DOOR_STATE, /*enum_call*/DOOR_STATE::open])); + } + + pub fn _check_inv_23(&self) -> bool { + //invariant + return self.gear.equal(&/*enum_call*/GEAR_STATE::extended).equivalent(&self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::extended])); + } + + pub fn _check_inv_24(&self) -> bool { + //invariant + return self.gear.equal(&/*enum_call*/GEAR_STATE::retracted).equivalent(&self.gears.range().equal(&bset![GEAR_STATE, /*enum_call*/GEAR_STATE::retracted])); + } + + pub fn _check_inv_25(&self) -> bool { + //invariant + return self.gear.equal(&/*enum_call*/GEAR_STATE::gear_moving).implies(|| self.door.equal(&/*enum_call*/DOOR_STATE::open)); + } + + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { + //calling the given functions without caching will recalculate them and cache them afterwards + 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);}, + "_tr_close_valve_door_open" => {self._tr_close_valve_door_open(false);}, + "_tr_open_valve_door_close" => {self._tr_open_valve_door_close(false);}, + "_tr_close_valve_door_close" => {self._tr_close_valve_door_close(false);}, + "_tr_open_valve_retract_gear" => {self._tr_open_valve_retract_gear(false);}, + "_tr_close_valve_retract_gear" => {self._tr_close_valve_retract_gear(false);}, + "_tr_open_valve_extend_gear" => {self._tr_open_valve_extend_gear(false);}, + "_tr_close_valve_extend_gear" => {self._tr_close_valve_extend_gear(false);}, + "_tr_con_stimulate_open_door_valve" => {self._tr_con_stimulate_open_door_valve(false);}, + "_tr_con_stop_stimulate_open_door_valve" => {self._tr_con_stop_stimulate_open_door_valve(false);}, + "_tr_con_stimulate_close_door_valve" => {self._tr_con_stimulate_close_door_valve(false);}, + "_tr_con_stop_stimulate_close_door_valve" => {self._tr_con_stop_stimulate_close_door_valve(false);}, + "_tr_con_stimulate_retract_gear_valve" => {self._tr_con_stimulate_retract_gear_valve(false);}, + "_tr_con_stop_stimulate_retract_gear_valve" => {self._tr_con_stop_stimulate_retract_gear_valve(false);}, + "_tr_con_stimulate_extend_gear_valve" => {self._tr_con_stimulate_extend_gear_valve(false);}, + "_tr_con_stop_stimulate_extend_gear_valve" => {self._tr_con_stop_stimulate_extend_gear_valve(false);}, + "_tr_env_start_retracting_first" => {self._tr_env_start_retracting_first(false);}, + "_tr_env_retract_gear_skip" => {self._tr_env_retract_gear_skip(false);}, + "_tr_env_retract_gear_last" => {self._tr_env_retract_gear_last(false);}, + "_tr_env_start_extending" => {self._tr_env_start_extending(false);}, + "_tr_env_extend_gear_last" => {self._tr_env_extend_gear_last(false);}, + "_tr_env_extend_gear_skip" => {self._tr_env_extend_gear_skip(false);}, + "_tr_env_start_open_door" => {self._tr_env_start_open_door(false);}, + "_tr_env_open_door_last" => {self._tr_env_open_door_last(false);}, + "_tr_env_open_door_skip" => {self._tr_env_open_door_skip(false);}, + "_tr_env_start_close_door" => {self._tr_env_start_close_door(false);}, + "_tr_env_close_door" => {self._tr_env_close_door(false);}, + "_tr_env_close_door_skip" => {self._tr_env_close_door_skip(false);}, + "_tr_toggle_handle_up" => {self._tr_toggle_handle_up(false);}, + "_tr_toggle_handle_down" => {self._tr_toggle_handle_down(false);}, + "_tr_con_stimulate_general_valve" => {self._tr_con_stimulate_general_valve(false);}, + "_tr_con_stop_stimulate_general_valve" => {self._tr_con_stop_stimulate_general_valve(false);}, + "_tr_evn_open_general_valve" => {self._tr_evn_open_general_valve(false);}, + "_tr_evn_close_general_valve" => {self._tr_evn_close_general_valve(false);}, + "_tr_env_close_analogical_switch" => {self._tr_env_close_analogical_switch(false);}, + "_tr_env_open_analogical_switch" => {self._tr_env_open_analogical_switch(false);}, + _ => {}, + } + } + } + + //model_check_next_states + fn generateNextStates(state: &mut LandingGear_R6, + isCaching: bool, + 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_invariants + 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 !state._check_inv_1() { + println!("_check_inv_1 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_3() { + println!("_check_inv_3 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_5() { + println!("_check_inv_5 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_7() { + println!("_check_inv_7 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_9() { + println!("_check_inv_9 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_11() { + println!("_check_inv_11 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_13() { + println!("_check_inv_13 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_15() { + println!("_check_inv_15 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_17() { + println!("_check_inv_17 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_19() { + println!("_check_inv_19 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_21() { + println!("_check_inv_21 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_23() { + println!("_check_inv_23 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_25() { + println!("_check_inv_25 failed!"); + return false; + } + } + return true; + } + return !(!state._check_inv_1() || !state._check_inv_2() || !state._check_inv_3() || !state._check_inv_4() || !state._check_inv_5() || !state._check_inv_6() || !state._check_inv_7() || !state._check_inv_8() || !state._check_inv_9() || !state._check_inv_10() || !state._check_inv_11() || !state._check_inv_12() || !state._check_inv_13() || !state._check_inv_14() || !state._check_inv_15() || !state._check_inv_16() || !state._check_inv_17() || !state._check_inv_18() || !state._check_inv_19() || !state._check_inv_20() || !state._check_inv_21() || !state._check_inv_22() || !state._check_inv_23() || !state._check_inv_24() || !state._check_inv_25()); + } + + //model_check_print + 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, &'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(), + MC_TYPE::DFS => collection.pop_back().unwrap(), + MC_TYPE::MIXED => if collection.len() % 2 == 0 { collection.pop_front().unwrap() } else { collection.pop_back().unwrap() } + }; + } + + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "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 + "close_valve_retract_gear" => vec!["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"], + //model_check_init_static + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "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 + "open_valve_extend_gear" => vec!["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"], + //model_check_init_static + "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 + "open_valve_retract_gear" => vec!["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"], + //model_check_init_static + "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 + "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 + "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 + "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 + "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 + "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 + "close_valve_extend_gear" => vec!["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"], + //model_check_init_static + "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 + "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 + "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 + "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 + "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 + "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 + "close_valve_door_close" => vec!["_check_inv_10"], + //model_check_init_static + "close_valve_retract_gear" => vec!["_check_inv_13"], + //model_check_init_static + "con_stimulate_open_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_7"], + //model_check_init_static + "env_close_door" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"], + //model_check_init_static + "env_start_close_door" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"], + //model_check_init_static + "toggle_handle_up" => vec!["_check_inv_4", "_check_inv_14"], + //model_check_init_static + "toggle_handle_down" => vec!["_check_inv_4", "_check_inv_14"], + //model_check_init_static + "open_valve_door_open" => vec!["_check_inv_12"], + //model_check_init_static + "env_retract_gear_last" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"], + //model_check_init_static + "env_open_door_last" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"], + //model_check_init_static + "con_stop_stimulate_retract_gear_valve" => vec!["_check_inv_17", "_check_inv_8"], + //model_check_init_static + "env_close_door_skip" => vec!["_check_inv_21", "_check_inv_20", "_check_inv_22"], + //model_check_init_static + "con_stop_stimulate_close_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_5"], + //model_check_init_static + "env_open_analogical_switch" => vec!["_check_inv_1"], + //model_check_init_static + "con_stop_stimulate_general_valve" => vec!["_check_inv_17", "_check_inv_2", "_check_inv_4"], + //model_check_init_static + "env_extend_gear_last" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"], + //model_check_init_static + "evn_open_general_valve" => vec!["_check_inv_3"], + //model_check_init_static + "land_plane" => vec!["_check_inv_9"], + //model_check_init_static + "con_stimulate_retract_gear_valve" => vec!["_check_inv_17", "_check_inv_8"], + //model_check_init_static + "con_stimulate_general_valve" => vec!["_check_inv_17", "_check_inv_2"], + //model_check_init_static + "env_start_retracting_first" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"], + //model_check_init_static + "env_retract_gear_skip" => vec!["_check_inv_19", "_check_inv_24", "_check_inv_23"], + //model_check_init_static + "open_valve_extend_gear" => vec!["_check_inv_11"], + //model_check_init_static + "begin_flying" => vec!["_check_inv_9"], + //model_check_init_static + "open_valve_retract_gear" => vec!["_check_inv_13"], + //model_check_init_static + "env_close_analogical_switch" => vec!["_check_inv_1"], + //model_check_init_static + "env_start_extending" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"], + //model_check_init_static + "open_valve_door_close" => vec!["_check_inv_10"], + //model_check_init_static + "con_stop_stimulate_open_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_7"], + //model_check_init_static + "con_stop_stimulate_extend_gear_valve" => vec!["_check_inv_17", "_check_inv_6"], + //model_check_init_static + "evn_close_general_valve" => vec!["_check_inv_3"], + //model_check_init_static + "close_valve_extend_gear" => vec!["_check_inv_11"], + //model_check_init_static + "con_stimulate_extend_gear_valve" => vec!["_check_inv_17", "_check_inv_6"], + //model_check_init_static + "close_valve_door_open" => vec!["_check_inv_12"], + //model_check_init_static + "con_stimulate_close_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_5"], + //model_check_init_static + "env_extend_gear_skip" => vec!["_check_inv_19", "_check_inv_24", "_check_inv_23"], + //model_check_init_static + "env_open_door_skip" => vec!["_check_inv_21", "_check_inv_20", "_check_inv_22"], + //model_check_init_static + "env_start_open_door" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"], + _ => vec![], + } + } + + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool, no_dead: bool, no_inv: bool) { + let mut machine = LandingGear_R6::new(); + + let mut all_states = HashSet::<LandingGear_R6>::new(); + all_states.insert(machine.clone()); + + 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(), "")); + + 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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } + if !no_dead && next_states.is_empty() { + print!("DEADLOCK DETECTED"); + stop_threads = true; + } + + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + + fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool, no_dead: bool, no_inv: bool) { + let threadPool = ThreadPool::new(threads); + + let machine = LandingGear_R6::new(); + + let all_states = Arc::new(DashSet::<LandingGear_R6>::new()); + all_states.insert(machine.clone()); + + let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(LandingGear_R6, &'static str)>::new())); + states_to_process_mutex.lock().unwrap().push_back((machine, "")); + + let num_transitions = Arc::new(AtomicU64::new(0)); + + 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 && !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 = 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, transitions); + if !no_dead && next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } + + //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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } + //println!("Thread {:?} done", thread::current().id()); + let _ = tx.send(Ok(1)); + }); + + 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()); + match rx.try_recv() { + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + +} + + +fn main() { + let args: Vec<String> = env::args().collect(); + if args.len() < 4 { panic!("Number of arguments errorneous"); } + + let threads = args.get(2).unwrap().parse::<usize>().unwrap(); + if threads <= 0 { panic!("Input for number of threads is wrong."); } + + let is_caching = args.get(3).unwrap().parse::<bool>().unwrap(); + let mc_type = match args.get(1).unwrap().as_str() { + "mixed" => MC_TYPE::MIXED, + "bf" => MC_TYPE::BFS, + "df" => MC_TYPE::DFS, + _ => panic!("Input for strategy is wrong.") + }; + + let mut no_dead = false; + let mut no_inv = false; + + if args.len() > 4 { + for arg in args.iter().skip(4) { + match arg.as_str() { + "-nodead" => no_dead = true, + "-noinv" => no_inv = true, + _ => {} + } + } + } + + if threads == 1 { + LandingGear_R6::model_check_single_threaded(mc_type, is_caching, no_dead, no_inv); + } else { + LandingGear_R6::modelCheckMultiThreaded(mc_type, threads, is_caching, no_dead, no_inv); + } +} diff --git a/benchmarks/model_checking/Rust_embedded/Lift_MC_Large.rs b/benchmarks/model_checking/Rust_embedded/Lift_MC_Large.rs new file mode 100644 index 000000000..a04b0aa0e --- /dev/null +++ b/benchmarks/model_checking/Rust_embedded/Lift_MC_Large.rs @@ -0,0 +1,354 @@ +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] +//#![no_std] //std is enabled for the generated machine by default, since without it there is no println which makes unit-testing very difficult +use btypes::{bset, brel}; +use btypes::bset::BSet; +use btypes::bset::SetItem; +use btypes::bset::PowSetItem; +use btypes::bset::PowAble; +use btypes::bset::NestedSet; +use btypes::brelation::BRelation; +use btypes::brelation::RelLeftItem; +use btypes::brelation::RelPowAble; +use btypes::bboolean::BBoolean; +use btypes::bboolean::BBool; +use btypes::bboolean::BOOL; +use btypes::binteger::BInteger; +use btypes::binteger::BInt; +use btypes::binteger::set_BInteger; +use btypes::btuple::BTuple; + +use std::env; +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}; + + + +#[derive(Clone, Copy)] +pub enum MC_TYPE { BFS, DFS, MIXED } + + + + +#[derive(Derivative)] +#[derivative(Clone, Default, Debug, Hash, PartialEq, Eq)] +pub struct Lift_MC_Large { + /*declarations*/level: BInteger, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_inc: Option<bool>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_dec: Option<bool>,} + + +impl Lift_MC_Large { + + pub fn new() -> Lift_MC_Large { + //values: '' + let mut m: Lift_MC_Large = Default::default(); + m.init(); + return m; + } + fn init(&mut self) { + /*set_initializations*/ + /*properties*/ + /*body*/self.level = 0; + /*includesInitialization*/ + } + + pub fn get_level(&self) -> BInteger { + return self.level.clone(); + } + + pub fn inc(&mut self) -> () { + //pre_assert + self.level = self.level.plus(&1); + + } + + pub fn dec(&mut self) -> () { + //pre_assert + self.level = self.level.minus(&1); + + } + + pub fn _tr_inc(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_inc.is_none() { + let mut __tmp__val__ = self.level.less(&1000000); + self._tr_cache_inc = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_inc.as_ref().unwrap().clone(); + } + } + + pub fn _tr_dec(&mut self, is_caching: bool) -> bool { + //transition + if !is_caching || self._tr_cache_dec.is_none() { + let mut __tmp__val__ = self.level.greater(&0); + self._tr_cache_dec = Option::Some(__tmp__val__); + return __tmp__val__; + } else { + return self._tr_cache_dec.as_ref().unwrap().clone(); + } + } + + pub fn _check_inv_1(&self) -> bool { + //invariant + return self.level.greaterEqual(&0); + } + + pub fn _check_inv_2(&self) -> bool { + //invariant + return self.level.lessEqual(&1000000); + } + + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { + //calling the given functions without caching will recalculate them and cache them afterwards + for trans in to_invalidate { + match trans { + "_tr_inc" => {self._tr_inc(false);}, + "_tr_dec" => {self._tr_dec(false);}, + _ => {}, + } + } + } + + //model_check_next_states + fn generateNextStates(state: &mut Lift_MC_Large, + isCaching: bool, + 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; + } + + + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); + return result; + } + + //model_check_invariants + 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 !state._check_inv_1() { + println!("_check_inv_1 failed!"); + return false; + } + } + //model_check_invariant + if dependent_invariants_of_state.contains(&"_check_inv_2") { + if !state._check_inv_2() { + println!("_check_inv_2 failed!"); + return false; + } + } + return true; + } + return !(!state._check_inv_1() || !state._check_inv_2()); + } + + //model_check_print + 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, &'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(), + MC_TYPE::DFS => collection.pop_back().unwrap(), + MC_TYPE::MIXED => if collection.len() % 2 == 0 { collection.pop_front().unwrap() } else { collection.pop_back().unwrap() } + }; + } + + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "dec" => vec!["_tr_dec", "_tr_inc"], + //model_check_init_static + "inc" => vec!["_tr_dec", "_tr_inc"], + _ => vec![], + } + } + + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "dec" => vec!["_check_inv_2", "_check_inv_1"], + //model_check_init_static + "inc" => vec!["_check_inv_2", "_check_inv_1"], + _ => vec![], + } + } + + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool, no_dead: bool, no_inv: bool) { + let mut machine = Lift_MC_Large::new(); + + let mut all_states = HashSet::<Lift_MC_Large>::new(); + all_states.insert(machine.clone()); + + 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(), "")); + + 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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } + if !no_dead && next_states.is_empty() { + print!("DEADLOCK DETECTED"); + stop_threads = true; + } + + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + + fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool, no_dead: bool, no_inv: bool) { + let threadPool = ThreadPool::new(threads); + + let machine = Lift_MC_Large::new(); + + let all_states = Arc::new(DashSet::<Lift_MC_Large>::new()); + all_states.insert(machine.clone()); + + 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, "")); + + let num_transitions = Arc::new(AtomicU64::new(0)); + + 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 && !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 = 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, transitions); + if !no_dead && next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } + + //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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } + //println!("Thread {:?} done", thread::current().id()); + let _ = tx.send(Ok(1)); + }); + + 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()); + match rx.try_recv() { + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + +} + + +fn main() { + let args: Vec<String> = env::args().collect(); + if args.len() < 4 { panic!("Number of arguments errorneous"); } + + let threads = args.get(2).unwrap().parse::<usize>().unwrap(); + if threads <= 0 { panic!("Input for number of threads is wrong."); } + + let is_caching = args.get(3).unwrap().parse::<bool>().unwrap(); + let mc_type = match args.get(1).unwrap().as_str() { + "mixed" => MC_TYPE::MIXED, + "bf" => MC_TYPE::BFS, + "df" => MC_TYPE::DFS, + _ => panic!("Input for strategy is wrong.") + }; + + let mut no_dead = false; + let mut no_inv = false; + + if args.len() > 4 { + for arg in args.iter().skip(4) { + match arg.as_str() { + "-nodead" => no_dead = true, + "-noinv" => no_inv = true, + _ => {} + } + } + } + + if threads == 1 { + Lift_MC_Large::model_check_single_threaded(mc_type, is_caching, no_dead, no_inv); + } else { + Lift_MC_Large::modelCheckMultiThreaded(mc_type, threads, is_caching, no_dead, no_inv); + } +} diff --git a/benchmarks/model_checking/Rust_embedded/Makefile b/benchmarks/model_checking/Rust_embedded/Makefile new file mode 100644 index 000000000..15291912b --- /dev/null +++ b/benchmarks/model_checking/Rust_embedded/Makefile @@ -0,0 +1,32 @@ +.SUFFIXES: + +.PHONY: all clean + +all: Lift_MC_Large Cruise_finite1_deterministic_MC LandingGear_R6 CAN_BUS_tlc Train1_Lukas_POR_v3 Train_1_beebook_deterministic_MC_POR_v2 nota_v2 + +OUTPUT ?= runtimes.txt + +CARGO_PROJ_PATH=../../../btypes_primitives/src/main/rust_embedded/bmachine_mc +#CARGO_PROJ_PATH=../../../btypes_primitives/src/main/rust_embedded/bmachine_bitvec_mc +CARGO_BUILD=cargo build --release --manifest-path $(CARGO_PROJ_PATH)/Cargo.toml +#CARGO_BUILD=cargo +nightly build --release --manifest-path $(CARGO_PROJ_PATH)/Cargo.toml +STRATEGY=mixed +THREADS=1 +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_mc $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine_mc $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine_mc $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine_mc $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine_mc $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine_mc $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine_mc $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine_mc $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine_mc $(STRATEGY) $(THREADS) $(CACHING) + /usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine_mc $(STRATEGY) $(THREADS) $(CACHING) + +clean: + rm -f $(CARGO_PROJ_PATH)/src/*.rs \ No newline at end of file diff --git a/benchmarks/model_checking/Rust_embedded/Train1_Lukas_POR_v3.rs b/benchmarks/model_checking/Rust_embedded/Train1_Lukas_POR_v3.rs new file mode 100644 index 000000000..3bc572a92 --- /dev/null +++ b/benchmarks/model_checking/Rust_embedded/Train1_Lukas_POR_v3.rs @@ -0,0 +1,1386 @@ +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] +//#![no_std] //std is enabled for the generated machine by default, since without it there is no println which makes unit-testing very difficult +use btypes::{bset, brel}; +use btypes::bset::BSet; +use btypes::bset::SetItem; +use btypes::bset::PowSetItem; +use btypes::bset::PowAble; +use btypes::bset::NestedSet; +use btypes::brelation::BRelation; +use btypes::brelation::RelLeftItem; +use btypes::brelation::RelPowAble; +use btypes::bboolean::BBoolean; +use btypes::bboolean::BBool; +use btypes::bboolean::BOOL; +use btypes::binteger::BInteger; +use btypes::binteger::BInt; +use btypes::binteger::set_BInteger; +use btypes::btuple::BTuple; + +use std::env; +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}; + + + +#[derive(Clone, Copy)] +pub enum MC_TYPE { BFS, DFS, MIXED } + + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum BLOCKS { + #[default] + A = 0, + B = 1, + C = 2, + D = 3, + E = 4, + F = 5, + G = 6, + H = 7, + I = 8 +} + +impl BLOCKS { + pub fn equal(&self, other: &BLOCKS) -> bool { *self == *other } + pub fn unequal(&self, other: &BLOCKS) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::A, + 1 => Self::B, + 2 => Self::C, + 3 => Self::D, + 4 => Self::E, + 5 => Self::F, + 6 => Self::G, + 7 => Self::H, + 8 => Self::I, + _ => panic!("BLOCKS index out of range! {:?}", idx) + } + } +} + +impl SetItem<9> for BLOCKS { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_BLOCKS = BSet<BLOCKS, 9>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum ROUTES { + #[default] + R1 = 0, + R2 = 1, + R3 = 2, + R4 = 3, + R5 = 4, + R6 = 5, + R7 = 6, + R8 = 7 +} + +impl ROUTES { + pub fn equal(&self, other: &ROUTES) -> bool { *self == *other } + pub fn unequal(&self, other: &ROUTES) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::R1, + 1 => Self::R2, + 2 => Self::R3, + 3 => Self::R4, + 4 => Self::R5, + 5 => Self::R6, + 6 => Self::R7, + 7 => Self::R8, + _ => panic!("ROUTES index out of range! {:?}", idx) + } + } +} + +impl SetItem<8> for ROUTES { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_ROUTES = BSet<ROUTES, 8>; +//set_enum_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum BLOCKS_X_BLOCKS { + #[default] + A_A = 0, + A_B = 1, + A_C = 2, + A_D = 3, + A_E = 4, + A_F = 5, + A_G = 6, + A_H = 7, + A_I = 8, + B_A = 9, + B_B = 10, + B_C = 11, + B_D = 12, + B_E = 13, + B_F = 14, + B_G = 15, + B_H = 16, + B_I = 17, + C_A = 18, + C_B = 19, + C_C = 20, + C_D = 21, + C_E = 22, + C_F = 23, + C_G = 24, + C_H = 25, + C_I = 26, + D_A = 27, + D_B = 28, + D_C = 29, + D_D = 30, + D_E = 31, + D_F = 32, + D_G = 33, + D_H = 34, + D_I = 35, + E_A = 36, + E_B = 37, + E_C = 38, + E_D = 39, + E_E = 40, + E_F = 41, + E_G = 42, + E_H = 43, + E_I = 44, + F_A = 45, + F_B = 46, + F_C = 47, + F_D = 48, + F_E = 49, + F_F = 50, + F_G = 51, + F_H = 52, + F_I = 53, + G_A = 54, + G_B = 55, + G_C = 56, + G_D = 57, + G_E = 58, + G_F = 59, + G_G = 60, + G_H = 61, + G_I = 62, + H_A = 63, + H_B = 64, + H_C = 65, + H_D = 66, + H_E = 67, + H_F = 68, + H_G = 69, + H_H = 70, + H_I = 71, + I_A = 72, + I_B = 73, + I_C = 74, + I_D = 75, + I_E = 76, + I_F = 77, + I_G = 78, + I_H = 79, + I_I = 80 +} +type rel_BLOCKS_X_BLOCKS = BRelation<BLOCKS, { BLOCKS::VARIANTS }, BLOCKS, { BLOCKS::VARIANTS }, 81>; +//relation_declaration done + + + +//relation_declaration +type rel_ROUTES_X_SetBLOCKS_X_BLOCKS = BRelation<ROUTES, { ROUTES::VARIANTS }, rel_BLOCKS_X_BLOCKS, { rel_BLOCKS_X_BLOCKS::VARIANTS }, 0>; +//relation_declaration done + + + +//enum_set_declaration start +#[derive(Default, Debug, Clone, Copy)] +// each enum value corresponds to one BSet +pub enum SetBLOCKS_X_BLOCKS { + #[default] + SET_SET_A_B__B_C_TES_TES = 0, + SET_SET_A_B__B_D__D_E__E_F_TES_TES = 1, + SET_SET_E_F__G_E__H_G_TES_TES = 2, + SET_SET_E_F__G_E__I_G_TES_TES = 3, + SET_SET_B_A__C_B_TES_TES = 4, + SET_SET_B_A__D_B__E_D__F_E_TES_TES = 5, + SET_SET_E_G__F_E__G_H_TES_TES = 6, + SET_SET_E_G__F_E__G_I_TES_TES = 7 +} +type set_SetBLOCKS_X_BLOCKS = BSet<rel_BLOCKS_X_BLOCKS, 8>; + +impl PowSetItem<8, 81> for BLOCKS_X_BLOCKS { + type SetRepr = SetBLOCKS_X_BLOCKS; + fn arr_to_idx(set: [bool; 81]) -> usize { + match set { + [false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 0, + [false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 1, + [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false] => 2, + [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false] => 3, + [false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 4, + [false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 5, + [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 6, + [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 7, + _ => panic!("Attempting to convert non-existing set to index!") // only happens if this is a const-set and code-generation missed a necessary value + } + } + fn idx_to_arr(idx: usize) -> [bool; 81] { + match idx { + 0 => [false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 1 => [false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 2 => [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false], + 3 => [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false], + 4 => [false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 5 => [false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 6 => [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 7 => [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + _ => panic!("SetBLOCKS_X_BLOCKS index out of range! {:?}", idx) + } + } +} +impl RelLeftItem<{BLOCKS::VARIANTS}, BLOCKS, { BLOCKS::VARIANTS}, 8, 81> for BLOCKS { + type RelEnum = BLOCKS_X_BLOCKS; +} +impl SetBLOCKS_X_BLOCKS { + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::SET_SET_A_B__B_C_TES_TES, + 1 => Self::SET_SET_A_B__B_D__D_E__E_F_TES_TES, + 2 => Self::SET_SET_E_F__G_E__H_G_TES_TES, + 3 => Self::SET_SET_E_F__G_E__I_G_TES_TES, + 4 => Self::SET_SET_B_A__C_B_TES_TES, + 5 => Self::SET_SET_B_A__D_B__E_D__F_E_TES_TES, + 6 => Self::SET_SET_E_G__F_E__G_H_TES_TES, + 7 => Self::SET_SET_E_G__F_E__G_I_TES_TES, + _ => panic!("SetBLOCKS_X_BLOCKS index out of range! {:?}", idx) + } + } +} + +impl SetItem<8> for SetBLOCKS_X_BLOCKS { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +//enum_set_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum ROUTES_X_BLOCKS { + #[default] + R1_A = 0, + R1_B = 1, + R1_C = 2, + R1_D = 3, + R1_E = 4, + R1_F = 5, + R1_G = 6, + R1_H = 7, + R1_I = 8, + R2_A = 9, + R2_B = 10, + R2_C = 11, + R2_D = 12, + R2_E = 13, + R2_F = 14, + R2_G = 15, + R2_H = 16, + R2_I = 17, + R3_A = 18, + R3_B = 19, + R3_C = 20, + R3_D = 21, + R3_E = 22, + R3_F = 23, + R3_G = 24, + R3_H = 25, + R3_I = 26, + R4_A = 27, + R4_B = 28, + R4_C = 29, + R4_D = 30, + R4_E = 31, + R4_F = 32, + R4_G = 33, + R4_H = 34, + R4_I = 35, + R5_A = 36, + R5_B = 37, + R5_C = 38, + R5_D = 39, + R5_E = 40, + R5_F = 41, + R5_G = 42, + R5_H = 43, + R5_I = 44, + R6_A = 45, + R6_B = 46, + R6_C = 47, + R6_D = 48, + R6_E = 49, + R6_F = 50, + R6_G = 51, + R6_H = 52, + R6_I = 53, + R7_A = 54, + R7_B = 55, + R7_C = 56, + R7_D = 57, + R7_E = 58, + R7_F = 59, + R7_G = 60, + R7_H = 61, + R7_I = 62, + R8_A = 63, + R8_B = 64, + R8_C = 65, + R8_D = 66, + R8_E = 67, + R8_F = 68, + R8_G = 69, + R8_H = 70, + R8_I = 71 +} +type rel_ROUTES_X_BLOCKS = BRelation<ROUTES, { ROUTES::VARIANTS }, BLOCKS, { BLOCKS::VARIANTS }, 72>; +//relation_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum BLOCKS_X_ROUTES { + #[default] + A_R1 = 0, + A_R2 = 1, + A_R3 = 2, + A_R4 = 3, + A_R5 = 4, + A_R6 = 5, + A_R7 = 6, + A_R8 = 7, + B_R1 = 8, + B_R2 = 9, + B_R3 = 10, + B_R4 = 11, + B_R5 = 12, + B_R6 = 13, + B_R7 = 14, + B_R8 = 15, + C_R1 = 16, + C_R2 = 17, + C_R3 = 18, + C_R4 = 19, + C_R5 = 20, + C_R6 = 21, + C_R7 = 22, + C_R8 = 23, + D_R1 = 24, + D_R2 = 25, + D_R3 = 26, + D_R4 = 27, + D_R5 = 28, + D_R6 = 29, + D_R7 = 30, + D_R8 = 31, + E_R1 = 32, + E_R2 = 33, + E_R3 = 34, + E_R4 = 35, + E_R5 = 36, + E_R6 = 37, + E_R7 = 38, + E_R8 = 39, + F_R1 = 40, + F_R2 = 41, + F_R3 = 42, + F_R4 = 43, + F_R5 = 44, + F_R6 = 45, + F_R7 = 46, + F_R8 = 47, + G_R1 = 48, + G_R2 = 49, + G_R3 = 50, + G_R4 = 51, + G_R5 = 52, + G_R6 = 53, + G_R7 = 54, + G_R8 = 55, + H_R1 = 56, + H_R2 = 57, + H_R3 = 58, + H_R4 = 59, + H_R5 = 60, + H_R6 = 61, + H_R7 = 62, + H_R8 = 63, + I_R1 = 64, + I_R2 = 65, + I_R3 = 66, + I_R4 = 67, + I_R5 = 68, + I_R6 = 69, + I_R7 = 70, + I_R8 = 71 +} +type rel_BLOCKS_X_ROUTES = BRelation<BLOCKS, { BLOCKS::VARIANTS }, ROUTES, { ROUTES::VARIANTS }, 72>; +//relation_declaration done + +#[derive(Derivative)] +#[derivative(Clone, Default, Debug, Hash, PartialEq, Eq)] +pub struct Train1_Lukas_POR_v3 { + /*declarations*/LBT: set_BLOCKS, + TRK: rel_BLOCKS_X_BLOCKS, + frm: set_ROUTES, + OCC: set_BLOCKS, + resbl: set_BLOCKS, + resrt: set_ROUTES, + rsrtbl: rel_BLOCKS_X_ROUTES, + /*constant_declarations*/fst: rel_ROUTES_X_BLOCKS, + lst: rel_ROUTES_X_BLOCKS, + nxt: rel_ROUTES_X_SetBLOCKS_X_BLOCKS, + rtbl: rel_BLOCKS_X_ROUTES, + /*sets*//*set_declaration*/_BLOCKS: set_BLOCKS, + /*set_declaration*/_ROUTES: set_ROUTES, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_route_reservation: Option<HashSet<ROUTES>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_route_freeing: Option<HashSet<ROUTES>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_FRONT_MOVE_1: Option<HashSet<ROUTES>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_FRONT_MOVE_2: Option<HashSet<BLOCKS>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_BACK_MOVE_1: Option<HashSet<BLOCKS>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_BACK_MOVE_2: Option<HashSet<BLOCKS>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_point_positionning: Option<HashSet<ROUTES>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_route_formation: Option<HashSet<ROUTES>>,} + + +impl Train1_Lukas_POR_v3 { + + pub fn new() -> Train1_Lukas_POR_v3 { + //values: '' + let mut m: Train1_Lukas_POR_v3 = Default::default(); + m.init(); + return m; + } + fn init(&mut self) { + /*set_initializations*///set_initialization + self._BLOCKS = bset![BLOCKS, /*enum_call*/BLOCKS::A, /*enum_call*/BLOCKS::B, /*enum_call*/BLOCKS::C, /*enum_call*/BLOCKS::D, /*enum_call*/BLOCKS::E, /*enum_call*/BLOCKS::F, /*enum_call*/BLOCKS::G, /*enum_call*/BLOCKS::H, /*enum_call*/BLOCKS::I]; + //set_initialization + self._ROUTES = bset![ROUTES, /*enum_call*/ROUTES::R1, /*enum_call*/ROUTES::R2, /*enum_call*/ROUTES::R3, /*enum_call*/ROUTES::R4, /*enum_call*/ROUTES::R5, /*enum_call*/ROUTES::R6, /*enum_call*/ROUTES::R7, /*enum_call*/ROUTES::R8]; + /*properties*///constant_initialization + self.nxt = brel![rel_ROUTES_X_SetBLOCKS_X_BLOCKS, (/*enum_call*/ROUTES::R1.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/BLOCKS::B.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/BLOCKS::C.clone())].clone()), (/*enum_call*/ROUTES::R2.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/BLOCKS::B.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/BLOCKS::D.clone()), (/*enum_call*/BLOCKS::D.clone(), /*enum_call*/BLOCKS::E.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/BLOCKS::F.clone())].clone()), (/*enum_call*/ROUTES::R3.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::H.clone(), /*enum_call*/BLOCKS::G.clone()), (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/BLOCKS::E.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/BLOCKS::F.clone())].clone()), (/*enum_call*/ROUTES::R4.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::I.clone(), /*enum_call*/BLOCKS::G.clone()), (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/BLOCKS::E.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/BLOCKS::F.clone())].clone()), (/*enum_call*/ROUTES::R5.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::C.clone(), /*enum_call*/BLOCKS::B.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/BLOCKS::A.clone())].clone()), (/*enum_call*/ROUTES::R6.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/BLOCKS::E.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/BLOCKS::D.clone()), (/*enum_call*/BLOCKS::D.clone(), /*enum_call*/BLOCKS::B.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/BLOCKS::A.clone())].clone()), (/*enum_call*/ROUTES::R7.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/BLOCKS::E.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/BLOCKS::G.clone()), (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/BLOCKS::H.clone())].clone()), (/*enum_call*/ROUTES::R8.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/BLOCKS::E.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/BLOCKS::G.clone()), (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/BLOCKS::I.clone())].clone())]; + //constant_initialization + self.fst = brel![rel_ROUTES_X_BLOCKS, (/*enum_call*/ROUTES::R1.clone(), /*enum_call*/BLOCKS::A.clone()), (/*enum_call*/ROUTES::R2.clone(), /*enum_call*/BLOCKS::A.clone()), (/*enum_call*/ROUTES::R3.clone(), /*enum_call*/BLOCKS::H.clone()), (/*enum_call*/ROUTES::R4.clone(), /*enum_call*/BLOCKS::I.clone()), (/*enum_call*/ROUTES::R5.clone(), /*enum_call*/BLOCKS::C.clone()), (/*enum_call*/ROUTES::R6.clone(), /*enum_call*/BLOCKS::F.clone()), (/*enum_call*/ROUTES::R7.clone(), /*enum_call*/BLOCKS::F.clone()), (/*enum_call*/ROUTES::R8.clone(), /*enum_call*/BLOCKS::F.clone())]; + //constant_initialization + self.lst = brel![rel_ROUTES_X_BLOCKS, (/*enum_call*/ROUTES::R1.clone(), /*enum_call*/BLOCKS::C.clone()), (/*enum_call*/ROUTES::R2.clone(), /*enum_call*/BLOCKS::F.clone()), (/*enum_call*/ROUTES::R3.clone(), /*enum_call*/BLOCKS::F.clone()), (/*enum_call*/ROUTES::R4.clone(), /*enum_call*/BLOCKS::F.clone()), (/*enum_call*/ROUTES::R5.clone(), /*enum_call*/BLOCKS::A.clone()), (/*enum_call*/ROUTES::R6.clone(), /*enum_call*/BLOCKS::A.clone()), (/*enum_call*/ROUTES::R7.clone(), /*enum_call*/BLOCKS::H.clone()), (/*enum_call*/ROUTES::R8.clone(), /*enum_call*/BLOCKS::I.clone())]; + //constant_initialization + self.rtbl = brel![rel_BLOCKS_X_ROUTES, (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/ROUTES::R1.clone()), (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/ROUTES::R2.clone()), (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/ROUTES::R5.clone()), (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/ROUTES::R6.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/ROUTES::R1.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/ROUTES::R2.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/ROUTES::R5.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/ROUTES::R6.clone()), (/*enum_call*/BLOCKS::C.clone(), /*enum_call*/ROUTES::R1.clone()), (/*enum_call*/BLOCKS::C.clone(), /*enum_call*/ROUTES::R5.clone()), (/*enum_call*/BLOCKS::D.clone(), /*enum_call*/ROUTES::R2.clone()), (/*enum_call*/BLOCKS::D.clone(), /*enum_call*/ROUTES::R6.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/ROUTES::R2.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/ROUTES::R3.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/ROUTES::R4.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/ROUTES::R6.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/ROUTES::R7.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/ROUTES::R8.clone()), (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/ROUTES::R2.clone()), (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/ROUTES::R3.clone()), (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/ROUTES::R4.clone()), (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/ROUTES::R6.clone()), (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/ROUTES::R7.clone()), (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/ROUTES::R8.clone()), (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/ROUTES::R3.clone()), (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/ROUTES::R4.clone()), (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/ROUTES::R4.clone()), (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/ROUTES::R7.clone()), (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/ROUTES::R8.clone()), (/*enum_call*/BLOCKS::H.clone(), /*enum_call*/ROUTES::R3.clone()), (/*enum_call*/BLOCKS::H.clone(), /*enum_call*/ROUTES::R7.clone()), (/*enum_call*/BLOCKS::I.clone(), /*enum_call*/ROUTES::R4.clone()), (/*enum_call*/BLOCKS::I.clone(), /*enum_call*/ROUTES::R8.clone())]; + /*body*/self.resrt = bset![ROUTES].clone().clone(); + self.resbl = bset![BLOCKS].clone().clone(); + self.rsrtbl = brel![rel_BLOCKS_X_ROUTES].clone().clone(); + self.OCC = bset![BLOCKS].clone().clone(); + self.TRK = brel![rel_BLOCKS_X_BLOCKS].clone().clone(); + self.frm = bset![ROUTES].clone().clone(); + self.LBT = bset![BLOCKS].clone().clone(); + /*includesInitialization*/ + } + + pub fn get_fst(&self) -> rel_ROUTES_X_BLOCKS { + return self.fst.clone(); + } + + pub fn get_lst(&self) -> rel_ROUTES_X_BLOCKS { + return self.lst.clone(); + } + + pub fn get_nxt(&self) -> rel_ROUTES_X_SetBLOCKS_X_BLOCKS { + return self.nxt.clone(); + } + + pub fn get_rtbl(&self) -> rel_BLOCKS_X_ROUTES { + return self.rtbl.clone(); + } + + pub fn get_LBT(&self) -> set_BLOCKS { + return self.LBT.clone(); + } + + pub fn get_TRK(&self) -> rel_BLOCKS_X_BLOCKS { + return self.TRK.clone(); + } + + pub fn get_frm(&self) -> set_ROUTES { + return self.frm.clone(); + } + + pub fn get_OCC(&self) -> set_BLOCKS { + return self.OCC.clone(); + } + + pub fn get_resbl(&self) -> set_BLOCKS { + return self.resbl.clone(); + } + + pub fn get_resrt(&self) -> set_ROUTES { + return self.resrt.clone(); + } + + pub fn get_rsrtbl(&self) -> rel_BLOCKS_X_ROUTES { + return self.rsrtbl.clone(); + } + + pub fn get__BLOCKS(&self) -> set_BLOCKS { + return self._BLOCKS.clone(); + } + + pub fn get__ROUTES(&self) -> set_ROUTES { + return self._ROUTES.clone(); + } + + pub fn route_reservation(&mut self, mut r: ROUTES) -> () { + //pre_assert + let mut _ld_resrt = self.resrt.clone(); + let mut _ld_rsrtbl = self.rsrtbl.clone(); + let mut _ld_resbl = self.resbl.clone(); + self.resrt = _ld_resrt.union(&bset![ROUTES, r]).clone().clone(); + self.rsrtbl = _ld_rsrtbl.union(&self.rtbl.rangeRestriction(&bset![ROUTES, r])).clone().clone(); + self.resbl = _ld_resbl.union(&self.rtbl.inverse().relationImage(&bset![ROUTES, r])).clone().clone(); + + } + + pub fn route_freeing(&mut self, mut r: ROUTES) -> () { + //pre_assert + let mut _ld_frm = self.frm.clone(); + let mut _ld_resrt = self.resrt.clone(); + self.resrt = _ld_resrt.difference(&bset![ROUTES, r]).clone().clone(); + self.frm = _ld_frm.difference(&bset![ROUTES, r]).clone().clone(); + + } + + pub fn FRONT_MOVE_1(&mut self, mut r: ROUTES) -> () { + //pre_assert + let mut _ld_OCC = self.OCC.clone(); + let mut _ld_LBT = self.LBT.clone(); + self.OCC = _ld_OCC.union(&bset![BLOCKS, self.fst.functionCall(&r)]).clone().clone(); + self.LBT = _ld_LBT.union(&bset![BLOCKS, self.fst.functionCall(&r)]).clone().clone(); + + } + + pub fn FRONT_MOVE_2(&mut self, mut b: BLOCKS) -> () { + //pre_assert + self.OCC = self.OCC.union(&bset![BLOCKS, self.TRK.functionCall(&b)]).clone().clone(); + + } + + pub fn BACK_MOVE_1(&mut self, mut b: BLOCKS) -> () { + //pre_assert + let mut _ld_rsrtbl = self.rsrtbl.clone(); + let mut _ld_resbl = self.resbl.clone(); + let mut _ld_OCC = self.OCC.clone(); + let mut _ld_LBT = self.LBT.clone(); + self.OCC = _ld_OCC.difference(&bset![BLOCKS, b]).clone().clone(); + self.rsrtbl = _ld_rsrtbl.domainSubstraction(&bset![BLOCKS, b]).clone().clone(); + self.resbl = _ld_resbl.difference(&bset![BLOCKS, b]).clone().clone(); + self.LBT = _ld_LBT.difference(&bset![BLOCKS, b]).clone().clone(); + + } + + pub fn BACK_MOVE_2(&mut self, mut b: BLOCKS) -> () { + //pre_assert + let mut _ld_rsrtbl = self.rsrtbl.clone(); + let mut _ld_resbl = self.resbl.clone(); + let mut _ld_OCC = self.OCC.clone(); + let mut _ld_LBT = self.LBT.clone(); + self.OCC = _ld_OCC.difference(&bset![BLOCKS, b]).clone().clone(); + self.rsrtbl = _ld_rsrtbl.domainSubstraction(&bset![BLOCKS, b]).clone().clone(); + self.resbl = _ld_resbl.difference(&bset![BLOCKS, b]).clone().clone(); + self.LBT = _ld_LBT.difference(&bset![BLOCKS, b]).union(&bset![BLOCKS, self.TRK.functionCall(&b)]).clone().clone(); + + } + + pub fn point_positionning(&mut self, mut r: ROUTES) -> () { + //pre_assert + self.TRK = self.TRK.domainSubstraction(&self.nxt.functionCall(&r).domain()).rangeSubstraction(&self.nxt.functionCall(&r).range()).union(&self.nxt.functionCall(&r)).clone().clone(); + + } + + pub fn route_formation(&mut self, mut r: ROUTES) -> () { + //pre_assert + self.frm = self.frm.union(&bset![ROUTES, r]).clone().clone(); + + } + + pub fn _tr_route_reservation(&mut self, is_caching: bool) -> HashSet<ROUTES> { + //transition + if !is_caching || self._tr_cache_route_reservation.is_none() { + let mut _ic_set_0: HashSet<ROUTES> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_r_1 in self._ROUTES.difference(&self.resrt).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (self.rtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1]).intersect(&self.resbl).equal(&bset![BLOCKS]) && bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range()))) { + _ic_set_0.insert(_ic_r_1); + } + + } + self._tr_cache_route_reservation = Option::Some(_ic_set_0.clone()); + return _ic_set_0; + } else { + return self._tr_cache_route_reservation.as_ref().unwrap().clone(); + } + } + + pub fn _tr_route_freeing(&mut self, is_caching: bool) -> HashSet<ROUTES> { + //transition + if !is_caching || self._tr_cache_route_freeing.is_none() { + let mut _ic_set_1: HashSet<ROUTES> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_r_1 in self.resrt.difference(&self.rsrtbl.range()).clone().iter() { + //parameter_combination_predicate TODO: FASTER + _ic_set_1.insert(_ic_r_1); + + } + self._tr_cache_route_freeing = Option::Some(_ic_set_1.clone()); + return _ic_set_1; + } else { + return self._tr_cache_route_freeing.as_ref().unwrap().clone(); + } + } + + pub fn _tr_FRONT_MOVE_1(&mut self, is_caching: bool) -> HashSet<ROUTES> { + //transition + if !is_caching || self._tr_cache_FRONT_MOVE_1.is_none() { + let mut _ic_set_2: HashSet<ROUTES> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_r_1 in self.frm.clone().iter() { + //parameter_combination_predicate TODO: FASTER + 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![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range()))) { + _ic_set_2.insert(_ic_r_1); + } + + } + self._tr_cache_FRONT_MOVE_1 = Option::Some(_ic_set_2.clone()); + return _ic_set_2; + } else { + return self._tr_cache_FRONT_MOVE_1.as_ref().unwrap().clone(); + } + } + + pub fn _tr_FRONT_MOVE_2(&mut self, is_caching: bool) -> HashSet<BLOCKS> { + //transition + if !is_caching || self._tr_cache_FRONT_MOVE_2.is_none() { + let mut _ic_set_3: HashSet<BLOCKS> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_b_1 in self.OCC.intersect(&self.TRK.domain()).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (self.OCC.notElementOf(&self.TRK.functionCall(&_ic_b_1)) && bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range()))) { + _ic_set_3.insert(_ic_b_1); + } + + } + self._tr_cache_FRONT_MOVE_2 = Option::Some(_ic_set_3.clone()); + return _ic_set_3; + } else { + return self._tr_cache_FRONT_MOVE_2.as_ref().unwrap().clone(); + } + } + + pub fn _tr_BACK_MOVE_1(&mut self, is_caching: bool) -> HashSet<BLOCKS> { + //transition + if !is_caching || self._tr_cache_BACK_MOVE_1.is_none() { + let mut _ic_set_4: HashSet<BLOCKS> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_b_1 in self.LBT.difference(&self.TRK.domain()).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range())) { + _ic_set_4.insert(_ic_b_1); + } + + } + self._tr_cache_BACK_MOVE_1 = Option::Some(_ic_set_4.clone()); + return _ic_set_4; + } else { + return self._tr_cache_BACK_MOVE_1.as_ref().unwrap().clone(); + } + } + + pub fn _tr_BACK_MOVE_2(&mut self, is_caching: bool) -> HashSet<BLOCKS> { + //transition + if !is_caching || self._tr_cache_BACK_MOVE_2.is_none() { + let mut _ic_set_5: HashSet<BLOCKS> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_b_1 in self.LBT.intersect(&self.TRK.domain()).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (self.OCC.elementOf(&self.TRK.functionCall(&_ic_b_1)) && bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range()))) { + _ic_set_5.insert(_ic_b_1); + } + + } + self._tr_cache_BACK_MOVE_2 = Option::Some(_ic_set_5.clone()); + return _ic_set_5; + } else { + return self._tr_cache_BACK_MOVE_2.as_ref().unwrap().clone(); + } + } + + pub fn _tr_point_positionning(&mut self, is_caching: bool) -> HashSet<ROUTES> { + //transition + if !is_caching || self._tr_cache_point_positionning.is_none() { + let mut _ic_set_6: HashSet<ROUTES> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range())) { + _ic_set_6.insert(_ic_r_1); + } + + } + self._tr_cache_point_positionning = Option::Some(_ic_set_6.clone()); + return _ic_set_6; + } else { + return self._tr_cache_point_positionning.as_ref().unwrap().clone(); + } + } + + pub fn _tr_route_formation(&mut self, is_caching: bool) -> HashSet<ROUTES> { + //transition + if !is_caching || self._tr_cache_route_formation.is_none() { + let mut _ic_set_7: HashSet<ROUTES> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (self.nxt.functionCall(&_ic_r_1).domainRestriction(&self.rsrtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1])).equal(&self.TRK.domainRestriction(&self.rsrtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1]))) && bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range()))) { + _ic_set_7.insert(_ic_r_1); + } + + } + self._tr_cache_route_formation = Option::Some(_ic_set_7.clone()); + return _ic_set_7; + } else { + return self._tr_cache_route_formation.as_ref().unwrap().clone(); + } + } + + pub fn _check_inv_1(&self) -> bool { + //invariant + return self._BLOCKS.check_domain_of(&self.TRK).and(&self._BLOCKS.check_range_of(&self.TRK)).and(&self.TRK.isFunction()).and(&self._BLOCKS.check_partial_of(&self.TRK)).and(&self.TRK.isInjection()); + } + + pub fn _check_inv_2(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_8 = true; + //iteration_construct_enumeration + for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter() { + //iteration_construct_assignment + { + let mut _ic_a_1 = bset![ROUTES, _ic_r_1]; + if !self.rtbl.rangeRestriction(&_ic_a_1).equal(&self.rsrtbl.rangeRestriction(&_ic_a_1)) { + _ic_boolean_8 = false; + break; + } + + } + } + + return _ic_boolean_8; + } + + pub fn _check_inv_3(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_10 = true; + //iteration_construct_enumeration + for _ic_x_1 in self.TRK.domain().clone().iter() { + //iteration_construct_enumeration + for _ic_y_1 in self.TRK.relationImage(&bset![BLOCKS, _ic_x_1]).clone().iter() { + //quantified_predicate + let mut _ic_boolean_9 = false; + //iteration_construct_enumeration + for _ic_r_1 in self._ROUTES.clone().iter() { + if self.nxt.functionCall(&_ic_r_1).elementOf(&(_ic_x_1.clone(), _ic_y_1.clone())) { + _ic_boolean_9 = true; + break; + } + + } + + if !_ic_boolean_9 { + _ic_boolean_10 = false; + break; + } + + } + } + + return _ic_boolean_10; + } + + pub fn _check_inv_4(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_11 = true; + //iteration_construct_enumeration + for _ic_r_1 in self.frm.clone().iter() { + //iteration_construct_assignment + { + let mut _ic_a_1 = self.rsrtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1]); + if !self.nxt.functionCall(&_ic_r_1).domainRestriction(&_ic_a_1).equal(&self.TRK.domainRestriction(&_ic_a_1)) { + _ic_boolean_11 = false; + break; + } + + } + } + + return _ic_boolean_11; + } + + pub fn _check_inv_5(&self) -> bool { + //invariant + return self.LBT.subset(&self.OCC); + } + + pub fn _check_inv_6(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_12 = true; + //iteration_construct_enumeration + for _ic_a_1 in self.rsrtbl.domain().clone().iter() { + //iteration_construct_enumeration + for _ic_b_1 in self.LBT.clone().iter() { + //iteration_construct_assignment + { + let mut _ic_c_1 = self.rsrtbl.functionCall(&_ic_b_1); + //iteration_construct_assignment + { + let mut _ic_d_1 = self.nxt.functionCall(&_ic_c_1); + 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)) { + _ic_boolean_12 = false; + break; + } + + } + } + } + } + + return _ic_boolean_12; + } + + pub fn _check_inv_7(&self) -> bool { + //invariant + return self.resbl.check_domain_of(&self.rsrtbl).and(&self.resrt.check_range_of(&self.rsrtbl)).and(&self.rsrtbl.isFunction()).and(&self.resbl.check_total_of(&self.rsrtbl)); + } + + pub fn _check_inv_8(&self) -> bool { + //invariant + return self.rsrtbl.subset(&self.rtbl); + } + + pub fn _check_inv_9(&self) -> bool { + //invariant + return self.OCC.subset(&self.resbl); + } + + pub fn _check_inv_10(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_13 = true; + //iteration_construct_enumeration + for _ic_r_1 in self._ROUTES.clone().iter() { + //iteration_construct_assignment + { + let mut _ic_a_1 = self.nxt.functionCall(&_ic_r_1); + //iteration_construct_assignment + { + let mut _ic_b_1 = self.rsrtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1]); + //iteration_construct_assignment + { + let mut _ic_c_1 = _ic_b_1.difference(&self.OCC); + if !((_ic_a_1.relationImage(&self.rtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1]).difference(&_ic_b_1)).intersect(&_ic_c_1).equal(&bset![BLOCKS]) && _ic_a_1.relationImage(&_ic_b_1).subset(&_ic_b_1)) && _ic_a_1.relationImage(&_ic_c_1).subset(&_ic_c_1)) { + _ic_boolean_13 = false; + break; + } + + } + } + } + } + + return _ic_boolean_13; + } + + pub fn _check_inv_11(&self) -> bool { + //invariant + return self.frm.subset(&self.resrt); + } + + pub fn _check_inv_12(&self) -> bool { + //invariant + return self.rsrtbl.relationImage(&self.OCC).subset(&self.frm); + } + + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { + //calling the given functions without caching will recalculate them and cache them afterwards + 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);}, + "_tr_FRONT_MOVE_2" => {self._tr_FRONT_MOVE_2(false);}, + "_tr_BACK_MOVE_1" => {self._tr_BACK_MOVE_1(false);}, + "_tr_BACK_MOVE_2" => {self._tr_BACK_MOVE_2(false);}, + "_tr_point_positionning" => {self._tr_point_positionning(false);}, + "_tr_route_formation" => {self._tr_route_formation(false);}, + _ => {}, + } + } + } + + //model_check_next_states + fn generateNextStates(state: &mut Train1_Lukas_POR_v3, + isCaching: bool, + 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; + } + + + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); + return result; + } + + //model_check_invariants + 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 !state._check_inv_1() { + println!("_check_inv_1 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_3() { + println!("_check_inv_3 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_5() { + println!("_check_inv_5 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_7() { + println!("_check_inv_7 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_9() { + println!("_check_inv_9 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_11() { + println!("_check_inv_11 failed!"); + return false; + } + } + //model_check_invariant + if dependent_invariants_of_state.contains(&"_check_inv_12") { + if !state._check_inv_12() { + println!("_check_inv_12 failed!"); + return false; + } + } + return true; + } + return !(!state._check_inv_1() || !state._check_inv_2() || !state._check_inv_3() || !state._check_inv_4() || !state._check_inv_5() || !state._check_inv_6() || !state._check_inv_7() || !state._check_inv_8() || !state._check_inv_9() || !state._check_inv_10() || !state._check_inv_11() || !state._check_inv_12()); + } + + //model_check_print + 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, &'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(), + MC_TYPE::DFS => collection.pop_back().unwrap(), + MC_TYPE::MIXED => if collection.len() % 2 == 0 { collection.pop_front().unwrap() } else { collection.pop_back().unwrap() } + }; + } + + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "point_positionning" => vec!["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], + //model_check_init_static + "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 + "FRONT_MOVE_1" => vec!["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], + //model_check_init_static + "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 + "FRONT_MOVE_2" => vec!["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], + //model_check_init_static + "route_formation" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"], + //model_check_init_static + "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 + "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 + "point_positionning" => vec!["_check_inv_3", "_check_inv_1", "_check_inv_4"], + //model_check_init_static + "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 + "FRONT_MOVE_1" => vec!["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"], + //model_check_init_static + "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 + "FRONT_MOVE_2" => vec!["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"], + //model_check_init_static + "route_formation" => vec!["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"], + //model_check_init_static + "route_freeing" => vec!["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"], + //model_check_init_static + "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![], + } + } + + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool, no_dead: bool, no_inv: bool) { + let mut machine = Train1_Lukas_POR_v3::new(); + + let mut all_states = HashSet::<Train1_Lukas_POR_v3>::new(); + all_states.insert(machine.clone()); + + 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(), "")); + + 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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } + if !no_dead && next_states.is_empty() { + print!("DEADLOCK DETECTED"); + stop_threads = true; + } + + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + + fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool, no_dead: bool, no_inv: bool) { + let threadPool = ThreadPool::new(threads); + + let machine = Train1_Lukas_POR_v3::new(); + + let all_states = Arc::new(DashSet::<Train1_Lukas_POR_v3>::new()); + all_states.insert(machine.clone()); + + 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 num_transitions = Arc::new(AtomicU64::new(0)); + + 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 && !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 = 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, transitions); + if !no_dead && next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } + + //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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } + //println!("Thread {:?} done", thread::current().id()); + let _ = tx.send(Ok(1)); + }); + + 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()); + match rx.try_recv() { + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + +} + + +fn main() { + let args: Vec<String> = env::args().collect(); + if args.len() < 4 { panic!("Number of arguments errorneous"); } + + let threads = args.get(2).unwrap().parse::<usize>().unwrap(); + if threads <= 0 { panic!("Input for number of threads is wrong."); } + + let is_caching = args.get(3).unwrap().parse::<bool>().unwrap(); + let mc_type = match args.get(1).unwrap().as_str() { + "mixed" => MC_TYPE::MIXED, + "bf" => MC_TYPE::BFS, + "df" => MC_TYPE::DFS, + _ => panic!("Input for strategy is wrong.") + }; + + let mut no_dead = false; + let mut no_inv = false; + + if args.len() > 4 { + for arg in args.iter().skip(4) { + match arg.as_str() { + "-nodead" => no_dead = true, + "-noinv" => no_inv = true, + _ => {} + } + } + } + + if threads == 1 { + Train1_Lukas_POR_v3::model_check_single_threaded(mc_type, is_caching, no_dead, no_inv); + } else { + Train1_Lukas_POR_v3::modelCheckMultiThreaded(mc_type, threads, is_caching, no_dead, no_inv); + } +} diff --git a/benchmarks/model_checking/Rust_embedded/Train_1_beebook_deterministic_MC_POR_v2.rs b/benchmarks/model_checking/Rust_embedded/Train_1_beebook_deterministic_MC_POR_v2.rs new file mode 100644 index 000000000..2c0f20e98 --- /dev/null +++ b/benchmarks/model_checking/Rust_embedded/Train_1_beebook_deterministic_MC_POR_v2.rs @@ -0,0 +1,1671 @@ +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] +//#![no_std] //std is enabled for the generated machine by default, since without it there is no println which makes unit-testing very difficult +use btypes::{bset, brel}; +use btypes::bset::BSet; +use btypes::bset::SetItem; +use btypes::bset::PowSetItem; +use btypes::bset::PowAble; +use btypes::bset::NestedSet; +use btypes::brelation::BRelation; +use btypes::brelation::RelLeftItem; +use btypes::brelation::RelPowAble; +use btypes::bboolean::BBoolean; +use btypes::bboolean::BBool; +use btypes::bboolean::BOOL; +use btypes::binteger::BInteger; +use btypes::binteger::BInt; +use btypes::binteger::set_BInteger; +use btypes::btuple::BTuple; + +use std::env; +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}; + + + +#[derive(Clone, Copy)] +pub enum MC_TYPE { BFS, DFS, MIXED } + + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum BLOCKS { + #[default] + A = 0, + B = 1, + C = 2, + D = 3, + E = 4, + F = 5, + G = 6, + H = 7, + I = 8, + J = 9, + K = 10, + L = 11, + M = 12, + N = 13 +} + +impl BLOCKS { + pub fn equal(&self, other: &BLOCKS) -> bool { *self == *other } + pub fn unequal(&self, other: &BLOCKS) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::A, + 1 => Self::B, + 2 => Self::C, + 3 => Self::D, + 4 => Self::E, + 5 => Self::F, + 6 => Self::G, + 7 => Self::H, + 8 => Self::I, + 9 => Self::J, + 10 => Self::K, + 11 => Self::L, + 12 => Self::M, + 13 => Self::N, + _ => panic!("BLOCKS index out of range! {:?}", idx) + } + } +} + +impl SetItem<14> for BLOCKS { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_BLOCKS = BSet<BLOCKS, 14>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum ROUTES { + #[default] + R1 = 0, + R2 = 1, + R3 = 2, + R4 = 3, + R5 = 4, + R6 = 5, + R7 = 6, + R8 = 7, + R9 = 8, + R10 = 9 +} + +impl ROUTES { + pub fn equal(&self, other: &ROUTES) -> bool { *self == *other } + pub fn unequal(&self, other: &ROUTES) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::R1, + 1 => Self::R2, + 2 => Self::R3, + 3 => Self::R4, + 4 => Self::R5, + 5 => Self::R6, + 6 => Self::R7, + 7 => Self::R8, + 8 => Self::R9, + 9 => Self::R10, + _ => panic!("ROUTES index out of range! {:?}", idx) + } + } +} + +impl SetItem<10> for ROUTES { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_ROUTES = BSet<ROUTES, 10>; +//set_enum_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum BLOCKS_X_BLOCKS { + #[default] + A_A = 0, + A_B = 1, + A_C = 2, + A_D = 3, + A_E = 4, + A_F = 5, + A_G = 6, + A_H = 7, + A_I = 8, + A_J = 9, + A_K = 10, + A_L = 11, + A_M = 12, + A_N = 13, + B_A = 14, + B_B = 15, + B_C = 16, + B_D = 17, + B_E = 18, + B_F = 19, + B_G = 20, + B_H = 21, + B_I = 22, + B_J = 23, + B_K = 24, + B_L = 25, + B_M = 26, + B_N = 27, + C_A = 28, + C_B = 29, + C_C = 30, + C_D = 31, + C_E = 32, + C_F = 33, + C_G = 34, + C_H = 35, + C_I = 36, + C_J = 37, + C_K = 38, + C_L = 39, + C_M = 40, + C_N = 41, + D_A = 42, + D_B = 43, + D_C = 44, + D_D = 45, + D_E = 46, + D_F = 47, + D_G = 48, + D_H = 49, + D_I = 50, + D_J = 51, + D_K = 52, + D_L = 53, + D_M = 54, + D_N = 55, + E_A = 56, + E_B = 57, + E_C = 58, + E_D = 59, + E_E = 60, + E_F = 61, + E_G = 62, + E_H = 63, + E_I = 64, + E_J = 65, + E_K = 66, + E_L = 67, + E_M = 68, + E_N = 69, + F_A = 70, + F_B = 71, + F_C = 72, + F_D = 73, + F_E = 74, + F_F = 75, + F_G = 76, + F_H = 77, + F_I = 78, + F_J = 79, + F_K = 80, + F_L = 81, + F_M = 82, + F_N = 83, + G_A = 84, + G_B = 85, + G_C = 86, + G_D = 87, + G_E = 88, + G_F = 89, + G_G = 90, + G_H = 91, + G_I = 92, + G_J = 93, + G_K = 94, + G_L = 95, + G_M = 96, + G_N = 97, + H_A = 98, + H_B = 99, + H_C = 100, + H_D = 101, + H_E = 102, + H_F = 103, + H_G = 104, + H_H = 105, + H_I = 106, + H_J = 107, + H_K = 108, + H_L = 109, + H_M = 110, + H_N = 111, + I_A = 112, + I_B = 113, + I_C = 114, + I_D = 115, + I_E = 116, + I_F = 117, + I_G = 118, + I_H = 119, + I_I = 120, + I_J = 121, + I_K = 122, + I_L = 123, + I_M = 124, + I_N = 125, + J_A = 126, + J_B = 127, + J_C = 128, + J_D = 129, + J_E = 130, + J_F = 131, + J_G = 132, + J_H = 133, + J_I = 134, + J_J = 135, + J_K = 136, + J_L = 137, + J_M = 138, + J_N = 139, + K_A = 140, + K_B = 141, + K_C = 142, + K_D = 143, + K_E = 144, + K_F = 145, + K_G = 146, + K_H = 147, + K_I = 148, + K_J = 149, + K_K = 150, + K_L = 151, + K_M = 152, + K_N = 153, + L_A = 154, + L_B = 155, + L_C = 156, + L_D = 157, + L_E = 158, + L_F = 159, + L_G = 160, + L_H = 161, + L_I = 162, + L_J = 163, + L_K = 164, + L_L = 165, + L_M = 166, + L_N = 167, + M_A = 168, + M_B = 169, + M_C = 170, + M_D = 171, + M_E = 172, + M_F = 173, + M_G = 174, + M_H = 175, + M_I = 176, + M_J = 177, + M_K = 178, + M_L = 179, + M_M = 180, + M_N = 181, + N_A = 182, + N_B = 183, + N_C = 184, + N_D = 185, + N_E = 186, + N_F = 187, + N_G = 188, + N_H = 189, + N_I = 190, + N_J = 191, + N_K = 192, + N_L = 193, + N_M = 194, + N_N = 195 +} +type rel_BLOCKS_X_BLOCKS = BRelation<BLOCKS, { BLOCKS::VARIANTS }, BLOCKS, { BLOCKS::VARIANTS }, 196>; +//relation_declaration done + + + +//relation_declaration +type rel_ROUTES_X_SetBLOCKS_X_BLOCKS = BRelation<ROUTES, { ROUTES::VARIANTS }, rel_BLOCKS_X_BLOCKS, { rel_BLOCKS_X_BLOCKS::VARIANTS }, 0>; +//relation_declaration done + + + +//enum_set_declaration start +#[derive(Default, Debug, Clone, Copy)] +// each enum value corresponds to one BSet +pub enum SetBLOCKS_X_BLOCKS { + #[default] + SET_SET_A_B__B_C__L_A_TES_TES = 0, + SET_SET_A_B__B_D__D_E__E_F__F_G__L_A_TES_TES = 1, + SET_SET_A_B__B_D__D_K__J_N__K_J__L_A_TES_TES = 2, + SET_SET_F_G__H_I__I_K__K_F__M_H_TES_TES = 3, + SET_SET_H_I__I_J__J_N__M_H_TES_TES = 4, + SET_SET_A_L__B_A__C_B_TES_TES = 5, + SET_SET_A_L__B_A__D_B__E_D__F_E__G_F_TES_TES = 6, + SET_SET_A_L__B_A__D_B__J_K__K_D__N_J_TES_TES = 7, + SET_SET_F_K__G_F__H_M__I_H__K_I_TES_TES = 8, + SET_SET_H_M__I_H__J_I__N_J_TES_TES = 9 +} +type set_SetBLOCKS_X_BLOCKS = BSet<rel_BLOCKS_X_BLOCKS, 10>; + +impl PowSetItem<10, 196> for BLOCKS_X_BLOCKS { + type SetRepr = SetBLOCKS_X_BLOCKS; + fn arr_to_idx(set: [bool; 196]) -> usize { + match set { + [false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 0, + [false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 1, + [false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 2, + [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 3, + [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 4, + [false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 5, + [false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 6, + [false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false] => 7, + [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] => 8, + [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false] => 9, + _ => panic!("Attempting to convert non-existing set to index!") // only happens if this is a const-set and code-generation missed a necessary value + } + } + fn idx_to_arr(idx: usize) -> [bool; 196] { + match idx { + 0 => [false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 1 => [false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 2 => [false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 3 => [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 4 => [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 5 => [false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 6 => [false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 7 => [false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false], + 8 => [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + 9 => [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false], + _ => panic!("SetBLOCKS_X_BLOCKS index out of range! {:?}", idx) + } + } +} +impl RelLeftItem<{BLOCKS::VARIANTS}, BLOCKS, { BLOCKS::VARIANTS}, 10, 196> for BLOCKS { + type RelEnum = BLOCKS_X_BLOCKS; +} +impl SetBLOCKS_X_BLOCKS { + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::SET_SET_A_B__B_C__L_A_TES_TES, + 1 => Self::SET_SET_A_B__B_D__D_E__E_F__F_G__L_A_TES_TES, + 2 => Self::SET_SET_A_B__B_D__D_K__J_N__K_J__L_A_TES_TES, + 3 => Self::SET_SET_F_G__H_I__I_K__K_F__M_H_TES_TES, + 4 => Self::SET_SET_H_I__I_J__J_N__M_H_TES_TES, + 5 => Self::SET_SET_A_L__B_A__C_B_TES_TES, + 6 => Self::SET_SET_A_L__B_A__D_B__E_D__F_E__G_F_TES_TES, + 7 => Self::SET_SET_A_L__B_A__D_B__J_K__K_D__N_J_TES_TES, + 8 => Self::SET_SET_F_K__G_F__H_M__I_H__K_I_TES_TES, + 9 => Self::SET_SET_H_M__I_H__J_I__N_J_TES_TES, + _ => panic!("SetBLOCKS_X_BLOCKS index out of range! {:?}", idx) + } + } +} + +impl SetItem<10> for SetBLOCKS_X_BLOCKS { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +//enum_set_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum ROUTES_X_BLOCKS { + #[default] + R1_A = 0, + R1_B = 1, + R1_C = 2, + R1_D = 3, + R1_E = 4, + R1_F = 5, + R1_G = 6, + R1_H = 7, + R1_I = 8, + R1_J = 9, + R1_K = 10, + R1_L = 11, + R1_M = 12, + R1_N = 13, + R2_A = 14, + R2_B = 15, + R2_C = 16, + R2_D = 17, + R2_E = 18, + R2_F = 19, + R2_G = 20, + R2_H = 21, + R2_I = 22, + R2_J = 23, + R2_K = 24, + R2_L = 25, + R2_M = 26, + R2_N = 27, + R3_A = 28, + R3_B = 29, + R3_C = 30, + R3_D = 31, + R3_E = 32, + R3_F = 33, + R3_G = 34, + R3_H = 35, + R3_I = 36, + R3_J = 37, + R3_K = 38, + R3_L = 39, + R3_M = 40, + R3_N = 41, + R4_A = 42, + R4_B = 43, + R4_C = 44, + R4_D = 45, + R4_E = 46, + R4_F = 47, + R4_G = 48, + R4_H = 49, + R4_I = 50, + R4_J = 51, + R4_K = 52, + R4_L = 53, + R4_M = 54, + R4_N = 55, + R5_A = 56, + R5_B = 57, + R5_C = 58, + R5_D = 59, + R5_E = 60, + R5_F = 61, + R5_G = 62, + R5_H = 63, + R5_I = 64, + R5_J = 65, + R5_K = 66, + R5_L = 67, + R5_M = 68, + R5_N = 69, + R6_A = 70, + R6_B = 71, + R6_C = 72, + R6_D = 73, + R6_E = 74, + R6_F = 75, + R6_G = 76, + R6_H = 77, + R6_I = 78, + R6_J = 79, + R6_K = 80, + R6_L = 81, + R6_M = 82, + R6_N = 83, + R7_A = 84, + R7_B = 85, + R7_C = 86, + R7_D = 87, + R7_E = 88, + R7_F = 89, + R7_G = 90, + R7_H = 91, + R7_I = 92, + R7_J = 93, + R7_K = 94, + R7_L = 95, + R7_M = 96, + R7_N = 97, + R8_A = 98, + R8_B = 99, + R8_C = 100, + R8_D = 101, + R8_E = 102, + R8_F = 103, + R8_G = 104, + R8_H = 105, + R8_I = 106, + R8_J = 107, + R8_K = 108, + R8_L = 109, + R8_M = 110, + R8_N = 111, + R9_A = 112, + R9_B = 113, + R9_C = 114, + R9_D = 115, + R9_E = 116, + R9_F = 117, + R9_G = 118, + R9_H = 119, + R9_I = 120, + R9_J = 121, + R9_K = 122, + R9_L = 123, + R9_M = 124, + R9_N = 125, + R10_A = 126, + R10_B = 127, + R10_C = 128, + R10_D = 129, + R10_E = 130, + R10_F = 131, + R10_G = 132, + R10_H = 133, + R10_I = 134, + R10_J = 135, + R10_K = 136, + R10_L = 137, + R10_M = 138, + R10_N = 139 +} +type rel_ROUTES_X_BLOCKS = BRelation<ROUTES, { ROUTES::VARIANTS }, BLOCKS, { BLOCKS::VARIANTS }, 140>; +//relation_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum BLOCKS_X_ROUTES { + #[default] + A_R1 = 0, + A_R2 = 1, + A_R3 = 2, + A_R4 = 3, + A_R5 = 4, + A_R6 = 5, + A_R7 = 6, + A_R8 = 7, + A_R9 = 8, + A_R10 = 9, + B_R1 = 10, + B_R2 = 11, + B_R3 = 12, + B_R4 = 13, + B_R5 = 14, + B_R6 = 15, + B_R7 = 16, + B_R8 = 17, + B_R9 = 18, + B_R10 = 19, + C_R1 = 20, + C_R2 = 21, + C_R3 = 22, + C_R4 = 23, + C_R5 = 24, + C_R6 = 25, + C_R7 = 26, + C_R8 = 27, + C_R9 = 28, + C_R10 = 29, + D_R1 = 30, + D_R2 = 31, + D_R3 = 32, + D_R4 = 33, + D_R5 = 34, + D_R6 = 35, + D_R7 = 36, + D_R8 = 37, + D_R9 = 38, + D_R10 = 39, + E_R1 = 40, + E_R2 = 41, + E_R3 = 42, + E_R4 = 43, + E_R5 = 44, + E_R6 = 45, + E_R7 = 46, + E_R8 = 47, + E_R9 = 48, + E_R10 = 49, + F_R1 = 50, + F_R2 = 51, + F_R3 = 52, + F_R4 = 53, + F_R5 = 54, + F_R6 = 55, + F_R7 = 56, + F_R8 = 57, + F_R9 = 58, + F_R10 = 59, + G_R1 = 60, + G_R2 = 61, + G_R3 = 62, + G_R4 = 63, + G_R5 = 64, + G_R6 = 65, + G_R7 = 66, + G_R8 = 67, + G_R9 = 68, + G_R10 = 69, + H_R1 = 70, + H_R2 = 71, + H_R3 = 72, + H_R4 = 73, + H_R5 = 74, + H_R6 = 75, + H_R7 = 76, + H_R8 = 77, + H_R9 = 78, + H_R10 = 79, + I_R1 = 80, + I_R2 = 81, + I_R3 = 82, + I_R4 = 83, + I_R5 = 84, + I_R6 = 85, + I_R7 = 86, + I_R8 = 87, + I_R9 = 88, + I_R10 = 89, + J_R1 = 90, + J_R2 = 91, + J_R3 = 92, + J_R4 = 93, + J_R5 = 94, + J_R6 = 95, + J_R7 = 96, + J_R8 = 97, + J_R9 = 98, + J_R10 = 99, + K_R1 = 100, + K_R2 = 101, + K_R3 = 102, + K_R4 = 103, + K_R5 = 104, + K_R6 = 105, + K_R7 = 106, + K_R8 = 107, + K_R9 = 108, + K_R10 = 109, + L_R1 = 110, + L_R2 = 111, + L_R3 = 112, + L_R4 = 113, + L_R5 = 114, + L_R6 = 115, + L_R7 = 116, + L_R8 = 117, + L_R9 = 118, + L_R10 = 119, + M_R1 = 120, + M_R2 = 121, + M_R3 = 122, + M_R4 = 123, + M_R5 = 124, + M_R6 = 125, + M_R7 = 126, + M_R8 = 127, + M_R9 = 128, + M_R10 = 129, + N_R1 = 130, + N_R2 = 131, + N_R3 = 132, + N_R4 = 133, + N_R5 = 134, + N_R6 = 135, + N_R7 = 136, + N_R8 = 137, + N_R9 = 138, + N_R10 = 139 +} +type rel_BLOCKS_X_ROUTES = BRelation<BLOCKS, { BLOCKS::VARIANTS }, ROUTES, { ROUTES::VARIANTS }, 140>; +//relation_declaration done + +#[derive(Derivative)] +#[derivative(Clone, Default, Debug, Hash, PartialEq, Eq)] +pub struct Train_1_beebook_deterministic_MC_POR_v2 { + /*declarations*/LBT: set_BLOCKS, + TRK: rel_BLOCKS_X_BLOCKS, + frm: set_ROUTES, + OCC: set_BLOCKS, + resbl: set_BLOCKS, + resrt: set_ROUTES, + rsrtbl: rel_BLOCKS_X_ROUTES, + /*constant_declarations*/fst: rel_ROUTES_X_BLOCKS, + lst: rel_ROUTES_X_BLOCKS, + nxt: rel_ROUTES_X_SetBLOCKS_X_BLOCKS, + rtbl: rel_BLOCKS_X_ROUTES, + /*sets*//*set_declaration*/_BLOCKS: set_BLOCKS, + /*set_declaration*/_ROUTES: set_ROUTES, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_route_reservation: Option<HashSet<ROUTES>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_route_freeing: Option<HashSet<ROUTES>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_FRONT_MOVE_1: Option<HashSet<ROUTES>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_FRONT_MOVE_2: Option<HashSet<BLOCKS>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_BACK_MOVE_1: Option<HashSet<BLOCKS>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_BACK_MOVE_2: Option<HashSet<BLOCKS>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_point_positionning: Option<HashSet<ROUTES>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_route_formation: Option<HashSet<ROUTES>>,} + + +impl Train_1_beebook_deterministic_MC_POR_v2 { + + pub fn new() -> Train_1_beebook_deterministic_MC_POR_v2 { + //values: '' + let mut m: Train_1_beebook_deterministic_MC_POR_v2 = Default::default(); + m.init(); + return m; + } + fn init(&mut self) { + /*set_initializations*///set_initialization + self._BLOCKS = bset![BLOCKS, /*enum_call*/BLOCKS::A, /*enum_call*/BLOCKS::B, /*enum_call*/BLOCKS::C, /*enum_call*/BLOCKS::D, /*enum_call*/BLOCKS::E, /*enum_call*/BLOCKS::F, /*enum_call*/BLOCKS::G, /*enum_call*/BLOCKS::H, /*enum_call*/BLOCKS::I, /*enum_call*/BLOCKS::J, /*enum_call*/BLOCKS::K, /*enum_call*/BLOCKS::L, /*enum_call*/BLOCKS::M, /*enum_call*/BLOCKS::N]; + //set_initialization + self._ROUTES = bset![ROUTES, /*enum_call*/ROUTES::R1, /*enum_call*/ROUTES::R2, /*enum_call*/ROUTES::R3, /*enum_call*/ROUTES::R4, /*enum_call*/ROUTES::R5, /*enum_call*/ROUTES::R6, /*enum_call*/ROUTES::R7, /*enum_call*/ROUTES::R8, /*enum_call*/ROUTES::R9, /*enum_call*/ROUTES::R10]; + /*properties*///constant_initialization + self.nxt = brel![rel_ROUTES_X_SetBLOCKS_X_BLOCKS, (/*enum_call*/ROUTES::R1.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::L.clone(), /*enum_call*/BLOCKS::A.clone()), (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/BLOCKS::B.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/BLOCKS::C.clone())].clone()), (/*enum_call*/ROUTES::R2.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::L.clone(), /*enum_call*/BLOCKS::A.clone()), (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/BLOCKS::B.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/BLOCKS::D.clone()), (/*enum_call*/BLOCKS::D.clone(), /*enum_call*/BLOCKS::E.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/BLOCKS::F.clone()), (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/BLOCKS::G.clone())].clone()), (/*enum_call*/ROUTES::R3.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::L.clone(), /*enum_call*/BLOCKS::A.clone()), (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/BLOCKS::B.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/BLOCKS::D.clone()), (/*enum_call*/BLOCKS::D.clone(), /*enum_call*/BLOCKS::K.clone()), (/*enum_call*/BLOCKS::K.clone(), /*enum_call*/BLOCKS::J.clone()), (/*enum_call*/BLOCKS::J.clone(), /*enum_call*/BLOCKS::N.clone())].clone()), (/*enum_call*/ROUTES::R4.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::M.clone(), /*enum_call*/BLOCKS::H.clone()), (/*enum_call*/BLOCKS::H.clone(), /*enum_call*/BLOCKS::I.clone()), (/*enum_call*/BLOCKS::I.clone(), /*enum_call*/BLOCKS::K.clone()), (/*enum_call*/BLOCKS::K.clone(), /*enum_call*/BLOCKS::F.clone()), (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/BLOCKS::G.clone())].clone()), (/*enum_call*/ROUTES::R5.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::M.clone(), /*enum_call*/BLOCKS::H.clone()), (/*enum_call*/BLOCKS::H.clone(), /*enum_call*/BLOCKS::I.clone()), (/*enum_call*/BLOCKS::I.clone(), /*enum_call*/BLOCKS::J.clone()), (/*enum_call*/BLOCKS::J.clone(), /*enum_call*/BLOCKS::N.clone())].clone()), (/*enum_call*/ROUTES::R6.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::C.clone(), /*enum_call*/BLOCKS::B.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/BLOCKS::A.clone()), (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/BLOCKS::L.clone())].clone()), (/*enum_call*/ROUTES::R7.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/BLOCKS::F.clone()), (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/BLOCKS::E.clone()), (/*enum_call*/BLOCKS::E.clone(), /*enum_call*/BLOCKS::D.clone()), (/*enum_call*/BLOCKS::D.clone(), /*enum_call*/BLOCKS::B.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/BLOCKS::A.clone()), (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/BLOCKS::L.clone())].clone()), (/*enum_call*/ROUTES::R8.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::N.clone(), /*enum_call*/BLOCKS::J.clone()), (/*enum_call*/BLOCKS::J.clone(), /*enum_call*/BLOCKS::K.clone()), (/*enum_call*/BLOCKS::K.clone(), /*enum_call*/BLOCKS::D.clone()), (/*enum_call*/BLOCKS::D.clone(), /*enum_call*/BLOCKS::B.clone()), (/*enum_call*/BLOCKS::B.clone(), /*enum_call*/BLOCKS::A.clone()), (/*enum_call*/BLOCKS::A.clone(), /*enum_call*/BLOCKS::L.clone())].clone()), (/*enum_call*/ROUTES::R9.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::G.clone(), /*enum_call*/BLOCKS::F.clone()), (/*enum_call*/BLOCKS::F.clone(), /*enum_call*/BLOCKS::K.clone()), (/*enum_call*/BLOCKS::K.clone(), /*enum_call*/BLOCKS::I.clone()), (/*enum_call*/BLOCKS::I.clone(), /*enum_call*/BLOCKS::H.clone()), (/*enum_call*/BLOCKS::H.clone(), /*enum_call*/BLOCKS::M.clone())].clone()), (/*enum_call*/ROUTES::R10.clone(), brel![rel_BLOCKS_X_BLOCKS, (/*enum_call*/BLOCKS::N.clone(), /*enum_call*/BLOCKS::J.clone()), (/*enum_call*/BLOCKS::J.clone(), /*enum_call*/BLOCKS::I.clone()), (/*enum_call*/BLOCKS::I.clone(), /*enum_call*/BLOCKS::H.clone()), (/*enum_call*/BLOCKS::H.clone(), /*enum_call*/BLOCKS::M.clone())].clone())]; + //constant_initialization + self.fst = brel![rel_ROUTES_X_BLOCKS, (/*enum_call*/ROUTES::R1.clone(), /*enum_call*/BLOCKS::L.clone()), (/*enum_call*/ROUTES::R2.clone(), /*enum_call*/BLOCKS::L.clone()), (/*enum_call*/ROUTES::R3.clone(), /*enum_call*/BLOCKS::L.clone()), (/*enum_call*/ROUTES::R4.clone(), /*enum_call*/BLOCKS::M.clone()), (/*enum_call*/ROUTES::R5.clone(), /*enum_call*/BLOCKS::M.clone()), (/*enum_call*/ROUTES::R6.clone(), /*enum_call*/BLOCKS::C.clone()), (/*enum_call*/ROUTES::R7.clone(), /*enum_call*/BLOCKS::G.clone()), (/*enum_call*/ROUTES::R8.clone(), /*enum_call*/BLOCKS::N.clone()), (/*enum_call*/ROUTES::R9.clone(), /*enum_call*/BLOCKS::G.clone()), (/*enum_call*/ROUTES::R10.clone(), /*enum_call*/BLOCKS::N.clone())]; + //constant_initialization + self.lst = brel![rel_ROUTES_X_BLOCKS, (/*enum_call*/ROUTES::R1.clone(), /*enum_call*/BLOCKS::C.clone()), (/*enum_call*/ROUTES::R2.clone(), /*enum_call*/BLOCKS::G.clone()), (/*enum_call*/ROUTES::R3.clone(), /*enum_call*/BLOCKS::N.clone()), (/*enum_call*/ROUTES::R4.clone(), /*enum_call*/BLOCKS::G.clone()), (/*enum_call*/ROUTES::R5.clone(), /*enum_call*/BLOCKS::N.clone()), (/*enum_call*/ROUTES::R6.clone(), /*enum_call*/BLOCKS::L.clone()), (/*enum_call*/ROUTES::R7.clone(), /*enum_call*/BLOCKS::L.clone()), (/*enum_call*/ROUTES::R8.clone(), /*enum_call*/BLOCKS::L.clone()), (/*enum_call*/ROUTES::R9.clone(), /*enum_call*/BLOCKS::M.clone()), (/*enum_call*/ROUTES::R10.clone(), /*enum_call*/BLOCKS::M.clone())]; + //constant_initialization + let mut _ic_set_0 = rel_BLOCKS_X_ROUTES::empty(); + //iteration_construct_enumeration + for _ic_b_1 in self._BLOCKS.clone().iter() { + //iteration_construct_enumeration + for _ic_r_1 in self._ROUTES.clone().iter() { + //set_comprehension_predicate + 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))) { + _ic_set_0 = _ic_set_0.union(&brel![rel_BLOCKS_X_ROUTES, (_ic_b_1.clone(), _ic_r_1.clone())]); + } + + } + } + self.rtbl = _ic_set_0; + /*body*/self.resrt = bset![ROUTES].clone().clone(); + self.resbl = bset![BLOCKS].clone().clone(); + self.rsrtbl = brel![rel_BLOCKS_X_ROUTES].clone().clone(); + self.OCC = bset![BLOCKS].clone().clone(); + self.TRK = brel![rel_BLOCKS_X_BLOCKS].clone().clone(); + self.frm = bset![ROUTES].clone().clone(); + self.LBT = bset![BLOCKS].clone().clone(); + /*includesInitialization*/ + } + + pub fn get_fst(&self) -> rel_ROUTES_X_BLOCKS { + return self.fst.clone(); + } + + pub fn get_lst(&self) -> rel_ROUTES_X_BLOCKS { + return self.lst.clone(); + } + + pub fn get_nxt(&self) -> rel_ROUTES_X_SetBLOCKS_X_BLOCKS { + return self.nxt.clone(); + } + + pub fn get_rtbl(&self) -> rel_BLOCKS_X_ROUTES { + return self.rtbl.clone(); + } + + pub fn get_LBT(&self) -> set_BLOCKS { + return self.LBT.clone(); + } + + pub fn get_TRK(&self) -> rel_BLOCKS_X_BLOCKS { + return self.TRK.clone(); + } + + pub fn get_frm(&self) -> set_ROUTES { + return self.frm.clone(); + } + + pub fn get_OCC(&self) -> set_BLOCKS { + return self.OCC.clone(); + } + + pub fn get_resbl(&self) -> set_BLOCKS { + return self.resbl.clone(); + } + + pub fn get_resrt(&self) -> set_ROUTES { + return self.resrt.clone(); + } + + pub fn get_rsrtbl(&self) -> rel_BLOCKS_X_ROUTES { + return self.rsrtbl.clone(); + } + + pub fn get__BLOCKS(&self) -> set_BLOCKS { + return self._BLOCKS.clone(); + } + + pub fn get__ROUTES(&self) -> set_ROUTES { + return self._ROUTES.clone(); + } + + pub fn route_reservation(&mut self, mut r: ROUTES) -> () { + //pre_assert + let mut _ld_resrt = self.resrt.clone(); + let mut _ld_rsrtbl = self.rsrtbl.clone(); + let mut _ld_resbl = self.resbl.clone(); + self.resrt = _ld_resrt.union(&bset![ROUTES, r]).clone().clone(); + self.rsrtbl = _ld_rsrtbl.union(&self.rtbl.rangeRestriction(&bset![ROUTES, r])).clone().clone(); + self.resbl = _ld_resbl.union(&self.rtbl.inverse().relationImage(&bset![ROUTES, r])).clone().clone(); + + } + + pub fn route_freeing(&mut self, mut r: ROUTES) -> () { + //pre_assert + let mut _ld_frm = self.frm.clone(); + let mut _ld_resrt = self.resrt.clone(); + self.resrt = _ld_resrt.difference(&bset![ROUTES, r]).clone().clone(); + self.frm = _ld_frm.difference(&bset![ROUTES, r]).clone().clone(); + + } + + pub fn FRONT_MOVE_1(&mut self, mut r: ROUTES) -> () { + //pre_assert + let mut _ld_OCC = self.OCC.clone(); + let mut _ld_LBT = self.LBT.clone(); + self.OCC = _ld_OCC.union(&bset![BLOCKS, self.fst.functionCall(&r)]).clone().clone(); + self.LBT = _ld_LBT.union(&bset![BLOCKS, self.fst.functionCall(&r)]).clone().clone(); + + } + + pub fn FRONT_MOVE_2(&mut self, mut b: BLOCKS) -> () { + //pre_assert + self.OCC = self.OCC.union(&bset![BLOCKS, self.TRK.functionCall(&b)]).clone().clone(); + + } + + pub fn BACK_MOVE_1(&mut self, mut b: BLOCKS) -> () { + //pre_assert + let mut _ld_rsrtbl = self.rsrtbl.clone(); + let mut _ld_resbl = self.resbl.clone(); + let mut _ld_OCC = self.OCC.clone(); + let mut _ld_LBT = self.LBT.clone(); + self.OCC = _ld_OCC.difference(&bset![BLOCKS, b]).clone().clone(); + self.rsrtbl = _ld_rsrtbl.domainSubstraction(&bset![BLOCKS, b]).clone().clone(); + self.resbl = _ld_resbl.difference(&bset![BLOCKS, b]).clone().clone(); + self.LBT = _ld_LBT.difference(&bset![BLOCKS, b]).clone().clone(); + + } + + pub fn BACK_MOVE_2(&mut self, mut b: BLOCKS) -> () { + //pre_assert + let mut _ld_rsrtbl = self.rsrtbl.clone(); + let mut _ld_resbl = self.resbl.clone(); + let mut _ld_OCC = self.OCC.clone(); + let mut _ld_LBT = self.LBT.clone(); + self.OCC = _ld_OCC.difference(&bset![BLOCKS, b]).clone().clone(); + self.rsrtbl = _ld_rsrtbl.domainSubstraction(&bset![BLOCKS, b]).clone().clone(); + self.resbl = _ld_resbl.difference(&bset![BLOCKS, b]).clone().clone(); + self.LBT = _ld_LBT.difference(&bset![BLOCKS, b]).union(&bset![BLOCKS, self.TRK.functionCall(&b)]).clone().clone(); + + } + + pub fn point_positionning(&mut self, mut r: ROUTES) -> () { + //pre_assert + self.TRK = self.TRK.domainSubstraction(&self.nxt.functionCall(&r).domain()).rangeSubstraction(&self.nxt.functionCall(&r).range()).union(&self.nxt.functionCall(&r)).clone().clone(); + + } + + pub fn route_formation(&mut self, mut r: ROUTES) -> () { + //pre_assert + self.frm = self.frm.union(&bset![ROUTES, r]).clone().clone(); + + } + + pub fn _tr_route_reservation(&mut self, is_caching: bool) -> HashSet<ROUTES> { + //transition + if !is_caching || self._tr_cache_route_reservation.is_none() { + let mut _ic_set_1: HashSet<ROUTES> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_r_1 in self._ROUTES.difference(&self.resrt).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (self.rtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1]).intersect(&self.resbl).equal(&bset![BLOCKS]) && bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range()))) { + _ic_set_1.insert(_ic_r_1); + } + + } + self._tr_cache_route_reservation = Option::Some(_ic_set_1.clone()); + return _ic_set_1; + } else { + return self._tr_cache_route_reservation.as_ref().unwrap().clone(); + } + } + + pub fn _tr_route_freeing(&mut self, is_caching: bool) -> HashSet<ROUTES> { + //transition + if !is_caching || self._tr_cache_route_freeing.is_none() { + let mut _ic_set_2: HashSet<ROUTES> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_r_1 in self.resrt.difference(&self.rsrtbl.range()).clone().iter() { + //parameter_combination_predicate TODO: FASTER + _ic_set_2.insert(_ic_r_1); + + } + self._tr_cache_route_freeing = Option::Some(_ic_set_2.clone()); + return _ic_set_2; + } else { + return self._tr_cache_route_freeing.as_ref().unwrap().clone(); + } + } + + pub fn _tr_FRONT_MOVE_1(&mut self, is_caching: bool) -> HashSet<ROUTES> { + //transition + if !is_caching || self._tr_cache_FRONT_MOVE_1.is_none() { + let mut _ic_set_3: HashSet<ROUTES> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_r_1 in self.frm.clone().iter() { + //parameter_combination_predicate TODO: FASTER + 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![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range()))) { + _ic_set_3.insert(_ic_r_1); + } + + } + self._tr_cache_FRONT_MOVE_1 = Option::Some(_ic_set_3.clone()); + return _ic_set_3; + } else { + return self._tr_cache_FRONT_MOVE_1.as_ref().unwrap().clone(); + } + } + + pub fn _tr_FRONT_MOVE_2(&mut self, is_caching: bool) -> HashSet<BLOCKS> { + //transition + if !is_caching || self._tr_cache_FRONT_MOVE_2.is_none() { + let mut _ic_set_4: HashSet<BLOCKS> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_b_1 in self.OCC.intersect(&self.TRK.domain()).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if self.OCC.notElementOf(&self.TRK.functionCall(&_ic_b_1)) { + _ic_set_4.insert(_ic_b_1); + } + + } + self._tr_cache_FRONT_MOVE_2 = Option::Some(_ic_set_4.clone()); + return _ic_set_4; + } else { + return self._tr_cache_FRONT_MOVE_2.as_ref().unwrap().clone(); + } + } + + pub fn _tr_BACK_MOVE_1(&mut self, is_caching: bool) -> HashSet<BLOCKS> { + //transition + if !is_caching || self._tr_cache_BACK_MOVE_1.is_none() { + let mut _ic_set_5: HashSet<BLOCKS> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_b_1 in self.LBT.difference(&self.TRK.domain()).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range())) { + _ic_set_5.insert(_ic_b_1); + } + + } + self._tr_cache_BACK_MOVE_1 = Option::Some(_ic_set_5.clone()); + return _ic_set_5; + } else { + return self._tr_cache_BACK_MOVE_1.as_ref().unwrap().clone(); + } + } + + pub fn _tr_BACK_MOVE_2(&mut self, is_caching: bool) -> HashSet<BLOCKS> { + //transition + if !is_caching || self._tr_cache_BACK_MOVE_2.is_none() { + let mut _ic_set_6: HashSet<BLOCKS> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_b_1 in self.LBT.intersect(&self.TRK.domain()).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (self.OCC.elementOf(&self.TRK.functionCall(&_ic_b_1)) && bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range()))) { + _ic_set_6.insert(_ic_b_1); + } + + } + self._tr_cache_BACK_MOVE_2 = Option::Some(_ic_set_6.clone()); + return _ic_set_6; + } else { + return self._tr_cache_BACK_MOVE_2.as_ref().unwrap().clone(); + } + } + + pub fn _tr_point_positionning(&mut self, is_caching: bool) -> HashSet<ROUTES> { + //transition + if !is_caching || self._tr_cache_point_positionning.is_none() { + let mut _ic_set_7: HashSet<ROUTES> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range())) { + _ic_set_7.insert(_ic_r_1); + } + + } + self._tr_cache_point_positionning = Option::Some(_ic_set_7.clone()); + return _ic_set_7; + } else { + return self._tr_cache_point_positionning.as_ref().unwrap().clone(); + } + } + + pub fn _tr_route_formation(&mut self, is_caching: bool) -> HashSet<ROUTES> { + //transition + if !is_caching || self._tr_cache_route_formation.is_none() { + let mut _ic_set_8: HashSet<ROUTES> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (self.nxt.functionCall(&_ic_r_1).domainRestriction(&self.rsrtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1])).equal(&self.TRK.domainRestriction(&self.rsrtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1]))) && bset![ROUTES].equal(&self.resrt.difference(&self.rsrtbl.range()))) { + _ic_set_8.insert(_ic_r_1); + } + + } + self._tr_cache_route_formation = Option::Some(_ic_set_8.clone()); + return _ic_set_8; + } else { + return self._tr_cache_route_formation.as_ref().unwrap().clone(); + } + } + + pub fn _check_inv_1(&self) -> bool { + //invariant + return self._BLOCKS.check_domain_of(&self.TRK).and(&self._BLOCKS.check_range_of(&self.TRK)).and(&self.TRK.isFunction()).and(&self._BLOCKS.check_partial_of(&self.TRK)).and(&self.TRK.isInjection()); + } + + pub fn _check_inv_2(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_9 = true; + //iteration_construct_enumeration + for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter() { + //iteration_construct_assignment + { + let mut _ic_a_1 = bset![ROUTES, _ic_r_1]; + if !self.rtbl.rangeRestriction(&_ic_a_1).equal(&self.rsrtbl.rangeRestriction(&_ic_a_1)) { + _ic_boolean_9 = false; + break; + } + + } + } + + return _ic_boolean_9; + } + + pub fn _check_inv_3(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_11 = true; + //iteration_construct_enumeration + for _ic_x_1 in self.TRK.domain().clone().iter() { + //iteration_construct_enumeration + for _ic_y_1 in self.TRK.relationImage(&bset![BLOCKS, _ic_x_1]).clone().iter() { + //quantified_predicate + let mut _ic_boolean_10 = false; + //iteration_construct_enumeration + for _ic_r_1 in self._ROUTES.clone().iter() { + if self.nxt.functionCall(&_ic_r_1).elementOf(&(_ic_x_1.clone(), _ic_y_1.clone())) { + _ic_boolean_10 = true; + break; + } + + } + + if !_ic_boolean_10 { + _ic_boolean_11 = false; + break; + } + + } + } + + return _ic_boolean_11; + } + + pub fn _check_inv_4(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_12 = true; + //iteration_construct_enumeration + for _ic_r_1 in self.frm.clone().iter() { + //iteration_construct_assignment + { + let mut _ic_a_1 = self.rsrtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1]); + if !self.nxt.functionCall(&_ic_r_1).domainRestriction(&_ic_a_1).equal(&self.TRK.domainRestriction(&_ic_a_1)) { + _ic_boolean_12 = false; + break; + } + + } + } + + return _ic_boolean_12; + } + + pub fn _check_inv_5(&self) -> bool { + //invariant + return self.LBT.subset(&self.OCC); + } + + pub fn _check_inv_6(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_13 = true; + //iteration_construct_enumeration + for _ic_a_1 in self.rsrtbl.domain().clone().iter() { + //iteration_construct_enumeration + for _ic_b_1 in self.LBT.clone().iter() { + //iteration_construct_assignment + { + let mut _ic_c_1 = self.rsrtbl.functionCall(&_ic_b_1); + //iteration_construct_assignment + { + let mut _ic_d_1 = self.nxt.functionCall(&_ic_c_1); + 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)) { + _ic_boolean_13 = false; + break; + } + + } + } + } + } + + return _ic_boolean_13; + } + + pub fn _check_inv_7(&self) -> bool { + //invariant + return self.resbl.check_domain_of(&self.rsrtbl).and(&self.resrt.check_range_of(&self.rsrtbl)).and(&self.rsrtbl.isFunction()).and(&self.resbl.check_total_of(&self.rsrtbl)); + } + + pub fn _check_inv_8(&self) -> bool { + //invariant + return self.rsrtbl.subset(&self.rtbl); + } + + pub fn _check_inv_9(&self) -> bool { + //invariant + return self.OCC.subset(&self.resbl); + } + + pub fn _check_inv_10(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_14 = true; + //iteration_construct_enumeration + for _ic_r_1 in self._ROUTES.clone().iter() { + //iteration_construct_assignment + { + let mut _ic_a_1 = self.nxt.functionCall(&_ic_r_1); + //iteration_construct_assignment + { + let mut _ic_b_1 = self.rsrtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1]); + //iteration_construct_assignment + { + let mut _ic_c_1 = _ic_b_1.difference(&self.OCC); + if !((_ic_a_1.relationImage(&self.rtbl.inverse().relationImage(&bset![ROUTES, _ic_r_1]).difference(&_ic_b_1)).intersect(&_ic_c_1).equal(&bset![BLOCKS]) && _ic_a_1.relationImage(&_ic_b_1).subset(&_ic_b_1)) && _ic_a_1.relationImage(&_ic_c_1).subset(&_ic_c_1)) { + _ic_boolean_14 = false; + break; + } + + } + } + } + } + + return _ic_boolean_14; + } + + pub fn _check_inv_11(&self) -> bool { + //invariant + return self.frm.subset(&self.resrt); + } + + pub fn _check_inv_12(&self) -> bool { + //invariant + return self.rsrtbl.relationImage(&self.OCC).subset(&self.frm); + } + + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { + //calling the given functions without caching will recalculate them and cache them afterwards + 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);}, + "_tr_FRONT_MOVE_2" => {self._tr_FRONT_MOVE_2(false);}, + "_tr_BACK_MOVE_1" => {self._tr_BACK_MOVE_1(false);}, + "_tr_BACK_MOVE_2" => {self._tr_BACK_MOVE_2(false);}, + "_tr_point_positionning" => {self._tr_point_positionning(false);}, + "_tr_route_formation" => {self._tr_route_formation(false);}, + _ => {}, + } + } + } + + //model_check_next_states + fn generateNextStates(state: &mut Train_1_beebook_deterministic_MC_POR_v2, + isCaching: bool, + 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; + } + + + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); + return result; + } + + //model_check_invariants + 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 !state._check_inv_1() { + println!("_check_inv_1 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_3() { + println!("_check_inv_3 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_5() { + println!("_check_inv_5 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_7() { + println!("_check_inv_7 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_9() { + println!("_check_inv_9 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_11() { + println!("_check_inv_11 failed!"); + return false; + } + } + //model_check_invariant + if dependent_invariants_of_state.contains(&"_check_inv_12") { + if !state._check_inv_12() { + println!("_check_inv_12 failed!"); + return false; + } + } + return true; + } + return !(!state._check_inv_1() || !state._check_inv_2() || !state._check_inv_3() || !state._check_inv_4() || !state._check_inv_5() || !state._check_inv_6() || !state._check_inv_7() || !state._check_inv_8() || !state._check_inv_9() || !state._check_inv_10() || !state._check_inv_11() || !state._check_inv_12()); + } + + //model_check_print + 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, &'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(), + MC_TYPE::DFS => collection.pop_back().unwrap(), + MC_TYPE::MIXED => if collection.len() % 2 == 0 { collection.pop_front().unwrap() } else { collection.pop_back().unwrap() } + }; + } + + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "point_positionning" => vec!["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], + //model_check_init_static + "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 + "FRONT_MOVE_1" => vec!["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], + //model_check_init_static + "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 + "FRONT_MOVE_2" => vec!["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"], + //model_check_init_static + "route_formation" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"], + //model_check_init_static + "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 + "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 + "point_positionning" => vec!["_check_inv_3", "_check_inv_1", "_check_inv_4"], + //model_check_init_static + "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 + "FRONT_MOVE_1" => vec!["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"], + //model_check_init_static + "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 + "FRONT_MOVE_2" => vec!["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"], + //model_check_init_static + "route_formation" => vec!["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"], + //model_check_init_static + "route_freeing" => vec!["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"], + //model_check_init_static + "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![], + } + } + + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool, no_dead: bool, no_inv: bool) { + let mut machine = Train_1_beebook_deterministic_MC_POR_v2::new(); + + let mut all_states = HashSet::<Train_1_beebook_deterministic_MC_POR_v2>::new(); + all_states.insert(machine.clone()); + + 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(), "")); + + 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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } + if !no_dead && next_states.is_empty() { + print!("DEADLOCK DETECTED"); + stop_threads = true; + } + + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + + fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool, no_dead: bool, no_inv: bool) { + let threadPool = ThreadPool::new(threads); + + 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 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 num_transitions = Arc::new(AtomicU64::new(0)); + + 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 && !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 = 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, transitions); + if !no_dead && next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } + + //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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } + //println!("Thread {:?} done", thread::current().id()); + let _ = tx.send(Ok(1)); + }); + + 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()); + match rx.try_recv() { + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + +} + + +fn main() { + let args: Vec<String> = env::args().collect(); + if args.len() < 4 { panic!("Number of arguments errorneous"); } + + let threads = args.get(2).unwrap().parse::<usize>().unwrap(); + if threads <= 0 { panic!("Input for number of threads is wrong."); } + + let is_caching = args.get(3).unwrap().parse::<bool>().unwrap(); + let mc_type = match args.get(1).unwrap().as_str() { + "mixed" => MC_TYPE::MIXED, + "bf" => MC_TYPE::BFS, + "df" => MC_TYPE::DFS, + _ => panic!("Input for strategy is wrong.") + }; + + let mut no_dead = false; + let mut no_inv = false; + + if args.len() > 4 { + for arg in args.iter().skip(4) { + match arg.as_str() { + "-nodead" => no_dead = true, + "-noinv" => no_inv = true, + _ => {} + } + } + } + + if threads == 1 { + Train_1_beebook_deterministic_MC_POR_v2::model_check_single_threaded(mc_type, is_caching, no_dead, no_inv); + } else { + Train_1_beebook_deterministic_MC_POR_v2::modelCheckMultiThreaded(mc_type, threads, is_caching, no_dead, no_inv); + } +} diff --git a/benchmarks/model_checking/Rust_embedded/nota_v2.rs b/benchmarks/model_checking/Rust_embedded/nota_v2.rs new file mode 100644 index 000000000..fc0d64c1a --- /dev/null +++ b/benchmarks/model_checking/Rust_embedded/nota_v2.rs @@ -0,0 +1,2112 @@ +#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ] +//#![no_std] //std is enabled for the generated machine by default, since without it there is no println which makes unit-testing very difficult +use btypes::{bset, brel}; +use btypes::bset::BSet; +use btypes::bset::SetItem; +use btypes::bset::PowSetItem; +use btypes::bset::PowAble; +use btypes::bset::NestedSet; +use btypes::brelation::BRelation; +use btypes::brelation::RelLeftItem; +use btypes::brelation::RelPowAble; +use btypes::bboolean::BBoolean; +use btypes::bboolean::BBool; +use btypes::bboolean::BOOL; +use btypes::binteger::BInteger; +use btypes::binteger::BInt; +use btypes::binteger::set_BInteger; +use btypes::btuple::BTuple; + +use std::env; +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}; + + + +#[derive(Clone, Copy)] +pub enum MC_TYPE { BFS, DFS, MIXED } + +#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct _Struct5 { + soc: set_SOCKET, + err: IN_ERROR_CODES, +} + +impl _Struct5 { + pub fn new(mut soc: set_SOCKET, mut err: IN_ERROR_CODES) -> _Struct5 { + let mut m: _Struct5 = Default::default(); + //record_field_initialization + m.soc = soc;//record_field_initialization + m.err = err; + return m; + } + + //record_field_get + pub fn get_soc(&self) -> set_SOCKET { + return self.soc.clone(); + } + + //record_field_get + pub fn get_err(&self) -> IN_ERROR_CODES { + return self.err.clone(); + } + + //record_field_override + pub fn override_soc(&self, soc: set_SOCKET) -> _Struct5 { + return _Struct5::new(soc.clone(), self.err.clone()); + } + + + //record_field_override + pub fn override_err(&self, err: IN_ERROR_CODES) -> _Struct5 { + return _Struct5::new(self.soc.clone(), err.clone()); + } + + + pub fn equal(&self, other: &_Struct5) -> bool { + return self.soc == other.soc && self.err == other.err; + } + + pub fn unequal(&self, other: &_Struct5) -> bool { + return self.soc != other.soc || self.err != other.err; + } + +} + +#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct _Struct1 { + sid: set_SID, + err: RM_ERROR_CODES, +} + +impl _Struct1 { + pub fn new(mut sid: set_SID, mut err: RM_ERROR_CODES) -> _Struct1 { + let mut m: _Struct1 = Default::default(); + //record_field_initialization + m.sid = sid;//record_field_initialization + m.err = err; + return m; + } + + //record_field_get + pub fn get_sid(&self) -> set_SID { + return self.sid.clone(); + } + + //record_field_get + pub fn get_err(&self) -> RM_ERROR_CODES { + return self.err.clone(); + } + + //record_field_override + pub fn override_sid(&self, sid: set_SID) -> _Struct1 { + return _Struct1::new(sid.clone(), self.err.clone()); + } + + + //record_field_override + pub fn override_err(&self, err: RM_ERROR_CODES) -> _Struct1 { + return _Struct1::new(self.sid.clone(), err.clone()); + } + + + pub fn equal(&self, other: &_Struct1) -> bool { + return self.sid == other.sid && self.err == other.err; + } + + pub fn unequal(&self, other: &_Struct1) -> bool { + return self.sid != other.sid || self.err != other.err; + } + +} + +#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct _Struct3 { + sid: set_SID, + err: IN_ERROR_CODES, +} + +impl _Struct3 { + pub fn new(mut sid: set_SID, mut err: IN_ERROR_CODES) -> _Struct3 { + let mut m: _Struct3 = Default::default(); + //record_field_initialization + m.sid = sid;//record_field_initialization + m.err = err; + return m; + } + + //record_field_get + pub fn get_sid(&self) -> set_SID { + return self.sid.clone(); + } + + //record_field_get + pub fn get_err(&self) -> IN_ERROR_CODES { + return self.err.clone(); + } + + //record_field_override + pub fn override_sid(&self, sid: set_SID) -> _Struct3 { + return _Struct3::new(sid.clone(), self.err.clone()); + } + + + //record_field_override + pub fn override_err(&self, err: IN_ERROR_CODES) -> _Struct3 { + return _Struct3::new(self.sid.clone(), err.clone()); + } + + + pub fn equal(&self, other: &_Struct3) -> bool { + return self.sid == other.sid && self.err == other.err; + } + + pub fn unequal(&self, other: &_Struct3) -> bool { + return self.sid != other.sid || self.err != other.err; + } + +} + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum INTERCONNECTNODE { + #[default] + node1 = 0, + node2 = 1 +} + +impl INTERCONNECTNODE { + pub fn equal(&self, other: &INTERCONNECTNODE) -> bool { *self == *other } + pub fn unequal(&self, other: &INTERCONNECTNODE) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::node1, + 1 => Self::node2, + _ => panic!("INTERCONNECTNODE index out of range! {:?}", idx) + } + } +} + +impl SetItem<2> for INTERCONNECTNODE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_INTERCONNECTNODE = BSet<INTERCONNECTNODE, 2>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SOCKET { + #[default] + socket1 = 0, + socket2 = 1 +} + +impl SOCKET { + pub fn equal(&self, other: &SOCKET) -> bool { *self == *other } + pub fn unequal(&self, other: &SOCKET) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::socket1, + 1 => Self::socket2, + _ => panic!("SOCKET index out of range! {:?}", idx) + } + } +} + +impl SetItem<2> for SOCKET { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_SOCKET = BSet<SOCKET, 2>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SERVICE { + #[default] + service1 = 0, + service2 = 1 +} + +impl SERVICE { + pub fn equal(&self, other: &SERVICE) -> bool { *self == *other } + pub fn unequal(&self, other: &SERVICE) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::service1, + 1 => Self::service2, + _ => panic!("SERVICE index out of range! {:?}", idx) + } + } +} + +impl SetItem<2> for SERVICE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_SERVICE = BSet<SERVICE, 2>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum RESOURCEMANAGER { + #[default] + resource1 = 0, + resource2 = 1 +} + +impl RESOURCEMANAGER { + pub fn equal(&self, other: &RESOURCEMANAGER) -> bool { *self == *other } + pub fn unequal(&self, other: &RESOURCEMANAGER) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::resource1, + 1 => Self::resource2, + _ => panic!("RESOURCEMANAGER index out of range! {:?}", idx) + } + } +} + +impl SetItem<2> for RESOURCEMANAGER { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_RESOURCEMANAGER = BSet<RESOURCEMANAGER, 2>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SID { + #[default] + SID1 = 0, + SID2 = 1 +} + +impl SID { + pub fn equal(&self, other: &SID) -> bool { *self == *other } + pub fn unequal(&self, other: &SID) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::SID1, + 1 => Self::SID2, + _ => panic!("SID index out of range! {:?}", idx) + } + } +} + +impl SetItem<2> for SID { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_SID = BSet<SID, 2>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum RM_ERROR_CODES { + #[default] + RM_SERVICE_FOUND = 0, + RM_SERVICE_NOT_FOUND = 1 +} + +impl RM_ERROR_CODES { + pub fn equal(&self, other: &RM_ERROR_CODES) -> bool { *self == *other } + pub fn unequal(&self, other: &RM_ERROR_CODES) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::RM_SERVICE_FOUND, + 1 => Self::RM_SERVICE_NOT_FOUND, + _ => panic!("RM_ERROR_CODES index out of range! {:?}", idx) + } + } +} + +impl SetItem<2> for RM_ERROR_CODES { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_RM_ERROR_CODES = BSet<RM_ERROR_CODES, 2>; +//set_enum_declaration done + +//set_enum_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum IN_ERROR_CODES { + #[default] + IN_REGISTRATION_OK = 0, + IN_REGISTRATION_FAILED = 1, + IN_DEREGISTRATION_OK = 2, + IN_DEREGISTRATION_FAILED = 3, + IN_NO_SOCKET_CONNECTION = 4, + IN_SOCKET_CONNECTION_OK = 5, + IN_NO_AVAILABLE_SERVICE = 6, + IN_SERVICE_AVAILABLE = 7, + IN_TARGET_SOCKET_GRANTED = 8, + IN_TARGET_SOCKET_NOT_GRANTED = 9 +} + +impl IN_ERROR_CODES { + pub fn equal(&self, other: &IN_ERROR_CODES) -> bool { *self == *other } + pub fn unequal(&self, other: &IN_ERROR_CODES) -> bool { *self != *other } + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::IN_REGISTRATION_OK, + 1 => Self::IN_REGISTRATION_FAILED, + 2 => Self::IN_DEREGISTRATION_OK, + 3 => Self::IN_DEREGISTRATION_FAILED, + 4 => Self::IN_NO_SOCKET_CONNECTION, + 5 => Self::IN_SOCKET_CONNECTION_OK, + 6 => Self::IN_NO_AVAILABLE_SERVICE, + 7 => Self::IN_SERVICE_AVAILABLE, + 8 => Self::IN_TARGET_SOCKET_GRANTED, + 9 => Self::IN_TARGET_SOCKET_NOT_GRANTED, + _ => panic!("IN_ERROR_CODES index out of range! {:?}", idx) + } + } +} + +impl SetItem<10> for IN_ERROR_CODES { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +type set_IN_ERROR_CODES = BSet<IN_ERROR_CODES, 10>; +//set_enum_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SOCKET_X_INTERCONNECTNODE { + #[default] + socket1_node1 = 0, + socket1_node2 = 1, + socket2_node1 = 2, + socket2_node2 = 3 +} +type rel_SOCKET_X_INTERCONNECTNODE = BRelation<SOCKET, { SOCKET::VARIANTS }, INTERCONNECTNODE, { INTERCONNECTNODE::VARIANTS }, 4>; +//relation_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum RESOURCEMANAGER_X_SetSERVICE { + #[default] + resource1_SET__TES = 0, + resource1_SET_service1_TES = 1, + resource1_SET_service2_TES = 2, + resource1_SET_service1__service2_TES = 3, + resource2_SET__TES = 4, + resource2_SET_service1_TES = 5, + resource2_SET_service2_TES = 6, + resource2_SET_service1__service2_TES = 7 +} +type rel_RESOURCEMANAGER_X_SetSERVICE = BRelation<RESOURCEMANAGER, { RESOURCEMANAGER::VARIANTS }, set_SERVICE, { set_SERVICE::VARIANTS }, 8>; +//relation_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum INTERCONNECTNODE_X_SetRESOURCEMANAGER { + #[default] + node1_SET__TES = 0, + node1_SET_resource1_TES = 1, + node1_SET_resource2_TES = 2, + node1_SET_resource1__resource2_TES = 3, + node2_SET__TES = 4, + node2_SET_resource1_TES = 5, + node2_SET_resource2_TES = 6, + node2_SET_resource1__resource2_TES = 7 +} +type rel_INTERCONNECTNODE_X_SetRESOURCEMANAGER = BRelation<INTERCONNECTNODE, { INTERCONNECTNODE::VARIANTS }, set_RESOURCEMANAGER, { set_RESOURCEMANAGER::VARIANTS }, 8>; +//relation_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SERVICE_X_SID { + #[default] + service1_SID1 = 0, + service1_SID2 = 1, + service2_SID1 = 2, + service2_SID2 = 3 +} +type rel_SERVICE_X_SID = BRelation<SERVICE, { SERVICE::VARIANTS }, SID, { SID::VARIANTS }, 4>; +//relation_declaration done + + + + + + + + + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SID_X_INTERCONNECTNODE { + #[default] + SID1_node1 = 0, + SID1_node2 = 1, + SID2_node1 = 2, + SID2_node2 = 3 +} +type rel_SID_X_INTERCONNECTNODE = BRelation<SID, { SID::VARIANTS }, INTERCONNECTNODE, { INTERCONNECTNODE::VARIANTS }, 4>; +//relation_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SERVICE_X_INTERCONNECTNODE { + #[default] + service1_node1 = 0, + service1_node2 = 1, + service2_node1 = 2, + service2_node2 = 3 +} +type rel_SERVICE_X_INTERCONNECTNODE = BRelation<SERVICE, { SERVICE::VARIANTS }, INTERCONNECTNODE, { INTERCONNECTNODE::VARIANTS }, 4>; +//relation_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SOCKET_X_SID { + #[default] + socket1_SID1 = 0, + socket1_SID2 = 1, + socket2_SID1 = 2, + socket2_SID2 = 3 +} +type rel_SOCKET_X_SID = BRelation<SOCKET, { SOCKET::VARIANTS }, SID, { SID::VARIANTS }, 4>; +//relation_declaration done + + + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SERVICE_X_SetSOCKET { + #[default] + service1_SET__TES = 0, + service1_SET_socket1_TES = 1, + service1_SET_socket2_TES = 2, + service1_SET_socket1__socket2_TES = 3, + service2_SET__TES = 4, + service2_SET_socket1_TES = 5, + service2_SET_socket2_TES = 6, + service2_SET_socket1__socket2_TES = 7 +} +type rel_SERVICE_X_SetSOCKET = BRelation<SERVICE, { SERVICE::VARIANTS }, set_SOCKET, { set_SOCKET::VARIANTS }, 8>; +//relation_declaration done + + + +//enum_set_declaration start +#[derive(Default, Debug, Clone, Copy)] +// each enum value corresponds to one BSet +pub enum SetRESOURCEMANAGER { + #[default] + SET_SET__TES_TES = 0, + SET_SET_resource1_TES_TES = 1, + SET_SET_resource2_TES_TES = 2, + SET_SET_resource1__resource2_TES_TES = 3 +} +type set_SetRESOURCEMANAGER = BSet<set_RESOURCEMANAGER, 4>; + +impl PowSetItem<4, 2> for RESOURCEMANAGER { + type SetRepr = SetRESOURCEMANAGER; + fn arr_to_idx(set: [bool; 2]) -> usize { + match set { + [false, false] => 0, + [true, false] => 1, + [false, true] => 2, + [true, true] => 3, + _ => panic!("Attempting to convert non-existing set to index!") // only happens if this is a const-set and code-generation missed a necessary value + } + } + fn idx_to_arr(idx: usize) -> [bool; 2] { + match idx { + 0 => [false, false], + 1 => [true, false], + 2 => [false, true], + 3 => [true, true], + _ => panic!("SetRESOURCEMANAGER index out of range! {:?}", idx) + } + } +} +impl SetRESOURCEMANAGER { + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::SET_SET__TES_TES, + 1 => Self::SET_SET_resource1_TES_TES, + 2 => Self::SET_SET_resource2_TES_TES, + 3 => Self::SET_SET_resource1__resource2_TES_TES, + _ => panic!("SetRESOURCEMANAGER index out of range! {:?}", idx) + } + } +} + +impl SetItem<4> for SetRESOURCEMANAGER { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +//enum_set_declaration done + +//relation_declaration +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SERVICE_X_BOOL { + #[default] + service1_BFALSE = 0, + service1_BTRUE = 1, + service2_BFALSE = 2, + service2_BTRUE = 3 +} +type rel_SERVICE_X_BOOL = BRelation<SERVICE, { SERVICE::VARIANTS }, BBoolean, { BBoolean::VARIANTS }, 4>; +//relation_declaration done + +//enum_set_declaration start +#[derive(Default, Debug, Clone, Copy)] +// each enum value corresponds to one BSet +pub enum SetSERVICE { + #[default] + SET_SET__TES_TES = 0, + SET_SET_service1_TES_TES = 1, + SET_SET_service2_TES_TES = 2, + SET_SET_service1__service2_TES_TES = 3 +} +type set_SetSERVICE = BSet<set_SERVICE, 4>; + +impl PowSetItem<4, 2> for SERVICE { + type SetRepr = SetSERVICE; + fn arr_to_idx(set: [bool; 2]) -> usize { + match set { + [false, false] => 0, + [true, false] => 1, + [false, true] => 2, + [true, true] => 3, + _ => panic!("Attempting to convert non-existing set to index!") // only happens if this is a const-set and code-generation missed a necessary value + } + } + fn idx_to_arr(idx: usize) -> [bool; 2] { + match idx { + 0 => [false, false], + 1 => [true, false], + 2 => [false, true], + 3 => [true, true], + _ => panic!("SetSERVICE index out of range! {:?}", idx) + } + } +} +impl SetSERVICE { + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::SET_SET__TES_TES, + 1 => Self::SET_SET_service1_TES_TES, + 2 => Self::SET_SET_service2_TES_TES, + 3 => Self::SET_SET_service1__service2_TES_TES, + _ => panic!("SetSERVICE index out of range! {:?}", idx) + } + } +} + +impl SetItem<4> for SetSERVICE { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +//enum_set_declaration done + + + +//enum_set_declaration start +#[derive(Default, Debug, Clone, Copy)] +// each enum value corresponds to one BSet +pub enum SetSOCKET { + #[default] + SET_SET__TES_TES = 0, + SET_SET_socket1_TES_TES = 1, + SET_SET_socket2_TES_TES = 2, + SET_SET_socket1__socket2_TES_TES = 3 +} +type set_SetSOCKET = BSet<set_SOCKET, 4>; + +impl PowSetItem<4, 2> for SOCKET { + type SetRepr = SetSOCKET; + fn arr_to_idx(set: [bool; 2]) -> usize { + match set { + [false, false] => 0, + [true, false] => 1, + [false, true] => 2, + [true, true] => 3, + _ => panic!("Attempting to convert non-existing set to index!") // only happens if this is a const-set and code-generation missed a necessary value + } + } + fn idx_to_arr(idx: usize) -> [bool; 2] { + match idx { + 0 => [false, false], + 1 => [true, false], + 2 => [false, true], + 3 => [true, true], + _ => panic!("SetSOCKET index out of range! {:?}", idx) + } + } +} +impl SetSOCKET { + pub const fn to_idx(self) -> usize { self as usize } + pub fn from_idx(idx: usize) -> Self { + match idx { + 0 => Self::SET_SET__TES_TES, + 1 => Self::SET_SET_socket1_TES_TES, + 2 => Self::SET_SET_socket2_TES_TES, + 3 => Self::SET_SET_socket1__socket2_TES_TES, + _ => panic!("SetSOCKET index out of range! {:?}", idx) + } + } +} + +impl SetItem<4> for SetSOCKET { + fn as_idx(&self) -> usize { self.to_idx() } + fn from_idx(idx: usize) -> Self { Self::from_idx(idx) } +} + +//enum_set_declaration done + +#[derive(Derivative)] +#[derivative(Clone, Default, Debug, Hash, PartialEq, Eq)] +pub struct nota_v2 { + /*declarations*/interconnectNodes: set_INTERCONNECTNODE, + sockets: set_SOCKET, + services: set_SERVICE, + resourceManagers: set_RESOURCEMANAGER, + sids: set_SID, + rm_services: rel_RESOURCEMANAGER_X_SetSERVICE, + rm_sids: rel_SERVICE_X_SID, + in_localServices: rel_SID_X_INTERCONNECTNODE, + in_sockets: rel_SOCKET_X_INTERCONNECTNODE, + in_resourceManager: rel_INTERCONNECTNODE_X_SetRESOURCEMANAGER, + soc_to: rel_SOCKET_X_SID, + soc_from: rel_SOCKET_X_SID, + svc_serviceID: rel_SERVICE_X_SID, + svc_sockets: rel_SERVICE_X_SetSOCKET, + svc_ICNode: rel_SERVICE_X_INTERCONNECTNODE, + svc_registered: rel_SERVICE_X_BOOL, + /*sets*//*set_declaration*/_INTERCONNECTNODE: set_INTERCONNECTNODE, + /*set_declaration*/_SOCKET: set_SOCKET, + /*set_declaration*/_SERVICE: set_SERVICE, + /*set_declaration*/_RESOURCEMANAGER: set_RESOURCEMANAGER, + /*set_declaration*/_SID: set_SID, + /*set_declaration*/_RM_ERROR_CODES: set_RM_ERROR_CODES, + /*set_declaration*/_IN_ERROR_CODES: set_IN_ERROR_CODES, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_constructor_interconnectNode: Option<HashSet<INTERCONNECTNODE>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_constructor_resourceManager: Option<HashSet<RESOURCEMANAGER>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_constructor_service: Option<HashSet<(INTERCONNECTNODE, SERVICE)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_constructor_socket: Option<HashSet<(((INTERCONNECTNODE, SID), SID), SOCKET)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_rm_register: Option<HashSet<((RESOURCEMANAGER, SERVICE), INTERCONNECTNODE)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_rm_deregister: Option<HashSet<((RESOURCEMANAGER, SERVICE), INTERCONNECTNODE)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_rm_getSid: Option<HashSet<(RESOURCEMANAGER, SERVICE)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_rm_getSid_Not_Found: Option<HashSet<(RESOURCEMANAGER, SERVICE)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_in_announceResourceManager: Option<HashSet<(INTERCONNECTNODE, RESOURCEMANAGER)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_in_register_success: Option<HashSet<((INTERCONNECTNODE, SERVICE), SID)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_in_register_failed: Option<HashSet<(INTERCONNECTNODE, SERVICE)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_in_requestTargetSocket_Granted: Option<HashSet<(((((INTERCONNECTNODE, INTERCONNECTNODE), SOCKET), SID), SID), SOCKET)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_in_requestTargetSocket_NotGranted: Option<HashSet<((((INTERCONNECTNODE, INTERCONNECTNODE), SOCKET), SID), SID)>>, + #[derivative(Hash="ignore", PartialEq="ignore")] + _tr_cache_svc_register: Option<HashSet<SERVICE>>,} + + +impl nota_v2 { + + pub fn new() -> nota_v2 { + //values: '' + let mut m: nota_v2 = Default::default(); + m.init(); + return m; + } + fn init(&mut self) { + /*set_initializations*///set_initialization + self._INTERCONNECTNODE = bset![INTERCONNECTNODE, /*enum_call*/INTERCONNECTNODE::node1, /*enum_call*/INTERCONNECTNODE::node2]; + //set_initialization + self._SOCKET = bset![SOCKET, /*enum_call*/SOCKET::socket1, /*enum_call*/SOCKET::socket2]; + //set_initialization + self._SERVICE = bset![SERVICE, /*enum_call*/SERVICE::service1, /*enum_call*/SERVICE::service2]; + //set_initialization + self._RESOURCEMANAGER = bset![RESOURCEMANAGER, /*enum_call*/RESOURCEMANAGER::resource1, /*enum_call*/RESOURCEMANAGER::resource2]; + //set_initialization + self._SID = bset![SID, /*enum_call*/SID::SID1, /*enum_call*/SID::SID2]; + //set_initialization + self._RM_ERROR_CODES = bset![RM_ERROR_CODES, /*enum_call*/RM_ERROR_CODES::RM_SERVICE_FOUND, /*enum_call*/RM_ERROR_CODES::RM_SERVICE_NOT_FOUND]; + //set_initialization + self._IN_ERROR_CODES = bset![IN_ERROR_CODES, /*enum_call*/IN_ERROR_CODES::IN_REGISTRATION_OK, /*enum_call*/IN_ERROR_CODES::IN_REGISTRATION_FAILED, /*enum_call*/IN_ERROR_CODES::IN_DEREGISTRATION_OK, /*enum_call*/IN_ERROR_CODES::IN_DEREGISTRATION_FAILED, /*enum_call*/IN_ERROR_CODES::IN_NO_SOCKET_CONNECTION, /*enum_call*/IN_ERROR_CODES::IN_SOCKET_CONNECTION_OK, /*enum_call*/IN_ERROR_CODES::IN_NO_AVAILABLE_SERVICE, /*enum_call*/IN_ERROR_CODES::IN_SERVICE_AVAILABLE, /*enum_call*/IN_ERROR_CODES::IN_TARGET_SOCKET_GRANTED, /*enum_call*/IN_ERROR_CODES::IN_TARGET_SOCKET_NOT_GRANTED]; + /*properties*/ + /*body*/self.interconnectNodes = bset![INTERCONNECTNODE].clone().clone(); + self.sockets = bset![SOCKET].clone().clone(); + self.services = bset![SERVICE].clone().clone(); + self.resourceManagers = bset![RESOURCEMANAGER].clone().clone(); + self.sids = bset![SID].clone().clone(); + self.rm_services = brel![rel_RESOURCEMANAGER_X_SetSERVICE].clone().clone(); + self.rm_sids = brel![rel_SERVICE_X_SID].clone().clone(); + self.in_localServices = brel![rel_SID_X_INTERCONNECTNODE].clone().clone(); + self.in_sockets = brel![rel_SOCKET_X_INTERCONNECTNODE].clone().clone(); + self.in_resourceManager = brel![rel_INTERCONNECTNODE_X_SetRESOURCEMANAGER].clone().clone(); + self.soc_to = brel![rel_SOCKET_X_SID].clone().clone(); + self.soc_from = brel![rel_SOCKET_X_SID].clone().clone(); + self.svc_serviceID = brel![rel_SERVICE_X_SID].clone().clone(); + self.svc_sockets = brel![rel_SERVICE_X_SetSOCKET].clone().clone(); + self.svc_ICNode = brel![rel_SERVICE_X_INTERCONNECTNODE].clone().clone(); + self.svc_registered = brel![rel_SERVICE_X_BOOL].clone().clone(); + /*includesInitialization*/ + } + + pub fn get_interconnectNodes(&self) -> set_INTERCONNECTNODE { + return self.interconnectNodes.clone(); + } + + pub fn get_sockets(&self) -> set_SOCKET { + return self.sockets.clone(); + } + + pub fn get_services(&self) -> set_SERVICE { + return self.services.clone(); + } + + pub fn get_resourceManagers(&self) -> set_RESOURCEMANAGER { + return self.resourceManagers.clone(); + } + + pub fn get_sids(&self) -> set_SID { + return self.sids.clone(); + } + + pub fn get_rm_services(&self) -> rel_RESOURCEMANAGER_X_SetSERVICE { + return self.rm_services.clone(); + } + + pub fn get_rm_sids(&self) -> rel_SERVICE_X_SID { + return self.rm_sids.clone(); + } + + pub fn get_in_localServices(&self) -> rel_SID_X_INTERCONNECTNODE { + return self.in_localServices.clone(); + } + + pub fn get_in_sockets(&self) -> rel_SOCKET_X_INTERCONNECTNODE { + return self.in_sockets.clone(); + } + + pub fn get_in_resourceManager(&self) -> rel_INTERCONNECTNODE_X_SetRESOURCEMANAGER { + return self.in_resourceManager.clone(); + } + + pub fn get_soc_to(&self) -> rel_SOCKET_X_SID { + return self.soc_to.clone(); + } + + pub fn get_soc_from(&self) -> rel_SOCKET_X_SID { + return self.soc_from.clone(); + } + + pub fn get_svc_serviceID(&self) -> rel_SERVICE_X_SID { + return self.svc_serviceID.clone(); + } + + pub fn get_svc_sockets(&self) -> rel_SERVICE_X_SetSOCKET { + return self.svc_sockets.clone(); + } + + pub fn get_svc_ICNode(&self) -> rel_SERVICE_X_INTERCONNECTNODE { + return self.svc_ICNode.clone(); + } + + pub fn get_svc_registered(&self) -> rel_SERVICE_X_BOOL { + return self.svc_registered.clone(); + } + + pub fn get__INTERCONNECTNODE(&self) -> set_INTERCONNECTNODE { + return self._INTERCONNECTNODE.clone(); + } + + pub fn get__SOCKET(&self) -> set_SOCKET { + return self._SOCKET.clone(); + } + + pub fn get__SERVICE(&self) -> set_SERVICE { + return self._SERVICE.clone(); + } + + pub fn get__RESOURCEMANAGER(&self) -> set_RESOURCEMANAGER { + return self._RESOURCEMANAGER.clone(); + } + + pub fn get__SID(&self) -> set_SID { + return self._SID.clone(); + } + + pub fn get__RM_ERROR_CODES(&self) -> set_RM_ERROR_CODES { + return self._RM_ERROR_CODES.clone(); + } + + pub fn get__IN_ERROR_CODES(&self) -> set_IN_ERROR_CODES { + return self._IN_ERROR_CODES.clone(); + } + + pub fn constructor_interconnectNode(&mut self, mut newic: INTERCONNECTNODE) -> INTERCONNECTNODE { + let mut oid: Option<INTERCONNECTNODE> = Option::None; + //select + if self._INTERCONNECTNODE.difference(&self.interconnectNodes).elementOf(&newic) { + let mut _ld_interconnectNodes = self.interconnectNodes.clone(); + self.interconnectNodes = _ld_interconnectNodes.union(&bset![INTERCONNECTNODE, newic]).clone().clone(); + self.in_resourceManager = self.in_resourceManager._override_single(newic, bset![RESOURCEMANAGER]); + oid = Option::Some(newic); + } else { + panic!("ERROR: called SELECT-function with incompatible parameters!"); + } + return oid.unwrap(); + } + + pub fn constructor_resourceManager(&mut self, mut newrm: RESOURCEMANAGER) -> RESOURCEMANAGER { + let mut oid: Option<RESOURCEMANAGER> = Option::None; + //pre_assert + let mut _ld_resourceManagers = self.resourceManagers.clone(); + self.resourceManagers = _ld_resourceManagers.union(&bset![RESOURCEMANAGER, newrm]).clone().clone(); + self.rm_services = self.rm_services._override_single(newrm, bset![SERVICE]); + oid = Option::Some(newrm); + + return oid.unwrap(); + } + + pub fn constructor_service(&mut self, mut ii: INTERCONNECTNODE, mut newsvc: SERVICE) -> SERVICE { + let mut oid: Option<SERVICE> = Option::None; + //pre_assert + let mut _ld_services = self.services.clone(); + self.services = _ld_services.union(&bset![SERVICE, newsvc]).clone().clone(); + self.svc_registered = self.svc_registered._override_single(newsvc, false); + self.svc_sockets = self.svc_sockets._override_single(newsvc, bset![SOCKET]); + self.svc_ICNode = self.svc_ICNode._override_single(newsvc, ii); + self.svc_serviceID = brel![rel_SERVICE_X_SID].clone().clone(); + oid = Option::Some(newsvc); + + return oid.unwrap(); + } + + pub fn constructor_socket(&mut self, mut ii: INTERCONNECTNODE, mut srcsid: SID, mut targsid: SID, mut newsoc: SOCKET) -> SOCKET { + let mut oid: Option<SOCKET> = Option::None; + //pre_assert + let mut _ld_sockets = self.sockets.clone(); + self.sockets = _ld_sockets.union(&bset![SOCKET, newsoc]).clone().clone(); + oid = Option::Some(newsoc); + self.in_sockets = self.in_sockets._override_single(newsoc, ii); + self.soc_to = self.soc_to._override_single(newsoc, srcsid); + self.soc_from = self.soc_from._override_single(newsoc, targsid); + + return oid.unwrap(); + } + + pub fn rm_register(&mut self, mut _self: RESOURCEMANAGER, mut ss: SERVICE, mut ii: INTERCONNECTNODE) -> () { + //pre_assert + + } + + pub fn rm_deregister(&mut self, mut _self: RESOURCEMANAGER, mut ss: SERVICE, mut ii: INTERCONNECTNODE) -> () { + //pre_assert + + } + + pub fn rm_getSid(&mut self, mut _self: RESOURCEMANAGER, mut ss: SERVICE) -> _Struct1 { + let mut sid: Option<set_SID> = Option::None; + let mut err: Option<RM_ERROR_CODES> = Option::None; + //pre_assert + err = Option::Some(/*enum_call*/RM_ERROR_CODES::RM_SERVICE_FOUND); + sid = Option::Some(bset![SID, self.rm_sids.functionCall(&ss)].clone()).clone(); + + return /*record*/_Struct1::new(sid.unwrap(), err.unwrap()); + } + + pub fn rm_getSid_Not_Found(&mut self, mut _self: RESOURCEMANAGER, mut ss: SERVICE) -> _Struct1 { + let mut sid: Option<set_SID> = Option::None; + let mut err: Option<RM_ERROR_CODES> = Option::None; + //pre_assert + sid = Option::Some(self._SID.difference(&self._SID).clone()).clone(); + err = Option::Some(/*enum_call*/RM_ERROR_CODES::RM_SERVICE_NOT_FOUND); + + return /*record*/_Struct1::new(sid.unwrap(), err.unwrap()); + } + + pub fn in_announceResourceManager(&mut self, mut _self: INTERCONNECTNODE, mut rm: RESOURCEMANAGER) -> () { + //pre_assert + self.in_resourceManager = self.in_resourceManager._override_single(_self, self.in_resourceManager.functionCall(&_self).union(&bset![RESOURCEMANAGER, rm])); + + } + + pub fn in_register_success(&mut self, mut _self: INTERCONNECTNODE, mut ss: SERVICE, mut si: SID) -> _Struct3 { + let mut sid: Option<set_SID> = Option::None; + let mut err: Option<IN_ERROR_CODES> = Option::None; + //pre_assert + let mut _ld_sids = self.sids.clone(); + + let mut _ld_in_localServices = self.in_localServices.clone(); + self.sids = _ld_sids.union(&bset![SID, si]).clone().clone(); + self.in_localServices = _ld_in_localServices.union(&brel![rel_SID_X_INTERCONNECTNODE, (si.clone(), _self.clone())]).clone().clone(); + err = Option::Some(/*enum_call*/IN_ERROR_CODES::IN_REGISTRATION_OK); + sid = Option::Some(bset![SID, si].clone()).clone(); + + return /*record*/_Struct3::new(sid.unwrap(), err.unwrap()); + } + + pub fn in_register_failed(&mut self, mut _self: INTERCONNECTNODE, mut ss: SERVICE) -> _Struct3 { + let mut sid: Option<set_SID> = Option::None; + let mut err: Option<IN_ERROR_CODES> = Option::None; + //pre_assert + sid = Option::Some(self._SID.difference(&self._SID).clone()).clone(); + err = Option::Some(/*enum_call*/IN_ERROR_CODES::IN_REGISTRATION_FAILED); + + return /*record*/_Struct3::new(sid.unwrap(), err.unwrap()); + } + + pub fn in_requestTargetSocket_Granted(&mut self, mut _self: INTERCONNECTNODE, mut ii: INTERCONNECTNODE, mut srcsoc: SOCKET, mut srcsid: SID, mut targsid: SID, mut newsoc: SOCKET) -> _Struct5 { + let mut soc: Option<set_SOCKET> = Option::None; + let mut err: Option<IN_ERROR_CODES> = Option::None; + //pre_assert + let mut _ld_sockets = self.sockets.clone(); + let mut _ld_in_sockets = self.in_sockets.clone(); + self.sockets = _ld_sockets.union(&bset![SOCKET, newsoc]).clone().clone(); + soc = Option::Some(bset![SOCKET, newsoc].clone()).clone(); + err = Option::Some(/*enum_call*/IN_ERROR_CODES::IN_TARGET_SOCKET_GRANTED); + self.in_sockets = _ld_in_sockets.union(&brel![rel_SOCKET_X_INTERCONNECTNODE, (newsoc.clone(), _self.clone())]).clone().clone(); + self.soc_to = self.soc_to._override_single(newsoc, srcsid); + self.soc_from = self.soc_from._override_single(newsoc, targsid); + + return /*record*/_Struct5::new(soc.unwrap(), err.unwrap()); + } + + pub fn in_requestTargetSocket_NotGranted(&mut self, mut _self: INTERCONNECTNODE, mut ii: INTERCONNECTNODE, mut srcsoc: SOCKET, mut srcsid: SID, mut targsid: SID) -> _Struct5 { + let mut soc: Option<set_SOCKET> = Option::None; + let mut err: Option<IN_ERROR_CODES> = Option::None; + //pre_assert + soc = Option::Some(self._SOCKET.difference(&self._SOCKET).clone()).clone(); + err = Option::Some(/*enum_call*/IN_ERROR_CODES::IN_TARGET_SOCKET_NOT_GRANTED); + + return /*record*/_Struct5::new(soc.unwrap(), err.unwrap()); + } + + pub fn svc_register(&mut self, mut _self: SERVICE) -> () { + //pre_assert + self.svc_registered = self.svc_registered._override_single(_self, true); + + } + + pub fn _tr_constructor_interconnectNode(&mut self, is_caching: bool) -> HashSet<INTERCONNECTNODE> { + //transition + if !is_caching || self._tr_cache_constructor_interconnectNode.is_none() { + let mut _ic_set_0: HashSet<INTERCONNECTNODE> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_newic_1 in self._INTERCONNECTNODE.difference(&self.interconnectNodes).clone().iter() { + //parameter_combination_predicate TODO: FASTER + _ic_set_0.insert(_ic_newic_1); + + } + self._tr_cache_constructor_interconnectNode = Option::Some(_ic_set_0.clone()); + return _ic_set_0; + } else { + return self._tr_cache_constructor_interconnectNode.as_ref().unwrap().clone(); + } + } + + pub fn _tr_constructor_resourceManager(&mut self, is_caching: bool) -> HashSet<RESOURCEMANAGER> { + //transition + if !is_caching || self._tr_cache_constructor_resourceManager.is_none() { + let mut _ic_set_1: HashSet<RESOURCEMANAGER> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_newrm_1 in self._RESOURCEMANAGER.difference(&self.resourceManagers).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (self.rm_services.domain().notElementOf(&_ic_newrm_1) && self.resourceManagers.equal(&bset![RESOURCEMANAGER])) { + _ic_set_1.insert(_ic_newrm_1); + } + + } + self._tr_cache_constructor_resourceManager = Option::Some(_ic_set_1.clone()); + return _ic_set_1; + } else { + return self._tr_cache_constructor_resourceManager.as_ref().unwrap().clone(); + } + } + + pub fn _tr_constructor_service(&mut self, is_caching: bool) -> HashSet<(INTERCONNECTNODE, SERVICE)> { + //transition + if !is_caching || self._tr_cache_constructor_service.is_none() { + let mut _ic_set_2: HashSet<(INTERCONNECTNODE, SERVICE)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_ii_1 in self.interconnectNodes.clone().iter() { + //iteration_construct_enumeration + for _ic_newsvc_1 in self._SERVICE.difference(&self.services).clone().iter() { + //parameter_combination_predicate TODO: FASTER + _ic_set_2.insert((_ic_ii_1.clone(), _ic_newsvc_1.clone())); + + } + } + self._tr_cache_constructor_service = Option::Some(_ic_set_2.clone()); + return _ic_set_2; + } else { + return self._tr_cache_constructor_service.as_ref().unwrap().clone(); + } + } + + pub fn _tr_constructor_socket(&mut self, is_caching: bool) -> HashSet<(((INTERCONNECTNODE, SID), SID), SOCKET)> { + //transition + if !is_caching || self._tr_cache_constructor_socket.is_none() { + let mut _ic_set_3: HashSet<(((INTERCONNECTNODE, SID), SID), SOCKET)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_ii_1 in self.interconnectNodes.clone().iter() { + //iteration_construct_enumeration + for _ic_srcsid_1 in self.sids.clone().iter() { + //iteration_construct_enumeration + for _ic_targsid_1 in self.sids.clone().iter() { + //iteration_construct_enumeration + for _ic_newsoc_1 in self._SOCKET.difference(&self.sockets).clone().iter() { + //parameter_combination_predicate TODO: FASTER + _ic_set_3.insert((((_ic_ii_1.clone(), _ic_srcsid_1.clone()).clone(), _ic_targsid_1.clone()).clone(), _ic_newsoc_1.clone())); + + } + } + } + } + self._tr_cache_constructor_socket = Option::Some(_ic_set_3.clone()); + return _ic_set_3; + } else { + return self._tr_cache_constructor_socket.as_ref().unwrap().clone(); + } + } + + pub fn _tr_rm_register(&mut self, is_caching: bool) -> HashSet<((RESOURCEMANAGER, SERVICE), INTERCONNECTNODE)> { + //transition + if !is_caching || self._tr_cache_rm_register.is_none() { + let mut _ic_set_4: HashSet<((RESOURCEMANAGER, SERVICE), INTERCONNECTNODE)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_self_1 in self.resourceManagers.clone().iter() { + //iteration_construct_enumeration + for _ic_ss_1 in self.services.clone().iter() { + //iteration_construct_enumeration + for _ic_ii_1 in self.interconnectNodes.clone().iter() { + //parameter_combination_predicate TODO: FASTER + _ic_set_4.insert(((_ic_self_1.clone(), _ic_ss_1.clone()).clone(), _ic_ii_1.clone())); + + } + } + } + self._tr_cache_rm_register = Option::Some(_ic_set_4.clone()); + return _ic_set_4; + } else { + return self._tr_cache_rm_register.as_ref().unwrap().clone(); + } + } + + pub fn _tr_rm_deregister(&mut self, is_caching: bool) -> HashSet<((RESOURCEMANAGER, SERVICE), INTERCONNECTNODE)> { + //transition + if !is_caching || self._tr_cache_rm_deregister.is_none() { + let mut _ic_set_5: HashSet<((RESOURCEMANAGER, SERVICE), INTERCONNECTNODE)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_self_1 in self.resourceManagers.clone().iter() { + //iteration_construct_enumeration + for _ic_ss_1 in self.services.clone().iter() { + //iteration_construct_enumeration + for _ic_ii_1 in self.interconnectNodes.clone().iter() { + //parameter_combination_predicate TODO: FASTER + _ic_set_5.insert(((_ic_self_1.clone(), _ic_ss_1.clone()).clone(), _ic_ii_1.clone())); + + } + } + } + self._tr_cache_rm_deregister = Option::Some(_ic_set_5.clone()); + return _ic_set_5; + } else { + return self._tr_cache_rm_deregister.as_ref().unwrap().clone(); + } + } + + pub fn _tr_rm_getSid(&mut self, is_caching: bool) -> HashSet<(RESOURCEMANAGER, SERVICE)> { + //transition + if !is_caching || self._tr_cache_rm_getSid.is_none() { + let mut _ic_set_6: HashSet<(RESOURCEMANAGER, SERVICE)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_self_1 in self.resourceManagers.clone().iter() { + //iteration_construct_enumeration + for _ic_ss_1 in self.services.clone().iter() { + //parameter_combination_predicate TODO: FASTER + if self.rm_sids.domain().elementOf(&_ic_ss_1) { + _ic_set_6.insert((_ic_self_1.clone(), _ic_ss_1.clone())); + } + + } + } + self._tr_cache_rm_getSid = Option::Some(_ic_set_6.clone()); + return _ic_set_6; + } else { + return self._tr_cache_rm_getSid.as_ref().unwrap().clone(); + } + } + + pub fn _tr_rm_getSid_Not_Found(&mut self, is_caching: bool) -> HashSet<(RESOURCEMANAGER, SERVICE)> { + //transition + if !is_caching || self._tr_cache_rm_getSid_Not_Found.is_none() { + let mut _ic_set_7: HashSet<(RESOURCEMANAGER, SERVICE)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_self_1 in self.resourceManagers.clone().iter() { + //iteration_construct_enumeration + for _ic_ss_1 in self.services.clone().iter() { + //parameter_combination_predicate TODO: FASTER + _ic_set_7.insert((_ic_self_1.clone(), _ic_ss_1.clone())); + + } + } + self._tr_cache_rm_getSid_Not_Found = Option::Some(_ic_set_7.clone()); + return _ic_set_7; + } else { + return self._tr_cache_rm_getSid_Not_Found.as_ref().unwrap().clone(); + } + } + + pub fn _tr_in_announceResourceManager(&mut self, is_caching: bool) -> HashSet<(INTERCONNECTNODE, RESOURCEMANAGER)> { + //transition + if !is_caching || self._tr_cache_in_announceResourceManager.is_none() { + let mut _ic_set_8: HashSet<(INTERCONNECTNODE, RESOURCEMANAGER)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_self_1 in self.interconnectNodes.clone().iter() { + //iteration_construct_enumeration + for _ic_rm_1 in self.resourceManagers.clone().iter() { + //parameter_combination_predicate TODO: FASTER + if self.in_resourceManager.functionCall(&_ic_self_1).equal(&bset![RESOURCEMANAGER]) { + _ic_set_8.insert((_ic_self_1.clone(), _ic_rm_1.clone())); + } + + } + } + self._tr_cache_in_announceResourceManager = Option::Some(_ic_set_8.clone()); + return _ic_set_8; + } else { + return self._tr_cache_in_announceResourceManager.as_ref().unwrap().clone(); + } + } + + pub fn _tr_in_register_success(&mut self, is_caching: bool) -> HashSet<((INTERCONNECTNODE, SERVICE), SID)> { + //transition + if !is_caching || self._tr_cache_in_register_success.is_none() { + let mut _ic_set_9: HashSet<((INTERCONNECTNODE, SERVICE), SID)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_self_1 in self.interconnectNodes.clone().iter() { + //iteration_construct_enumeration + for _ic_ss_1 in self.services.clone().iter() { + //iteration_construct_enumeration + for _ic_si_1 in self._SID.difference(&self.sids).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if self.in_localServices.domain().elementOf(&_ic_si_1).not() { + _ic_set_9.insert(((_ic_self_1.clone(), _ic_ss_1.clone()).clone(), _ic_si_1.clone())); + } + + } + } + } + self._tr_cache_in_register_success = Option::Some(_ic_set_9.clone()); + return _ic_set_9; + } else { + return self._tr_cache_in_register_success.as_ref().unwrap().clone(); + } + } + + pub fn _tr_in_register_failed(&mut self, is_caching: bool) -> HashSet<(INTERCONNECTNODE, SERVICE)> { + //transition + if !is_caching || self._tr_cache_in_register_failed.is_none() { + let mut _ic_set_10: HashSet<(INTERCONNECTNODE, SERVICE)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_self_1 in self.interconnectNodes.clone().iter() { + //iteration_construct_enumeration + for _ic_ss_1 in self.services.clone().iter() { + //parameter_combination_predicate TODO: FASTER + _ic_set_10.insert((_ic_self_1.clone(), _ic_ss_1.clone())); + + } + } + self._tr_cache_in_register_failed = Option::Some(_ic_set_10.clone()); + return _ic_set_10; + } else { + return self._tr_cache_in_register_failed.as_ref().unwrap().clone(); + } + } + + pub fn _tr_in_requestTargetSocket_Granted(&mut self, is_caching: bool) -> HashSet<(((((INTERCONNECTNODE, INTERCONNECTNODE), SOCKET), SID), SID), SOCKET)> { + //transition + if !is_caching || self._tr_cache_in_requestTargetSocket_Granted.is_none() { + let mut _ic_set_11: HashSet<(((((INTERCONNECTNODE, INTERCONNECTNODE), SOCKET), SID), SID), SOCKET)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_self_1 in self.interconnectNodes.clone().iter() { + //iteration_construct_enumeration + for _ic_ii_1 in self.interconnectNodes.clone().iter() { + //iteration_construct_enumeration + for _ic_srcsoc_1 in self.sockets.clone().iter() { + //iteration_construct_enumeration + for _ic_srcsid_1 in self.sids.clone().iter() { + //iteration_construct_enumeration + for _ic_targsid_1 in self.sids.clone().iter() { + //iteration_construct_enumeration + for _ic_newsoc_1 in self._SOCKET.difference(&self.sockets).clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (_ic_self_1.unequal(&_ic_ii_1) && self.in_sockets.functionCall(&_ic_srcsoc_1).equal(&_ic_ii_1)) { + _ic_set_11.insert((((((_ic_self_1.clone(), _ic_ii_1.clone()).clone(), _ic_srcsoc_1.clone()).clone(), _ic_srcsid_1.clone()).clone(), _ic_targsid_1.clone()).clone(), _ic_newsoc_1.clone())); + } + + } + } + } + } + } + } + self._tr_cache_in_requestTargetSocket_Granted = Option::Some(_ic_set_11.clone()); + return _ic_set_11; + } else { + return self._tr_cache_in_requestTargetSocket_Granted.as_ref().unwrap().clone(); + } + } + + pub fn _tr_in_requestTargetSocket_NotGranted(&mut self, is_caching: bool) -> HashSet<((((INTERCONNECTNODE, INTERCONNECTNODE), SOCKET), SID), SID)> { + //transition + if !is_caching || self._tr_cache_in_requestTargetSocket_NotGranted.is_none() { + let mut _ic_set_12: HashSet<((((INTERCONNECTNODE, INTERCONNECTNODE), SOCKET), SID), SID)> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_self_1 in self.interconnectNodes.clone().iter() { + //iteration_construct_enumeration + for _ic_ii_1 in self.interconnectNodes.clone().iter() { + //iteration_construct_enumeration + for _ic_srcsoc_1 in self.sockets.clone().iter() { + //iteration_construct_enumeration + for _ic_srcsid_1 in self.sids.clone().iter() { + //iteration_construct_enumeration + for _ic_targsid_1 in self.sids.clone().iter() { + //parameter_combination_predicate TODO: FASTER + if (_ic_self_1.unequal(&_ic_ii_1) && self.in_sockets.functionCall(&_ic_srcsoc_1).equal(&_ic_ii_1)) { + _ic_set_12.insert(((((_ic_self_1.clone(), _ic_ii_1.clone()).clone(), _ic_srcsoc_1.clone()).clone(), _ic_srcsid_1.clone()).clone(), _ic_targsid_1.clone())); + } + + } + } + } + } + } + self._tr_cache_in_requestTargetSocket_NotGranted = Option::Some(_ic_set_12.clone()); + return _ic_set_12; + } else { + return self._tr_cache_in_requestTargetSocket_NotGranted.as_ref().unwrap().clone(); + } + } + + pub fn _tr_svc_register(&mut self, is_caching: bool) -> HashSet<SERVICE> { + //transition + if !is_caching || self._tr_cache_svc_register.is_none() { + let mut _ic_set_13: HashSet<SERVICE> = HashSet::new(); + //transition, parameters, no condidtion + //iteration_construct_enumeration + for _ic_self_1 in self.services.clone().iter() { + //parameter_combination_predicate TODO: FASTER + if self.svc_registered.functionCall(&_ic_self_1).equal(&false) { + _ic_set_13.insert(_ic_self_1); + } + + } + self._tr_cache_svc_register = Option::Some(_ic_set_13.clone()); + return _ic_set_13; + } else { + return self._tr_cache_svc_register.as_ref().unwrap().clone(); + } + } + + pub fn _check_inv_1(&self) -> bool { + //invariant + return self.interconnectNodes.subset(&self._INTERCONNECTNODE); + } + + pub fn _check_inv_2(&self) -> bool { + //invariant + return self.sockets.subset(&self._SOCKET); + } + + pub fn _check_inv_3(&self) -> bool { + //invariant + return self.services.subset(&self._SERVICE); + } + + pub fn _check_inv_4(&self) -> bool { + //invariant + return self.resourceManagers.subset(&self._RESOURCEMANAGER); + } + + pub fn _check_inv_5(&self) -> bool { + //invariant + return self.sids.subset(&self._SID); + } + + pub fn _check_inv_6(&self) -> bool { + //invariant + return self.resourceManagers.check_domain_of(&self.rm_services).and(&self.services.pow().check_range_of(&self.rm_services)).and(&self.rm_services.isFunction()).and(&self.resourceManagers.check_total_of(&self.rm_services)); + } + + pub fn _check_inv_7(&self) -> bool { + //invariant + //quantified_predicate + let mut _ic_boolean_14 = true; + //iteration_construct_enumeration + for _ic_a1_1 in self.rm_services.domain().clone().iter() { + //iteration_construct_enumeration + for _ic_a2_1 in self.rm_services.domain().clone().iter() { + if !_ic_a1_1.unequal(&_ic_a2_1).implies(|| self.rm_services.functionCall(&_ic_a1_1).intersect(&self.rm_services.functionCall(&_ic_a2_1)).equal(&bset![SERVICE])) { + _ic_boolean_14 = false; + break; + } + + } + } + + return _ic_boolean_14; + } + + pub fn _check_inv_8(&self) -> bool { + //invariant + return self.services.check_domain_of(&self.rm_sids).and(&self.sids.check_range_of(&self.rm_sids)).and(&self.rm_sids.isFunction()).and(&self.services.check_partial_of(&self.rm_sids)).and(&self.rm_sids.isInjection()); + } + + pub fn _check_inv_9(&self) -> bool { + //invariant + return self.sids.check_domain_of(&self.in_localServices).and(&self.interconnectNodes.check_range_of(&self.in_localServices)).and(&self.in_localServices.isFunction()).and(&self.sids.check_total_of(&self.in_localServices)); + } + + pub fn _check_inv_10(&self) -> bool { + //invariant + return self.sockets.check_domain_of(&self.in_sockets).and(&self.interconnectNodes.check_range_of(&self.in_sockets)).and(&self.in_sockets.isFunction()).and(&self.sockets.check_total_of(&self.in_sockets)); + } + + pub fn _check_inv_11(&self) -> bool { + //invariant + return self.interconnectNodes.check_domain_of(&self.in_resourceManager).and(&self.resourceManagers.pow().check_range_of(&self.in_resourceManager)).and(&self.in_resourceManager.isFunction()).and(&self.interconnectNodes.check_total_of(&self.in_resourceManager)); + } + + pub fn _check_inv_12(&self) -> bool { + //invariant + return self.sockets.check_domain_of(&self.soc_to).and(&self.sids.check_range_of(&self.soc_to)).and(&self.soc_to.isFunction()).and(&self.sockets.check_total_of(&self.soc_to)); + } + + pub fn _check_inv_13(&self) -> bool { + //invariant + return self.sockets.check_domain_of(&self.soc_from).and(&self.sids.check_range_of(&self.soc_from)).and(&self.soc_from.isFunction()).and(&self.sockets.check_total_of(&self.soc_from)); + } + + pub fn _check_inv_14(&self) -> bool { + //invariant + return self.services.check_domain_of(&self.svc_serviceID).and(&self.sids.check_range_of(&self.svc_serviceID)).and(&self.svc_serviceID.isFunction()).and(&self.services.check_partial_of(&self.svc_serviceID)); + } + + pub fn _check_inv_15(&self) -> bool { + //invariant + return self.services.check_domain_of(&self.svc_sockets).and(&self.sockets.pow().check_range_of(&self.svc_sockets)).and(&self.svc_sockets.isFunction()).and(&self.services.check_total_of(&self.svc_sockets)); + } + + pub fn _check_inv_16(&self) -> bool { + //invariant + return self.services.check_domain_of(&self.svc_ICNode).and(&self.interconnectNodes.check_range_of(&self.svc_ICNode)).and(&self.svc_ICNode.isFunction()).and(&self.services.check_total_of(&self.svc_ICNode)); + } + + pub fn _check_inv_17(&self) -> bool { + //invariant + return self.services.check_domain_of(&self.svc_registered).and(&BOOL.check_range_of(&self.svc_registered)).and(&self.svc_registered.isFunction()).and(&self.services.check_total_of(&self.svc_registered)); + } + + pub fn _check_inv_18(&self) -> bool { + //invariant + return self.resourceManagers.equal(&bset![RESOURCEMANAGER]).not().implies(|| self.resourceManagers.card().equal(&1)); + } + + fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) { + //calling the given functions without caching will recalculate them and cache them afterwards + 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);}, + "_tr_constructor_socket" => {self._tr_constructor_socket(false);}, + "_tr_rm_register" => {self._tr_rm_register(false);}, + "_tr_rm_deregister" => {self._tr_rm_deregister(false);}, + "_tr_rm_getSid" => {self._tr_rm_getSid(false);}, + "_tr_rm_getSid_Not_Found" => {self._tr_rm_getSid_Not_Found(false);}, + "_tr_in_announceResourceManager" => {self._tr_in_announceResourceManager(false);}, + "_tr_in_register_success" => {self._tr_in_register_success(false);}, + "_tr_in_register_failed" => {self._tr_in_register_failed(false);}, + "_tr_in_requestTargetSocket_Granted" => {self._tr_in_requestTargetSocket_Granted(false);}, + "_tr_in_requestTargetSocket_NotGranted" => {self._tr_in_requestTargetSocket_NotGranted(false);}, + "_tr_svc_register" => {self._tr_svc_register(false);}, + _ => {}, + } + } + } + + //model_check_next_states + fn generateNextStates(state: &mut nota_v2, + isCaching: bool, + 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; + } + + + transitions.fetch_add(evaluated_transitions, Ordering::AcqRel); + return result; + } + + //model_check_invariants + 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 !state._check_inv_1() { + println!("_check_inv_1 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_3() { + println!("_check_inv_3 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_5() { + println!("_check_inv_5 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_7() { + println!("_check_inv_7 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_9() { + println!("_check_inv_9 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_11() { + println!("_check_inv_11 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_13() { + println!("_check_inv_13 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_15() { + println!("_check_inv_15 failed!"); + return false; + } + } + //model_check_invariant + 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 !state._check_inv_17() { + println!("_check_inv_17 failed!"); + return false; + } + } + //model_check_invariant + if dependent_invariants_of_state.contains(&"_check_inv_18") { + if !state._check_inv_18() { + println!("_check_inv_18 failed!"); + return false; + } + } + return true; + } + return !(!state._check_inv_1() || !state._check_inv_2() || !state._check_inv_3() || !state._check_inv_4() || !state._check_inv_5() || !state._check_inv_6() || !state._check_inv_7() || !state._check_inv_8() || !state._check_inv_9() || !state._check_inv_10() || !state._check_inv_11() || !state._check_inv_12() || !state._check_inv_13() || !state._check_inv_14() || !state._check_inv_15() || !state._check_inv_16() || !state._check_inv_17() || !state._check_inv_18()); + } + + //model_check_print + 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, &'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(), + MC_TYPE::DFS => collection.pop_back().unwrap(), + MC_TYPE::MIXED => if collection.len() % 2 == 0 { collection.pop_front().unwrap() } else { collection.pop_back().unwrap() } + }; + } + + fn get_guard_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "in_register_success" => vec!["_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"], + //model_check_init_static + "in_announceResourceManager" => vec!["_tr_in_announceResourceManager"], + //model_check_init_static + "in_requestTargetSocket_Granted" => vec!["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"], + //model_check_init_static + "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 + "constructor_socket" => vec!["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"], + //model_check_init_static + "in_requestTargetSocket_NotGranted" => vec![], + //model_check_init_static + "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 + "rm_getSid" => vec![], + //model_check_init_static + "rm_deregister" => vec![], + //model_check_init_static + "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 + "in_register_failed" => vec![], + //model_check_init_static + "rm_register" => vec![], + //model_check_init_static + "rm_getSid_Not_Found" => vec![], + //model_check_init_static + "svc_register" => vec!["_tr_svc_register"], + _ => vec![], + } + } + + fn get_invariant_dependencies(op: &'static str) -> Vec<&str> { + return match op { + //model_check_init_static + "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 + "in_announceResourceManager" => vec!["_check_inv_11"], + //model_check_init_static + "in_requestTargetSocket_Granted" => vec!["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"], + //model_check_init_static + "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 + "constructor_socket" => vec!["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"], + //model_check_init_static + "in_requestTargetSocket_NotGranted" => vec![], + //model_check_init_static + "constructor_interconnectNode" => vec!["_check_inv_16", "_check_inv_1", "_check_inv_10", "_check_inv_9", "_check_inv_11"], + //model_check_init_static + "rm_getSid" => vec![], + //model_check_init_static + "rm_deregister" => vec![], + //model_check_init_static + "constructor_resourceManager" => vec!["_check_inv_18", "_check_inv_6", "_check_inv_7", "_check_inv_4", "_check_inv_11"], + //model_check_init_static + "in_register_failed" => vec![], + //model_check_init_static + "rm_register" => vec![], + //model_check_init_static + "rm_getSid_Not_Found" => vec![], + //model_check_init_static + "svc_register" => vec!["_check_inv_17"], + _ => vec![], + } + } + + fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool, no_dead: bool, no_inv: bool) { + let mut machine = nota_v2::new(); + + let mut all_states = HashSet::<nota_v2>::new(); + all_states.insert(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.clone(), "")); + + 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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + println!("INVARIANT VIOLATED"); + stop_threads = true; + } + if !no_dead && next_states.is_empty() { + print!("DEADLOCK DETECTED"); + stop_threads = true; + } + + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + + fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool, no_dead: bool, no_inv: bool) { + let threadPool = ThreadPool::new(threads); + + let machine = nota_v2::new(); + + let all_states = Arc::new(DashSet::<nota_v2>::new()); + all_states.insert(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 num_transitions = Arc::new(AtomicU64::new(0)); + + 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 && !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 = 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, transitions); + if !no_dead && next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); } + + //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 !no_inv && !Self::checkInvariants(&state, last_op, is_caching) { + let _ = tx.send(Err("INVARIANT VIOLATED")); + } + //println!("Thread {:?} done", thread::current().id()); + let _ = tx.send(Ok(1)); + }); + + 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()); + match rx.try_recv() { + 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(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads); + } + +} + + +fn main() { + let args: Vec<String> = env::args().collect(); + if args.len() < 4 { panic!("Number of arguments errorneous"); } + + let threads = args.get(2).unwrap().parse::<usize>().unwrap(); + if threads <= 0 { panic!("Input for number of threads is wrong."); } + + let is_caching = args.get(3).unwrap().parse::<bool>().unwrap(); + let mc_type = match args.get(1).unwrap().as_str() { + "mixed" => MC_TYPE::MIXED, + "bf" => MC_TYPE::BFS, + "df" => MC_TYPE::DFS, + _ => panic!("Input for strategy is wrong.") + }; + + let mut no_dead = false; + let mut no_inv = false; + + if args.len() > 4 { + for arg in args.iter().skip(4) { + match arg.as_str() { + "-nodead" => no_dead = true, + "-noinv" => no_inv = true, + _ => {} + } + } + } + + if threads == 1 { + nota_v2::model_check_single_threaded(mc_type, is_caching, no_dead, no_inv); + } else { + nota_v2::modelCheckMultiThreaded(mc_type, threads, is_caching, no_dead, no_inv); + } +} -- GitLab