Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : use only structure (mc_pair_t) for the verification of liveness prope...
[simgrid.git] / src / mc / mc_liveness.c
index f19a670..9fdfaa7 100644 (file)
@@ -19,163 +19,242 @@ xbt_dynar_t successors;
 
 /********* Static functions *********/
 
-static int is_reached_acceptance_pair(xbt_automaton_state_t st){
-
-  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
-
-  MC_SET_RAW_MEM;
-
-  mc_acceptance_pair_t new_pair = NULL;
-  new_pair = xbt_new0(s_mc_acceptance_pair_t, 1);
-  new_pair->num = xbt_dynar_length(acceptance_pairs) + 1;
-  new_pair->automaton_state = st;
-  new_pair->prop_ato = xbt_dynar_new(sizeof(int), NULL);
-  new_pair->system_state = MC_take_snapshot();  
-  
-  /* Get values of propositional symbols */
+static xbt_dynar_t get_atomic_propositions_values(){
   int res;
   int_f_void_t f;
   unsigned int cursor = 0;
   xbt_automaton_propositional_symbol_t ps = NULL;
+  xbt_dynar_t values = xbt_dynar_new(sizeof(int), NULL);
+
   xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){
     f = (int_f_void_t)ps->function;
     res = f();
-    xbt_dynar_push_as(new_pair->prop_ato, int, res);
+    xbt_dynar_push_as(values, int, res);
   }
-  
-  MC_UNSET_RAW_MEM;
-  
+
+  return values;
+}
+
+static int is_reached_acceptance_pair(mc_pair_t pair){
+
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
   if(xbt_dynar_is_empty(acceptance_pairs)){
 
     MC_SET_RAW_MEM;
-    /* New acceptance pair */
-    xbt_dynar_push(acceptance_pairs, &new_pair); 
+    if(pair->graph_state->system_state == NULL)
+      pair->graph_state->system_state = MC_take_snapshot();
+    xbt_dynar_push(acceptance_pairs, &pair); 
     MC_UNSET_RAW_MEM;
 
     if(raw_mem_set)
       MC_SET_RAW_MEM;
-    return 0;
+
+    return -1;
 
   }else{
 
     MC_SET_RAW_MEM;
+
+    if(pair->graph_state->system_state == NULL)
+      pair->graph_state->system_state = MC_take_snapshot();
     
-    cursor = 0;
-    mc_acceptance_pair_t pair_test = NULL;
-     
-    xbt_dynar_foreach(acceptance_pairs, cursor, pair_test){
-      if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug))
-        XBT_DEBUG("****** Pair reached #%d ******", pair_test->num);
-      if(xbt_automaton_state_compare(pair_test->automaton_state, st) == 0){
-        if(xbt_automaton_propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){
-          if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){
-            
-            if(raw_mem_set)
-              MC_SET_RAW_MEM;
-            else
-              MC_UNSET_RAW_MEM;
-            
-            return 1;
+    size_t current_bytes_used = pair->heap_bytes_used;
+    int current_nb_processes = pair->nb_processes;
+
+    unsigned int cursor = 0;
+    int previous_cursor = 0, next_cursor = 0;
+    int start = 0;
+    int end = xbt_dynar_length(acceptance_pairs) - 1;
+
+    mc_pair_t pair_test = NULL;
+    size_t bytes_used_test;
+    int nb_processes_test;
+    int same_processes_and_bytes_not_found = 1;
+
+    while(start <= end && same_processes_and_bytes_not_found){
+      cursor = (start + end) / 2;
+      pair_test = (mc_pair_t)xbt_dynar_get_as(acceptance_pairs, cursor, mc_pair_t);
+      bytes_used_test = pair_test->heap_bytes_used;
+      nb_processes_test = pair_test->nb_processes;
+      if(nb_processes_test < current_nb_processes)
+        start = cursor + 1;
+      if(nb_processes_test > current_nb_processes)
+        end = cursor - 1; 
+      if(nb_processes_test == current_nb_processes){
+        if(bytes_used_test < current_bytes_used)
+          start = cursor + 1;
+        if(bytes_used_test > current_bytes_used)
+          end = cursor - 1;
+        if(bytes_used_test == current_bytes_used){
+          same_processes_and_bytes_not_found = 0;
+          if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){
+            if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){
+              if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){
+                if(raw_mem_set)
+                  MC_SET_RAW_MEM;
+                else
+                  MC_UNSET_RAW_MEM;
+                return pair_test->num;
+              }
+            }
+          }
+          /* Search another pair with same number of bytes used in std_heap */
+          previous_cursor = cursor - 1;
+          while(previous_cursor >= 0){
+            pair_test = (mc_pair_t)xbt_dynar_get_as(acceptance_pairs, previous_cursor, mc_pair_t);
+            bytes_used_test = pair_test->heap_bytes_used;
+            if(bytes_used_test != current_bytes_used)
+              break;
+            if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){
+              if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){  
+                if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){
+                  if(raw_mem_set)
+                    MC_SET_RAW_MEM;
+                  else
+                    MC_UNSET_RAW_MEM;
+                  return pair_test->num;
+                }
+              }
+            }
+            previous_cursor--;
+          }
+          next_cursor = cursor + 1;
+          while(next_cursor < xbt_dynar_length(acceptance_pairs)){
+            pair_test = (mc_pair_t)xbt_dynar_get_as(acceptance_pairs, next_cursor, mc_pair_t);
+            bytes_used_test = pair_test->heap_bytes_used;
+            if(bytes_used_test != current_bytes_used)
+              break;
+            if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){
+              if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){
+                if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){
+                  if(raw_mem_set)
+                    MC_SET_RAW_MEM;
+                  else
+                    MC_UNSET_RAW_MEM;
+                  return pair_test->num;
+                }
+              }
+            }
+            next_cursor++;
           }
-        }else{
-          XBT_DEBUG("Different values of propositional symbols");
         }
-      }else{
-        XBT_DEBUG("Different automaton state");
       }
     }
 
-    /* New acceptance pair */
-    xbt_dynar_push(acceptance_pairs, &new_pair); 
+    pair_test = (mc_pair_t)xbt_dynar_get_as(acceptance_pairs, cursor, mc_pair_t);
+    bytes_used_test = pair_test->heap_bytes_used;
+
+    if(bytes_used_test < current_bytes_used)
+      xbt_dynar_insert_at(acceptance_pairs, cursor + 1, &pair);
+    else
+    xbt_dynar_insert_at(acceptance_pairs, cursor, &pair);
     
     MC_UNSET_RAW_MEM;
 
     if(raw_mem_set)
       MC_SET_RAW_MEM;
-    compare = 0;
     
-    return 0;
+    return -1;
     
   }
 }
 
 
-static void set_acceptance_pair_reached(xbt_automaton_state_t st){
+static void set_acceptance_pair_reached(mc_pair_t pair){
 
   int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
-  MC_SET_RAW_MEM;
 
-  mc_acceptance_pair_t pair = NULL;
-  pair = xbt_new0(s_mc_acceptance_pair_t, 1);
-  pair->num = xbt_dynar_length(acceptance_pairs) + 1;
-  pair->automaton_state = st;
-  pair->prop_ato = xbt_dynar_new(sizeof(int), NULL);
-  pair->system_state = MC_take_snapshot();
+  if(xbt_dynar_is_empty(acceptance_pairs)){
 
-  /* Get values of propositional symbols */
-  unsigned int cursor = 0;
-  xbt_automaton_propositional_symbol_t ps = NULL;
-  int res;
-  int_f_void_t f;
+     MC_SET_RAW_MEM;
+     if(pair->graph_state->system_state == NULL)
+       pair->graph_state->system_state = MC_take_snapshot();
+     xbt_dynar_push(acceptance_pairs, &pair); 
+     MC_UNSET_RAW_MEM;
 
-  xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){
-    f = (int_f_void_t)ps->function;
-    res = f();
-    xbt_dynar_push_as(pair->prop_ato, int, res);
-  }
+  }else{
 
-  xbt_dynar_push(acceptance_pairs, &pair); 
-  
-  MC_UNSET_RAW_MEM;
+    MC_SET_RAW_MEM;
+
+    if(pair->graph_state->system_state == NULL)
+      pair->graph_state->system_state = MC_take_snapshot();
+    
+    size_t current_bytes_used = pair->heap_bytes_used;
+    int current_nb_processes = pair->nb_processes;
+
+    unsigned int cursor = 0;
+    int start = 0;
+    int end = xbt_dynar_length(acceptance_pairs) - 1;
+
+    mc_pair_t pair_test = NULL;
+    size_t bytes_used_test = 0;
+    int nb_processes_test;
+
+    while(start <= end){
+      cursor = (start + end) / 2;
+      pair_test = (mc_pair_t)xbt_dynar_get_as(acceptance_pairs, cursor, mc_pair_t);
+      bytes_used_test = pair_test->heap_bytes_used;
+      nb_processes_test = pair_test->nb_processes;
+      if(nb_processes_test < current_nb_processes)
+        start = cursor + 1;
+      if(nb_processes_test > current_nb_processes)
+        end = cursor - 1; 
+      if(nb_processes_test == current_nb_processes){
+        if(bytes_used_test < current_bytes_used)
+          start = cursor + 1;
+        if(bytes_used_test > current_bytes_used)
+          end = cursor - 1;
+        if(bytes_used_test == current_bytes_used)
+          break;
+      }
+    }
+
+    if(bytes_used_test < current_bytes_used)
+      xbt_dynar_insert_at(acceptance_pairs, cursor + 1, &pair);
+    else
+      xbt_dynar_insert_at(acceptance_pairs, cursor, &pair);
+    
+    MC_UNSET_RAW_MEM;
+    
+  }
 
   if(raw_mem_set)
     MC_SET_RAW_MEM;
     
 }
 
-static mc_visited_pair_t visited_pair_new(xbt_automaton_state_t as){
+static void remove_acceptance_pair(mc_pair_t pair){
 
-  mc_visited_pair_t new_pair = NULL;
-  new_pair = xbt_new0(s_mc_visited_pair_t, 1);
-  new_pair->automaton_state = as;
-  new_pair->prop_ato = xbt_dynar_new(sizeof(int), NULL);
-  new_pair->heap_bytes_used = mmalloc_get_bytes_used(std_heap);
-  new_pair->nb_processes = xbt_swag_size(simix_global->process_list);
-  new_pair->system_state = MC_take_snapshot();  
-  
-  /* Get values of propositional symbols */
-  int res;
-  int_f_void_t f;
-  unsigned int cursor = 0;
-  xbt_automaton_propositional_symbol_t ps = NULL;
-  xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){
-    f = (int_f_void_t)ps->function;
-    res = f();
-    xbt_dynar_push_as(new_pair->prop_ato, int, res);
-  }
+  int index = xbt_dynar_search_or_negative(acceptance_pairs, pair);
+  if(index != -1)
+    xbt_dynar_remove_at(acceptance_pairs, index, NULL);
+  pair->acceptance_removed = 1;
 
-  return new_pair;
+  if(pair->stack_removed && pair->acceptance_removed){
+    if(_sg_mc_visited == 0){
+      MC_pair_delete(pair);
+    }else if(pair->visited_removed){
+      MC_pair_delete(pair);
+    }
+  }
 
 }
 
-static int is_visited_pair(xbt_automaton_state_t as){
+static int is_visited_pair(mc_pair_t pair){
 
   if(_sg_mc_visited == 0)
     return -1;
 
   int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
-  MC_SET_RAW_MEM;
-  mc_visited_pair_t new_pair = visited_pair_new(as);
-  MC_UNSET_RAW_MEM;
-
   if(xbt_dynar_is_empty(visited_pairs)){
 
     MC_SET_RAW_MEM;
-    xbt_dynar_push(visited_pairs, &new_pair); 
+    if(pair->graph_state->system_state == NULL)
+      pair->graph_state->system_state = MC_take_snapshot();
+    xbt_dynar_push(visited_pairs, &pair); 
     MC_UNSET_RAW_MEM;
 
     if(raw_mem_set)
@@ -186,23 +265,27 @@ static int is_visited_pair(xbt_automaton_state_t as){
   }else{
 
     MC_SET_RAW_MEM;
+
+    if(pair->graph_state->system_state == NULL)
+      pair->graph_state->system_state = MC_take_snapshot();
     
-    size_t current_bytes_used = new_pair->heap_bytes_used;
-    int current_nb_processes = new_pair->nb_processes;
+    size_t current_bytes_used = pair->heap_bytes_used;
+    int current_nb_processes = pair->nb_processes;
 
     unsigned int cursor = 0;
     int previous_cursor = 0, next_cursor = 0;
     int start = 0;
     int end = xbt_dynar_length(visited_pairs) - 1;
 
-    mc_visited_pair_t pair_test = NULL;
+    mc_pair_t pair_test = NULL;
     size_t bytes_used_test;
     int nb_processes_test;
     int same_processes_and_bytes_not_found = 1;
+    int result;
 
     while(start <= end && same_processes_and_bytes_not_found){
       cursor = (start + end) / 2;
-      pair_test = (mc_visited_pair_t)xbt_dynar_get_as(visited_pairs, cursor, mc_visited_pair_t);
+      pair_test = (mc_pair_t)xbt_dynar_get_as(visited_pairs, cursor, mc_pair_t);
       bytes_used_test = pair_test->heap_bytes_used;
       nb_processes_test = pair_test->nb_processes;
       if(nb_processes_test < current_nb_processes)
@@ -216,38 +299,63 @@ static int is_visited_pair(xbt_automaton_state_t as){
           end = cursor - 1;
         if(bytes_used_test == current_bytes_used){
           same_processes_and_bytes_not_found = 0;
-          if(xbt_automaton_state_compare(pair_test->automaton_state, as) == 0){
-            if(xbt_automaton_propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){
-              if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){
+          if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){
+            if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){
+              XBT_DEBUG("Pair %d", pair_test->num);
+              if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){
                 xbt_dynar_remove_at(visited_pairs, cursor, NULL);
-                xbt_dynar_insert_at(visited_pairs, cursor, &new_pair);
-                XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", new_pair->num, pair_test->num);
+                xbt_dynar_insert_at(visited_pairs, cursor, &pair);
+                pair_test->visited_removed = 1;
+                result = pair_test->num;
+                if(pair_test->stack_removed && pair_test->visited_removed){
+                  if((pair_test->automaton_state->type == 1) || (pair_test->automaton_state->type == 2)){
+                    if(pair_test->acceptance_removed){ 
+                      MC_pair_delete(pair_test);
+                    }
+                  }else{
+                    MC_pair_delete(pair_test);
+                  }     
+                }
+
+                XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", pair->num, pair_test->num);
                 if(raw_mem_set)
                   MC_SET_RAW_MEM;
                 else
                   MC_UNSET_RAW_MEM;
-                return pair_test->num;
+                return result;
               }
             }
           }
           /* Search another pair with same number of bytes used in std_heap */
           previous_cursor = cursor - 1;
           while(previous_cursor >= 0){
-            pair_test = (mc_visited_pair_t)xbt_dynar_get_as(visited_pairs, previous_cursor, mc_visited_pair_t);
-            bytes_used_test = pair_test->system_state->heap_bytes_used;
+            pair_test = (mc_pair_t)xbt_dynar_get_as(visited_pairs, previous_cursor, mc_pair_t);
+            bytes_used_test = pair_test->heap_bytes_used;
             if(bytes_used_test != current_bytes_used)
               break;
-            if(xbt_automaton_state_compare(pair_test->automaton_state, as) == 0){
-              if(xbt_automaton_propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){  
-                if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){
+            if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){
+              if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){  
+                XBT_DEBUG("Pair %d", pair_test->num);
+                if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){
                   xbt_dynar_remove_at(visited_pairs, previous_cursor, NULL);
-                  xbt_dynar_insert_at(visited_pairs, previous_cursor, &new_pair);
-                  XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", new_pair->num, pair_test->num);
+                  xbt_dynar_insert_at(visited_pairs, previous_cursor, &pair);
+                  pair_test->visited_removed = 1;
+                  result = pair_test->num;
+                  if(pair_test->stack_removed && pair_test->visited_removed){
+                    if((pair_test->automaton_state->type == 1) || (pair_test->automaton_state->type == 2)){
+                      if(pair_test->acceptance_removed){ 
+                        MC_pair_delete(pair_test);
+                      }
+                    }else{
+                      MC_pair_delete(pair_test);
+                    }     
+                  }
+                  XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", pair->num, pair_test->num);
                   if(raw_mem_set)
                     MC_SET_RAW_MEM;
                   else
                     MC_UNSET_RAW_MEM;
-                  return pair_test->num;
+                  return result;
                 }
               }
             }
@@ -255,21 +363,33 @@ static int is_visited_pair(xbt_automaton_state_t as){
           }
           next_cursor = cursor + 1;
           while(next_cursor < xbt_dynar_length(visited_pairs)){
-            pair_test = (mc_visited_pair_t)xbt_dynar_get_as(visited_pairs, next_cursor, mc_visited_pair_t);
-            bytes_used_test = pair_test->system_state->heap_bytes_used;
+            pair_test = (mc_pair_t)xbt_dynar_get_as(visited_pairs, next_cursor, mc_pair_t);
+            bytes_used_test = pair_test->heap_bytes_used;
             if(bytes_used_test != current_bytes_used)
               break;
-            if(xbt_automaton_state_compare(pair_test->automaton_state, as) == 0){
-              if(xbt_automaton_propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){
-                if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){
+            if(xbt_automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){
+              if(xbt_automaton_propositional_symbols_compare_value(pair_test->atomic_propositions, pair->atomic_propositions) == 0){
+                XBT_DEBUG("Pair %d", pair_test->num);
+                if(snapshot_compare(pair->graph_state->system_state, pair_test->graph_state->system_state) == 0){
                   xbt_dynar_remove_at(visited_pairs, next_cursor, NULL);
-                  xbt_dynar_insert_at(visited_pairs, next_cursor, &new_pair);
-                  XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", new_pair->num, pair_test->num);
+                  xbt_dynar_insert_at(visited_pairs, next_cursor, &pair);
+                  pair_test->visited_removed = 1;
+                  result = pair_test->num;
+                  if(pair_test->stack_removed && pair_test->visited_removed){
+                    if((pair_test->automaton_state->type == 1) || (pair_test->automaton_state->type == 2)){
+                      if(pair_test->acceptance_removed){ 
+                        MC_pair_delete(pair_test);
+                      }
+                    }else{
+                      MC_pair_delete(pair_test);
+                    }     
+                  }
+                  XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", pair->num, pair_test->num);
                   if(raw_mem_set)
                     MC_SET_RAW_MEM;
                   else
                     MC_UNSET_RAW_MEM;
-                  return pair_test->num;
+                  return result;
                 }
               }
             }
@@ -279,13 +399,13 @@ static int is_visited_pair(xbt_automaton_state_t as){
       }
     }
 
-    pair_test = (mc_visited_pair_t)xbt_dynar_get_as(visited_pairs, cursor, mc_visited_pair_t);
+    pair_test = (mc_pair_t)xbt_dynar_get_as(visited_pairs, cursor, mc_pair_t);
     bytes_used_test = pair_test->heap_bytes_used;
 
     if(bytes_used_test < current_bytes_used)
-      xbt_dynar_insert_at(visited_pairs, cursor + 1, &new_pair);
+      xbt_dynar_insert_at(visited_pairs, cursor + 1, &pair);
     else
-      xbt_dynar_insert_at(visited_pairs, cursor, &new_pair);
+      xbt_dynar_insert_at(visited_pairs, cursor, &pair);
 
     if(xbt_dynar_length(visited_pairs) > _sg_mc_visited){
       int min = mc_stats->expanded_states;
@@ -297,7 +417,11 @@ static int is_visited_pair(xbt_automaton_state_t as){
           min = pair_test->num;
         }
       }
-      xbt_dynar_remove_at(visited_pairs, index, NULL);
+      xbt_dynar_remove_at(visited_pairs, index, &pair_test);
+      pair_test->visited_removed = 1;
+      if(pair_test->stack_removed && pair_test->acceptance_removed && pair_test->visited_removed)
+        MC_pair_delete(pair_test);
+      
     }
 
     /*cursor = 0;
@@ -354,33 +478,6 @@ static int MC_automaton_evaluate_label(xbt_automaton_exp_label_t l){
 }
 
 
-/********* Free functions *********/
-
-static void visited_pair_free(mc_visited_pair_t pair){
-  if(pair){
-    xbt_dynar_free(&(pair->prop_ato));
-    MC_free_snapshot(pair->system_state);
-    xbt_free(pair);
-  }
-}
-
-static void visited_pair_free_voidp(void *p){
-  visited_pair_free((mc_visited_pair_t) * (void **) p);
-}
-
-static void acceptance_pair_free(mc_acceptance_pair_t pair){
-  if(pair){
-    xbt_dynar_free(&(pair->prop_ato));
-    MC_free_snapshot(pair->system_state);
-    xbt_free(pair);
-  }
-}
-
-static void acceptance_pair_free_voidp(void *p){
-  acceptance_pair_free((mc_acceptance_pair_t) * (void **) p);
-}
-
-
 /********* DDFS Algorithm *********/
 
 
@@ -392,27 +489,17 @@ void MC_ddfs_init(void){
   XBT_DEBUG("Double-DFS init");
   XBT_DEBUG("**************************************************");
 
-  mc_pair_t mc_initial_pair = NULL;
-  mc_state_t initial_graph_state = NULL;
+  mc_pair_t initial_pair = NULL;
   smx_process_t process; 
 
   MC_wait_for_requests();
 
   MC_SET_RAW_MEM;
 
-  initial_graph_state = MC_state_new();
-  xbt_swag_foreach(process, simix_global->process_list){
-    if(MC_process_is_enabled(process)){
-      MC_state_interleave_process(initial_graph_state, process);
-    }
-  }
-
-  acceptance_pairs = xbt_dynar_new(sizeof(mc_acceptance_pair_t), acceptance_pair_free_voidp);
-  visited_pairs = xbt_dynar_new(sizeof(mc_visited_pair_t), visited_pair_free_voidp);
+  acceptance_pairs = xbt_dynar_new(sizeof(mc_pair_t), NULL); 
+  visited_pairs = xbt_dynar_new(sizeof(mc_pair_t), NULL); 
   successors = xbt_dynar_new(sizeof(mc_pair_t), NULL);
 
-  /* Save the initial state */
   initial_state_liveness->snapshot = MC_take_snapshot();
 
   MC_UNSET_RAW_MEM; 
@@ -421,11 +508,26 @@ void MC_ddfs_init(void){
   xbt_automaton_state_t automaton_state;
 
   xbt_dynar_foreach(_mc_property_automaton->states, cursor, automaton_state){
-    if(automaton_state->type == -1){
+    if(automaton_state->type == -1){ /* Initial automaton state */
       
       MC_SET_RAW_MEM;
-      mc_initial_pair = MC_pair_new(initial_graph_state, automaton_state, MC_state_interleave_size(initial_graph_state));
-      xbt_fifo_unshift(mc_stack_liveness, mc_initial_pair);
+
+      initial_pair = MC_pair_new();
+      initial_pair->automaton_state = automaton_state;
+      initial_pair->graph_state = MC_state_new();
+      initial_pair->atomic_propositions = get_atomic_propositions_values();
+
+      /* Get enabled process and insert it in the interleave set of the graph_state */
+      xbt_swag_foreach(process, simix_global->process_list){
+        if(MC_process_is_enabled(process)){
+          MC_state_interleave_process(initial_pair->graph_state, process);
+        }
+      }
+
+      initial_pair->requests = MC_state_interleave_size(initial_pair->graph_state);
+
+      xbt_fifo_unshift(mc_stack_liveness, initial_pair);
+
       MC_UNSET_RAW_MEM;
       
       if(cursor != 0){
@@ -435,24 +537,36 @@ void MC_ddfs_init(void){
 
       MC_ddfs(0);
 
-    }else{
-      if(automaton_state->type == 2){
+    }else if(automaton_state->type == 2){ /* Acceptance automaton state */
       
-        MC_SET_RAW_MEM;
-        mc_initial_pair = MC_pair_new(initial_graph_state, automaton_state, MC_state_interleave_size(initial_graph_state));
-        xbt_fifo_unshift(mc_stack_liveness, mc_initial_pair);
-        MC_UNSET_RAW_MEM;
-
-        set_acceptance_pair_reached(automaton_state);
+      MC_SET_RAW_MEM;
 
-        if(cursor != 0){
-          MC_restore_snapshot(initial_state_liveness->snapshot);
-          MC_UNSET_RAW_MEM;
+      initial_pair = MC_pair_new();
+      initial_pair->automaton_state = automaton_state;
+      initial_pair->graph_state = MC_state_new();
+      initial_pair->atomic_propositions = get_atomic_propositions_values();
+        
+      /* Get enabled process and insert it in the interleave set of the graph_state */
+      xbt_swag_foreach(process, simix_global->process_list){
+        if(MC_process_is_enabled(process)){
+          MC_state_interleave_process(initial_pair->graph_state, process);
         }
-  
-        MC_ddfs(1);
-  
       }
+
+      initial_pair->requests = MC_state_interleave_size(initial_pair->graph_state);
+        
+      xbt_fifo_unshift(mc_stack_liveness, initial_pair);
+        
+      MC_UNSET_RAW_MEM;
+
+      set_acceptance_pair_reached(initial_pair);
+
+      if(cursor != 0){
+        MC_restore_snapshot(initial_state_liveness->snapshot);
+        MC_UNSET_RAW_MEM;
+      }
+  
+      MC_ddfs(1);
     }
   }
 
@@ -483,22 +597,19 @@ void MC_ddfs(int search_cycle){
  
   XBT_DEBUG("********************* ( Depth = %d, search_cycle = %d )", xbt_fifo_size(mc_stack_liveness), search_cycle);
  
-  mc_stats->visited_states++;
+  mc_stats->visited_pairs++;
 
   int value;
-  mc_state_t next_graph_state = NULL;
   smx_simcall_t req = NULL;
   char *req_str;
 
   xbt_automaton_transition_t transition_succ;
   unsigned int cursor = 0;
   int res;
+  int reached_num;
 
   mc_pair_t next_pair = NULL;
   mc_pair_t pair_succ;
-
-  mc_pair_t pair_to_remove;
-  mc_acceptance_pair_t acceptance_pair_to_remove;
   
   if(xbt_fifo_size(mc_stack_liveness) < _sg_mc_max_depth){
 
@@ -525,22 +636,6 @@ void MC_ddfs(int search_cycle){
 
         MC_SET_RAW_MEM;
 
-        /* Create the new expanded graph_state */
-        next_graph_state = MC_state_new();
-
-        /* Get enabled process and insert it in the interleave set of the next graph_state */
-        xbt_swag_foreach(process, simix_global->process_list){
-          if(MC_process_is_enabled(process)){
-            XBT_DEBUG("Process %lu enabled with simcall : %d", process->pid, (&process->simcall)->call); 
-          }
-        }
-
-        xbt_swag_foreach(process, simix_global->process_list){
-          if(MC_process_is_enabled(process)){
-            MC_state_interleave_process(next_graph_state, process);
-          }
-        }
-
         xbt_dynar_reset(successors);
 
         MC_UNSET_RAW_MEM;
@@ -552,9 +647,25 @@ void MC_ddfs(int search_cycle){
           res = MC_automaton_evaluate_label(transition_succ->label);
 
           if(res == 1){ // enabled transition in automaton
+
             MC_SET_RAW_MEM;
-            next_pair = MC_pair_new(next_graph_state, transition_succ->dst, MC_state_interleave_size(next_graph_state));
+
+            next_pair = MC_pair_new();
+            next_pair->graph_state = MC_state_new();
+            next_pair->automaton_state = transition_succ->dst;
+            next_pair->atomic_propositions = get_atomic_propositions_values();
+
+            /* Get enabled process and insert it in the interleave set of the next graph_state */
+            xbt_swag_foreach(process, simix_global->process_list){
+              if(MC_process_is_enabled(process)){
+                MC_state_interleave_process(next_pair->graph_state, process);
+              }
+            }
+
+            next_pair->requests = MC_state_interleave_size(next_pair->graph_state);
+            
             xbt_dynar_push(successors, &next_pair);
+
             MC_UNSET_RAW_MEM;
           }
 
@@ -567,9 +678,25 @@ void MC_ddfs(int search_cycle){
           res = MC_automaton_evaluate_label(transition_succ->label);
   
           if(res == 2){ // true transition in automaton
+            
             MC_SET_RAW_MEM;
-            next_pair = MC_pair_new(next_graph_state, transition_succ->dst,  MC_state_interleave_size(next_graph_state));
+            
+            next_pair = MC_pair_new();
+            next_pair->graph_state = MC_state_new();
+            next_pair->automaton_state = transition_succ->dst;
+            next_pair->atomic_propositions = get_atomic_propositions_values();
+
+            /* Get enabled process and insert it in the interleave set of the next graph_state */
+            xbt_swag_foreach(process, simix_global->process_list){
+              if(MC_process_is_enabled(process)){
+                MC_state_interleave_process(next_pair->graph_state, process);
+              }
+            }
+
+            next_pair->requests = MC_state_interleave_size(next_pair->graph_state);
+            
             xbt_dynar_push(successors, &next_pair);
+
             MC_UNSET_RAW_MEM;
           }
 
@@ -583,9 +710,9 @@ void MC_ddfs(int search_cycle){
 
             if((pair_succ->automaton_state->type == 1) || (pair_succ->automaton_state->type == 2)){ 
           
-              if(is_reached_acceptance_pair(pair_succ->automaton_state)){
+              if((reached_num = is_reached_acceptance_pair(pair_succ)) != -1){
         
-                XBT_INFO("Next pair (depth = %d, %u interleave) already reached !", xbt_fifo_size(mc_stack_liveness) + 1, MC_state_interleave_size(pair_succ->graph_state));
+                XBT_INFO("Next pair (depth = %d, %u interleave) already reached (equal to state %d) !", xbt_fifo_size(mc_stack_liveness) + 1, MC_state_interleave_size(pair_succ->graph_state), reached_num);
 
                 XBT_INFO("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
                 XBT_INFO("|             ACCEPTANCE CYCLE            |");
@@ -598,17 +725,15 @@ void MC_ddfs(int search_cycle){
 
               }else{
 
-                if(is_visited_pair(pair_succ->automaton_state) != -1){
+                if(is_visited_pair(pair_succ) != -1){
 
                   XBT_DEBUG("Next pair already visited !");
-                  break;
+                  continue;
             
                 }else{
 
                   XBT_DEBUG("Next pair (depth =%d) -> Acceptance pair (%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->automaton_state->id);
 
-                  XBT_DEBUG("Acceptance pairs : %lu", xbt_dynar_length(acceptance_pairs));
-
                   MC_SET_RAW_MEM;
                   xbt_fifo_unshift(mc_stack_liveness, pair_succ);
                   MC_UNSET_RAW_MEM;
@@ -621,10 +746,10 @@ void MC_ddfs(int search_cycle){
 
             }else{
 
-              if(is_visited_pair(pair_succ->automaton_state) != -1){
+              if(is_visited_pair(pair_succ) != -1){
 
                 XBT_DEBUG("Next pair already visited !");
-                break;
+                continue;
                 
               }else{
 
@@ -639,10 +764,10 @@ void MC_ddfs(int search_cycle){
 
           }else{
 
-            if(is_visited_pair(pair_succ->automaton_state) != -1){
+            if(is_visited_pair(pair_succ) != -1){
 
               XBT_DEBUG("Next pair already visited !");
-              break;
+              continue;
             
             }else{
     
@@ -650,12 +775,10 @@ void MC_ddfs(int search_cycle){
 
                 XBT_DEBUG("Next pair (depth =%d) -> Acceptance pair (%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->automaton_state->id);
       
-                set_acceptance_pair_reached(pair_succ->automaton_state); 
+                set_acceptance_pair_reached(pair_succ); 
 
                 search_cycle = 1;
 
-                XBT_DEBUG("Acceptance pairs : %lu", xbt_dynar_length(acceptance_pairs));
-
               }
 
               MC_SET_RAW_MEM;
@@ -689,9 +812,6 @@ void MC_ddfs(int search_cycle){
 
       MC_SET_RAW_MEM;
 
-      /* Create the new expanded graph_state */
-      next_graph_state = MC_state_new();
-
       xbt_dynar_reset(successors);
 
       MC_UNSET_RAW_MEM;
@@ -703,9 +823,25 @@ void MC_ddfs(int search_cycle){
         res = MC_automaton_evaluate_label(transition_succ->label);
 
         if(res == 1){ // enabled transition in automaton
+          
           MC_SET_RAW_MEM;
-          next_pair = MC_pair_new(next_graph_state, transition_succ->dst, MC_state_interleave_size(next_graph_state));
+
+          next_pair = MC_pair_new();
+          next_pair->graph_state = MC_state_new();
+          next_pair->automaton_state = transition_succ->dst;
+          next_pair->atomic_propositions = get_atomic_propositions_values();
+          
+          /* Get enabled process and insert it in the interleave set of the next graph_state */
+          xbt_swag_foreach(process, simix_global->process_list){
+            if(MC_process_is_enabled(process)){
+              MC_state_interleave_process(next_pair->graph_state, process);
+            }
+          }
+
+          next_pair->requests = MC_state_interleave_size(next_pair->graph_state);
+          
           xbt_dynar_push(successors, &next_pair);
+          
           MC_UNSET_RAW_MEM;
         }
 
@@ -718,9 +854,25 @@ void MC_ddfs(int search_cycle){
         res = MC_automaton_evaluate_label(transition_succ->label);
   
         if(res == 2){ // true transition in automaton
+          
           MC_SET_RAW_MEM;
-          next_pair = MC_pair_new(next_graph_state, transition_succ->dst, MC_state_interleave_size(next_graph_state));
+
+          next_pair = MC_pair_new();
+          next_pair->graph_state = MC_state_new();
+          next_pair->automaton_state = transition_succ->dst;
+          next_pair->atomic_propositions = get_atomic_propositions_values();
+          
+          /* Get enabled process and insert it in the interleave set of the next graph_state */
+          xbt_swag_foreach(process, simix_global->process_list){
+            if(MC_process_is_enabled(process)){
+              MC_state_interleave_process(next_pair->graph_state, process);
+            }
+          }
+
+          next_pair->requests = MC_state_interleave_size(next_pair->graph_state);
+          
           xbt_dynar_push(successors, &next_pair);
+          
           MC_UNSET_RAW_MEM;
         }
 
@@ -734,9 +886,9 @@ void MC_ddfs(int search_cycle){
 
           if((pair_succ->automaton_state->type == 1) || (pair_succ->automaton_state->type == 2)){ 
 
-            if(is_reached_acceptance_pair(pair_succ->automaton_state)){
+            if((reached_num = is_reached_acceptance_pair(pair_succ)) != -1){
            
-              XBT_INFO("Next pair (depth = %d) already reached !", xbt_fifo_size(mc_stack_liveness) + 1);
+              XBT_INFO("Next pair (depth = %d) already reached (equal to state %d)!", xbt_fifo_size(mc_stack_liveness) + 1, reached_num);
         
               XBT_INFO("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
               XBT_INFO("|             ACCEPTANCE CYCLE            |");
@@ -749,7 +901,7 @@ void MC_ddfs(int search_cycle){
 
             }else{
 
-              if(is_visited_pair(pair_succ->automaton_state) != -1){
+              if(is_visited_pair(pair_succ) != -1){
                 
                 XBT_DEBUG("Next pair already visited !");
                 break;
@@ -757,8 +909,6 @@ void MC_ddfs(int search_cycle){
               }else{
 
                 XBT_INFO("Next pair (depth = %d) -> Acceptance pair (%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->automaton_state->id);
-        
-                XBT_INFO("Acceptance pairs : %lu", xbt_dynar_length(acceptance_pairs));
 
                 MC_SET_RAW_MEM;
                 xbt_fifo_unshift(mc_stack_liveness, pair_succ);
@@ -772,7 +922,7 @@ void MC_ddfs(int search_cycle){
 
           }else{
             
-            if(is_visited_pair(pair_succ->automaton_state) != -1){
+            if(is_visited_pair(pair_succ) != -1){
               
               XBT_DEBUG("Next pair already visited !");
               break;
@@ -792,7 +942,7 @@ void MC_ddfs(int search_cycle){
 
         }else{
       
-          if(is_visited_pair(pair_succ->automaton_state) != -1){
+          if(is_visited_pair(pair_succ) != -1){
 
             XBT_DEBUG("Next pair already visited !");
             break;
@@ -801,12 +951,10 @@ void MC_ddfs(int search_cycle){
 
             if(((pair_succ->automaton_state->type == 1) || (pair_succ->automaton_state->type == 2))){
 
-              set_acceptance_pair_reached(pair_succ->automaton_state);
+              set_acceptance_pair_reached(pair_succ);
          
               search_cycle = 1;
 
-              XBT_INFO("Acceptance pairs : %lu", xbt_dynar_length(acceptance_pairs));
-
             }
 
             MC_SET_RAW_MEM;
@@ -845,13 +993,15 @@ void MC_ddfs(int search_cycle){
 
   
   MC_SET_RAW_MEM;
-  pair_to_remove = xbt_fifo_shift(mc_stack_liveness);
-  xbt_fifo_remove(mc_stack_liveness, pair_to_remove);
-  pair_to_remove = NULL;
+  xbt_fifo_remove(mc_stack_liveness, current_pair);
+  current_pair->stack_removed = 1;
   if((current_pair->automaton_state->type == 1) || (current_pair->automaton_state->type == 2)){
-    acceptance_pair_to_remove = xbt_dynar_pop_as(acceptance_pairs, mc_acceptance_pair_t);
-    acceptance_pair_free(acceptance_pair_to_remove);
-    acceptance_pair_to_remove = NULL;
+    remove_acceptance_pair(current_pair);
+  }else{
+    if(_sg_mc_visited == 0)
+      MC_pair_delete(current_pair);
+    else if(current_pair->visited_removed)
+      MC_pair_delete(current_pair);
   }
   MC_UNSET_RAW_MEM;