diff --git a/src/.HybridKripkeState.h.kate-swp b/src/.HybridKripkeState.h.kate-swp
deleted file mode 100644
index 779eacdfc4dc852635675663db21ac8d1f87d37e..0000000000000000000000000000000000000000
Binary files a/src/.HybridKripkeState.h.kate-swp and /dev/null differ
diff --git a/src/HybridKripke.cpp b/src/HybridKripke.cpp
index 3770bab909ce8753db8d1906cabc55782d3693b7..ee4946682b092bac07f00e920d42b994dccfa087 100644
--- a/src/HybridKripke.cpp
+++ b/src/HybridKripke.cpp
@@ -9,25 +9,27 @@
 
 #include "HybridKripke.h"
 #include <map>
+#define TAG_FINISH 2
 #define TAG_INITIAL 3
 #define TAG_ACK_INITIAL 8
 using namespace spot;
 
 HybridKripke::HybridKripke(const bdd_dict_ptr &dict_ptr): spot::kripke(dict_ptr)
 {
-    
+    cout<<__func__<<endl;
     HybridKripkeIterator::m_dict_ptr=&dict_ptr;
-    HybridKripkeIterator::m_deadlock.setLDDValue(1);
+    /*HybridKripkeIterator::m_deadlock.setLDDValue(1);
     HybridKripkeIterator::m_deadlock.setVisited();
     HybridKripkeIterator::m_deadlock.setCompletedSucc();
     HybridKripkeIterator::m_div.setLDDValue(0);
     HybridKripkeIterator::m_div.setVisited();
     HybridKripkeIterator::m_div.setCompletedSucc();
-    HybridKripkeIterator::m_div.Successors.push_back(pair<LDDState*,int>(&HybridKripkeIterator::m_div,-1));
+    HybridKripkeIterator::m_div.Successors.push_back(pair<LDDState*,int>(&HybridKripkeIterator::m_div,-1));*/
 }
 
-HybridKripke::HybridKripke(const spot::bdd_dict_ptr& dict_ptr,set<string> &l_transap,set<string> &l_placeap):HybridKripke(dict_ptr) {
-    
+HybridKripke::HybridKripke(const spot::bdd_dict_ptr& dict_ptr,set<string> &l_transap,set<string> &l_placeap,NewNet &net_):HybridKripke(dict_ptr) {
+    m_net=&net_;
+    HybridKripkeIterator::m_net=&net_;
     for (auto it=l_transap.begin();it!=l_transap.end();it++) {
         register_ap(*it);
     }
@@ -40,47 +42,47 @@ HybridKripke::HybridKripke(const spot::bdd_dict_ptr& dict_ptr,set<string> &l_tra
 
 
 state* HybridKripke::get_init_state() const {
-    // LDDState *ss=m_builder->getInitialMetaState();
+  
+    
     int v;
     MPI_Send( &v, 1, MPI_INT, 0, TAG_INITIAL, MPI_COMM_WORLD); 
-     char message[18];
+     char message[23];
     MPI_Status status; int nbytes;
     MPI_Probe(MPI_ANY_SOURCE, TAG_ACK_INITIAL, MPI_COMM_WORLD, &status);
-    MPI_Get_count(&status, MPI_UNSIGNED_CHAR, &v);
-    cout<<" Message size : "<<v<<endl;
-    MPI_Recv(message, 17, MPI_UNSIGNED_CHAR,MPI_ANY_SOURCE,TAG_ACK_INITIAL,MPI_COMM_WORLD, &status);
-    message[17]='\0';    
-    cout<<"Message received : "<<message<<endl;
+    MPI_Get_count(&status, MPI_BYTE, &v);
+    MPI_Recv(message, 22, MPI_BYTE,MPI_ANY_SOURCE,TAG_ACK_INITIAL,MPI_COMM_WORLD, &status);
+    char id[16];
+    memcpy(id,message,16);
     
-
-    uint16_t p_container=message[0];
-    return new HybridKripkeState(message+1,p_container);
+    uint16_t p_container;
+    memcpy(&p_container,message+16,2);    
+    return new HybridKripkeState(id,p_container);    
 
 }
 // Allows to print state label representing its id
 std::string HybridKripke::format_state(const spot::state* s) const
   {
-    //cout<<__func__<<endl;
+    cout<<__func__<<endl;
     auto ss = static_cast<const HybridKripkeState*>(s);
     std::ostringstream out;
-    out << "( " << ss->getId() <<  ")";
-   // cout << " ( " << ss->getLDDState()->getLDDValue() <<  ")";
+    out << "( " << ss->hash() <<  ")";
+ 
     return out.str();
   }
 
 HybridKripkeIterator* HybridKripke::succ_iter(const spot::state* s) const {
-   
+   cout<<__func__<<endl;
     auto ss = static_cast<const HybridKripkeState*>(s);
-    LDDState *aggregate;//=ss->getLDDState();
+    HybridKripkeState *aggregate=ss;
     bdd cond = state_condition(ss);
     if (iter_cache_)
     {
       auto it = static_cast<HybridKripkeIterator*>(iter_cache_);
       iter_cache_ = nullptr;    // empty the cache
-      it->recycle(aggregate, cond);
+      it->recycle(ss, cond);
       return it;
     }
-  return new HybridKripkeIterator(*ss,cond);
+  return new HybridKripkeIterator(*aggregate,cond);
 
     
     
@@ -93,19 +95,19 @@ HybridKripkeIterator* HybridKripke::succ_iter(const spot::state* s) const {
 
 bdd HybridKripke::state_condition(const spot::state* s) const
   {
-
+   
     auto ss = static_cast<const HybridKripkeState*>(s);
-    //vector<int> marked_place=ss->getLDDState()->getMarkedPlaces(m_builder->getPlaceProposition());
+    set<uint16_t> marked_place=ss->getMarkedPlaces();
 
 
     bdd result=bddtrue;
-    // Marked places
-    //for (auto it=marked_place.begin();it!=marked_place.end();it++) {
-    // string name=m_builder->getPlace(*it);
-    //spot::formula f=spot::formula::ap(name);
-    //result&=bdd_ithvar((dict_->var_map.find(f))->second);
-   // }
-    //vector<int> unmarked_place=ss->getLDDState()->getUnmarkedPlaces(m_builder->getPlaceProposition());
+     
+    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();
     //for (auto it=unmarked_place.begin();it!=unmarked_place.end();it++) {
     /*string name=m_builder->getPlace(*it);
     spot::formula f=spot::formula::ap(name);
@@ -118,6 +120,12 @@ bdd HybridKripke::state_condition(const spot::state* s) const
 
 HybridKripke::~HybridKripke()
 {
-    //dtor
+    int world_size;
+    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
+    int i,v;
+    for (i = 0; i < world_size-1; i++) {      
+        MPI_Send( &v, 1, MPI_INT, i, TAG_FINISH, MPI_COMM_WORLD);       
+    } 
+   
 }
 
diff --git a/src/HybridKripke.h b/src/HybridKripke.h
index 273fe216e80d70e3dd70ce4e61b489990e65e31c..d8caeb85d1c1f577816fd1038b50ac3b73239cea 100644
--- a/src/HybridKripke.h
+++ b/src/HybridKripke.h
@@ -11,7 +11,7 @@ class HybridKripke: public spot::kripke {
     public:
 
         HybridKripke(const spot::bdd_dict_ptr& dict_ptr);
-        HybridKripke(const spot::bdd_dict_ptr& dict_ptr,set<string> &l_transap,set<string> &l_placeap);
+        HybridKripke(const spot::bdd_dict_ptr& dict_ptr,set<string> &l_transap,set<string> &l_placeap,NewNet &net_);
         virtual ~HybridKripke();
         spot::state* get_init_state() const override;
         HybridKripkeIterator* succ_iter(const spot::state* s) const override;
@@ -24,7 +24,7 @@ class HybridKripke: public spot::kripke {
 
     private:
     std::map<int, int> place_prop;
-    //LDDGraph* m_sog;
+    NewNet *m_net;
 };
 
 #endif // SOGKRIPKE_H_INCLUDED
diff --git a/src/HybridKripkeIterator.cpp b/src/HybridKripkeIterator.cpp
index b7cc6c33086cfb455d3df892d948e3f27498ed4d..0c7f4bf226a7e33b9c5e22dc1b579565c695348d 100644
--- a/src/HybridKripkeIterator.cpp
+++ b/src/HybridKripkeIterator.cpp
@@ -3,61 +3,85 @@
 #include "HybridKripkeState.h"
 #include "HybridKripkeIterator.h"
 #define TAG_ASK_SUCC 4
+#define TAG_ACK_SUCC 11
+#define TAG_NOTCOMPLETED 20
 
-HybridKripkeIterator::HybridKripkeIterator(const HybridKripkeState &kstate, bdd cnd):m_current_state(&kstate), kripke_succ_iterator(cnd)
+HybridKripkeIterator::HybridKripkeIterator(HybridKripkeState &kstate, bdd cnd):m_current_state(&kstate), kripke_succ_iterator(cnd)
 {
-    LDDState* lddstate;
-    cout<<"Send ask container"<<endl;
-     MPI_Send(m_current_state->getId(),16,MPI_UNSIGNED_CHAR,m_current_state->getContainerProcess(), TAG_ASK_SUCC, MPI_COMM_WORLD);
-    for (int i=0;i<m_lddstate->getSuccessors()->size();i++) {
-        m_lsucc.push_back(m_lddstate->getSuccessors()->at(i));
+    cout<<__func__<<endl;
+    // Ask list of successors 
+     MPI_Send(m_current_state->getId(),16,MPI_BYTE,m_current_state->getContainerProcess(), TAG_ASK_SUCC, MPI_COMM_WORLD);
+     cout<<"Container process to ask :"<<m_current_state->getContainerProcess()<<endl;
+     // 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;
+    for (uint32_t i=0;i<nb_succ;i++) {
+        succ_t succ_elt;
+        
+        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);      
     }
-   if (lddstate->isDeadLock()) {
+    
+   /*if (lddstate->isDeadLock()) {
      m_lsucc.push_back(pair<LDDState*,int>(&m_deadlock,-1));
     }
     if (lddstate->isDiv()) {
         m_lsucc.push_back(pair<LDDState*,int>(&m_div,-1));
-    }
+    }*/
 
 }
 bool HybridKripkeIterator::first() {
 
-   // cout<<"entering "<<__func__<<endl;
+    cout<<"entering "<<__func__<<endl;
     m_current_edge=0;
-    //cout<<"exciting "<<__func__<<endl;
-    return m_lsucc.size()!=0;
+    
+    return m_succ.size()!=0;
 
 }
 
 bool HybridKripkeIterator::next() {
-    //cout<<"entering "<<__func__<<"   "<<m_current_edge<<endl;
+   
     m_current_edge++;
-    return m_current_edge<m_lsucc.size();
+    return m_current_edge<m_succ.size();
 
 }
 
 bool HybridKripkeIterator::done() const {
-    //cout<<"entring /excit"<<__func__<<endl;
-    return m_current_edge==m_lsucc.size();
-
+    cout<<"entring /excit"<<__func__<<endl;
+    return m_current_edge==m_succ.size();
 }
 
 HybridKripkeState* HybridKripkeIterator::dst() const
   {
-    /*cout<<"Source "<<m_lddstate->getLDDValue()<<"Destination :"<<m_lsucc.at(m_current_edge).first->getLDDValue()<<" in "<<m_lsucc.size()<<" / "<<m_current_edge<<endl;*/
-   // return new HybridKripkeState(m_lsucc.at(m_current_edge).first);
-   char* id;
-   uint16_t p_container;
-   return new HybridKripkeState(id,p_container);
-   // return new HybridKripkeState(m_lsucc.at(m_current_edge).first);
+     succ_t succ_elt= m_succ.at(m_current_edge);
+   return new HybridKripkeState(succ_elt.id,succ_elt.pcontainer);
+  
   }
 
 bdd HybridKripkeIterator::cond()  const {
-    //cout<<"entering "<<__func__<<endl;
-    if (m_lsucc.at(m_current_edge).second==-1) return bddtrue;
-
-    string name=m_builder->getTransition(m_lsucc.at(m_current_edge).second);
-    //cout<<"Value "<<m_lddstate->getSuccessors()->at(m_current_edge).second<<" Transition name "<<name<<endl;
+    cout<<"entering "<<__func__<<endl;
+    succ_t succ_elt=m_succ.at(m_current_edge);
+    
+    if (succ_elt.transition==-1) return bddtrue;
+    
+    string name=m_net->getTransitionName(succ_elt.transition);
 
     spot::bdd_dict *p=m_dict_ptr->get();
     spot::formula f=spot::formula::ap(name);
@@ -72,19 +96,21 @@ bdd HybridKripkeIterator::cond()  const {
 }*/
 HybridKripkeIterator::~HybridKripkeIterator()
 {
-    //dtor
+    
 }
 
-void HybridKripkeIterator::recycle(LDDState* aggregate, bdd cond)
+void HybridKripkeIterator::recycle(HybridKripkeState* aggregate, bdd cond)
 {
-        m_lddstate=aggregate;
+        cout<<__func__<<endl;
+        m_current_state=aggregate;
         spot::kripke_succ_iterator::recycle(cond);
 }
 
-HybridKripkeState* HybridKripkeIterator::current_state() const {
+/*HybridKripkeState* HybridKripkeIterator::current_state() const {
+    cout<<__func__<<endl;
     return m_current_state;
-}
-static ModelCheckBaseMT * HybridKripkeIterator::m_builder;
+}*/
+static NewNet * HybridKripkeIterator::m_net;
 static spot::bdd_dict_ptr* HybridKripkeIterator::m_dict_ptr;
 static LDDState HybridKripkeIterator::m_deadlock;
 static LDDState HybridKripkeIterator::m_div;
diff --git a/src/HybridKripkeIterator.h b/src/HybridKripkeIterator.h
index 17a81d346e9d536b6d99dc0627d9d18ab54f4e63..720b4ea122f43b27d5c60ca7797c24a6d7eafd9e 100644
--- a/src/HybridKripkeIterator.h
+++ b/src/HybridKripkeIterator.h
@@ -4,15 +4,20 @@
 #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:
     static LDDState m_deadlock;
     static LDDState m_div;
-    static ModelCheckBaseMT * m_builder;
+    static NewNet * m_net;
     static spot::bdd_dict_ptr* m_dict_ptr;
   //  sog_succ_iterator(const RdPBDD& pn, const SogKripkeState& s, const bdd& c);
-    HybridKripkeIterator(const HybridKripkeState &kstate, bdd cnd);
+    HybridKripkeIterator(HybridKripkeState &kstate, bdd cnd);
     virtual ~HybridKripkeIterator();
     bool first() override;
     bool next() override;
@@ -20,18 +25,20 @@ public:
     HybridKripkeState* dst() const override;
     bdd cond() const override final;
 
-    HybridKripkeState* current_state() const;
+   // HybridKripkeState* current_state() const;
 
-    void recycle(LDDState *aggregate, bdd cond);
+    void recycle(HybridKripkeState *aggregate, bdd cond);
 
    
     std::string format_transition() const;
+    
 
 private:
     HybridKripkeState *m_current_state;
-    LDDState * m_lddstate;
-    vector<pair<LDDState*, int>> m_lsucc;
+    
+    
     unsigned int m_current_edge=0;
+    vector<succ_t> m_succ;
 };
 
 
diff --git a/src/HybridKripkeState.cpp b/src/HybridKripkeState.cpp
index 31dd140aa3b194166fc6cac92b71ba4d525a6081..9c2e02ffd800cb2dd52e1b4b5e5be30d20e97393 100644
--- a/src/HybridKripkeState.cpp
+++ b/src/HybridKripkeState.cpp
@@ -6,6 +6,7 @@
 HybridKripkeState::~HybridKripkeState()
 {
     //dtor
+    cout<<__func__<<endl;
 }
 
-static ModelCheckBaseMT * HybridKripkeState::m_builder;
+//static ModelCheckBaseMT * HybridKripkeState::m_builder;
diff --git a/src/HybridKripkeState.h b/src/HybridKripkeState.h
index 57dd8bddc8e4d17de14680757f5dd20d2643d227..0ed7af28cfcb9f65aa7d5cddd9b66e0bb4bb6a48 100644
--- a/src/HybridKripkeState.h
+++ b/src/HybridKripkeState.h
@@ -4,31 +4,52 @@
 #include <mpi.h>
 #include "LDDState.h"
 #include "ModelCheckBaseMT.h"
-
+#define TAG_ASK_STATE 9
+#define TAG_ACK_STATE 10
 class HybridKripkeState : public spot::state
 {
 public:
-    static ModelCheckBaseMT * m_builder;
+    //static ModelCheckBaseMT * m_builder;
     HybridKripkeState(unsigned char * id,uint16_t pcontainer):m_container(pcontainer) {
-        memcpy(m_id,id,16);               
-    };
-    // Constructor for cloning
-    HybridKripkeState(unsigned char *id,uint16_t pcontainer,bool ddiv, bool deadlock):m_container(pcontainer),m_div(ddiv),m_deadlock(deadlock) {
+        cout<<__func__<<"pcontainer :"<<pcontainer<<endl;
         memcpy(m_id,id,16);
+        
+        MPI_Send(m_id,16,MPI_BYTE,pcontainer, TAG_ASK_STATE, MPI_COMM_WORLD);
+        
+        
+        char message[9];
+        MPI_Status status; //int nbytes;
+        MPI_Probe(MPI_ANY_SOURCE, TAG_ACK_STATE, MPI_COMM_WORLD, &status);
+        cout<<"ACK state received..."<<endl;
+        MPI_Recv(message, 8, MPI_BYTE,MPI_ANY_SOURCE,TAG_ACK_STATE,MPI_COMM_WORLD, &status);
+        memcpy(&m_hashid,message,8);        
+        m_hashid=m_hashid | (size_t(m_container)<<56);
+        
+        
+    }
+    // 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); 
+    
+        cout<<__func__<<endl;
+        
     }
     virtual ~HybridKripkeState();
 
     HybridKripkeState* clone() const override
     {
-        return new HybridKripkeState(m_id,m_container,m_div,m_deadlock);
+        cout<<__func__<<endl;
+        return new HybridKripkeState(m_id,m_container,m_hashid,m_div,m_deadlock);
     }
     size_t hash() const override
     {
-        return m_state->getLDDValue();
+        cout<<__func__<<m_hashid<<endl;        
+        return m_hashid;
     }
 
     int compare(const spot::state* other) const override
     {
+        cout<<__func__<<endl;
         auto o = static_cast<const HybridKripkeState*>(other);
         size_t oh = o->hash();
         size_t h = hash();
@@ -39,19 +60,27 @@ public:
             return h > oh;
     }
     unsigned char * getId() {
+        cout<<__func__<<endl;
         return m_id;
     }
     uint16_t getContainerProcess() {
+        cout<<__func__<<endl;
         return m_container;
     }
+    set<uint16_t> & getMarkedPlaces() { return m_marked_places;}
+    set<uint16_t> & getUnmarkedPlaces() { return m_unmarked_places;}
 protected:
 
 private:
-    LDDState *m_state;
-    unsigned char  m_id[16];
+    //LDDState *m_state;
+    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;
 };
 
 
diff --git a/src/LDDGraph.cpp b/src/LDDGraph.cpp
index 4cb6537fda0836dc6be9a964dfb3e365f7eed725..cf0829b14303e1e64cb49b48d07770c59a2bccac 100644
--- a/src/LDDGraph.cpp
+++ b/src/LDDGraph.cpp
@@ -44,7 +44,19 @@ LDDState * LDDGraph::findSHA(unsigned char* c)
                 return *i;
     return NULL;
 }
-
+/*--------------------------------------------*/
+size_t LDDGraph::findSHAPos(unsigned char* c,bool &res)
+{
+    size_t i=0;
+    res=false;
+    for(i=0;i<m_GONodes.size();i++)       
+            if((cmpSHA(c,m_GONodes.at(i)->m_SHA2)==0)) {
+                res=true;
+                return i;
+            }
+   // cout<<__func__<<" : Aggregate not found!!!"<<endl;
+    return i;
+}
 
 /*----------------------insert() ------------*/
 void LDDGraph::insert(LDDState *c)
@@ -110,7 +122,7 @@ void LDDGraph::printCompleteInformation()
 	//InitVisit(initialstate,n);
 
 	size_t n=1;
-	//cout<<"NB BDD NODE : "<<NbBddNode(initialstate,n)<<endl;
+	//cout<<"NB BDD NODE : "<<NbBdm_current_state->getContainerProcess()dNode(initialstate,n)<<endl;
 	NbBddNode(m_initialstate,n);
 	// cout<<"NB BDD NODE : "<<bdd_anodecount(m_Tab,(int)m_nbStates)<<endl;
 	//cout<<"Shared Nodes : "<<bdd_anodecount(Tab,nbStates)<<endl;
diff --git a/src/LDDGraph.h b/src/LDDGraph.h
index 9c027cece4d3916bc6f2efa970029fd2ed5a7795..891eaf6fc23d4f67efe4928a93610167f1c73083 100755
--- a/src/LDDGraph.h
+++ b/src/LDDGraph.h
@@ -34,6 +34,7 @@ class LDDGraph
 		long m_nbArcs;
 		LDDState* find(LDDState*);
 		LDDState* findSHA(unsigned char*);
+        size_t findSHAPos(unsigned char*,bool &res);
 		bool cmpSHA(const unsigned char *s1, const unsigned char *s2);
 		void insertSHA(LDDState *c);
 		LDDEdges& get_successor(LDDState*);
diff --git a/src/LDDState.h b/src/LDDState.h
index 59ba7ef0242a7b7c669ec95127f0c042ef854516..e59e7195b46c5ffd15e3ca407376e4ef1d3276fc 100755
--- a/src/LDDState.h
+++ b/src/LDDState.h
@@ -43,13 +43,14 @@ class LDDState {
   bool isCompletedSucc() {return m_completed;}
   vector<int> getMarkedPlaces(set<int>& lplacesAP);
   vector<int> getUnmarkedPlaces(set<int>& lplacesAP);
-
+  void setProcess(uint16_t v) {m_process=v;}
+  uint16_t getProcess() {return m_process;}
  protected:
  private:
   bool m_virtual = false;
   bool m_visited=false;
   bool m_completed=false;
-
+  uint16_t m_process=0;
 };
 
 typedef pair<LDDState*, int> LDDEdge;
diff --git a/src/MCHybridSOG.cpp b/src/MCHybridSOG.cpp
index 6b07f6d31b25f486ddac6d15abb3f223f478ea37..9ca13560fece90bb9653c9338b5c9f81f7366774 100644
--- a/src/MCHybridSOG.cpp
+++ b/src/MCHybridSOG.cpp
@@ -20,6 +20,10 @@ using namespace sylvan;
 
 #define TAG_AGREGATE 5
 #define TAG_ACK_INITIAL 8
+#define TAG_ASK_STATE 9
+#define TAG_ACK_STATE 10
+#define TAG_ACK_SUCC 11
+#define TAG_NOTCOMPLETED 20
 
 MCHybridSOG::MCHybridSOG(const NewNet &R,MPI_Comm &comm_world, int BOUND,bool init)
 {
@@ -129,7 +133,7 @@ void *MCHybridSOG::doCompute()
 
     unsigned char Identif[20];
     m_Terminated=false;
-    m_Terminating=false;
+    
     /****************************************** initial state ********************************************/
     if (task_id==0 && id_thread==0)
     {
@@ -146,7 +150,7 @@ void *MCHybridSOG::doCompute()
         get_md5(*chaine,Identif);
         //lddmc_getsha(Complete_meta_state, Identif);
         int destination=(int)(Identif[0]%n_tasks);
-
+        c->setProcess(destination);
         if(destination==0)
         {
 
@@ -156,7 +160,7 @@ void *MCHybridSOG::doCompute()
             m_graph->setInitialState(c);
             m_graph->insert(c);
             m_charge[1]++;
-            strcpySHA(c->m_SHA2,Identif);
+            memcpy(c->m_SHA2,Identif,16);
         }
         else
         {
@@ -199,8 +203,39 @@ void *MCHybridSOG::doCompute()
             {
                 send_state_message();
                 read_message();
+                if (m_waitingBuild) {
+                            bool res;
+                            size_t pos=m_graph->findSHAPos(m_id_md5,res);
+                            if (res) {
+                                m_waitingBuild=false;
+                                m_aggWaiting=m_graph->getLDDStateById(pos);
+                                m_waitingSucc=true;
+                                cout<<"Get build..."<<endl;
+                            }
+                            
+                        }
+                        if (m_waitingSucc) {
+                            
+                            if (m_aggWaiting->isCompletedSucc()) {
+                                cout<<"Get succ..."<<endl;
+                                m_waitingSucc=false;
+                                sendSuccToMC();
+                            }
+                        }
+                        if (m_waitingAgregate) {
+                            bool res;
+                            size_t pos=m_graph->findSHAPos(m_id_md5,res);
+                            //cout<<"Not found..."<<endl;
+                            if (res) {
+                                m_waitingAgregate=false;
+                                char mess[9];
+                                memcpy(mess,&pos,8);
+                                MPI_Send(mess,8,MPI_BYTE,n_tasks, TAG_ACK_STATE, MPI_COMM_WORLD);  
+                                
+                            }
+                        }
             }
-            while (isNotTerminated()); 
+            while (!m_Terminated); 
 
 
             
@@ -291,7 +326,7 @@ void *MCHybridSOG::doCompute()
 
                             /**************** construction local ******/
                             // cout<<"debut boucle pile process "<<task_id<< " thread "<< id_thread<<endl;
-
+                            reached_class->setProcess(destination);
                             if(destination==task_id)
                             {
                                 //      cout << " construction local de l'aggregat " <<endl;
@@ -300,6 +335,7 @@ void *MCHybridSOG::doCompute()
                                 if(!pos)
                                 {
                                     m_graph->insert(reached_class);
+                                    
                                     pthread_mutex_unlock(&m_graph_mutex);
                                     m_graph->addArc();
 
@@ -340,7 +376,7 @@ void *MCHybridSOG::doCompute()
                                  MDD reached=ldd_reachedclass;
 
                                     m_graph->insertSHA(reached_class);
-                                    strcpySHA(reached_class->m_SHA2,Identif);
+                                    memcpy(reached_class->m_SHA2,Identif,16);
                                     pthread_mutex_unlock(&m_graph_mutex);
                                 #ifndef REDUCE
                                 reached=Canonize(ldd_reachedclass,0);
@@ -380,6 +416,8 @@ void *MCHybridSOG::doCompute()
 
 
                         }
+                        e.first.first->setCompletedSucc();
+                        
 
 
 
@@ -411,6 +449,12 @@ void *MCHybridSOG::doCompute()
                         if (!m_graph->find(Agregate))
                         {
                             m_graph->insert(Agregate);
+                            Agregate->setProcess(task_id);
+                            string* chaine=new string();
+                            convert_wholemdd_stringcpp(MState,*chaine);
+                            get_md5(*chaine,Identif);
+                            delete chaine;
+                            memcpy(Agregate->m_SHA2,Identif,16);
                             pthread_mutex_unlock(&m_graph_mutex);
                             Set fire=firable_obs(MState);
                             min_charge=minCharge();
@@ -446,62 +490,99 @@ void *MCHybridSOG::doCompute()
 
         }    /// End else
         //cout<<"Working process "<<task_id<<" leaved...thread "<<id_thread<<endl;
+        
     }
 
 
 }
 
 
-bool MCHybridSOG::isNotTerminated()
-{
-    bool res=true;
-    int i=0;
-    while (i<m_nb_thread && res)
-    {
-        res=m_st[i].empty() && m_msg[i].empty();
-        i++;
-    }
-    return !res;
-}
-
 
 
 void MCHybridSOG::read_message()
 {
     int flag=0;
-
-
     MPI_Iprobe(MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&flag,&m_status); // exist a msg to receiv?
     while (flag!=0)
     {
+       //cout<<"message tag :"<<m_status.MPI_TAG<<" by task "<<task_id<<endl;
+      if (m_status.MPI_TAG==TAG_ASK_STATE) {          
+            cout<<"TAG ASKSTATE received by task "<<task_id<<" from "<<m_status.MPI_SOURCE<<endl;
+            char mess[17];
+            MPI_Recv(mess,16,MPI_BYTE,m_status.MPI_SOURCE,m_status.MPI_TAG,MPI_COMM_WORLD,&m_status);
+            bool res;m_waitingAgregate=false;
+            size_t pos=m_graph->findSHAPos(mess,res);
+            if (!res) {
+                cout<<"Not found"<<endl;
+                m_waitingAgregate=true;
+                memcpy(m_id_md5,mess,16);
+            }
+            else {
+                cout<<"pos found :"<<pos<<endl;
+                memcpy(mess,&pos,8);
+                MPI_Send(mess,8,MPI_BYTE,m_status.MPI_SOURCE, TAG_ACK_STATE, MPI_COMM_WORLD);                
+            }
+            
+      }
+      else if (m_status.MPI_TAG==TAG_ASK_SUCC) {          
+        
+            char mess[17];
+            
+            MPI_Recv(mess,16,MPI_BYTE,m_status.MPI_SOURCE,m_status.MPI_TAG,MPI_COMM_WORLD,&m_status);
+            m_waitingBuild=false;m_waitingSucc=false;
+            bool res;
+            cout<<"Before "<<res<<endl;
+            size_t pos=m_graph->findSHAPos(mess,res);
+            cout<<"After "<<res<<endl;
+            if (res) {
+                LDDState *aggregate=m_graph->getLDDStateById(pos);
+                m_aggWaiting=aggregate;
+                if (aggregate->isCompletedSucc()) sendSuccToMC();
+                else {
+                    m_waitingSucc=true;                    
+                    cout<<"Waiting for succ..."<<endl;
+                }
+            }
+            else {
+                m_waitingBuild=true;
+                cout<<"Waiting for build..."<<endl;
+                memcpy(m_id_md5,mess,16);
+            }
+            
+      }
+      int v;
         switch (m_status.MPI_TAG)
         {
-        case TAG_STATE :
-            //cout<<"TAG STATE received by task "<<task_id<<endl;
+        case TAG_STATE:
+            cout<<"=============================TAG STATE received by task "<<task_id<<endl;
             read_state_message();
             break;
-        case TAG_FINISH : break;
-        case TAG_INITIAL : 
-             int v;
+        case TAG_FINISH: 
+            cout<<"TAG FINISH received by task "<<task_id<<endl;
+            
+             MPI_Recv(&v, 1, MPI_INT, m_status.MPI_SOURCE, m_status.MPI_TAG, MPI_COMM_WORLD, &m_status);
+            m_Terminated=true;
+            break;
+        case TAG_INITIAL: 
+            cout<<"TAG INITIAL received by task "<<task_id<<endl;
+             
              MPI_Recv(&v, 1, MPI_INT, m_status.MPI_SOURCE, m_status.MPI_TAG, MPI_COMM_WORLD, &m_status);
              LDDState *i_agregate=m_graph->getInitialState();
              
-             stringstream ss;
-             ss<<(task_id);ss<<'\0';
-             ss<<i_agregate->getSHAValue();
-             cout<<"Ldd Value :"<<i_agregate->getLDDValue()<<endl;
-             cout<<"string :"<<ss.str()<<endl;   
-             
-             MPI_Send(ss.str().c_str(),17,MPI_UNSIGNED_CHAR,m_status.MPI_SOURCE, TAG_ACK_INITIAL, MPI_COMM_WORLD);
+           
+             char message[23];
+             memcpy(message,i_agregate->getSHAValue(),16);
+             uint16_t id_p=i_agregate->getProcess();
+             uint32_t jouk=65535;
+             memcpy(message+16,&id_p,2);
+             memcpy(message+18,&jouk,4);           
+            
+             MPI_Send(message,22,MPI_BYTE,m_status.MPI_SOURCE, TAG_ACK_INITIAL, MPI_COMM_WORLD);
              break;
-        case TAG_ASK_SUCC : 
-            int id;
-             MPI_Recv(&id, 1, MPI_INT, m_status.MPI_SOURCE, m_status.MPI_TAG, MPI_COMM_WORLD, &m_status);
-            // LDDState *aggregate=m_graph->findSHA()
-             // Send successors 
-            break;
-        case TAG_AGREGATE : break;
-        default :  //cout<<"unknown received "<<status.MPI_TAG<<" by task "<<task_id<<endl;
+       
+        
+        
+        default:  cout<<"unknown received "<<m_status.MPI_TAG<<" by task "<<task_id<<endl;
             //AbortTerm();
             break;
             /* int v;
@@ -509,7 +590,8 @@ void MCHybridSOG::read_message()
              if (task_id!=0)
                  MPI_Send( &v, 1, MPI_INT, 0, TAG_ABORT, MPI_COMM_WORLD);*/
         }
-        MPI_Iprobe(MPI_ANY_SOURCE,MPI_ANY_TAG,m_comm_world,&flag,&m_status);
+        
+        MPI_Iprobe(MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&flag,&m_status);
     }
 
 }
@@ -523,7 +605,7 @@ void MCHybridSOG::read_state_message()
     int nbytes;
     MPI_Get_count(&m_status, MPI_CHAR, &nbytes);
     char inmsg[nbytes+1];
-    MPI_Recv(inmsg, nbytes, MPI_CHAR,m_status.MPI_SOURCE,TAG_STATE,m_comm_world, &m_status);
+    MPI_Recv(inmsg, nbytes, MPI_CHAR,m_status.MPI_SOURCE,TAG_STATE,MPI_COMM_WORLD, &m_status);
     m_nbrecv++;
     string *msg_receiv =new string(inmsg,nbytes);
     min_charge=minCharge();
@@ -548,7 +630,7 @@ void MCHybridSOG::send_state_message()
         message_size=s.first->size()+1;
         int destination=s.second;
         read_message();
-        MPI_Send(s.first->c_str(), message_size, MPI_CHAR, destination, TAG_STATE, m_comm_world);      
+        MPI_Send(s.first->c_str(), message_size, MPI_CHAR, destination, TAG_STATE, MPI_COMM_WORLD);      
         m_nbsend++;
         m_size_mess+=message_size;
         delete s.first;
@@ -740,10 +822,6 @@ MDD MCHybridSOG::decodage_message(const char *chaine)
 } */
 
 
-
-
-
-
 void * MCHybridSOG::threadHandler(void *context)
 {
 
@@ -801,3 +879,29 @@ void  MCHybridSOG::get_md5(const string& chaine,unsigned char *md_chaine)
     pthread_spin_unlock(&m_spin_md5);
     md_chaine[16]='\0';
 }
+
+void MCHybridSOG::sendSuccToMC() {
+    uint32_t nb_succ=m_aggWaiting->getSuccessors()->size();
+    uint32_t message_size=nb_succ*20+4;
+            
+    char mess_tosend[message_size];
+    memcpy(mess_tosend,&nb_succ,4);            
+    uint32_t i_message=4;
+    
+    for (uint32_t i=0;i<nb_succ;i++) {  
+               
+                pair<LDDState*,int> elt;
+                elt=m_aggWaiting->getSuccessors()->at(i);
+                memcpy(mess_tosend+i_message,elt.first->getSHAValue(),16);
+                i_message+=16;
+                uint16_t pcontainer=elt.first->getProcess();
+                cout<<" pcontainer "<<pcontainer<<endl;
+                memcpy(mess_tosend+i_message,&pcontainer,2);                
+                i_message+=2;  
+                memcpy(mess_tosend+i_message,&(elt.second),2);
+                i_message+=2; 
+            }
+            
+           MPI_Send(mess_tosend,message_size,MPI_BYTE,n_tasks, TAG_ACK_SUCC,MPI_COMM_WORLD);
+          
+}
diff --git a/src/MCHybridSOG.h b/src/MCHybridSOG.h
index 6418e3a6d269d5d325d118604a9caaf9fd414097..9c250deae146d7543a4fc2fd5b2d95c916695ee8 100644
--- a/src/MCHybridSOG.h
+++ b/src/MCHybridSOG.h
@@ -58,12 +58,19 @@ public:
 protected:
 private:
     MPI_Comm m_comm_world;
+    void sendSuccToMC();
+    bool m_waitingAgregate=false;
+    bool m_waitingBuild=false;
+    char m_id_md5[16];
+    LDDState * m_aggWaiting=nullptr;
+    bool m_waitingSucc=false;
+    
     /// \ hash function
     void get_md5(const string &chaine, unsigned char *md_chaine);
         
     /// minimum charge function for the load balancing between thread
     inline int minCharge();
-    inline bool isNotTerminated();
+    
     /// Copie string of caracter
     void strcpySHA(unsigned char *dest, const unsigned char *source);
 
@@ -126,7 +133,7 @@ private:
     int m_total_nb_send = 0, m_total_nb_recv = 0;
 
     MPI_Status m_status;
-    bool m_Terminating = false;
+    
 
 };
 
diff --git a/src/NewNet.h b/src/NewNet.h
index 10107a044d95ba59d98744209c254420af8b0a50..9709a016016507dec081c17a3d9ee6ac867e63fc 100644
--- a/src/NewNet.h
+++ b/src/NewNet.h
@@ -106,8 +106,11 @@ class NewNet : public RdPMonteur {
   int nbTransition() const { return transitions.size(); };
   set<string>& getListTransitionAP() {return m_ltransitionAP;}
   set<string>& getListPlaceAP() {return m_lplaceAP;}
+  string& getPlaceName(size_t pos) { return m_placePosName.find(pos)->second;}
+  string& getTransitionName(size_t pos) { return m_transitionPosName.find(pos)->second;}
   map<int,string> m_placePosName;
   private:
+  
   map<int,string> m_transitionPosName;
 
 
diff --git a/src/main.cpp b/src/main.cpp
index 369c6d849d044d5b924bc8bb44dd8bc971bfadaf..d358602a16673541c7422350e903f85377b52b99 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -327,15 +327,19 @@ int main(int argc, char** argv)
                     else {                        
                         cout<<"On the fly Model checker by process "<<task_id<<endl;
                        auto d = spot::make_bdd_dict();
-                        spot::twa_graph_ptr k =spot::make_twa_graph(std::make_shared<HybridKripke>(d,R.getListTransitionAP(),R.getListPlaceAP()),spot::twa::prop_set::all(), true);
+                       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,R.getListTransitionAP(),R.getListPlaceAP(),R),spot::twa::prop_set::all(), true);
+                        cout<<"finished...."<<endl;
+                        //while(1);
                      /*   auto k =
             std::make_shared<HybridKripke>(d,R.getListTransitionAP(),R.getListPlaceAP());*/
-                     /*    fstream file;
+                    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();
+                    
                     }
                 }