Skip to content
Snippets Groups Projects
TransitionSet.cpp 1.57 KiB
Newer Older
#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;
}