Skip to content
Snippets Groups Projects
TransitionSet.cpp 2.11 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "TransitionSet.hpp"
    
    #include <limits>
    
    
    TransitionSet::TransitionSet(const std::string & filename)
    {
      FILE * file = std::fopen(filename.c_str(), "r");
    
      if (!file)
        util::myThrow(fmt::format("cannot open file '{}'", filename));
    
    
      char readBuffer[1024];
    
      while (!std::feof(file))
      {
        if (readBuffer != std::fgets(readBuffer, 1024, file))
          break;
    
        std::string transitionName = readBuffer;
        if (transitionName.back() == '\n')
          transitionName.pop_back();
    
        transitions.emplace_back(transitionName);
      }
    
      std::fclose(file);
    }
    
    
    std::vector<std::pair<Transition*, int>> TransitionSet::getAppliableTransitionsCosts(const Config & c)
    
      using Pair = std::pair<Transition*, int>;
    
      std::vector<Pair> appliableTransitions;
    
    
      for (unsigned int i = 0; i < transitions.size(); i++)
        if (transitions[i].appliable(c))
          appliableTransitions.emplace_back(&transitions[i], transitions[i].getCost(c));
    
    
      std::sort(appliableTransitions.begin(), appliableTransitions.end(), 
      [](const Pair & a, const Pair & b)
      {
        return a.second < b.second;
      });
    
      return appliableTransitions;
    }
    
    
    Transition * TransitionSet::getBestAppliableTransition(const Config & c)
    {
      Transition * result = nullptr;
      int bestCost = std::numeric_limits<int>::max();
    
      for (unsigned int i = 0; i < transitions.size(); i++)
      {
        if (!transitions[i].appliable(c))
          continue;
    
        int cost = transitions[i].getCost(c);
    
        if (cost == 0)
          return &transitions[i];
    
        if (cost < bestCost)
        {
          result = &transitions[i];
          bestCost = cost;
        }
      }
    
      return result;
    }
    
    
    std::size_t TransitionSet::size() const
    {
      return transitions.size();
    }
    
    
    std::size_t TransitionSet::getTransitionIndex(const Transition * transition) const
    {
      if (!transition)
        util::myThrow("transition is null");
    
      return transition - &transitions[0];
    }
    
    
    Franck Dary's avatar
    Franck Dary committed
    Transition * TransitionSet::getTransition(std::size_t index)
    {
      return &transitions[index];
    }
    
    
    Transition * TransitionSet::getTransition(const std::string & name)
    {
      for (auto & transition : transitions)
        if (transition.getName() == name)
          return &transition;
    
      return nullptr;
    }