diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e83dc31f4d6db034da5bff69b6e89e5019573ed..ba2bdb001c42b5da2db217c4618a57b434498b5c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,3 +75,4 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") # add tests # enable_testing() # add_subdirectory(tests) + diff --git a/src/algorithm/CNDFS.cpp b/src/algorithm/CNDFS.cpp index 1443e6b5c37df39e9be393d2d08bf40841221365..e0cc32b599ddde6a3b9b041bb688f0301add255e 100644 --- a/src/algorithm/CNDFS.cpp +++ b/src/algorithm/CNDFS.cpp @@ -22,6 +22,8 @@ using namespace std; +int i=0; + CNDFS::CNDFS(ModelCheckBaseMT *mcl, const spot::twa_graph_ptr &af, const uint16_t &nbTh) : mMcl(mcl), mAa(af), mNbTh(nbTh) { dict_ba = mAa->get_dict(); @@ -100,6 +102,8 @@ void CNDFS::dfsRed(myState_t *state, vector<myState_t *> &Rp, uint8_t idThread) // cout << "dfsRed" << endl; Rp.push_back(state); // computeSuccessors(state); + std::mt19937 g(rd()); + std::shuffle(state->new_successors.begin(), state->new_successors.end(), g); for (const auto &succ: state->new_successors) { // cout << "dfs red 1 " << succ.first->cyan[idThread]<< endl; if (succ.first->cyan[idThread]) { @@ -107,14 +111,16 @@ void CNDFS::dfsRed(myState_t *state, vector<myState_t *> &Rp, uint8_t idThread) exit(0); } // unvisited and not red state - if ((find(Rp.begin(), Rp.end(), state) != Rp.end()) && !succ.first->red) + if ((find(Rp.begin(), Rp.end(), state) != Rp.end()) && !succ.first->red){ dfsRed(succ.first, Rp, idThread); + } + } } /* * Check whether a product state exists or not - */ +*/ myState_t *CNDFS::isStateBuilt(LDDState *sogState, spot::twa_graph_state *spotState) { auto compare = [sogState, spotState](myState_t *state) { return (state->left == sogState && state->right == spotState); @@ -125,6 +131,7 @@ myState_t *CNDFS::isStateBuilt(LDDState *sogState, spot::twa_graph_state *spotSt //compute new successors of a product state void CNDFS::computeSuccessors(myState_t *state, vector<spot::formula> ap_sog) { + if (state->succState == SuccState::done) return; std::unique_lock lk(mMutexStatus); if (state->succState == SuccState::doing) { @@ -144,13 +151,6 @@ void CNDFS::computeSuccessors(myState_t *state, vector<spot::formula> ap_sog) { auto ap_state = spot::formula::ap(name); if (dict_ba->var_map.find(ap_state) != dict_ba->var_map.end()) { ap_sog.push_back(ap_state); - for( auto n: dict_ba->var_map) - { - if (n.first != ap_state) - { - ap_sog.push_back(spot::formula::Not(n.first)); - } - } } } //iterate over the successors of a current aggregate @@ -161,9 +161,13 @@ void CNDFS::computeSuccessors(myState_t *state, vector<spot::formula> ap_sog) { if (dict_ba->var_map.find(ap_edge) != dict_ba->var_map.end()) { ap_sog.push_back(ap_edge); } - - spot::formula pa_sog_result = spot::formula::And(ap_sog); -// cout << "formula sog: " << pa_sog_result << endl; + for( auto &n: dict_ba->var_map) + { + if (std::find(ap_sog.begin(), ap_sog.end(), n.first) == ap_sog.end()) { + ap_sog.push_back(spot::formula::Not(n.first)); + } + } + auto pa_sog_result = spot::formula::And(ap_sog); //iterate over the successors of a BA state auto ii = mAa->succ_iter(ba_current_state); if (ii->first()) diff --git a/src/algorithm/CndfsV2.cpp b/src/algorithm/CndfsV2.cpp index b2916febd4692bf855dfefd1eb64f4eb8bf3c9fb..60bdf27b19afd44a1a7c562969d3bb791e17b7d6 100644 --- a/src/algorithm/CndfsV2.cpp +++ b/src/algorithm/CndfsV2.cpp @@ -99,7 +99,6 @@ myState_t *CndfsV2::buildState(myState_t *state, pair<spot::formula, int > tr) { buildStatePtr->right = getSuccessorFromBA(state->right,tr); buildStatePtr->isAcceptance = mAa->state_is_accepting(buildStatePtr->right); buildStatePtr->isConstructed = true; - return buildStatePtr; } @@ -109,6 +108,8 @@ void CndfsV2::dfsRed(myState_t *state, vector<myState_t *> &Rp, uint8_t idThread // cout << "dfsRed" << endl; Rp.push_back(state); // computeSuccessors(state); + std::mt19937 g(rd()); + std::shuffle(state->new_successors.begin(), state->new_successors.end(), g); for (const auto &succ: state->new_successors) { // cout << "dfs red 1 " << succ.first->cyan[idThread]<< endl; if (succ.first->cyan[idThread]) { @@ -155,13 +156,6 @@ void CndfsV2::fireable(myState_t *state, vector<spot::formula> ap_sog, uint8_t auto ap_state = spot::formula::ap(name); if (dict_ba->var_map.find(ap_state) != dict_ba->var_map.end()) { ap_sog.push_back(ap_state); - for( auto n: dict_ba->var_map) - { - if (n.first != ap_state) - { - ap_sog.push_back(spot::formula::Not(n.first)); - } - } } } //iterate over the successors of a current aggregate @@ -172,7 +166,12 @@ void CndfsV2::fireable(myState_t *state, vector<spot::formula> ap_sog, uint8_t if (dict_ba->var_map.find(ap_edge) != dict_ba->var_map.end()) { ap_sog.push_back(ap_edge); } - + for( auto n: dict_ba->var_map) + { + if (std::find(ap_sog.begin(), ap_sog.end(), n.first) == ap_sog.end()) { + ap_sog.push_back(spot::formula::Not(n.first)); + } + } spot::formula pa_sog_result = spot::formula::And(ap_sog); // cout << "formula sog: " << pa_sog_result << endl; //iterate over the successors of a BA state diff --git a/src/main.cpp b/src/main.cpp index ba18f34e2b6e8eaee463e6e14695854dd6ba70b7..82c37bfac3a5b77cbb24e6426c969b4afb2f8833 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -528,7 +528,15 @@ int main(int argc, char **argv) if (algorithm == "CndfsV1") { cout<<"------------MC-CNDFS-VERSION1-------------"<<endl; - CNDFS cndfs(mcl,af,2); // If I increase the number of threads, a segmentation fault appears. + //start time +// std::chrono::steady_clock::time_point startTime, finalTime; +// startTime = std::chrono::steady_clock::now(); + CNDFS cndfs(mcl,af,2); +// finalTime = std::chrono::steady_clock::now(); +// displayTime(startTime, finalTime); + + //finish time + //diff return(0); } else if (algorithm == "CndfsV2")// run on the fly sequential model-checking @@ -545,7 +553,9 @@ int main(int argc, char **argv) }else { auto k = std::make_shared<SogKripkeTh>(d, mcl, Rnewnet.getListTransitionAP(), Rnewnet.getListPlaceAP()); + //temps depart runOnTheFlyMC(algorithm, k, af); + //temps fin } // stop model checker process