else
THROW_IMPOSSIBLE;
- recipe_ = std::list<Transition*>();
-
remote_app.get_actors_status(strategy_->actors_to_run_);
#if SIMGRID_HAVE_STATEFUL_MC
THROW_IMPOSSIBLE;
*strategy_ = *(parent_state->strategy_);
- recipe_ = std::list(parent_state_->get_recipe());
- recipe_.push_back(incoming_transition_.get());
-
remote_app.get_actors_status(strategy_->actors_to_run_);
#if SIMGRID_HAVE_STATEFUL_MC /* Stateful model checking */
return count;
}
+std::deque<Transition*>& State::get_recipe()
+{
+ if (recipe_.empty()) {
+ for (auto* s = this; s != nullptr; s = s->get_parent_state().get())
+ if (s->get_transition_in() != nullptr)
+ recipe_.push_front(s->get_transition_in().get());
+ }
+ return recipe_;
+}
+
aid_t State::next_transition() const
{
XBT_DEBUG("Search for an actor to run. %zu actors to consider", strategy_->actors_to_run_.size());
std::shared_ptr<Transition> incoming_transition_ = nullptr;
/** @brief A list of transition to be replayed in order to get in this state. */
- std::list<Transition*> recipe_;
+ std::deque<Transition*> recipe_{};
/** Sequential state ID (used for debugging) */
long num_ = 0;
bool is_actor_done(aid_t actor) const { return strategy_->actors_to_run_.at(actor).is_done(); }
std::shared_ptr<Transition> get_transition_out() const { return outgoing_transition_; }
+ std::shared_ptr<Transition> get_transition_in() const { return incoming_transition_; }
std::shared_ptr<State> get_parent_state() const { return parent_state_; }
- std::list<Transition*> get_recipe() const { return recipe_; }
+ std::deque<Transition*>& get_recipe();
std::map<aid_t, ActorState> const& get_actors_list() const { return strategy_->actors_to_run_; }