Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix two minor bugs in the ODPOR implementation
[simgrid.git] / src / mc / explo / CommunicationDeterminismChecker.cpp
index f7def5a..a340c2c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2022. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2008-2023. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -11,6 +11,7 @@
 #include "src/mc/mc_private.hpp"
 #include "src/mc/transition/TransitionAny.hpp"
 #include "src/mc/transition/TransitionComm.hpp"
+#include "xbt/string.hpp"
 
 #include <cstdint>
 
@@ -84,7 +85,7 @@ public:
     initial_communications_pattern.resize(maxpid);
     incomplete_communications_pattern.resize(maxpid);
   }
-  void restore_communications_pattern(const simgrid::mc::State* state, RemoteApp& remote_app);
+  void restore_communications_pattern(const simgrid::mc::State* state, RemoteApp const& remote_app);
   void enforce_deterministic_pattern(aid_t process, const PatternCommunication* comm);
   void get_comm_pattern(const Transition* transition);
   void complete_comm_pattern(const CommWaitTransition* transition);
@@ -99,7 +100,7 @@ public:
   std::vector<unsigned> communication_indices_;
 
   static simgrid::xbt::Extension<simgrid::mc::State, StateCommDet> EXTENSION_ID;
-  explicit StateCommDet(CommDetExtension& checker, RemoteApp& remote_app)
+  explicit StateCommDet(CommDetExtension& checker, RemoteApp const& remote_app)
   {
     const unsigned long maxpid = remote_app.get_maxpid();
     for (unsigned long i = 0; i < maxpid; i++) {
@@ -134,7 +135,7 @@ static simgrid::mc::CommPatternDifference compare_comm_pattern(const simgrid::mc
   return CommPatternDifference::NONE;
 }
 
-void CommDetExtension::restore_communications_pattern(const simgrid::mc::State* state, RemoteApp& remote_app)
+void CommDetExtension::restore_communications_pattern(const simgrid::mc::State* state, RemoteApp const& remote_app)
 {
   for (size_t i = 0; i < initial_communications_pattern.size(); i++)
     initial_communications_pattern[i].index_comm =
@@ -208,7 +209,7 @@ void CommDetExtension::enforce_deterministic_pattern(aid_t actor, const PatternC
       XBT_INFO("*********************************************************");
       XBT_INFO("%s", send_diff.c_str());
       exploration_.log_state();
-      mc_model_checker->exit(SIMGRID_MC_EXIT_NON_DETERMINISM);
+      throw McError(ExitStatus::NON_DETERMINISM);
     } else if (_sg_mc_comms_determinism && (not send_deterministic && not recv_deterministic)) {
       XBT_INFO("****************************************************");
       XBT_INFO("***** Non-deterministic communications pattern *****");
@@ -218,7 +219,7 @@ void CommDetExtension::enforce_deterministic_pattern(aid_t actor, const PatternC
       if (not recv_diff.empty())
         XBT_INFO("%s", recv_diff.c_str());
       exploration_.log_state();
-      mc_model_checker->exit(SIMGRID_MC_EXIT_NON_DETERMINISM);
+      throw McError(ExitStatus::NON_DETERMINISM);
     }
   }
 }
@@ -233,7 +234,7 @@ void CommDetExtension::get_comm_pattern(const Transition* transition)
   auto pattern   = std::make_unique<PatternCommunication>();
   pattern->index = initial_pattern.index_comm + incomplete_pattern.size();
 
-  if (transition->type_ == Transition::Type::COMM_SEND) {
+  if (transition->type_ == Transition::Type::COMM_ASYNC_SEND) {
     auto* send = static_cast<const CommSendTransition*>(transition);
 
     pattern->type      = PatternCommunicationType::send;
@@ -242,7 +243,7 @@ void CommDetExtension::get_comm_pattern(const Transition* transition)
 
     // FIXME: Detached sends should be enforced when the receive is waited
 
-  } else if (transition->type_ == Transition::Type::COMM_RECV) {
+  } else if (transition->type_ == Transition::Type::COMM_ASYNC_RECV) {
     auto* recv = static_cast<const CommRecvTransition*>(transition);
 
     pattern->type      = PatternCommunicationType::receive;
@@ -290,8 +291,8 @@ void CommDetExtension::handle_comm_pattern(const Transition* transition)
     return;
 
   switch (transition->type_) {
-    case Transition::Type::COMM_SEND:
-    case Transition::Type::COMM_RECV:
+    case Transition::Type::COMM_ASYNC_SEND:
+    case Transition::Type::COMM_ASYNC_RECV:
       get_comm_pattern(transition);
       break;
     case Transition::Type::COMM_WAIT:
@@ -319,30 +320,31 @@ void CommDetExtension::handle_comm_pattern(const Transition* transition)
       }
  */
 
-Exploration* create_communication_determinism_checker(const std::vector<char*>& args)
+Exploration* create_communication_determinism_checker(const std::vector<char*>& args, ReductionMode mode)
 {
   CommDetExtension::EXTENSION_ID = simgrid::mc::Exploration::extension_create<CommDetExtension>();
   StateCommDet::EXTENSION_ID     = simgrid::mc::State::extension_create<StateCommDet>();
 
   XBT_DEBUG("********* Start communication determinism verification *********");
 
-  auto base      = new DFSExplorer(args);
+  auto base      = new DFSExplorer(args, mode, true);
   auto extension = new CommDetExtension(*base);
 
-  DFSExplorer::on_exploration_start([extension](RemoteApp&) {
+  DFSExplorer::on_exploration_start([extension](RemoteApp const&) {
     XBT_INFO("Check communication determinism");
     extension->exploration_start();
   });
-  DFSExplorer::on_backtracking([extension](RemoteApp&) { extension->initial_communications_pattern_done = true; });
-  DFSExplorer::on_state_creation([extension](State* state, RemoteApp& remote_app) {
+  DFSExplorer::on_backtracking(
+      [extension](RemoteApp const&) { extension->initial_communications_pattern_done = true; });
+  DFSExplorer::on_state_creation([extension](State* state, RemoteApp const& remote_app) {
     state->extension_set(new StateCommDet(*extension, remote_app));
   });
 
-  DFSExplorer::on_restore_system_state([extension](State* state, RemoteApp& remote_app) {
+  DFSExplorer::on_restore_system_state([extension](State const* state, RemoteApp const& remote_app) {
     extension->restore_communications_pattern(state, remote_app);
   });
 
-  DFSExplorer::on_restore_initial_state([extension](RemoteApp& remote_app) {
+  DFSExplorer::on_restore_initial_state([extension](RemoteApp const& remote_app) {
     const unsigned long maxpid = remote_app.get_maxpid();
     assert(maxpid == extension->incomplete_communications_pattern.size());
     assert(maxpid == extension->initial_communications_pattern.size());
@@ -352,10 +354,12 @@ Exploration* create_communication_determinism_checker(const std::vector<char*>&
     }
   });
 
-  DFSExplorer::on_transition_replay([extension](Transition* t, RemoteApp&) { extension->handle_comm_pattern(t); });
-  DFSExplorer::on_transition_execute([extension](Transition* t, RemoteApp&) { extension->handle_comm_pattern(t); });
+  DFSExplorer::on_transition_replay(
+      [extension](Transition const* t, RemoteApp const&) { extension->handle_comm_pattern(t); });
+  DFSExplorer::on_transition_execute(
+      [extension](Transition const* t, RemoteApp const&) { extension->handle_comm_pattern(t); });
 
-  DFSExplorer::on_log_state([extension](RemoteApp&) {
+  DFSExplorer::on_log_state([extension](RemoteApp const&) {
     if (_sg_mc_comms_determinism) {
       if (extension->send_deterministic && not extension->recv_deterministic) {
         XBT_INFO("*******************************************************");