Newer
Older
TransitionSet::TransitionSet(const std::string & filename)
{
FILE * file = std::fopen(filename.c_str(), "r");
Franck Dary
committed
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;
}