Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'udpor-phase6' into 'master'
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Wed, 22 Mar 2023 20:43:42 +0000 (20:43 +0000)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Wed, 22 Mar 2023 20:43:42 +0000 (20:43 +0000)
Phase 6 of UDPOR Integration: Add `K`-partial alternatives computation + clean up phase

See merge request simgrid/simgrid!139

1  2 
MANIFEST.in
src/mc/explo/UdporChecker.cpp
tools/cmake/DefinePackages.cmake

diff --combined MANIFEST.in
@@@ -1665,7 -1665,6 +1665,7 @@@ include docs/source/Release_Notes.rs
  include docs/source/Start_your_own_project.rst
  include docs/source/The_XBT_toolbox.rst
  include docs/source/Tutorial_Algorithms.rst
 +include docs/source/Tutorial_DAG.rst
  include docs/source/Tutorial_MPI_Applications.rst
  include docs/source/Tutorial_Model-checking.rst
  include docs/source/XML_reference.rst
@@@ -1700,17 -1699,6 +1700,17 @@@ include docs/source/img/zoom_comm.drawi
  include docs/source/img/zoom_comm.svg
  include docs/source/index.rst
  include docs/source/intl.rst
 +include docs/source/tuto_dag/dag_lab1.cpp
 +include docs/source/tuto_dag/dag_lab2-1.cpp
 +include docs/source/tuto_dag/dag_lab2-2.cpp
 +include docs/source/tuto_dag/dag_lab2-3.cpp
 +include docs/source/tuto_dag/img/dag.svg
 +include docs/source/tuto_dag/img/dag1.svg
 +include docs/source/tuto_dag/img/dag2.svg
 +include docs/source/tuto_dag/simple_dax.xml
 +include docs/source/tuto_dag/simple_dot.dot
 +include docs/source/tuto_dag/simple_json.json
 +include docs/source/tuto_dag/small_platform.xml
  include docs/source/tuto_disk/CMakeLists.txt
  include docs/source/tuto_disk/Dockerfile
  include docs/source/tuto_disk/analysis.irst
@@@ -2147,6 -2135,8 +2147,6 @@@ include src/kernel/xml/simgrid.dt
  include src/kernel/xml/simgrid_dtd.c
  include src/kernel/xml/simgrid_dtd.h
  include src/mc/AddressSpace.hpp
 -include src/mc/ModelChecker.cpp
 -include src/mc/ModelChecker.hpp
  include src/mc/VisitedState.cpp
  include src/mc/VisitedState.hpp
  include src/mc/api/ActorState.hpp
@@@ -2154,8 -2144,6 +2154,8 @@@ include src/mc/api/RemoteApp.cp
  include src/mc/api/RemoteApp.hpp
  include src/mc/api/State.cpp
  include src/mc/api/State.hpp
 +include src/mc/api/guide/BasicGuide.hpp
 +include src/mc/api/guide/GuidedState.hpp
  include src/mc/compare.cpp
  include src/mc/datatypes.h
  include src/mc/explo/CommunicationDeterminismChecker.cpp
@@@ -2168,6 -2156,7 +2168,7 @@@ include src/mc/explo/LivenessChecker.hp
  include src/mc/explo/UdporChecker.cpp
  include src/mc/explo/UdporChecker.hpp
  include src/mc/explo/simgrid_mc.cpp
+ include src/mc/explo/udpor/Comb.hpp
  include src/mc/explo/udpor/Configuration.cpp
  include src/mc/explo/udpor/Configuration.hpp
  include src/mc/explo/udpor/Configuration_test.cpp
@@@ -2603,7 -2592,6 +2604,7 @@@ include tools/cmake/Modules/FindLibunwi
  include tools/cmake/Modules/FindNS3.cmake
  include tools/cmake/Modules/FindPAPI.cmake
  include tools/cmake/Modules/FindValgrind.cmake
 +include tools/cmake/Modules/nlohmann_jsonConfig.cmake
  include tools/cmake/Modules/pybind11Config.cmake
  include tools/cmake/Option.cmake
  include tools/cmake/Tests.cmake
@@@ -5,7 -5,10 +5,10 @@@
  
  #include "src/mc/explo/UdporChecker.hpp"
  #include "src/mc/api/State.hpp"
+ #include "src/mc/explo/udpor/Comb.hpp"
+ #include "src/mc/explo/udpor/History.hpp"
  #include "src/mc/explo/udpor/maximal_subsets_iterator.hpp"
  #include <xbt/asserts.h>
  #include <xbt/log.h>
  
@@@ -13,7 -16,7 +16,7 @@@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_udpo
  
  namespace simgrid::mc::udpor {
  
 -UdporChecker::UdporChecker(const std::vector<char*>& args) : Exploration(args)
 +UdporChecker::UdporChecker(const std::vector<char*>& args) : Exploration(args, true)
  {
    // Initialize the map
  }
@@@ -59,7 -62,9 +62,9 @@@ void UdporChecker::explore(const Config
      // are no enabled transitions that can be executed from the
      // state reached by `C` (denoted `state(C)`), i.e. by some
      // execution of the transitions in C obeying the causality
-     // relation. Here, then, we would be in a deadlock.
+     // relation. Here, then, we may be in a deadlock (the other
+     // possibility is that we've finished running everything, and
+     // we wouldn't be in deadlock then)
      if (enC.empty()) {
        get_remote_app().check_deadlock();
      }
@@@ -75,7 -80,7 +80,7 @@@
                             "the search, yet no events were actually chosen\n"
                             "*********************************\n\n");
  
-   // Move the application into stateCe and actually make note of that state
+   // Move the application into stateCe and make note of that state
    move_to_stateCe(*stateC, *e);
    auto stateCe = record_current_state();
  
    // D <-- D + {e}
    D.insert(e);
  
-   // TODO: Determine a value of K to use or don't use it at all
    constexpr unsigned K = 10;
-   if (auto J = compute_partial_alternative(D, C, K); !J.empty()) {
-     J.subtract(C.get_events());
+   if (auto J = C.compute_k_partial_alternative_to(D, this->unfolding, K); J.has_value()) {
  
      // Before searching the "right half", we need to make
      // sure the program actually reflects the fact
      restore_program_state_to(*stateC);
  
      // Explore(C, D + {e}, J \ C)
-     explore(C, D, std::move(J), std::move(stateC), std::move(prev_exC));
+     auto J_minus_C = J.value().get_events().subtracting(C.get_events());
+     explore(C, D, std::move(J_minus_C), std::move(stateC), std::move(prev_exC));
    }
  
    // D <-- D - {e}
@@@ -157,7 -161,9 +161,9 @@@ EventSet UdporChecker::compute_exC_by_e
         begin != maximal_subsets_iterator(); ++begin) {
      const EventSet& maximal_subset = *begin;
  
-     // TODO: Determine if `a` is enabled here
+     // Determining if `a` is enabled here might not be possible while looking at `a` opaquely
+     // We leave the implementation as-is to ensure that any addition would be simple
+     // if it were ever added
      const bool enabled_at_config_k = false;
  
      if (enabled_at_config_k) {
        }
      }
    }
    return incremental_exC;
  }
  
@@@ -194,13 -199,15 +199,15 @@@ void UdporChecker::move_to_stateCe(Stat
                                "one transition of the state of an visited event is enabled, yet no\n"
                                "state was actually enabled. Please report this as a bug.\n"
                                "*********************************\n\n");
 -  state.execute_next(next_actor);
 +  state.execute_next(next_actor, get_remote_app());
  }
  
  void UdporChecker::restore_program_state_to(const State& stateC)
  {
-   // TODO: Perform state regeneration in the same manner as is done
-   // in the DFSChecker.cpp
+   get_remote_app().restore_initial_state();
+   // TODO: We need to have the stack of past states available at this
+   // point. Since the method is recursive, we'll need to keep track of
+   // this as we progress
  }
  
  std::unique_ptr<State> UdporChecker::record_current_state()
    auto next_state = this->get_current_state();
  
    // In UDPOR, we care about all enabled transitions in a given state
 -  next_state->mark_all_enabled_todo();
 +  next_state->consider_all();
  
    return next_state;
  }
@@@ -227,15 -234,23 +234,23 @@@ const UnfoldingEvent* UdporChecker::sel
    return nullptr;
  }
  
- EventSet UdporChecker::compute_partial_alternative(const EventSet& D, const Configuration& C, const unsigned k) const
- {
-   // TODO: Compute k-partial alternatives using [2]
-   return EventSet();
- }
  void UdporChecker::clean_up_explore(const UnfoldingEvent* e, const Configuration& C, const EventSet& D)
  {
-   // TODO: Perform clean up here
+   const EventSet C_union_D              = C.get_events().make_union(D);
+   const EventSet es_immediate_conflicts = this->unfolding.get_immediate_conflicts_of(e);
+   const EventSet Q_CDU                  = C_union_D.make_union(es_immediate_conflicts.get_local_config());
+   // Move {e} \ Q_CDU from U to G
+   if (Q_CDU.contains(e)) {
+     this->unfolding.remove(e);
+   }
+   // foreach ê in #ⁱ_U(e)
+   for (const auto* e_hat : es_immediate_conflicts) {
+     // Move [ê] \ Q_CDU from U to G
+     const EventSet to_remove = e_hat->get_history().subtracting(Q_CDU);
+     this->unfolding.remove(to_remove);
+   }
  }
  
  RecordTrace UdporChecker::get_record_trace()
@@@ -529,7 -529,8 +529,8 @@@ set(MC_SR
    src/mc/explo/LivenessChecker.hpp
    src/mc/explo/UdporChecker.cpp
    src/mc/explo/UdporChecker.hpp
+   
+   src/mc/explo/udpor/Comb.hpp
    src/mc/explo/udpor/Configuration.hpp
    src/mc/explo/udpor/Configuration.cpp
    src/mc/explo/udpor/EventSet.cpp
    src/mc/transition/TransitionSynchro.cpp
    src/mc/transition/TransitionSynchro.hpp
  
 -  src/mc/AddressSpace.hpp
 -  src/mc/ModelChecker.cpp
 -  src/mc/ModelChecker.hpp
 -  src/mc/VisitedState.cpp
 -  src/mc/VisitedState.hpp
 +  src/mc/api/guide/BasicGuide.hpp
 +  src/mc/api/guide/GuidedState.hpp
    src/mc/api/ActorState.hpp
    src/mc/api/State.cpp
    src/mc/api/State.hpp
    src/mc/api/RemoteApp.cpp
    src/mc/api/RemoteApp.hpp
 +
 +  src/mc/AddressSpace.hpp
 +  src/mc/VisitedState.cpp
 +  src/mc/VisitedState.hpp
    src/mc/compare.cpp
    src/mc/mc_exit.hpp
    src/mc/mc_forward.hpp
@@@ -872,19 -872,6 +873,19 @@@ set(DOC_SOURCE
    docs/source/tuto_s4u/master-workers-lab3.cpp
    docs/source/tuto_s4u/master-workers-lab4.cpp
  
 +  docs/source/Tutorial_DAG.rst
 +  docs/source/tuto_dag/dag_lab1.cpp
 +  docs/source/tuto_dag/dag_lab2-1.cpp
 +  docs/source/tuto_dag/dag_lab2-2.cpp
 +  docs/source/tuto_dag/dag_lab2-3.cpp
 +  docs/source/tuto_dag/img/dag1.svg
 +  docs/source/tuto_dag/img/dag2.svg
 +  docs/source/tuto_dag/img/dag.svg
 +  docs/source/tuto_dag/simple_dax.xml
 +  docs/source/tuto_dag/simple_dot.dot
 +  docs/source/tuto_dag/simple_json.json
 +  docs/source/tuto_dag/small_platform.xml
 +
    docs/source/Tutorial_MPI_Applications.rst
    docs/source/tuto_smpi/3hosts.png
    docs/source/tuto_smpi/3hosts.xml
@@@ -1051,7 -1038,6 +1052,7 @@@ set(CMAKE_SOURCE_FILE
    tools/cmake/Modules/FindNS3.cmake
    tools/cmake/Modules/FindPAPI.cmake
    tools/cmake/Modules/FindValgrind.cmake
 +  tools/cmake/Modules/nlohmann_jsonConfig.cmake
    tools/cmake/Modules/pybind11Config.cmake
    tools/cmake/Option.cmake
    tools/cmake/Tests.cmake