Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : test dpor without replay from initial state but with
[simgrid.git] / src / mc / mc_global.c
index 9fcb58c..6a46001 100644 (file)
@@ -15,9 +15,12 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_global, mc,
 mc_snapshot_t initial_snapshot = NULL;
 xbt_fifo_t mc_stack = NULL;
 mc_stats_t mc_stats = NULL;
+mc_stats_pair_t mc_stats_pair = NULL;
 mc_state_t mc_current_state = NULL;
 char mc_replay_mode = FALSE;
 double *mc_time = NULL;
+xbt_fifo_t mc_snapshot_stack = NULL;
+
 /**
  *  \brief Initialize the model-checker data structures
  */
@@ -51,6 +54,33 @@ void MC_init(void)
   MC_UNSET_RAW_MEM;
 }
 
+void MC_init_with_automaton(xbt_automaton_t a){
+
+  XBT_DEBUG("Start init mc");
+  
+  mc_time = xbt_new0(double, simix_process_maxpid);
+
+  /* Initialize the data structures that must be persistent across every
+     iteration of the model-checker (in RAW memory) */
+
+  MC_SET_RAW_MEM;
+
+  /* Initialize statistics */
+  mc_stats_pair = xbt_new0(s_mc_stats_pair_t, 1);
+  //mc_stats_pair->pair_size = 1;
+
+  XBT_DEBUG("Creating snapshot_stack");
+
+ /* Create exploration stack */
+  mc_snapshot_stack = xbt_fifo_new();
+
+  MC_UNSET_RAW_MEM;
+
+  //MC_dfs_init(a);
+  MC_stateful_dpor_init(a);
+}
+
+
 void MC_modelcheck(void)
 {
   MC_init();
@@ -58,6 +88,18 @@ void MC_modelcheck(void)
   MC_exit();
 }
 
+void MC_modelcheck_with_automaton(xbt_automaton_t a){
+  MC_init_with_automaton(a);
+  MC_exit_with_automaton();
+}
+
+void MC_exit_with_automaton(void)
+{
+  MC_print_statistics_pairs(mc_stats_pair);
+  xbt_free(mc_time);
+  MC_memory_exit();
+}
+
 void MC_exit(void)
 {
   MC_print_statistics(mc_stats);
@@ -81,12 +123,7 @@ void MC_wait_for_requests(void)
   unsigned int iter;
 
   while (xbt_dynar_length(simix_global->process_to_run)) {
-    SIMIX_context_runall(simix_global->process_to_run);
-
-    xbt_dynar_t tmp = simix_global->process_that_ran;
-    simix_global->process_that_ran = simix_global->process_to_run;
-    simix_global->process_to_run = tmp;
-    xbt_dynar_reset(simix_global->process_to_run);
+    SIMIX_process_runall();
     xbt_dynar_foreach(simix_global->process_that_ran, iter, process) {
       req = &process->request;
       if (req->call != REQ_NO_REQ && !MC_request_is_visible(req))
@@ -227,6 +264,17 @@ void MC_print_statistics(mc_stats_t stats)
      (double)stats->expanded_states / stats->state_size); */
 }
 
+void MC_print_statistics_pairs(mc_stats_pair_t stats)
+{
+  XBT_INFO("Expanded pairs = %lu", stats->expanded_pairs);
+  XBT_INFO("Visited pairs = %lu", stats->visited_pairs);
+  XBT_INFO("Executed transitions = %lu", stats->executed_transitions);
+  XBT_INFO("Expanded / Visited = %lf",
+        (double) stats->visited_pairs / stats->expanded_pairs);
+  /*XBT_INFO("Exploration coverage = %lf",
+     (double)stats->expanded_states / stats->state_size); */
+}
+
 void MC_assert(int prop)
 {
   if (MC_IS_ENABLED && !prop) {
@@ -240,6 +288,19 @@ void MC_assert(int prop)
   }
 }
 
+void MC_assert_pair(int prop){
+  if (MC_IS_ENABLED && !prop) {
+    XBT_INFO("**************************");
+    XBT_INFO("*** PROPERTY NOT VALID ***");
+    XBT_INFO("**************************");
+    //XBT_INFO("Counter-example execution trace:");
+    MC_show_snapshot_stack(mc_snapshot_stack);
+    //MC_dump_snapshot_stack(mc_snapshot_stack);
+    MC_print_statistics_pairs(mc_stats_pair);
+    xbt_abort();
+  }
+}
+
 void MC_process_clock_add(smx_process_t process, double amount)
 {
   mc_time[process->pid] += amount;