From d462294be83a9ab781013e970a7ff77f83ac61c5 Mon Sep 17 00:00:00 2001
From: ouni <ouni@lipn.univ-paris13.fr>
Date: Thu, 25 Apr 2019 14:57:21 +0200
Subject: [PATCH] src

---
 .gitmodules.save        |   4 +
 src/CommonSOG.cpp       | 174 ++++++++++++++++++
 src/CommonSOG.h         |  42 +++++
 src/DistributedSOG.cpp  | 200 +++------------------
 src/DistributedSOG.h    |  42 ++---
 src/HybridSOG.cpp       | 173 +-----------------
 src/HybridSOG.h         | 205 ++++++++++-----------
 src/LDDGraph.cpp        |  31 ----
 src/SpotSogIterator.cpp |   4 +-
 src/SpotSogIterator.h   |   4 +-
 src/main.cpp            | 121 ++++++++++---
 src/threadSOG.cpp       | 390 ++++------------------------------------
 src/threadSOG.h         |  52 ++----
 13 files changed, 497 insertions(+), 945 deletions(-)
 create mode 100644 .gitmodules.save
 create mode 100644 src/CommonSOG.cpp
 create mode 100644 src/CommonSOG.h

diff --git a/.gitmodules.save b/.gitmodules.save
new file mode 100644
index 0000000..10d37a8
--- /dev/null
+++ b/.gitmodules.save
@@ -0,0 +1,4 @@
+[submodule "libraries/parser"]
+	path = libraries/parser
+	url = https://depot.lipn.univ-paris13.fr/PMC-SOG/pn-parser/tree/mc-sog-parser
+URL non trouvée pour le chemin de sous-mod
diff --git a/src/CommonSOG.cpp b/src/CommonSOG.cpp
new file mode 100644
index 0000000..ead7db6
--- /dev/null
+++ b/src/CommonSOG.cpp
@@ -0,0 +1,174 @@
+#include "CommonSOG.h"
+#include "sylvan_seq.h"
+
+const vector<class Place> *_places = NULL;
+CommonSOG::CommonSOG()
+{
+    //ctor
+}
+
+CommonSOG::~CommonSOG()
+{
+    //dtor
+}
+
+LDDGraph *CommonSOG::getGraph() const {
+    return m_graph;
+}
+
+MDD CommonSOG::Accessible_epsilon(MDD From)
+{
+    MDD M1;
+    MDD M2=From;
+
+    do
+    {
+        M1=M2;
+        for(Set::const_iterator i=m_nonObservable.begin(); !(i==m_nonObservable.end()); i++)
+        {
+
+            MDD succ= lddmc_firing_mono(M2,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
+            M2=lddmc_union_mono(M2,succ);
+            //M2=succ|M2;
+        }
+
+    }
+    while(M1!=M2);
+    return M2;
+}
+// Return the set of firable observable transitions from an agregate
+Set CommonSOG::firable_obs(MDD State)
+{
+    Set res;
+    for(Set::const_iterator i=m_observable.begin(); !(i==m_observable.end()); i++)
+    {
+        //cout<<"firable..."<<endl;
+        MDD succ = lddmc_firing_mono(State,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
+        if(succ!=lddmc_false)
+        {
+            res.insert(*i);
+        }
+
+    }
+    return res;
+}
+
+MDD CommonSOG::get_successor(MDD From,int t)
+{
+    return lddmc_firing_mono(From,m_tb_relation[(t)].getMinus(),m_tb_relation[(t)].getPlus());
+}
+
+
+MDD CommonSOG::ImageForward(MDD From)
+{
+    MDD Res=lddmc_false;
+    for(Set::const_iterator i=m_nonObservable.begin(); !(i==m_nonObservable.end()); i++)
+    {
+        MDD succ= lddmc_firing_mono(From,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
+        Res=lddmc_union_mono(Res,succ);
+    }
+    return Res;
+}
+
+
+/*----------------------------------------------CanonizeR()------------------------------------*/
+MDD CommonSOG::Canonize(MDD s,unsigned int level)
+{
+    if (level>m_nbPlaces || s==lddmc_false) return lddmc_false;
+    if(isSingleMDD(s))   return s;
+    MDD s0=lddmc_false,s1=lddmc_false;
+
+    bool res=false;
+    do
+    {
+        if (get_mddnbr(s,level)>1)
+        {
+            s0=ldd_divide_rec(s,level);
+            s1=ldd_minus(s,s0);
+            res=true;
+        }
+        else
+            level++;
+    }
+    while(level<m_nbPlaces && !res);
+
+
+    if (s0==lddmc_false && s1==lddmc_false)
+        return lddmc_false;
+    // if (level==nbPlaces) return lddmc_false;
+    MDD Front,Reach;
+    if (s0!=lddmc_false && s1!=lddmc_false)
+    {
+        Front=s1;
+        Reach=s1;
+        do
+        {
+            // cout<<"premiere boucle interne \n";
+            Front=ldd_minus(ImageForward(Front),Reach);
+            Reach = lddmc_union_mono(Reach,Front);
+            s0 = ldd_minus(s0,Front);
+        }
+        while((Front!=lddmc_false)&&(s0!=lddmc_false));
+    }
+    if((s0!=lddmc_false)&&(s1!=lddmc_false))
+    {
+        Front=s0;
+        Reach = s0;
+        do
+        {
+            //  cout<<"deuxieme boucle interne \n";
+            Front=ldd_minus(ImageForward(Front),Reach);
+            Reach = lddmc_union_mono(Reach,Front);
+            s1 = ldd_minus(s1,Front);
+        }
+        while( Front!=lddmc_false && s1!=lddmc_false );
+    }
+
+
+
+    MDD Repr=lddmc_false;
+
+    if (isSingleMDD(s0))
+    {
+        Repr=s0;
+    }
+    else
+    {
+
+        Repr=Canonize(s0,level);
+
+    }
+
+    if (isSingleMDD(s1))
+        Repr=lddmc_union_mono(Repr,s1);
+    else
+        Repr=lddmc_union_mono(Repr,Canonize(s1,level));
+
+
+    return Repr;
+
+
+}
+
+void CommonSOG::printhandler(ostream &o, int var)
+{
+    o << (*_places)[var/2].name;
+    if (var%2)
+        o << "_p";
+}
+
+
+vector<TransSylvan>* CommonSOG::getTBRelation() {
+    return &m_tb_relation;
+}
+
+Set * CommonSOG::getNonObservable() {
+    return &m_nonObservable;
+}
+
+
+/*********Returns the count of places******************************************/
+unsigned int CommonSOG::getPlacesCount() {
+    return m_nbPlaces;
+}
+
diff --git a/src/CommonSOG.h b/src/CommonSOG.h
new file mode 100644
index 0000000..2132dca
--- /dev/null
+++ b/src/CommonSOG.h
@@ -0,0 +1,42 @@
+#ifndef COMMONSOG_H
+#define COMMONSOG_H
+#include "LDDGraph.h"
+#include "TransSylvan.h"
+#include "Net.hpp"
+#include <stack>
+
+typedef pair<LDDState *, MDD> couple;
+typedef pair<couple, Set> Pair;
+typedef stack<Pair> pile;
+class CommonSOG
+{
+    public:
+        CommonSOG();
+        virtual ~CommonSOG();
+        LDDGraph *getGraph() const;
+        static void printhandler(ostream &o, int var);
+        vector<TransSylvan>* getTBRelation();
+        Set * getNonObservable();
+        unsigned int getPlacesCount();
+    protected:
+        net m_net;
+        int m_nbPlaces = 0;
+        LDDGraph *m_graph;
+        vector<TransSylvan> m_tb_relation;
+        LDDState m_M0;
+        map<string, int> m_transitionName;
+        Set m_observable;
+        Set m_nonObservable;
+        Set InterfaceTrans;
+        Set Formula_Trans;
+        vector<class Transition> transitions;
+
+        MDD Accessible_epsilon(MDD From);
+        Set firable_obs(MDD State);
+        MDD get_successor(MDD From, int t);
+        MDD ImageForward(MDD From);
+        MDD Canonize(MDD s, unsigned int level);
+    private:
+};
+
+#endif // COMMONSOG_H
diff --git a/src/DistributedSOG.cpp b/src/DistributedSOG.cpp
index 8c8ba94..627a474 100644
--- a/src/DistributedSOG.cpp
+++ b/src/DistributedSOG.cpp
@@ -25,12 +25,6 @@ using namespace sylvan;
 /**************************************************/
 
 
-
-
-
-const vector<class Place> *__vplaces = NULL;
-
-
 DistributedSOG::DistributedSOG(const net &R, int BOUND,bool init)
 {
 
@@ -47,20 +41,20 @@ DistributedSOG::DistributedSOG(const net &R, int BOUND,bool init)
     m_net=R;
 
     m_init=init;
-    nbPlaces=R.places.size();
+
     int i, domain;
     vector<Place>::const_iterator it_places;
 
     //_______________
     transitions=R.transitions;
-    Observable=R.Observable;
-    NonObservable=R.NonObservable;
+    m_observable=R.Observable;
+    m_nonObservable=R.NonObservable;
     Formula_Trans=R.Formula_Trans;
-    transitionName=R.transitionName;
+    m_transitionName=R.transitionName;
     InterfaceTrans=R.InterfaceTrans;
-    Nb_places=R.places.size();
-    cout<<"Nombre de places : "<<Nb_places<<endl;
-    cout<<"Derniere place : "<<R.places[Nb_places-1].name<<endl;
+    m_nbPlaces=R.places.size();
+    cout<<"Nombre de places : "<<m_nbPlaces<<endl;
+    cout<<"Derniere place : "<<R.places[m_nbPlaces-1].name<<endl;
     // place domain, place bvect, place initial marking and place name
 
 
@@ -72,17 +66,17 @@ DistributedSOG::DistributedSOG(const net &R, int BOUND,bool init)
     M0=lddmc_cube(liste_marques,R.places.size());
     delete []liste_marques;
     // place names
-    __vplaces = &R.places;
+//    __vplaces = &R.places;
 
 
-    uint32_t *prec = new uint32_t[nbPlaces];
-    uint32_t *postc= new uint32_t [nbPlaces];
+    uint32_t *prec = new uint32_t[m_nbPlaces];
+    uint32_t *postc= new uint32_t [m_nbPlaces];
     // Transition relation
     for(vector<Transition>::const_iterator t=R.transitions.begin();
             t!=R.transitions.end(); t++)
     {
         // Initialisation
-        for(i=0; i<nbPlaces; i++)
+        for(i=0; i<m_nbPlaces; i++)
         {
             prec[i]=0;
             postc[i]=0;
@@ -103,8 +97,8 @@ DistributedSOG::DistributedSOG(const net &R, int BOUND,bool init)
             postc[it->first] = postc[it->first] + it->second;
         }
 
-        MDD _minus=lddmc_cube(prec,nbPlaces);
-        MDD _plus=lddmc_cube(postc,nbPlaces);
+        MDD _minus=lddmc_cube(prec,m_nbPlaces);
+        MDD _plus=lddmc_cube(postc,m_nbPlaces);
         m_tb_relation.push_back(TransSylvan(_minus,_plus));
     }
     delete [] prec;
@@ -158,7 +152,8 @@ void *DistributedSOG::doCompute()
         {
             m_nbmetastate++;
             //m_old_size=lddmc_nodecount(c->m_lddstate);
-            fire=firable_obs(Complete_meta_state);
+
+            Set fire=firable_obs(Complete_meta_state);
             m_st.push(Pair(couple(c,Complete_meta_state),fire));
             m_graph->setInitialState(c);
             m_graph->insert(c);
@@ -204,7 +199,7 @@ void *DistributedSOG::doCompute()
                 reached_class=new LDDState;
 
                 //  lddmc_fprintdot(fp,Complete_meta_state);
-                MDD marking=get_successorMDD(e.first.second,t);
+                MDD marking=get_successor(e.first.second,t);
                 MDD lddmarq=Accessible_epsilon(marking);
                 reached_class->m_lddstate=lddmarq;
                 lddmc_getsha(lddmarq, msg);
@@ -229,7 +224,7 @@ void *DistributedSOG::doCompute()
                         reached_class->Predecessors.insert(reached_class->Predecessors.begin(),LDDEdge(e.first.first,t));
                         m_nbmetastate++;
 
-                        fire=firable_obs(lddmarq);
+                        Set fire=firable_obs(lddmarq);
 
                         m_st.push(Pair(couple(reached_class,lddmarq),fire));
                         nb_success++;
@@ -458,7 +453,7 @@ void DistributedSOG::read_state_message()
         if (!m_graph->find(Agregate))
         {
             m_graph->insert(Agregate);
-            fire=firable_obs(MState);
+            Set fire=firable_obs(MState);
             m_nbmetastate++;
             m_old_size=lddmc_nodecount(Agregate->m_lddstate);
             m_st.push(Pair(couple(Agregate,MState),fire));
@@ -551,70 +546,8 @@ void DistributedSOG::computeDSOG(LDDGraph &g)
 
 
 
-void DistributedSOG::printhandler(ostream &o, int var)
-{
-    o << (*__vplaces)[var/2].name;
-    if (var%2)
-        o << "_p";
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-Set DistributedSOG::firable_obs(MDD State)
-{
-    Set res;
-    for(Set::const_iterator i=Observable.begin(); !(i==Observable.end()); i++)
-    {
-
-        //cout<<"firable..."<<endl;
-        MDD succ = lddmc_firing_mono(State,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        if(succ!=lddmc_false)
-        {
-            //cout<<"firable..."<<endl;
-            res.insert(*i);
-        }
-
-    }
-    return res;
-}
-
-MDD DistributedSOG::get_successorMDD(MDD From,int t)
-{
-
-    MDD res=lddmc_firing_mono(From,m_tb_relation[(t)].getMinus(),m_tb_relation[(t)].getPlus());
-    return res;
-}
-
-
-MDD DistributedSOG::Accessible_epsilon(MDD From)
-{
-    MDD M1;
-    MDD M2=From;
-    int it=0;
-    do
-    {
-        M1=M2;
-        for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-        {
-
-            MDD succ= lddmc_firing_mono(M2,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-            M2=lddmc_union_mono(M2,succ);
-            //M2=succ|M2;
-        }
-        //TabMeta[nbmetastate]=M2;
-        //int intsize=sylvan_anodecount(TabMeta,nbmetastate+1);
-        //if(m_MaxIntBdd<intsize)
-        //  m_MaxIntBdd=intsize;
-        it++;
-        //	cout << bdd_nodecount(M2) << endl;
-    }
-    while(M1!=M2);
-    return M2;
-}
-
 
 string to_hex(unsigned char s)
 {
@@ -708,15 +641,15 @@ MDD DistributedSOG::decodage_message(char *chaine)
     nb_marq=(nb_marq<<8) | (unsigned char)chaine[0];
 
     unsigned int index=2;
-    uint32_t list_marq[nbPlaces];
+    uint32_t list_marq[m_nbPlaces];
     for (unsigned int i=0; i<nb_marq; i++)
     {
-        for (unsigned int j=0; j<nbPlaces; j++)
+        for (unsigned int j=0; j<m_nbPlaces; j++)
         {
             list_marq[j]=chaine[index];
             index++;
         }
-        MDD N=lddmc_cube(list_marq,nbPlaces);
+        MDD N=lddmc_cube(list_marq,m_nbPlaces);
         M=lddmc_union_mono(M,N);
     }
     return M;
@@ -730,7 +663,7 @@ void DistributedSOG::MarquageString(char *dest,const char *source)
     int index=1;
     for (int nb=0; nb<length; nb++)
     {
-        for (int i=0; i<nbPlaces; i++)
+        for (int i=0; i<m_nbPlaces; i++)
         {
             dest[index]=(unsigned char)source[index]+(unsigned char)'0';
             printf("%d",source[index]);
@@ -742,95 +675,6 @@ void DistributedSOG::MarquageString(char *dest,const char *source)
 }
 
 /******************************************************************************/
-MDD DistributedSOG::ImageForward(MDD From)
-{
-    MDD Res=lddmc_false;
-    for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-    {
-        MDD succ= lddmc_firing_mono(From,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-         Res=lddmc_union_mono(Res,succ);
-    }
-    return Res;
-}
-
-
-/*----------------------------------------------CanonizeR()------------------------------------*/
-MDD DistributedSOG::Canonize(MDD s,unsigned int level)
-{
-    if (level>nbPlaces || s==lddmc_false) return lddmc_false;
-    if(isSingleMDD(s))   return s;
-    MDD s0=lddmc_false,s1=lddmc_false;
 
-    bool res=false;
-    do
-    {
-        if (get_mddnbr(s,level)>1)
-        {
-            s0=ldd_divide_rec(s,level);
-            s1=ldd_minus(s,s0);
-            res=true;
-        }
-        else
-            level++;
-    }
-    while(level<nbPlaces && !res);
-
-
-    if (s0==lddmc_false && s1==lddmc_false)
-        return lddmc_false;
-    // if (level==nbPlaces) return lddmc_false;
-    MDD Front,Reach;
-    if (s0!=lddmc_false && s1!=lddmc_false)
-    {
-        Front=s1;
-        Reach=s1;
-        do
-        {
-            // cout<<"premiere boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s0 = ldd_minus(s0,Front);
-        }
-        while((Front!=lddmc_false)&&(s0!=lddmc_false));
-    }
-    if((s0!=lddmc_false)&&(s1!=lddmc_false))
-    {
-        Front=s0;
-        Reach = s0;
-        do
-        {
-            //  cout<<"deuxieme boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s1 = ldd_minus(s1,Front);
-        }
-        while( Front!=lddmc_false && s1!=lddmc_false );
-    }
-
-
-
-    MDD Repr=lddmc_false;
-
-    if (isSingleMDD(s0))
-    {
-        Repr=s0;
-    }
-    else
-    {
-
-        Repr=Canonize(s0,level);
-
-    }
-
-    if (isSingleMDD(s1))
-        Repr=lddmc_union_mono(Repr,s1);
-    else
-        Repr=lddmc_union_mono(Repr,Canonize(s1,level));
-
-
-    return Repr;
-
-
-}
 
 
diff --git a/src/DistributedSOG.h b/src/DistributedSOG.h
index 41cd1c6..f10880f 100644
--- a/src/DistributedSOG.h
+++ b/src/DistributedSOG.h
@@ -28,11 +28,12 @@
 //#include <boost/serialization/string.hpp>
 //#include <boost/mpi.hpp>
 #include <iostream>
-#include <queue>
+
 #include <string>
 //#include <boost/serialization/string.hpp>
 #include <time.h>
 #include <chrono>
+#include "CommonSOG.h"
 // namespace mpi = boost::mpi;
 
 #define MASTER 0
@@ -40,12 +41,10 @@
 
 extern int n_tasks, task_id;
 
-typedef pair<LDDState *, MDD> couple;
-typedef pair<couple, Set> Pair;
-typedef stack<Pair> pile;
+
 
 // typedef vector<Trans> vec_trans;
-class DistributedSOG {
+class DistributedSOG : public CommonSOG{
  public:
   DistributedSOG(const net &, int BOUND = 32, bool init = false);
   void buildFromNet(int index);
@@ -53,7 +52,6 @@ class DistributedSOG {
   void BuildInitialState(LDDState *m_state, MDD mdd);
   void computeSeqSOG(LDDGraph &g);
   virtual ~DistributedSOG();
-  static void printhandler(ostream &o, int var);
   static void *threadHandler(void *context);
   void *doCompute();
   void NonEmpty();
@@ -61,11 +59,8 @@ class DistributedSOG {
 
  protected:
  private:
-  LDDGraph *m_graph;
-  MDD LDDAccessible_epsilon(MDD *m);
-  MDD Accessible_epsilon(MDD From);
-  Set firable_obs(MDD State);
-  MDD get_successorMDD(MDD From, int t);
+
+
   int minCharge();
   bool isNotTerminated();
   int Terminate();
@@ -73,22 +68,11 @@ class DistributedSOG {
   char *concat_string(const char *s1, int longueur1, const char *s2,
                       int longueur2, char *dest);
   void sha256(LDDState *state, char output[65]);
-  //-----Original defined as members
-  vector<class Transition> transitions;
-  Set Observable;
-  Set NonObservable;
-  map<string, int> transitionName;
-  Set InterfaceTrans;
-  Set Formula_Trans;
-  unsigned int Nb_places;
+
   MDD M0;
-  LDDState m_M0;
+
   MDD currentvar;
-  // vector<TransSylvan> m_relation;
-  //        vec_trans m_tb_relation[16];
 
-  //-----------------
-  vector<TransSylvan> m_tb_relation;
   int m_NbIt;
   int m_itext, m_itint;
   int m_MaxIntBdd;
@@ -109,27 +93,21 @@ class DistributedSOG {
 
   MPI_Request m_request;
 
-  net m_net;
-  int m_bound, m_init;
+
+  int  m_init;
   int tempCanoniz = 0;
   int tempS = 0;
   int tempR = 0;
   long m_sizeMsg = 0;
   long m_sizeMsgCanoniz = 0;
 
-  std::queue<char *> m_queue;  // empty queue
 
-  int nbPlaces;
   void convert_wholemdd_string(MDD cmark, char **result, unsigned int &length);
   MDD decodage_message(char *chaine);
   void read_state_message();
   int nbsend = 0, nbrecv = 0;
   int total_nb_send = 0, total_nb_recv = 0;
-  Set fire;
-  MDD Canonize(MDD s, unsigned int level);
-  MDD ImageForward(MDD From);
 
-  // named_mutex m_initial_mtx{open_or_create, "initial"};
 };
 
 #endif  // DISTRIBUTEDSOG_H
diff --git a/src/HybridSOG.cpp b/src/HybridSOG.cpp
index 02c7b65..31c6c0f 100644
--- a/src/HybridSOG.cpp
+++ b/src/HybridSOG.cpp
@@ -35,7 +35,7 @@ using namespace sylvan;
 
 
 
-const vector<class Place> *_vplaces = NULL;
+
 
 /*void my_error_handler_dist(int errcode) {
     cout<<"errcode = "<<errcode<<endl;
@@ -74,10 +74,10 @@ HybridSOG::HybridSOG(const net &R, int BOUND,bool init)
     init_gc_seq();
     //_______________
     transitions=R.transitions;
-    Observable=R.Observable;
-    NonObservable=R.NonObservable;
+    m_observable=R.Observable;
+    m_nonObservable=R.NonObservable;
     Formula_Trans=R.Formula_Trans;
-    transitionName=R.transitionName;
+    m_transitionName=R.transitionName;
     InterfaceTrans=R.InterfaceTrans;
 
     m_nbPlaces=R.places.size();
@@ -95,7 +95,7 @@ HybridSOG::HybridSOG(const net &R, int BOUND,bool init)
 
     delete []liste_marques;
     // place names
-    _vplaces = &R.places;
+
 
 
     uint32_t *prec = new uint32_t[m_nbPlaces];
@@ -829,15 +829,6 @@ void HybridSOG::computeDSOG(LDDGraph &g)
 }
 
 
-
-void HybridSOG::printhandler(ostream &o, int var)
-{
-    o << (*_vplaces)[var/2].name;
-    if (var%2)
-        o << "_p";
-}
-
-
 int HybridSOG::minCharge()
 {
     int pos=1;
@@ -854,65 +845,6 @@ int HybridSOG::minCharge()
 }
 
 
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-Set HybridSOG::firable_obs(MDD State)
-{
-    Set res;
-    for(Set::const_iterator i=Observable.begin(); !(i==Observable.end()); i++)
-    {
-
-        //cout<<"firable..."<<endl;
-        MDD succ = lddmc_firing_mono(State,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        if(succ!=lddmc_false)
-        {
-            res.insert(*i);
-        }
-    }
-    return res;
-}
-
-
-
-
-MDD HybridSOG::get_successor(MDD From,int t)
-{
-    return lddmc_firing_mono(From,m_tb_relation[t].getMinus(),m_tb_relation[t].getPlus());
-}
-
-
-MDD HybridSOG::Accessible_epsilon(MDD From)
-{
-    MDD M1;
-    MDD M2=From;
-    do
-    {
-        M1=M2;
-        for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-        {
-
-            MDD succ= lddmc_firing_mono(M2,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-            M2=lddmc_union_mono(succ,M2);
-            //M2=succ|M2;
-        }
-        //	cout << bdd_nodecount(M2) << endl;
-    }
-    while(M1!=M2);
-    return M2;
-}
-
-
-/*string to_hex(unsigned char s)
-{
-    stringstream ss;
-    ss << hex << (int) s;
-    return ss.str();
-} */
-
-
 void HybridSOG::strcpySHA(unsigned char *dest,const unsigned char *source)
 {
     for (int i=0; i<LENGTH_ID; i++)
@@ -979,109 +911,14 @@ MDD HybridSOG::decodage_message(const char *chaine)
 
 
 
-/******************************************************************************/
-MDD HybridSOG::ImageForward(MDD From)
-{
-    MDD Res=lddmc_false;
-    for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-    {
-        MDD succ= lddmc_firing_mono(From,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        Res=lddmc_union_mono(Res,succ);
-    }
-    return Res;
-}
-
 
-/*----------------------------------------------CanonizeR()------------------------------------*/
-MDD HybridSOG::Canonize(MDD s,unsigned int level)
-{
-    if (level>m_nbPlaces || s==lddmc_false) return lddmc_false;
-    if(isSingleMDD(s))   return s;
-    MDD s0=lddmc_false,s1=lddmc_false;
-
-    bool res=false;
-    do
-    {
-        if (get_mddnbr(s,level)>1)
-        {
-            s0=ldd_divide_rec(s,level);
-            s1=ldd_minus(s,s0);
-            res=true;
-        }
-        else
-            level++;
-    }
-    while(level<m_nbPlaces && !res);
-
-
-    if (s0==lddmc_false && s1==lddmc_false)
-        return lddmc_false;
-    // if (level==nbPlaces) return lddmc_false;
-    MDD Front,Reach;
-    if (s0!=lddmc_false && s1!=lddmc_false)
-    {
-        Front=s1;
-        Reach=s1;
-        do
-        {
-            // cout<<"premiere boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s0 = ldd_minus(s0,Front);
-        }
-        while((Front!=lddmc_false)&&(s0!=lddmc_false));
-    }
-    if((s0!=lddmc_false)&&(s1!=lddmc_false))
-    {
-        Front=s0;
-        Reach = s0;
-        do
-        {
-            //  cout<<"deuxieme boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s1 = ldd_minus(s1,Front);
-        }
-        while( Front!=lddmc_false && s1!=lddmc_false );
-    }
 
-
-
-    MDD Repr=lddmc_false;
-
-    if (isSingleMDD(s0))
-    {
-        Repr=s0;
-    }
-    else
-    {
-
-        Repr=Canonize(s0,level);
-
-    }
-
-    if (isSingleMDD(s1))
-        Repr=lddmc_union_mono(Repr,s1);
-    else
-        Repr=lddmc_union_mono(Repr,Canonize(s1,level));
-
-
-    return Repr;
-
-
-}
 void * HybridSOG::threadHandler(void *context)
 {
 
     return ((HybridSOG*)context)->doCompute();
 }
 
-
-void printchaine(string *s) {
-    for (int i=0;i<s->size();i++)
-        printf("%d",(s->at(i)-1));
-}
-
 void HybridSOG::convert_wholemdd_stringcpp(MDD cmark,string &res)
 {
     typedef pair<string,MDD> Pair_stack;
diff --git a/src/HybridSOG.h b/src/HybridSOG.h
index 8011e98..6511d11 100644
--- a/src/HybridSOG.h
+++ b/src/HybridSOG.h
@@ -29,6 +29,7 @@
 //#include <boost/serialization/string.hpp>
 #include <time.h>
 #include <chrono>
+#include "CommonSOG.h"
 // namespace mpi = boost::mpi;
 
 //#define MASTER 0
@@ -36,125 +37,103 @@
 extern unsigned int nb_th;
 extern int n_tasks, task_id;
 
-typedef pair<LDDState *, MDD> couple;
-typedef pair<couple, Set> Pair;
-typedef stack<Pair> pile;
+
 
 typedef pair<string *, unsigned int> MSG;
 
 typedef stack<MSG> pile_msg;
 
 // typedef vector<Trans> vec_trans;
-class HybridSOG {
- public:
-  HybridSOG(const net &, int BOUND = 32, bool init = false);
-  void buildFromNet(int index);
-  /// principal functions to construct the SOG
-  void computeDSOG(LDDGraph &g);
-  virtual ~HybridSOG();
-  static void printhandler(ostream &o, int var);
-  static void *threadHandler(void *context);
-  void *doCompute();
-
- protected:
- private:
-  /// \ hash function
-  void get_md5(const string &chaine, unsigned char *md_chaine);
-  /// Termination Detection functions
-  inline void ReceiveTermSignal();
-  inline void TermSendMsg();
-  inline void startTermDetectionByMaster();
-  inline void TermReceivedMsg();
-  LDDGraph *m_graph;
-  /// saturation
-  inline MDD Accessible_epsilon(MDD From);
-  inline MDD ImageForward(MDD From);
-  /// Observable Transition
-  Set firable_obs(MDD State);
-  ///
-  MDD get_successor(MDD From, int t);
-
-  /// 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);
-
-  vector<class Transition> transitions;
-  Set Observable;
-  Set NonObservable;
-  map<string, int> transitionName;
-  Set InterfaceTrans;
-  Set Formula_Trans;
-  unsigned int m_nbPlaces;
-  MDD M0;
-  LDDState m_M0;
-
-  //-----------------
-  vector<TransSylvan> m_tb_relation;
-  int m_NbIt;
-  int m_itext, m_itint;
-  int m_MaxIntBdd;
-
-  int m_nbmetastate;
-
-  pile m_st[128];
-  pile_msg m_msg[128];
-
-  // void DisplayMessage(const char *chaine);
-
-  //        int n_tasks, task_id;
-
-  int m_charge[128];
-
-  net m_net;
-  int m_bound, m_init;
-
-  /// Convert an MDD to a string caracter (for the send)
-  void convert_wholemdd_stringcpp(MDD cmark, string &chaine);
-  /// Convert a string caracter to an MDD
-  MDD decodage_message(const char *chaine);
-  /// there is a message to receive?
-  void read_message();
-  /// receive termination message
-  void read_termination();
-  void AbortTerm();
-  /// receive state message
-  void read_state_message();
-  /// send state message
-  void send_state_message();
-  /// canonicalization of an aggregate represented by an MDD
-  MDD Canonize(MDD s, unsigned int level);
-
-  int m_nb_thread;
-  pthread_t m_list_thread[128];
-
-  int m_id_thread;
-  /// Mutex declaration
-  pthread_mutex_t m_mutex;
-  pthread_mutex_t m_graph_mutex;
-  pthread_mutex_t m_gc_mutex;
-  pthread_mutex_t m_supervise_gc_mutex;
-  unsigned int m_gc;
-
-  pthread_mutex_t m_mutex_stack[128];
-  pthread_mutex_t m_spin_stack[128];
-  pthread_mutex_t m_spin_msg[128];
-  // pthread_mutex_t m_spin_charge;
-  pthread_spinlock_t m_spin_md5;
-  pthread_mutex_t m_spin_working;
-  unsigned int m_working = 0;
-
-  // unsigned int m_count_thread_working;
-  bool m_Terminated = false;
-  unsigned long m_size_mess = 0;
-  int m_nbsend = 0, m_nbrecv = 0;
-  int m_total_nb_send = 0, m_total_nb_recv = 0;
-
-  MPI_Status m_status;
-  bool m_Terminating = false;
-
-  // named_mutex m_initial_mtx{open_or_create, "initial"};
+class HybridSOG : public CommonSOG
+{
+public:
+    HybridSOG(const net &, int BOUND = 32, bool init = false);
+    void buildFromNet(int index);
+    /// principal functions to construct the SOG
+    void computeDSOG(LDDGraph &g);
+    virtual ~HybridSOG();
+    static void *threadHandler(void *context);
+    void *doCompute();
+
+protected:
+private:
+    /// \ hash function
+    void get_md5(const string &chaine, unsigned char *md_chaine);
+    /// Termination Detection functions
+    inline void ReceiveTermSignal();
+    inline void TermSendMsg();
+    inline void startTermDetectionByMaster();
+    inline void TermReceivedMsg();
+
+
+
+    /// 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);
+
+    MDD M0;
+
+    int m_NbIt;
+    int m_itext, m_itint;
+    int m_MaxIntBdd;
+
+    int m_nbmetastate;
+
+    pile m_st[128];
+    pile_msg m_msg[128];
+
+    // void DisplayMessage(const char *chaine);
+
+    //        int n_tasks, task_id;
+
+    int m_charge[128];
+    int m_init;
+
+    /// Convert an MDD to a string caracter (for the send)
+    void convert_wholemdd_stringcpp(MDD cmark, string &chaine);
+    /// Convert a string caracter to an MDD
+    MDD decodage_message(const char *chaine);
+    /// there is a message to receive?
+    void read_message();
+    /// receive termination message
+    void read_termination();
+    void AbortTerm();
+    /// receive state message
+    void read_state_message();
+    /// send state message
+    void send_state_message();
+
+
+    int m_nb_thread;
+    pthread_t m_list_thread[128];
+
+    int m_id_thread;
+    /// Mutex declaration
+    pthread_mutex_t m_mutex;
+    pthread_mutex_t m_graph_mutex;
+    pthread_mutex_t m_gc_mutex;
+    pthread_mutex_t m_supervise_gc_mutex;
+    unsigned int m_gc;
+
+    pthread_mutex_t m_mutex_stack[128];
+    pthread_mutex_t m_spin_stack[128];
+    pthread_mutex_t m_spin_msg[128];
+    // pthread_mutex_t m_spin_charge;
+    pthread_spinlock_t m_spin_md5;
+    pthread_mutex_t m_spin_working;
+    unsigned int m_working = 0;
+
+    // unsigned int m_count_thread_working;
+    bool m_Terminated = false;
+    unsigned long m_size_mess = 0;
+    int m_nbsend = 0, m_nbrecv = 0;
+    int m_total_nb_send = 0, m_total_nb_recv = 0;
+
+    MPI_Status m_status;
+    bool m_Terminating = false;
+
 };
 
 #endif  // HybridSOG_H
diff --git a/src/LDDGraph.cpp b/src/LDDGraph.cpp
index c5e2ba0..13a89d3 100644
--- a/src/LDDGraph.cpp
+++ b/src/LDDGraph.cpp
@@ -123,13 +123,10 @@ void LDDGraph::printCompleteInformation()
 		size_t n=1;
 		 printGraph(m_initialstate,n);
 	}
-
-
 }
 /*----------------------InitVisit()------------------------*/
 void LDDGraph::InitVisit(LDDState * S,size_t nb)
 {
-
 	if(nb<=m_nbStates)
 	{
 		S->m_visited=false;
@@ -176,34 +173,11 @@ void LDDGraph::printGraph(LDDState *s,size_t &nb)
 /*---------void print_successors_class(Class_Of_State *)------------*/
 void LDDGraph::printsuccessors(LDDState *s)
 {
-	/*Edges::const_iterator i;
-	cout<<bddtable<<s->class_state<<endl;
-	if(s->boucle)
-		cout<<"\n\tON BOUCLE DESSUS AVEC EPSILON\n";
-	if(s->blocage)
-		cout<<"\n\tEXISTENCE D'UN ETAT BLOCANT\n";
-	cout<<"\n\tSES SUCCESSEURS SONT  ( "<<s->Successors.size()<<" ) :\n\n";
-	getchar();
-	for(i =s->Successors.begin();!(i==s->Successors.end());i++)
-	{
-		cout<<" \t- t"<<(*i).second<<" ->";
-		cout<<bddtable<<(*i).first->class_state<<endl;
-		getchar();
-	}*/
 	cout<<"Not implemented yet!"<<endl;
 }
 /*---------void printpredescessors(Class_Of_State *)------------*/
 void LDDGraph::printpredecessors(LDDState *s)
 {
-	/*Edges::const_iterator i;
-	cout<<"\n\tSES PREDESCESSEURS SONT  ( "<<s->Predecessors.size()<<" ) :\n\n";
-	getchar();
-	for(i =s->Predecessors.begin();!(i==s->Predecessors.end());i++)
-	{
-		cout<<" \t- t"<<(*i).second<<" ->";
-		cout<<bddtable<<(*i).first->class_state<<endl;
-		getchar();
-	}*/
 	cout<<"Not implemented yet!"<<endl;
 }
 /*** Giving a position in m_GONodes Returns an LDDState ****/
@@ -212,11 +186,6 @@ LDDState *LDDGraph::getLDDStateById(unsigned int id) {
 }
 
 string LDDGraph::getTransition(int pos) {
-    //return m_transition->at(pos);
-  /*  map<string,int>::iterator it=m_transition->begin();
-    int i=0;
-    while (i<pos) {it++;i++;}
-    return it->first;*/
     cout<<"********** Pos "<<pos<<endl;
     map<string,int>::iterator it=m_transition->begin();
     while(it != m_transition->end())
diff --git a/src/SpotSogIterator.cpp b/src/SpotSogIterator.cpp
index fc0a42e..5e8c76e 100644
--- a/src/SpotSogIterator.cpp
+++ b/src/SpotSogIterator.cpp
@@ -35,13 +35,13 @@ SpotSogState* SpotSogIterator::dst() const
 bdd SpotSogIterator::cond()  const {
     bdd a=bddtrue;//1;
     string name=m_graph->getTransition(m_lddstate->getSuccessors()->at(m_current_edge).second);
-    cout<<"Value "<<m_lddstate->getSuccessors()->at(m_current_edge).second<<" Transition name "<<name<<endl;
+    //cout<<"Value "<<m_lddstate->getSuccessors()->at(m_current_edge).second<<" Transition name "<<name<<endl;
 
     spot::bdd_dict *p=m_dict_ptr->get();
     spot::formula f=spot::formula::ap(name);
     bdd   result=bdd_ithvar((p->var_map.find(f))->second);
 
-    //cout<<"Iterator cond()"<<m_current_edge<<"\n";
+    //cout<<"Iterator "<<__func__<<"  "<<m_current_edge<<"\n";
     return result;
 }
 
diff --git a/src/SpotSogIterator.h b/src/SpotSogIterator.h
index 6580ea2..7a25b99 100644
--- a/src/SpotSogIterator.h
+++ b/src/SpotSogIterator.h
@@ -14,9 +14,7 @@ class SpotSogIterator : public spot::twa_succ_iterator
         bool next() override;
         bool done() const override;
         SpotSogState* dst() const override;
-//        const state * 	dst () const override;//
-        // a non derived function
- //       std::string format_transition() const;
+
         bdd cond() const override final;
         spot::acc_cond::mark_t acc() const override final;
 
diff --git a/src/main.cpp b/src/main.cpp
index eef6a27..3e4564c 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -38,32 +38,62 @@ int Formula_transitions(const char * f, Set_mot& formula_trans, net Rv) ;
 unsigned int nb_th;
 int n_tasks, task_id;
 spot::formula not_f;
-set<string> buildObsTransitions(const string &fileName) {
+set<string> buildObsTransitions(const string &fileName, const net &p) {
     string input;
     set<string> transitionSet;
+    vector<Place>::const_iterator it_Places;
     ifstream file(fileName);
-    if (file.is_open()) {
+    if (file.is_open())
+    {
         getline (file,input);
         cout<<"Loaded formula : "<<input<<endl;
         file.close();
 
     }
-    else {
+    else
+    {
         cout<<"Can not open formula file"<<endl;
         exit(0);
     }
 
     spot::parsed_formula pf = spot::parse_infix_psl(input);
-    if (pf.format_errors(std::cerr)) return transitionSet;
+    if (pf.format_errors(std::cerr))
+        return transitionSet;
     spot::formula fo = pf.f;
-    if (!fo.is_ltl_formula())    {
-      std::cerr << "Only LTL formulas are supported.\n";
-      return transitionSet;
+    if (!fo.is_ltl_formula())
+    {
+        std::cerr << "Only LTL formulas are supported.\n";
+        return transitionSet;
     }
     spot::atomic_prop_set *p_list=spot::atomic_prop_collect(fo,0);
-    for (spot::atomic_prop_set::const_iterator i=p_list->begin();i!=p_list->end();i++) {
+    for (spot::atomic_prop_set::const_iterator i=p_list->begin(); i!=p_list->end(); i++)
+    {
+
+        for(it_Places=p.places.begin(); it_Places!=p.places.end();it_Places++)
+        {
+        //int pl = p.get_place_num((*it_Places)->name());
+
+        if (strcmp((*i).ap_name(),it_Places->name()))
+        if (p->get_incidence()[t].get(p) != 0)
+          transitionSet.insert(t);
+        }
         transitionSet.insert((*i).ap_name());
+
+    //
     }
+    /*places
+    for(it = sap->begin(); it != sap->end(); ++it) {
+      if(!p->place_exists( (*it)->name() )) {
+        std::string* s = new std::string((*it)->name());
+        delete sap;
+        sap = 0;
+        return s;
+      }
+      int pl = p->get_place_num((*it)->name());
+      for (int t = 0; t < p->t_size(); ++t)
+        if (p->get_incidence()[t].get(pl) != 0)
+          ob_tr.insert(t);
+    */
     print_spin_ltl(std::cout, fo)<<'\n';
     cout<<"Building formula negation\n";
     not_f = spot::formula::Not(pf.f);
@@ -79,11 +109,16 @@ int main(int argc, char** argv)
 
     exit(0);*/
 
-    if(argc<3)  return 0;
+    if(argc<3)
+        return 0;
     char Obs[100]="";
     char Int[100]="";
+    char pnet[100]="";
     strcpy(Obs, argv[4]);
-    if (argc > 6) strcpy(Int, argv[5]);
+    strcpy(pnet, argv[3]);
+
+    if (argc > 6)
+        strcpy(Int, argv[5]);
 
     int bound  = atoi(argv[argc - 1])==0?32:atoi(argv[argc - 1]);
     //if(argc>5)
@@ -106,7 +141,8 @@ int main(int argc, char** argv)
 
     cout<<"______________________________________\n";
     cout<<"Fetching formula..."<<endl;
-    set<string> list_transitions=buildObsTransitions(Obs);
+    net p(pnet);
+    set<string> list_transitions=buildObsTransitions(Obs,p);
 
     net R(argv[3],list_transitions);
 
@@ -133,44 +169,73 @@ int main(int argc, char** argv)
         else
         {
             cout<<"*******************Multithread version****************** \n" <<endl;
-            if (!strcmp(argv[1],"p")) {
+            if (!strcmp(argv[1],"p"))
+            {
                 cout<<"Construction with pthread library."<<endl;
                 cout<<"Count of threads to be created: "<<nb_th<<endl;
                 DR.computeDSOG(g,false);
                 g.printCompleteInformation();
             }
-            else if (!strcmp(argv[1],"pc")) {
+            else if (!strcmp(argv[1],"pc"))
+            {
                 cout<<"Canonized construction with pthread library."<<endl;
                 cout<<"Count of threads to be created: "<<nb_th<<endl;
                 DR.computeDSOG(g,true);
                 g.printCompleteInformation();
             }
-            else if (!strcmp(argv[1],"l")) {
+            else if (!strcmp(argv[1],"l"))
+            {
                 cout<<"Construction with lace framework."<<endl;
                 cout<<"Count of workers to be created: "<<nb_th<<endl;
                 DR.computeSOGLace(g);
                 g.printCompleteInformation();
             }
-             else if (!strcmp(argv[1],"lc")) {
+            else if (!strcmp(argv[1],"lc"))
+            {
                 cout<<"Canonised construction with lace framework."<<endl;
                 cout<<"Count of workers to be created: "<<nb_th<<endl;
                 DR.computeSOGLaceCanonized(g);
                 g.printCompleteInformation();
             }
-            cout<<"Building automata for not(formula)\n";
-            auto d = spot::make_bdd_dict();
-            spot::twa_graph_ptr af = spot::translator(d).run(not_f);
-            cout<<"Formula automata built.\n";
-            auto k = std::make_shared<SogTwa>(d,DR.getGraph());
-            spot::print_dot(std::cout, k);
-
-            /*
-            if (auto run = k->intersecting_run(af))
-                std::cout << "formula is violated by the following run:\n" << *run;
-            else
-                std::cout << "formula is verified\n";*/
 
-        }
+            cout<<"Perform Model checking ?";
+            char c;
+            cin>>c;
+            if (c='y')
+            {
+                cout<<"Building automata for not(formula)\n";
+                auto d = spot::make_bdd_dict();
+                spot::twa_graph_ptr af = spot::translator(d).run(not_f);
+                cout<<"Formula automata built.\n";
+                cout<<"Want to save the graph in a dot file ?";
+                cin>>c;
+                if (c=='y') {
+                    fstream file;
+                    string st(Obs);
+                    st+=".dot";
+                    file.open(st.c_str(),fstream::out);
+                    spot::print_dot(file, af);
+                    file.close();
+                }
+                auto k = std::make_shared<SogTwa>(d,DR.getGraph());
+                cout<<"SOG translated to SPOT succeeded.."<<endl;
+                cout<<"Want to save the graph in a dot file ?";
+                cin>>c;
+                if (c=='y') {
+                    fstream file;
+                    string st(argv[3]);
+                    st+=".dot";
+                    file.open(st.c_str(),fstream::out);
+                    spot::print_dot(file, k);
+                    file.close();
+                }
+                if (auto run = k->intersecting_run(af))
+                    std::cout << "formula is violated by the following run:\n" << *run;
+                else
+                    std::cout << "formula is verified\n";
+            }
+
+          }
     }
 
 
diff --git a/src/threadSOG.cpp b/src/threadSOG.cpp
index 17f8baf..d6a7ee3 100644
--- a/src/threadSOG.cpp
+++ b/src/threadSOG.cpp
@@ -5,12 +5,6 @@
 //#define DEBUG_GC
 #include "threadSOG.h"
 
-
-// #include <vec.h>
-
-
-// #include "test_assert.h"
-
 #include "sylvan.h"
 #include "sylvan_seq.h"
 #include <sylvan_sog.h>
@@ -18,8 +12,6 @@
 
 using namespace sylvan;
 
-
-
 void write_to_dot(const char *ch,MDD m)
 {
     FILE *fp=fopen(ch,"w");
@@ -29,20 +21,6 @@ void write_to_dot(const char *ch,MDD m)
 
 /*************************************************/
 
-//#include <boost/thread.hpp>
-const vector<class Place> *_places = NULL;
-
-/*void my_error_handler_dist(int errcode) {
-    cout<<"errcode = "<<errcode<<endl;
-	if (errcode == BDD_RANGE) {
-		// Value out of range : increase the size of the variables...
-		// but which one???
-		bdd_default_errhandler(errcode);
-	}
-	else {
-		bdd_default_errhandler(errcode);
-	}
-} */
 
 
 
@@ -80,36 +58,27 @@ threadSOG::threadSOG(const net &R, int BOUND, int nbThread,bool uselace,bool ini
 
     //_______________
     transitions=R.transitions;
-    Observable=R.Observable;
+    m_observable=R.Observable;
 
-    NonObservable=R.NonObservable;
+    m_nonObservable=R.NonObservable;
     Formula_Trans=R.Formula_Trans;
-    transitionName=R.transitionName;
+    m_transitionName=R.transitionName;
 
     cout<<"Toutes les Transitions:"<<endl;
-    map<string,int>::iterator it2=transitionName.begin();
-    for (;it2!=transitionName.end();it2++) {
+    map<string,int>::iterator it2=m_transitionName.begin();
+    for (;it2!=m_transitionName.end();it2++) {
         cout<<(*it2).first<<" : "<<(*it2).second<<endl;}
 
 
 
     cout<<"Transitions observables :"<<endl;
-    Set::iterator it=Observable.begin();
-    for (;it!=Observable.end();it++) {cout<<*it<<"  ";}
+    Set::iterator it=m_observable.begin();
+    for (;it!=m_observable.end();it++) {cout<<*it<<"  ";}
     cout<<endl;
     InterfaceTrans=R.InterfaceTrans;
     m_nbPlaces=R.places.size();
     cout<<"Nombre de places : "<<m_nbPlaces<<endl;
     cout<<"Derniere place : "<<R.places[m_nbPlaces-1].name<<endl;
-    // place domain, place bvect, place initial marking and place name
-    // domains
-
-
-    // bvec
-
-
-    // Computing initial marking
-
 
     uint32_t * liste_marques=new uint32_t[R.places.size()];
     for(i=0,it_places=R.places.begin(); it_places!=R.places.end(); i++,it_places++)
@@ -119,10 +88,8 @@ threadSOG::threadSOG(const net &R, int BOUND, int nbThread,bool uselace,bool ini
 
     M0=lddmc_cube(liste_marques,R.places.size());
 
-   // ldd_refs_push(M0);
 
-    // place names
-    _places = &R.places;
+
 
 
     uint32_t *prec = new uint32_t[m_nbPlaces];
@@ -211,7 +178,7 @@ void threadSOG::computeSeqSOG(LDDGraph &g)
 
     // cout<<"Marquage initial :\n";
     //cout<<bddtable<<M0<<endl;
-    MDD Complete_meta_state=Accessible_epsilon2(M0);
+    MDD Complete_meta_state=Accessible_epsilon(M0);
    // write_to_dot("detectDiv.dot",Complete_meta_state);
     //cout<<" div "<<Set_Div(Complete_meta_state)<<endl;
     //lddmc_fprintdot(fp,Complete_meta_state);
@@ -219,15 +186,7 @@ void threadSOG::computeSeqSOG(LDDGraph &g)
 
     //cout<<"Apres accessible epsilon \n";
     fire=firable_obs(Complete_meta_state);
-   // MDD canonised_initial=Canonize(Complete_meta_state,0);
-    //ldd_refs_push(canonised_initial);
-
 
-    //c->blocage=Set_Bloc(Complete_meta_state);
-    //c->boucle=Set_Div(Complete_meta_state);
-    //c->m_lddstate=CanonizeR(Complete_meta_state,0);
-    //cout<<"Apres CanonizeR nb representant : "<<bdd_pathcount(c->m_lddstate)<<endl;
-    //c->m_lddstate=canonised_initial;
     c->m_lddstate=Complete_meta_state;
     //TabMeta[m_nbmetastate]=c->m_lddstate;
     m_nbmetastate++;
@@ -254,7 +213,7 @@ void threadSOG::computeSeqSOG(LDDGraph &g)
             reached_class=new LDDState;
             {
                 //  cout<<"Avant Accessible epsilon \n";
-                MDD Complete_meta_state=Accessible_epsilon2(get_successor(e.first.second,t));
+                MDD Complete_meta_state=Accessible_epsilon(get_successor(e.first.second,t));
                 //MDD reduced_meta=Canonize(Complete_meta_state,0);
                 ldd_refs_push(Complete_meta_state);
                 //ldd_refs_push(reduced_meta);
@@ -345,11 +304,6 @@ void * threadSOG::doCompute()
         //ldd_refs_push(canonised_initial);
         fire=firable_obs(Complete_meta_state);
 
-        //c->blocage=Set_Bloc(Complete_meta_state);
-        //c->boucle=Set_Div(Complete_meta_state);
-        //c->m_lddstate=CanonizeR(Complete_meta_state,0);
-        //cout<<"Apres CanonizeR nb representant : "<<bdd_pathcount(c->m_lddstate)<<endl;
-        //c->m_lddstate=canonised_initial;
         c->m_lddstate=Complete_meta_state;
         //m_TabMeta[m_nbmetastate]=c->m_lddstate;
         m_nbmetastate++;
@@ -515,11 +469,7 @@ void * threadSOG::doComputeCanonized()
         ldd_refs_push(canonised_initial);
         fire=firable_obs(Complete_meta_state);
 
-        //c->blocage=Set_Bloc(Complete_meta_state);
-        //c->boucle=Set_Div(Complete_meta_state);
-        //c->m_lddstate=CanonizeR(Complete_meta_state,0);
-        //cout<<"Apres CanonizeR nb representant : "<<bdd_pathcount(c->m_lddstate)<<endl;
-        //c->m_lddstate=canonised_initial;
+
         c->m_lddstate=canonised_initial;
         //m_TabMeta[m_nbmetastate]=c->m_lddstate;
         m_nbmetastate++;
@@ -536,8 +486,7 @@ void * threadSOG::doComputeCanonized()
 
     LDDState* reached_class;
 
-    // size_t max_meta_state_size;
-    // int min_charge;
+
     do
     {
 
@@ -672,7 +621,7 @@ void threadSOG::computeDSOG(LDDGraph &g,bool canonised)
     cout << "number of threads "<<m_nb_thread<<endl;
     int rc;
     m_graph=&g;
-    m_graph->setTransition(transitionName);
+    m_graph->setTransition(m_transitionName);
     m_id_thread=0;
 
     pthread_mutex_init(&m_mutex, NULL);
@@ -721,110 +670,6 @@ void * threadSOG::threadHandlerCanonized(void *context)
     return ((threadSOG*)context)->doComputeCanonized();
 }
 
-
-void threadSOG::printhandler(ostream &o, int var)
-{
-    o << (*_places)[var/2].name;
-    if (var%2)
-        o << "_p";
-}
-
-
-
-
-
-
-
-
-
-
-Set threadSOG::firable_obs(MDD State)
-{
-    Set res;
-    for(Set::const_iterator i=Observable.begin(); !(i==Observable.end()); i++)
-    {
-        //cout<<"firable..."<<endl;
-        MDD succ = lddmc_firing_mono(State,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        if(succ!=lddmc_false)
-        {
-            res.insert(*i);
-        }
-
-    }
-    return res;
-}
-
-
-MDD threadSOG::get_successor(MDD From,int t)
-{
-    return lddmc_firing_mono(From,m_tb_relation[(t)].getMinus(),m_tb_relation[(t)].getPlus());
-}
-
-MDD threadSOG::get_successor2(MDD From,int t)
-{
-  //  LACE_ME;
-    return lddmc_firing_mono(From,m_tb_relation[(t)].getMinus(),m_tb_relation[(t)].getPlus());
-}
-
-MDD threadSOG::Accessible_epsilon2(MDD From)
-{
-    MDD M1;
-    MDD M2=From;
-    int it=0;
-
-
-    do
-    {
-
-        M1=M2;
-        for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-        {    LACE_ME;
-
-            MDD succ= lddmc_firing_mono(M2,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-            M2=lddmc_union(succ,M2);
-
-        }
-
-        it++;
-
-        //	cout << bdd_nodecount(M2) << endl;
-    }
-    while(M1!=M2);
-
-    return M2;
-}
-
-MDD threadSOG::Accessible_epsilon(MDD From)
-{
-    MDD M1;
-    MDD M2=From;
-    int it=0;
-
-
-    do
-    {
-
-        M1=M2;
-        for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-        {
-
-            MDD succ= lddmc_firing_mono(M2,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-            M2=lddmc_union_mono(succ,M2);
-
-        }
-
-        it++;
-
-        //	cout << bdd_nodecount(M2) << endl;
-    }
-    while(M1!=M2);
-
-    return M2;
-}
-
-
-
-
 int threadSOG::minCharge()
 {
     int pos=0;
@@ -842,155 +687,10 @@ int threadSOG::minCharge()
 }
 
 
-/*---------------------------  Set_Bloc()  -------*/
-/*bool DistributedSOG::Set_Bloc(MDD &S) const {
-
- cout<<"Ici detect blocage \n";
-int check_deadlocks = 0
-MDD cur;
-  for(vector<TransSylvan>::const_iterator i = m_tb_relation.begin(); i!=m_tb_relation.end();i++)
-  {
-
-      cur=TransSylvan(*i).getMinus();
-
-  }
-return ((S&cur)!=lddmc_false);
-	//BLOCAGE
-}
-
-
-/*-------------------------Set_Div() à revoir -----------------------------*/
-/*bool threadSOG::Set_Div(MDD &S) const
-{
-	Set::const_iterator i;
-	MDD To,Reached;
-	//cout<<"Ici detect divergence \n";
-	Reached=S;
-	do
-	{
-	        MDD From=Reached;
-		for(i=NonObservable.begin();!(i==NonObservable.end());i++)
-		{
-
-                To=lddmc_firing_mono(Reached,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-                Reached=lddmc_union_mono(Reached,To);
-				//To=m_tb_relation[*i](Reached);
-				//Reached=Reached|To; //Reached=To ???
-				//Reached=To;
-		}
-		if(Reached==From)
-			//cout<<"SEQUENCE DIVERGENTE \n";
-			return true;
-		//From=Reached;
-	}while(Reached!=bddfalse);
-	 return false;
-	//cout<<"PAS DE SEQUENCE DIVERGENTE \n";
-}
-*/
-
-MDD threadSOG::Canonize(MDD s,unsigned int level)
-{
-    if (level>m_nbPlaces || s==lddmc_false)
-        return lddmc_false;
-    if(isSingleMDD(s))
-        return s;
-    MDD s0=lddmc_false,s1=lddmc_false;
-
-    bool res=false;
-    do
-    {
-        if (get_mddnbr(s,level)>1)
-        {
-            s0=ldd_divide_rec(s,level);
-            s1=ldd_minus(s,s0);
-            res=true;
-        }
-        else
-            level++;
-    }
-    while(level<m_nbPlaces && !res);
-
-
-    if (s0==lddmc_false && s1==lddmc_false)
-        return lddmc_false;
-    // if (level==nbPlaces) return lddmc_false;
-    MDD Front,Reach;
-    if (s0!=lddmc_false && s1!=lddmc_false)
-    {
-        Front=s1;
-        Reach=s1;
-        do
-        {
-            // cout<<"premiere boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s0 = ldd_minus(s0,Front);
-        }
-        while((Front!=lddmc_false)&&(s0!=lddmc_false));
-    }
-    if((s0!=lddmc_false)&&(s1!=lddmc_false))
-    {
-        Front=s0;
-        Reach = s0;
-        do
-        {
-            //  cout<<"deuxieme boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s1 = ldd_minus(s1,Front);
-        }
-        while( Front!=lddmc_false && s1!=lddmc_false );
-    }
-
-
-
-    MDD Repr=lddmc_false;
-
-    if (isSingleMDD(s0))
-    {
-        Repr=s0;
-    }
-    else
-    {
-
-        Repr=Canonize(s0,level);
-
-    }
-
-    if (isSingleMDD(s1))
-        Repr=lddmc_union_mono(Repr,s1);
-    else
-        Repr=lddmc_union_mono(Repr,Canonize(s1,level));
-
-
-    return Repr;
-
-
-}
-MDD threadSOG::ImageForward(MDD From)
-{
-    MDD Res=lddmc_false;
-    for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-    {
-        MDD succ= lddmc_firing_mono(From,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        //        bdd succ = relation[(*i)](From);
-        Res=lddmc_union_mono(Res,succ);
-        // Res=Res|succ;
-
-    }
-    return Res;
-}
-
 
 bool threadSOG::Set_Bloc(MDD &M) const
 {
-  //bdd Mt = lddmc_true;
-  //for(vector<Trans>::const_iterator i = relation.begin(); i != relation.end(); ++i) {
-   // Mt = Mt & !(i->Precond);
-  //}
-  //return ((S & Mt) != bddfalse);
-   cout<<"Ici detect blocage \n";
-//int check_deadlocks = 0
+
    MDD cur=lddmc_true;
   for(vector<TransSylvan>::const_iterator i = m_tb_relation.begin(); i!=m_tb_relation.end();i++)
   {
@@ -1003,7 +703,7 @@ return ((M&cur)!=lddmc_false);
 }
 bool threadSOG::Set_Div2( const MDD &M) const
 {
-    if (NonObservable.empty())
+    if (m_nonObservable.empty())
     return false;
 	Set::const_iterator i;
 	MDD Reached,From;
@@ -1012,7 +712,7 @@ bool threadSOG::Set_Div2( const MDD &M) const
 	do
 	{
         From=Reached;
-		for(i=NonObservable.begin();!(i==NonObservable.end());i++)
+		for(i=m_nonObservable.begin();!(i==m_nonObservable.end());i++)
 		{
 		// To=relation[*i](Reached);
         // Reached=Reached|To; //Reached=To ???
@@ -1029,7 +729,7 @@ bool threadSOG::Set_Div2( const MDD &M) const
 //}
 bool threadSOG::Set_Div(MDD &M) const
 {
-    if (NonObservable.empty())
+    if (m_nonObservable.empty())
     return false;
 	Set::const_iterator i;
 	MDD Reached,From;
@@ -1038,7 +738,7 @@ bool threadSOG::Set_Div(MDD &M) const
 	do
 	{
         From=Reached;
-		for(i=NonObservable.begin();!(i==NonObservable.end());i++)
+		for(i=m_nonObservable.begin();!(i==m_nonObservable.end());i++)
 		{
 		// To=relation[*i](Reached);
         // Reached=Reached|To; //Reached=To ???
@@ -1046,12 +746,8 @@ bool threadSOG::Set_Div(MDD &M) const
         Reached=lddmc_union_mono(Reached,To);
 				//Reached=To;
 		}
-		if(Reached==From)
-		//{
-        //cout << " sequence divergente "<<endl;
-        return true;
-		//}
-		//From=Reached;
+		if(Reached==From) return true;
+
 	}while(Reached!=lddmc_false && Reached != From);
    //  cout<<"PAS DE SEQUENCE DIVERGENTE \n";
 	 return false;
@@ -1062,10 +758,6 @@ threadSOG::~threadSOG()
     //dtor
 }
 
-/*********Returns the count of places******************************************/
-unsigned int threadSOG::getPlacesCount() {
-    return m_nbPlaces;
-}
 
 
 
@@ -1141,7 +833,7 @@ void threadSOG::computeSOGLace(LDDGraph &g)
     clock_gettime(CLOCK_REALTIME, &start);
     Set fire;
     m_graph=&g;
-    m_graph->setTransition(transitionName);
+    m_graph->setTransition(m_transitionName);
     m_nbmetastate=0;
     m_MaxIntBdd=0;
 
@@ -1150,10 +842,10 @@ void threadSOG::computeSOGLace(LDDGraph &g)
 
     //cout<<"Marquage initial is being built..."<<endl;
     LACE_ME;
-    MDD initial_meta_state(CALL(Accessible_epsilon_lace,M0,&NonObservable,&m_tb_relation));
+    MDD initial_meta_state(CALL(Accessible_epsilon_lace,M0,&m_nonObservable,&m_tb_relation));
 
 
-    fire=firable_obs_lace(initial_meta_state,&Observable,&m_tb_relation);
+    fire=firable_obs_lace(initial_meta_state,&m_observable,&m_tb_relation);
 
     c->m_lddstate=initial_meta_state;
 
@@ -1166,10 +858,7 @@ void threadSOG::computeSOGLace(LDDGraph &g)
     m_graph->insert(c);
     //m_graph->nbMarking+=bdd_pathcount(c->m_lddstate);
     LDDState* reached_class;
-    //  MDD Complete_meta_state;*/
 
-    // size_t max_meta_state_size;
-    // int min_charge;
 
     while (!m_st[0].empty())
     {
@@ -1184,7 +873,7 @@ void threadSOG::computeSOGLace(LDDGraph &g)
             int t = *iter;
             cout<<"Transition order1: "<<*iter<<endl;
             //e.second.erase(t);
-            SPAWN(Accessible_epsilon_lace,get_successor(e.first.second,t),&NonObservable,&m_tb_relation);
+            SPAWN(Accessible_epsilon_lace,get_successor(e.first.second,t),&m_nonObservable,&m_tb_relation);
             onb_it++;iter++;
         }
 
@@ -1193,7 +882,6 @@ void threadSOG::computeSOGLace(LDDGraph &g)
             Set::iterator it = e.second.end();
             it--;
             int t=*it;
-            cout<<"Transition order2: "<<t<<endl;
             e.second.erase(it);
             MDD Complete_meta_state=SYNC(Accessible_epsilon_lace);
             reached_class=new LDDState;
@@ -1208,7 +896,7 @@ void threadSOG::computeSOGLace(LDDGraph &g)
                 e.first.first->Successors.insert(e.first.first->Successors.begin(),LDDEdge(reached_class,t));
                 reached_class->Predecessors.insert(reached_class->Predecessors.begin(),LDDEdge(e.first.first,t));
                 m_nbmetastate++;
-                fire=firable_obs_lace(Complete_meta_state,&Observable,&m_tb_relation);
+                fire=firable_obs_lace(Complete_meta_state,&m_observable,&m_tb_relation);
                 m_st[0].push(Pair(couple(reached_class,Complete_meta_state),fire));
             }
             else
@@ -1227,12 +915,7 @@ void threadSOG::computeSOGLace(LDDGraph &g)
     std::cout << "TIME OF CONSTRUCTION OF THE SOG " << tps << " seconds\n";
 }
 
-Set * threadSOG::getNonObservable() {
-    return &NonObservable;
-}
-vector<TransSylvan>* threadSOG::getTBRelation() {
-    return &m_tb_relation;
-}
+
 /********************* Compute canonized SOG with lace *********************************************/
 
 /******************************Canonizer with lace framework  **********************************/
@@ -1338,7 +1021,7 @@ void threadSOG::computeSOGLaceCanonized(LDDGraph &g)
     clock_gettime(CLOCK_REALTIME, &start);
     Set fire;
     m_graph=&g;
-    m_graph->setTransition(transitionName);
+    m_graph->setTransition(m_transitionName);
 
 
     m_nbmetastate=0;
@@ -1349,12 +1032,12 @@ void threadSOG::computeSOGLaceCanonized(LDDGraph &g)
 
     //cout<<"Marquage initial is being built..."<<endl;
     LACE_ME;
-    MDD initial_meta_state(CALL(Accessible_epsilon_lace,M0,&NonObservable,&m_tb_relation));
+    MDD initial_meta_state(CALL(Accessible_epsilon_lace,M0,&m_nonObservable,&m_tb_relation));
 
     //lddmc_refs_spawn(SPAWN(lddmc_canonize,initial_meta_state,0,*this));
 
 
-    fire=firable_obs_lace(initial_meta_state,&Observable,&m_tb_relation);
+    fire=firable_obs_lace(initial_meta_state,&m_observable,&m_tb_relation);
     m_nbmetastate++;
     //m_old_size=lddmc_nodecount(c->m_lddstate);
     //reduced_initial=lddmc_refs_sync(SYNC(lddmc_canonize));
@@ -1381,15 +1064,17 @@ cout<<"\n=========================================\n";
         {
             int t = *iter;
             //e.second.erase(t);
-            SPAWN(Accessible_epsilon_lace,get_successor(e.first.second,t),&NonObservable,&m_tb_relation);
+            SPAWN(Accessible_epsilon_lace,get_successor(e.first.second,t),&m_nonObservable,&m_tb_relation);
             onb_it++;iter++;
         }
 
         for (unsigned int i=0; i<onb_it; i++)
         {
-            int t = *e.second.end();
+            Set::iterator it = e.second.end();
+            it--;
+            int t=*it;
+            e.second.erase(it);
 
-            e.second.erase(t);
             MDD Complete_meta_state=SYNC(Accessible_epsilon_lace);
             lddmc_refs_push(Complete_meta_state);
 
@@ -1408,7 +1093,7 @@ cout<<"\n=========================================\n";
                 e.first.first->Successors.insert(e.first.first->Successors.begin(),LDDEdge(reached_class,t));
                 reached_class->Predecessors.insert(reached_class->Predecessors.begin(),LDDEdge(e.first.first,t));
                 m_nbmetastate++;
-                fire=firable_obs_lace(Complete_meta_state,&Observable,&m_tb_relation);
+                fire=firable_obs_lace(Complete_meta_state,&m_observable,&m_tb_relation);
                 m_st[0].push(Pair(couple(reached_class,Complete_meta_state),fire));
             }
             else
@@ -1428,8 +1113,3 @@ cout<<"\n=========================================\n";
     std::cout << "TIME OF CONSTRUCTION OF THE SOG " << tps << " seconds\n";
 }
 
-
-LDDGraph *threadSOG::getGraph() const {
-    return m_graph;
-}
-
diff --git a/src/threadSOG.h b/src/threadSOG.h
index 26008f2..d6dc0a1 100644
--- a/src/threadSOG.h
+++ b/src/threadSOG.h
@@ -12,71 +12,53 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include "LDDGraph.h"
-#include "TransSylvan.h"
+#include "TransSylvan.h"
+#include "CommonSOG.h"
+
+
+
 
-typedef pair<LDDState *, MDD> couple;
-typedef pair<couple, Set> Pair;
-typedef stack<Pair> pile;
 // typedef vector<Trans> vec_trans;
 extern unsigned int nb_th;
 
-class threadSOG {
+class threadSOG : public CommonSOG{
  public:
   threadSOG(const net &, int BOUND = 32, int nbThread=2,bool uselace=false,bool init = false);
   void buildFromNet(int index);
   void computeDSOG(LDDGraph &g,bool canonised);
   void computeSeqSOG(LDDGraph &g);
   virtual ~threadSOG();
-  static void printhandler(ostream &o, int var);
   static void *threadHandler(void *context);
   static void *threadHandlerCanonized(void *context);
   void *doCompute();
   void *doComputeCanonized();
-  unsigned int getPlacesCount();
-  MDD ImageForward(MDD From);
+
+
   void computeSOGLace(LDDGraph &g);
   void computeSOGLaceCanonized(LDDGraph &g);
-  Set * getNonObservable();
-  vector<TransSylvan>* getTBRelation();
-  LDDGraph *getGraph() const;
+
+
+
  protected:
  private:
  ////////////////////////////////
 
- //////////////////////////////
-
-  int m_nbPlaces = 0;
-  MDD Canonize(MDD s, unsigned int level);
-  LDDGraph *m_graph;
-  MDD LDDAccessible_epsilon(MDD *m);
-  MDD LDDAccessible_epsilon2(MDD *m);
-  MDD Accessible_epsilon(MDD From);
-  MDD Accessible_epsilon2(MDD From);
-  Set firable_obs(MDD State);
-  MDD get_successor(MDD From, int t);
-  MDD get_successor2(MDD From, int t);
+
+
+
   int minCharge();
   bool Set_Bloc(MDD &M) const;
   bool Set_Bloc2(const MDD &M) const;
   bool Set_Div(MDD &M) const;
   bool Set_Div2(const MDD &M) const;
   bool isNotTerminated();
-  //-----Original defined as members
-  vector<class Transition> transitions;
-  Set Observable;
-  Set NonObservable;
-  map<string, int> transitionName;
-  Set InterfaceTrans;
-  Set Formula_Trans;
 
   timespec start, finish;
 
   MDD M0;
-  LDDState m_M0;
-  MDD currentvar;
 
-  //-----------------
-  vector<TransSylvan> m_tb_relation;
+    //-----------------
+
   int m_NbIt;
   int m_itext, m_itint;
   int m_MaxIntBdd;
@@ -92,7 +74,7 @@ class threadSOG {
 
   int m_min_charge;
 
-  net m_net;
+
   int m_bound, m_init;
   int m_id_thread;
   pthread_mutex_t m_mutex;
-- 
GitLab