diff --git a/src/HybridKripke.cpp b/src/HybridKripke.cpp index d9e4bc98bcd5aad23afbcbb3272525e45186d07a..50cd35e772004513c236f071558d826f069ac4a1 100644 --- a/src/HybridKripke.cpp +++ b/src/HybridKripke.cpp @@ -71,20 +71,18 @@ std::string HybridKripke::format_state(const spot::state* s) const HybridKripkeIterator* HybridKripke::succ_iter(const spot::state* s) const { //cout<<__func__<<endl; - auto ss = static_cast<const HybridKripkeState*>(s); - char id[16]; - memcpy(id,ss->getId(),16); + auto ss = static_cast<const HybridKripkeState*>(s); bdd cond = state_condition(ss); - uint16_t pcontainer=ss->getContainerProcess(); - /* if (iter_cache_) + HybridKripkeState* st=ss; + if (iter_cache_) { auto it = static_cast<HybridKripkeIterator*>(iter_cache_); iter_cache_ = nullptr; // empty the cache - it->recycle(id,pcontainer,cond); + it->recycle(*st,cond); return it; - }*/ + } - return new HybridKripkeIterator(id,pcontainer,cond); + return new HybridKripkeIterator(*st,cond); } @@ -92,14 +90,14 @@ bdd HybridKripke::state_condition(const spot::state* s) const { auto ss = static_cast<const HybridKripkeState*>(s); - set<uint16_t>* marked_place=ss->getMarkedPlaces(); + list<uint16_t>* marked_place=ss->getMarkedPlaces(); bdd result=bddtrue; for (auto it=marked_place->begin();it!=marked_place->end();it++) { string name=m_net->getPlaceName(*it); spot::formula f=spot::formula::ap(name); result&=bdd_ithvar((dict_->var_map.find(f))->second); } - set<uint16_t>* unmarked_place=ss->getUnmarkedPlaces(); + list<uint16_t>* unmarked_place=ss->getUnmarkedPlaces(); for (auto it=unmarked_place->begin();it!=unmarked_place->end();it++) { string name=m_net->getPlaceName(*it); spot::formula f=spot::formula::ap(name); diff --git a/src/HybridKripkeIterator.cpp b/src/HybridKripkeIterator.cpp index 93424f9fdaa0d1096af5f77ca72b04f05bd5cf37..5297b26a16e881864625a309c8fc4f29d98267d1 100644 --- a/src/HybridKripkeIterator.cpp +++ b/src/HybridKripkeIterator.cpp @@ -2,76 +2,46 @@ #include "LDDGraph.h" #include "HybridKripkeState.h" #include "HybridKripkeIterator.h" -#define TAG_ASK_SUCC 4 -#define TAG_ACK_SUCC 11 -#define TAG_NOTCOMPLETED 20 -HybridKripkeIterator::HybridKripkeIterator(char *id,uint16_t pcontainer, bdd cnd): m_pcontainer(pcontainer),kripke_succ_iterator(cnd) + +HybridKripkeIterator::HybridKripkeIterator(HybridKripkeState &st, bdd cnd): kripke_succ_iterator(cnd) { - memcpy(m_id,id,16); - // Ask list of successors - MPI_Send(m_id,16,MPI_BYTE,m_pcontainer, TAG_ASK_SUCC, MPI_COMM_WORLD); - - // Receive list of successors - MPI_Status status; - MPI_Probe(MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status); - uint32_t nbytes; - MPI_Get_count(&status, MPI_BYTE, &nbytes); - char inmsg[nbytes+1]; - //cout<<"Received bytes : "<<nbytes<<endl; - MPI_Recv(inmsg, nbytes, MPI_BYTE,status.MPI_SOURCE,TAG_ACK_SUCC,MPI_COMM_WORLD, &status); - uint32_t nb_succ; - memcpy(&nb_succ,inmsg,4); - //cout<<"Number of successors "<<nb_succ<<endl; - uint32_t indice=4; - succ_t *succ_elt; - //printf("List of successors of %.16s\n",m_id); - for (uint32_t i=0;i<nb_succ;i++) { - succ_elt=new succ_t; - memcpy(succ_elt->id,inmsg+indice,16); - indice+=16; - - memcpy(&(succ_elt->pcontainer),inmsg+indice,2); - indice+=2; - memcpy(&(succ_elt->transition),inmsg+indice,2); - indice+=2; - m_succ.push_back(*succ_elt); - delete succ_elt; - } + m_current_state=&st; + } bool HybridKripkeIterator::first() { //cout<<"entering "<<__func__<<endl; m_current_edge=0; - return m_succ.size()!=0; + return m_current_state->getListSucc()->size()!=0; } bool HybridKripkeIterator::next() { m_current_edge++; - return m_current_edge<m_succ.size(); + return m_current_edge<m_current_state->getListSucc()->size(); } bool HybridKripkeIterator::done() const { //cout<<"entring /excit"<<__func__<<endl; - return m_current_edge==m_succ.size(); + return m_current_edge==m_current_state->getListSucc()->size(); } HybridKripkeState* HybridKripkeIterator::dst() const { - succ_t succ_elt= m_succ.at(m_current_edge); + succ_t succ_elt= m_current_state->getListSucc()->at(m_current_edge); return new HybridKripkeState(succ_elt.id,succ_elt.pcontainer); } bdd HybridKripkeIterator::cond() const { //cout<<"entering "<<__func__<<endl; - succ_t succ_elt=m_succ.at(m_current_edge); + succ_t succ_elt=m_current_state->getListSucc()->at(m_current_edge); if (succ_elt.transition==-1) return bddtrue; @@ -93,11 +63,10 @@ HybridKripkeIterator::~HybridKripkeIterator() } -void HybridKripkeIterator::recycle(char *id,uint16_t pcontainer, bdd cond) +void HybridKripkeIterator::recycle(HybridKripkeState &st, bdd cond) { //cout<<__func__<<endl; - memcpy(m_id,id,16); - m_pcontainer=pcontainer; + m_current_state=&st; spot::kripke_succ_iterator::recycle(cond); } diff --git a/src/HybridKripkeIterator.h b/src/HybridKripkeIterator.h index a62012e2572ba6767ea6aed646e3b18770dfebdf..c56a8e84ebf5d8a59b99bdd53c44c58a6801829b 100644 --- a/src/HybridKripkeIterator.h +++ b/src/HybridKripkeIterator.h @@ -4,11 +4,7 @@ #include "ModelCheckBaseMT.h" #include <spot/kripke/kripke.hh> // Iterator for a SOG graph -typedef struct { - char id[17]; - int16_t transition; - uint16_t pcontainer; -} succ_t; + class HybridKripkeIterator : public spot::kripke_succ_iterator { public: @@ -18,7 +14,7 @@ public: static spot::bdd_dict_ptr* m_dict_ptr; - HybridKripkeIterator(char *id,uint16_t pcontainer, bdd cnd); + HybridKripkeIterator(HybridKripkeState &st, bdd cnd); virtual ~HybridKripkeIterator(); bool first() override; bool next() override; @@ -28,16 +24,14 @@ public: // HybridKripkeState* current_state() const; - void recycle(char *id,uint16_t pcontainer, bdd cond); + void recycle(HybridKripkeState &st, bdd cond); std::string format_transition() const; private: - - char m_id[16]; - uint16_t m_pcontainer; unsigned int m_current_edge=0; - vector<succ_t> m_succ; + HybridKripkeState *m_current_state; + }; diff --git a/src/HybridKripkeState.h b/src/HybridKripkeState.h index 902d5dd9dd3c1b6b349f98f33d3ad0e025f4483c..935d75d654e741669b1f1ae3f428949163456fe4 100644 --- a/src/HybridKripkeState.h +++ b/src/HybridKripkeState.h @@ -6,6 +6,14 @@ #include "ModelCheckBaseMT.h" #define TAG_ASK_STATE 9 #define TAG_ACK_STATE 10 +#define TAG_ASK_SUCC 4 +#define TAG_ACK_SUCC 11 +#define TAG_NOTCOMPLETED 20 +typedef struct { + char id[17]; + int16_t transition; + uint16_t pcontainer; +} succ_t; class HybridKripkeState : public spot::state { public: @@ -31,26 +39,54 @@ public: memcpy(&n_mp,message+8,2); //cout<<" Marked places :"<<n_mp<<endl; - uint16_t indice=10; - for(int i=0;i<n_mp;i++) { + uint32_t indice=10; + for(uint16_t i=0;i<n_mp;i++) { uint16_t val; memcpy(&val,message+indice,2); - m_marked_places.insert(val); + m_marked_places.emplace_front(val); indice+=2; } uint16_t n_up; memcpy(&n_up,message+indice,2); //cout<<" Unmarked places :"<<n_mp<<endl; indice+=2; - for(int i=0;i<n_up;i++) { + for(uint16_t i=0;i<n_up;i++) { uint16_t val; memcpy(&val,message+indice,2); - m_unmarked_places.insert(val); + m_unmarked_places.emplace_front(val); indice+=2; } + // Get successors + MPI_Send(m_id,16,MPI_BYTE,m_container, TAG_ASK_SUCC, MPI_COMM_WORLD); + + // Receive list of successors + + MPI_Probe(MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status); + MPI_Get_count(&status, MPI_BYTE, &nbytes); + char inmsg[nbytes+1]; + //cout<<"Received bytes : "<<nbytes<<endl; + MPI_Recv(inmsg, nbytes, MPI_BYTE,status.MPI_SOURCE,TAG_ACK_SUCC,MPI_COMM_WORLD, &status); + uint32_t nb_succ; + memcpy(&nb_succ,inmsg,4); + //cout<<"Number of successors "<<nb_succ<<endl; + indice=4; + succ_t *succ_elt; + //printf("List of successors of %.16s\n",m_id); + for (uint32_t i=0;i<nb_succ;i++) { + succ_elt=new succ_t; + memcpy(succ_elt->id,inmsg+indice,16); + indice+=16; + memcpy(&(succ_elt->pcontainer),inmsg+indice,2); + indice+=2; + memcpy(&(succ_elt->transition),inmsg+indice,2); + indice+=2; + m_succ.push_back(*succ_elt); + delete succ_elt; + } - } + +} // Constructor for cloning HybridKripkeState(unsigned char *id,uint16_t pcontainer,size_t hsh,bool ddiv, bool deadlock):m_container(pcontainer),m_div(ddiv),m_deadlock(deadlock),m_hashid(hsh) { memcpy(m_id,id,16); @@ -82,27 +118,27 @@ public: else return h > oh; } - unsigned char * getId() { - // cout<<__func__<<endl; + char * getId() { return m_id; } uint16_t getContainerProcess() { return m_container; } - set<uint16_t> * getMarkedPlaces() { return &m_marked_places;} - set<uint16_t> * getUnmarkedPlaces() { return &m_unmarked_places;} + list<uint16_t> * getMarkedPlaces() { return &m_marked_places;} + list<uint16_t> * getUnmarkedPlaces() { return &m_unmarked_places;} + vector<succ_t>* getListSucc() { return &m_succ;} protected: -private: - //LDDState *m_state; +private: char m_id[17]; uint32_t m_pos; size_t m_hashid; bool m_div; bool m_deadlock; uint16_t m_container; - set<uint16_t> m_marked_places; - set<uint16_t> m_unmarked_places; + list<uint16_t> m_marked_places; + list<uint16_t> m_unmarked_places; + vector<succ_t> m_succ; }; diff --git a/src/HybridSOG.cpp b/src/HybridSOG.cpp index ae14cc890331e05cadfb29dea2a5f5d4ed8cbba0..4da85135feb6a97fc2329a2de3481f2d5004a5a6 100644 --- a/src/HybridSOG.cpp +++ b/src/HybridSOG.cpp @@ -738,7 +738,7 @@ void HybridSOG::computeDSOG(LDDGraph &g) MPI_Barrier(MPI_COMM_WORLD); // int nb_th; m_nb_thread=nb_th; - cout<<"nb de thread"<<nb_th<<endl; + //cout<<"nb de thread"<<nb_th<<endl; int rc; m_id_thread=0; m_nbrecv=0; diff --git a/src/MCHybridSOG.cpp b/src/MCHybridSOG.cpp index 7f9b91f512542aae8d53e06bc623192ebe28c848..a0569d68770c45369427441ff6f8883f5e9c5e0e 100644 --- a/src/MCHybridSOG.cpp +++ b/src/MCHybridSOG.cpp @@ -623,12 +623,12 @@ void MCHybridSOG::computeDSOG(LDDGraph &g) double tps; // double t1=(double)clock() / (double)CLOCKS_PER_SEC; - cout<<"process with id "<<task_id<<" / "<<n_tasks<<endl; + //cout<<"process with id "<<task_id<<" / "<<n_tasks<<endl; MPI_Barrier(m_comm_world); - cout<<"After!!!!process with id "<<task_id<<endl; + // cout<<"After!!!!process with id "<<task_id<<endl; // int nb_th; m_nb_thread=nb_th; - cout<<"nb de thread"<<nb_th<<endl; + //cout<<"nb de thread"<<nb_th<<endl; int rc; m_id_thread=0; m_nbrecv=0; diff --git a/src/main.cpp b/src/main.cpp index 5477c36adbba09f59a7b275fb926a460f253be45..5d36106fafdeb6019ba12081c0493c4dd65694a1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -315,7 +315,7 @@ int main(int argc, char** argv) } MPI_Comm gprocess; MPI_Comm_split(MPI_COMM_WORLD,task_id==n_tasks?0:1,task_id,&gprocess); - cout<<" Task id "<<task_id<<"/"<<n_tasks<<endl; + //cout<<" Task id "<<task_id<<"/"<<n_tasks<<endl; if (task_id!=n_tasks) { cout<<"N task :"<<n_tasks<<endl; MCHybridSOG DR(Rnewnet,gprocess, bound,false); @@ -326,18 +326,25 @@ int main(int argc, char** argv) cout<<"On the fly Model checker by process "<<task_id<<endl; auto d = spot::make_bdd_dict(); spot::twa_graph_ptr af = spot::translator(d).run(not_f); - spot::twa_graph_ptr k =spot::make_twa_graph(std::make_shared<HybridKripke>(d,Rnewnet.getListTransitionAP(),Rnewnet.getListPlaceAP(),Rnewnet),spot::twa::prop_set::all(), true); + /* spot::twa_graph_ptr k =spot::make_twa_graph(std::make_shared<HybridKripke>(d,Rnewnet.getListTransitionAP(),Rnewnet.getListPlaceAP(),Rnewnet),spot::twa::prop_set::all(), true); cout<<"finished...."<<endl; - //while(1); - /* auto k = - std::make_shared<HybridKripke>(d,R.getListTransitionAP(),R.getListPlaceAP());*/ + + fstream file; string st(argv[3]); st+=".dot"; file.open(st.c_str(),fstream::out); spot::print_dot(file, k,"ka"); - file.close(); - + file.close();*/ + auto k = + std::make_shared<HybridKripke>(d,Rnewnet.getListTransitionAP(),Rnewnet.getListPlaceAP(),Rnewnet); + if (auto run = k->intersecting_run(af)) + { + std::cout << "formula is violated by the following run:\n"<<*run<<endl; + cout<<"=================================="<<endl; + } + else + std::cout << "formula is verified\n"; } }