X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6260d187764dc644d699e1a53454f7efdcc682df..3f9b311ec56db95ec539001a860ae3c838c48312:/src/mc/api/strategy/BasicStrategy.hpp diff --git a/src/mc/api/strategy/BasicStrategy.hpp b/src/mc/api/strategy/BasicStrategy.hpp index 67c1ac8673..ca44509880 100644 --- a/src/mc/api/strategy/BasicStrategy.hpp +++ b/src/mc/api/strategy/BasicStrategy.hpp @@ -7,50 +7,50 @@ #define SIMGRID_MC_BASICSTRATEGY_HPP #include "Strategy.hpp" +#include "src/mc/explo/Exploration.hpp" + +XBT_LOG_EXTERNAL_CATEGORY(mc_dfs); namespace simgrid::mc { /** Basic MC guiding class which corresponds to no guide. When asked for different states * it will follow a depth first search politics to minize the number of opened states. */ class BasicStrategy : public Strategy { - int depth_ = 100000; // Arbitrary starting point. next_transition must return a positiv value to work with threshold in DFSExplorer + int depth_ = _sg_mc_max_depth; // Arbitrary starting point. next_transition must return a positive value to work with + // threshold in DFSExplorer public: void copy_from(const Strategy* strategy) override { - const BasicStrategy* cast_strategy = static_cast(strategy); + const auto* cast_strategy = dynamic_cast(strategy); xbt_assert(cast_strategy != nullptr); depth_ = cast_strategy->depth_ - 1; - xbt_assert(depth_ > 0, "The exploration reached a depth greater than 100000. We will stop here to prevent weird interaction with DFSExplorer."); + if (depth_ <= 0) { + XBT_CERROR(mc_dfs, + "The exploration reached a depth greater than %d. Change the depth limit with " + "--cfg=model-check/max-depth. Here are the 100 first trace elements", + _sg_mc_max_depth.get()); + auto trace = Exploration::get_instance()->get_textual_trace(100); + for (auto const& elm : trace) + XBT_CERROR(mc_dfs, " %s", elm.c_str()); + xbt_die("Aborting now."); + } } BasicStrategy() = default; ~BasicStrategy() override = default; - std::pair next_transition() const override - { + std::pair best_transition(bool must_be_todo) const override { for (auto const& [aid, actor] : actors_to_run_) { /* Only consider actors (1) marked as interleaving by the checker and (2) currently enabled in the application */ - if (not actor.is_todo() || not actor.is_enabled() || actor.is_done()) { + if ((not actor.is_todo() && must_be_todo) || not actor.is_enabled() || actor.is_done()) continue; - } return std::make_pair(aid, depth_); } return std::make_pair(-1, depth_); } - void execute_next(aid_t aid, RemoteApp& app) override { return; } - void consider_best() override - { - for (auto& [_, actor] : actors_to_run_) { - if (actor.is_todo()) - return; - if (actor.is_enabled() and not actor.is_done()) { - actor.mark_todo(); - return; - } - } - } + void execute_next(aid_t aid, RemoteApp& app) override { return; } }; } // namespace simgrid::mc