X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2d7cf98366e8cf8ae17f5c5be0c3b030fc110307..45c3a73f3553c8d365f61eaa8445f038db9bdb8f:/src/mc/explo/udpor/History.hpp diff --git a/src/mc/explo/udpor/History.hpp b/src/mc/explo/udpor/History.hpp index d4b9753ff2..dc17c27e58 100644 --- a/src/mc/explo/udpor/History.hpp +++ b/src/mc/explo/udpor/History.hpp @@ -10,7 +10,9 @@ #include "src/mc/explo/udpor/EventSet.hpp" #include "src/mc/explo/udpor/udpor_forward.hpp" +#include #include +#include #include namespace simgrid::mc::udpor { @@ -53,8 +55,9 @@ public: History& operator=(History const&) = default; History(History&&) = default; - explicit History(UnfoldingEvent* e) : events_({e}) {} + explicit History(const UnfoldingEvent* e) : events_({e}) {} explicit History(EventSet event_set = EventSet()) : events_(std::move(event_set)) {} + explicit History(std::initializer_list list) : events_(std::move(list)) {} auto begin() const { return Iterator(events_); } auto end() const { return Iterator(EventSet()); } @@ -71,7 +74,7 @@ public: * @param e the event to check * @returns whether or not `e` is contained in the collection */ - bool contains(UnfoldingEvent* e) const; + bool contains(const UnfoldingEvent* e) const; /** * @brief Computes all events in the history described by this instance @@ -85,41 +88,61 @@ public: * dependency graph for all events in this history */ EventSet get_all_events() const; + + /** + * @brief Computes all events in the history described by this instance + * which are maximal (intuitively, those events which cause no others + * or are the "most recent") + */ + EventSet get_all_maximal_events() const; + + /** + * @brief Computes the set of events that are not contained + * in the given configuration + * + * A configuration is a causally-closed, conflict-free set + * of events. Thus, you can determine which events lie outside + * of a configuration during the search more efficiently: the moment + * you discover an event contained in the configuration, you + * do not need to search that event or any of its ancestors as + * they will all be contained in the configuration + */ EventSet get_event_diff_with(const Configuration& config) const; private: /** * @brief An iterator which traverses the history of a set of events */ - struct Iterator { + struct Iterator : boost::iterator_facade { + public: + using optional_configuration = std::optional>; + Iterator(const EventSet& initial_events, optional_configuration config = std::nullopt); + private: + /// @brief Points in the graph from where to continue the search EventSet frontier; + + /// @brief What the iterator currently believes to be the + /// entire history of the events in the graph it traverses EventSet current_history = EventSet(); - std::optional> configuration; - friend History; + /// @brief What the iterator currently believes + // to be the set of maximal events + EventSet maximal_events; + optional_configuration configuration; - public: - Iterator(const EventSet& initial_events, std::optional> config = std::nullopt) - : frontier(initial_events), configuration(config) - { - } - - Iterator& operator++(); - auto operator->() { return frontier.begin().operator->(); } - auto operator*() const { return *frontier.begin(); } - - // If what the iterator sees next is the same, we consider them - // to be the same iterator. This way, once the iterator has completed - // its search, it will be "equal" to an iterator searching nothing - bool operator==(const Iterator& other) { return this->frontier == other.frontier; } - bool operator!=(const Iterator& other) { return not(this->operator==(other)); } - - using iterator_category = std::forward_iterator_tag; - using difference_type = int; // # of steps between - using value_type = UnfoldingEvent*; - using pointer = value_type*; - using reference = value_type&; + // boost::iterator_facade<...> interface to implement + void increment(); + bool equal(const Iterator& other) const; + + const UnfoldingEvent* const& dereference() const; + + // Allows boost::iterator_facade<...> to function properly + friend class boost::iterator_core_access; + + // Allow the `History` class to use some of the + // computation of the iterator + friend History; }; };