X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/50753d5f8442a47c17c4035724201a18a7ff6146..7e625e5e848a284b522d69ec28cb111f1f88515b:/src/mc/explo/udpor/EventSet.cpp diff --git a/src/mc/explo/udpor/EventSet.cpp b/src/mc/explo/udpor/EventSet.cpp index 09cb66b061..929234e2a0 100644 --- a/src/mc/explo/udpor/EventSet.cpp +++ b/src/mc/explo/udpor/EventSet.cpp @@ -14,7 +14,7 @@ namespace simgrid::mc::udpor { -EventSet::EventSet(Configuration&& config) : EventSet(config.get_events()) {} +EventSet::EventSet(const Configuration& config) : EventSet(config.get_events()) {} void EventSet::remove(const UnfoldingEvent* e) { @@ -90,6 +90,19 @@ EventSet EventSet::make_union(const Configuration& config) const return make_union(config.get_events()); } +EventSet EventSet::make_intersection(const EventSet& other) const +{ + std::unordered_set result; + + for (const UnfoldingEvent* e : other.events_) { + if (contains(e)) { + result.insert(e); + } + } + + return EventSet(std::move(result)); +} + EventSet EventSet::get_local_config() const { return History(*this).get_all_events(); @@ -110,6 +123,11 @@ bool EventSet::contains(const UnfoldingEvent* e) const return this->events_.find(e) != this->events_.end(); } +bool EventSet::contains_equivalent_to(const UnfoldingEvent* e) const +{ + return std::find_if(begin(), end(), [=](const UnfoldingEvent* e_in_set) { return *e == *e_in_set; }) != end(); +} + bool EventSet::is_subset_of(const EventSet& other) const { // If there is some element not contained in `other`, then @@ -142,13 +160,23 @@ bool EventSet::intersects(const History& history) const return std::any_of(history.begin(), history.end(), [=](const UnfoldingEvent* e) { return this->contains(e); }); } +bool EventSet::intersects(const EventSet& other) const +{ + return std::any_of(other.begin(), other.end(), [=](const UnfoldingEvent* e) { return this->contains(e); }); +} + +EventSet EventSet::get_largest_maximal_subset() const +{ + const History history(*this); + return history.get_all_maximal_events(); +} + bool EventSet::is_maximal() const { // A set of events is maximal if no event from // the original set is ruled out when traversing // the history of the events - const History history(*this); - return *this == history.get_all_maximal_events(); + return *this == this->get_largest_maximal_subset(); } bool EventSet::is_conflict_free() const @@ -192,7 +220,7 @@ std::vector EventSet::get_topological_ordering() const temporarily_marked_events.insert(evt); EventSet immediate_causes = evt->get_immediate_causes(); - if (!immediate_causes.empty() && immediate_causes.is_subset_of(temporarily_marked_events)) { + if (not immediate_causes.empty() && immediate_causes.is_subset_of(temporarily_marked_events)) { throw std::invalid_argument("Attempted to perform a topological sort on a configuration " "whose contents contain a cycle. The configuration (and the graph " "connecting all of the events) is an invalid event structure"); @@ -233,6 +261,18 @@ std::vector EventSet::get_topological_ordering_of_reverse return topological_events; } +std::string EventSet::to_string() const +{ + std::string contents; + + for (const auto* event : *this) { + contents += event->to_string(); + contents += " + "; + } + + return contents; +} + std::vector EventSet::move_into_vector() const&& { std::vector contents; @@ -245,4 +285,4 @@ std::vector EventSet::move_into_vector() const&& return contents; } -} // namespace simgrid::mc::udpor \ No newline at end of file +} // namespace simgrid::mc::udpor