X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6260d187764dc644d699e1a53454f7efdcc682df..6c16c61daeab4491da3abfba8e1b657308f8dfd4:/src/mc/api/strategy/UniformStrategy.hpp diff --git a/src/mc/api/strategy/UniformStrategy.hpp b/src/mc/api/strategy/UniformStrategy.hpp index 72f1a37799..472c571d3a 100644 --- a/src/mc/api/strategy/UniformStrategy.hpp +++ b/src/mc/api/strategy/UniformStrategy.hpp @@ -7,45 +7,48 @@ #define SIMGRID_MC_UNIFORMSTRATEGY_HPP #include "src/mc/transition/Transition.hpp" +#include "xbt/random.hpp" namespace simgrid::mc { /** Guiding strategy that valuate states randomly */ class UniformStrategy : public Strategy { + static constexpr int MAX_RAND = 100000; + std::map valuation; public: UniformStrategy() { for (long aid = 0; aid < 10; aid++) - valuation[aid] = rand() % 1000; + valuation[aid] = xbt::random::uniform_int(0, MAX_RAND); } void copy_from(const Strategy* strategy) override { - for (auto& [aid, _] : actors_to_run_) - valuation[aid] = rand() % 1000; + for (auto const& [aid, _] : actors_to_run_) + valuation[aid] = xbt::random::uniform_int(0, MAX_RAND); } - std::pair next_transition() const override + std::pair best_transition(bool must_be_todo) const override { int possibilities = 0; // Consider only valid actors for (auto const& [aid, actor] : actors_to_run_) { - if (actor.is_todo() and (not actor.is_done()) and actor.is_enabled()) + if ((actor.is_todo() || not must_be_todo) && (not actor.is_done()) && actor.is_enabled()) possibilities++; } int chosen; if (possibilities == 0) - return std::make_pair(-1, 100000); + return std::make_pair(-1, 0); if (possibilities == 1) chosen = 0; else - chosen = rand() % possibilities; + chosen = xbt::random::uniform_int(0, possibilities-1); for (auto const& [aid, actor] : actors_to_run_) { - if ((not actor.is_todo()) or actor.is_done() or (not actor.is_enabled())) + if (((not actor.is_todo()) && must_be_todo) || actor.is_done() || (not actor.is_enabled())) continue; if (chosen == 0) { return std::make_pair(aid, valuation.at(aid)); @@ -53,46 +56,10 @@ public: chosen--; } - return std::make_pair(-1, 100000); + return std::make_pair(-1, 0); } void execute_next(aid_t aid, RemoteApp& app) override {} - - void consider_best() override - { - - int possibilities = 0; - // Consider only valid actors - // If some actor are already considered as todo, skip - for (auto const& [aid, actor] : actors_to_run_) { - if (valuation.count(aid) == 0) - for (auto& [aid, _] : actors_to_run_) - valuation[aid] = rand() % 1000; - if (actor.is_todo()) - return; - if (actor.is_enabled() and not actor.is_done()) - possibilities++; - } - - int chosen; - if (possibilities == 0) - return; - if (possibilities == 1) - chosen = 0; - else - chosen = rand() % possibilities; - - for (auto& [aid, actor] : actors_to_run_) { - if (not actor.is_enabled() or actor.is_done()) - continue; - if (chosen == 0) { - actor.mark_todo(); - return; - } - chosen--; - } - THROW_IMPOSSIBLE; // One actor should be marked as todo before - } }; } // namespace simgrid::mc