#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; }