Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add conflict-free invariant check to Configuration
[simgrid.git] / src / mc / explo / udpor / Configuration_test.cpp
index d1f1030..48eeb4e 100644 (file)
@@ -9,6 +9,7 @@
 #include "src/mc/explo/udpor/History.hpp"
 #include "src/mc/explo/udpor/UnfoldingEvent.hpp"
 #include "src/mc/explo/udpor/maximal_subsets_iterator.hpp"
+#include "src/mc/explo/udpor/udpor_tests_private.hpp"
 
 #include <unordered_map>
 
@@ -24,11 +25,11 @@ TEST_CASE("simgrid::mc::udpor::Configuration: Constructing Configurations")
   //          e3
   //         /  /
   //        e4   e5
-  UnfoldingEvent e1;
-  UnfoldingEvent e2{&e1};
-  UnfoldingEvent e3{&e2};
-  UnfoldingEvent e4{&e3};
-  UnfoldingEvent e5{&e3};
+  UnfoldingEvent e1(EventSet(), std::make_shared<IndependentAction>());
+  UnfoldingEvent e2(EventSet({&e1}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e3(EventSet({&e2}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e4(EventSet({&e3}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e5(EventSet({&e3}), std::make_shared<IndependentAction>());
 
   SECTION("Creating a configuration without events")
   {
@@ -37,7 +38,7 @@ TEST_CASE("simgrid::mc::udpor::Configuration: Constructing Configurations")
     REQUIRE(C.get_latest_event() == nullptr);
   }
 
-  SECTION("Creating a configuration with events")
+  SECTION("Creating a configuration with events (test violation of being causally closed)")
   {
     // 5 choose 0 = 1 test
     REQUIRE_NOTHROW(Configuration({&e1}));
@@ -93,10 +94,10 @@ TEST_CASE("simgrid::mc::udpor::Configuration: Adding Events")
   //           /
   //         /  /
   //        e3   e4
-  UnfoldingEvent e1;
-  UnfoldingEvent e2{&e1};
-  UnfoldingEvent e3{&e2};
-  UnfoldingEvent e4{&e2};
+  UnfoldingEvent e1(EventSet(), std::make_shared<IndependentAction>());
+  UnfoldingEvent e2(EventSet({&e1}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e3(EventSet({&e2}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e4(EventSet({&e2}), std::make_shared<IndependentAction>());
 
   REQUIRE_THROWS_AS(Configuration().add_event(nullptr), std::invalid_argument);
   REQUIRE_THROWS_AS(Configuration().add_event(&e2), std::invalid_argument);
@@ -136,10 +137,10 @@ TEST_CASE("simgrid::mc::udpor::Configuration: Topological Sort Order")
   //          e3
   //         /
   //        e4
-  UnfoldingEvent e1;
-  UnfoldingEvent e2{&e1};
-  UnfoldingEvent e3{&e2};
-  UnfoldingEvent e4{&e3};
+  UnfoldingEvent e1(EventSet(), std::make_shared<IndependentAction>());
+  UnfoldingEvent e2(EventSet({&e1}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e3(EventSet({&e2}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e4(EventSet({&e3}), std::make_shared<IndependentAction>());
 
   SECTION("Topological ordering for entire set")
   {
@@ -194,12 +195,12 @@ TEST_CASE("simgrid::mc::udpor::Configuration: Topological Sort Order More Compli
   //        e4   e6
   //        /
   //       e5
-  UnfoldingEvent e1;
-  UnfoldingEvent e2{&e1};
-  UnfoldingEvent e3{&e2};
-  UnfoldingEvent e4{&e3};
-  UnfoldingEvent e5{&e4};
-  UnfoldingEvent e6{&e3};
+  UnfoldingEvent e1(EventSet(), std::make_shared<IndependentAction>());
+  UnfoldingEvent e2(EventSet({&e1}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e3(EventSet({&e2}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e4(EventSet({&e3}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e5(EventSet({&e4}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e6(EventSet({&e3}), std::make_shared<IndependentAction>());
 
   SECTION("Topological ordering for subsets")
   {
@@ -303,18 +304,18 @@ TEST_CASE("simgrid::mc::udpor::Configuration: Topological Sort Order Very Compli
   //        /   /     /
   //         /  /   /
   //         [   e12    ]
-  UnfoldingEvent e1;
-  UnfoldingEvent e2{&e1};
-  UnfoldingEvent e8{&e1};
-  UnfoldingEvent e3{&e2};
-  UnfoldingEvent e4{&e3};
-  UnfoldingEvent e5{&e4};
-  UnfoldingEvent e6{&e4};
-  UnfoldingEvent e7{&e2, &e8};
-  UnfoldingEvent e9{&e6, &e7};
-  UnfoldingEvent e10{&e7};
-  UnfoldingEvent e11{&e8};
-  UnfoldingEvent e12{&e5, &e9, &e10};
+  UnfoldingEvent e1(EventSet(), std::make_shared<IndependentAction>());
+  UnfoldingEvent e2(EventSet({&e1}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e8(EventSet({&e1}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e3(EventSet({&e2}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e4(EventSet({&e3}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e5(EventSet({&e4}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e6(EventSet({&e4}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e7(EventSet({&e2, &e8}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e9(EventSet({&e6, &e7}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e10(EventSet({&e7}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e11(EventSet({&e8}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e12(EventSet({&e5, &e9, &e10}), std::make_shared<IndependentAction>());
   Configuration C{&e1, &e2, &e3, &e4, &e5, &e6, &e7, &e8, &e9, &e10, &e11, &e12};
 
   SECTION("Test every combination of the maximal configuration (forward graph)")
@@ -386,6 +387,13 @@ TEST_CASE("simgrid::mc::udpor::Configuration: Topological Sort Order Very Compli
       REQUIRE(events_seen == ordered_event_set);
     }
   }
+
+  SECTION("Test that the topological ordering is equivalent to that of the configuration's events")
+  {
+    REQUIRE(C.get_topologically_sorted_events() == C.get_events().get_topological_ordering());
+    REQUIRE(C.get_topologically_sorted_events_of_reverse_graph() ==
+            C.get_events().get_topological_ordering_of_reverse_graph());
+  }
 }
 
 TEST_CASE("simgrid::mc::udpor::maximal_subsets_iterator: Basic Testing of Maximal Subsets")
@@ -398,14 +406,14 @@ TEST_CASE("simgrid::mc::udpor::maximal_subsets_iterator: Basic Testing of Maxima
   //           e3    e6
   //           /     / /
   //          e4    e7 e8
-  UnfoldingEvent e1;
-  UnfoldingEvent e2{&e1};
-  UnfoldingEvent e3{&e2};
-  UnfoldingEvent e4{&e3};
-  UnfoldingEvent e5{&e1};
-  UnfoldingEvent e6{&e5};
-  UnfoldingEvent e7{&e6};
-  UnfoldingEvent e8{&e6};
+  UnfoldingEvent e1(EventSet(), std::make_shared<IndependentAction>());
+  UnfoldingEvent e2(EventSet({&e1}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e3(EventSet({&e2}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e4(EventSet({&e3}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e5(EventSet({&e1}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e6(EventSet({&e5}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e7(EventSet({&e6}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e8(EventSet({&e6}), std::make_shared<IndependentAction>());
 
   SECTION("Iteration over an empty configuration yields only the empty set")
   {
@@ -464,7 +472,7 @@ TEST_CASE("simgrid::mc::udpor::maximal_subsets_iterator: Basic Testing of Maxima
         // Only events in `interesting_bunch` can appear: thus no set
         // should include anything else other than `interesting_bunch`
         REQUIRE(event_set.is_subset_of(interesting_bunch));
-        REQUIRE(event_set.is_maximal_event_set());
+        REQUIRE(event_set.is_maximal());
         maximal_subset_counts[event_set.size()]++;
       }
 
@@ -497,7 +505,7 @@ TEST_CASE("simgrid::mc::udpor::maximal_subsets_iterator: Basic Testing of Maxima
         // Only events in `interesting_bunch` can appear: thus no set
         // should include anything else other than `interesting_bunch`
         REQUIRE(event_set.is_subset_of(interesting_bunch));
-        REQUIRE(event_set.is_maximal_event_set());
+        REQUIRE(event_set.is_maximal());
         maximal_subset_counts[event_set.size()]++;
       }
 
@@ -531,24 +539,24 @@ TEST_CASE("simgrid::mc::udpor::maximal_subsets_iterator: Stress Test for Maximal
   //               |   e11 e12 e13 e14   e15
   //               |   /      / / /   /  /
   //               +-> e16     e17     e18
-  UnfoldingEvent e1;
-  UnfoldingEvent e2{&e1};
-  UnfoldingEvent e3{&e1};
-  UnfoldingEvent e4{&e2};
-  UnfoldingEvent e5{&e2};
-  UnfoldingEvent e6{&e3};
-  UnfoldingEvent e7{&e3};
-  UnfoldingEvent e8{&e4};
-  UnfoldingEvent e9{&e4, &e5, &e6};
-  UnfoldingEvent e10{&e6, &e7};
-  UnfoldingEvent e11{&e8};
-  UnfoldingEvent e12{&e8};
-  UnfoldingEvent e13{&e9};
-  UnfoldingEvent e14{&e9};
-  UnfoldingEvent e15{&e10};
-  UnfoldingEvent e16{&e5, &e11};
-  UnfoldingEvent e17{&e12, &e13, &e14};
-  UnfoldingEvent e18{&e14, &e15};
+  UnfoldingEvent e1(EventSet(), std::make_shared<IndependentAction>());
+  UnfoldingEvent e2(EventSet({&e1}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e3(EventSet({&e1}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e4(EventSet({&e2}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e5(EventSet({&e2}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e6(EventSet({&e3}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e7(EventSet({&e3}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e8(EventSet({&e4}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e9(EventSet({&e4, &e5, &e6}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e10(EventSet({&e6, &e7}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e11(EventSet({&e8}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e12(EventSet({&e8}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e13(EventSet({&e9}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e14(EventSet({&e9}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e15(EventSet({&e10}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e16(EventSet({&e5, &e11}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e17(EventSet({&e12, &e13, &e14}), std::make_shared<IndependentAction>());
+  UnfoldingEvent e18(EventSet({&e14, &e15}), std::make_shared<IndependentAction>());
   Configuration C{&e1, &e2, &e3, &e4, &e5, &e6, &e7, &e8, &e9, &e10, &e11, &e12, &e13, &e14, &e15, &e16, &e17, &e18};
 
   SECTION("Every subset iterated over is maximal")
@@ -561,7 +569,33 @@ TEST_CASE("simgrid::mc::udpor::maximal_subsets_iterator: Stress Test for Maximal
 
     for (; first != last; ++first) {
       REQUIRE((*first).size() <= C.get_events().size());
-      REQUIRE((*first).is_maximal_event_set());
+      REQUIRE((*first).is_maximal());
+    }
+  }
+
+  SECTION("Test that the maximal set ordering is equivalent to that of the configuration's events")
+  {
+    maximal_subsets_iterator first_config(C);
+    maximal_subsets_iterator first_events(C.get_events());
+    maximal_subsets_iterator last;
+
+    // Make sure we actually have something to iterate over
+    REQUIRE(first_config != last);
+    REQUIRE(first_config == first_events);
+    REQUIRE(first_events != last);
+
+    for (; first_config != last; ++first_config, ++first_events) {
+      // first_events and first_config should always be at the same location
+      REQUIRE(first_events != last);
+      const auto& first_config_set = *first_config;
+      const auto& first_events_set = *first_events;
+
+      REQUIRE(first_config_set.size() <= C.get_events().size());
+      REQUIRE(first_config_set.is_maximal());
+      REQUIRE(first_events_set == first_config_set);
     }
+
+    // Iteration with events directly should now also be finished
+    REQUIRE(first_events == last);
   }
 }
\ No newline at end of file