10 uint32_t transitionCountThreshold,
bool restrictToUnnamedActions)
11 : automatonName(automatonName),
12 eliminationOrder(order),
13 restrictToUnnamedActions(restrictToUnnamedActions),
14 transitionCountThreshold(transitionCountThreshold) {}
22 switch (eliminationOrder) {
24 STORM_LOG_THROW(!restrictToUnnamedActions, storm::exceptions::NotImplementedException,
25 "Cannot perform automatic elimination if restrictToUnnamedActions is true and elimination order is arbitrary.");
28 if (session.
isEliminable(automatonName, loc.getName())) {
43 std::map<std::string, bool> uneliminable;
47 bool partOfProp = session.
isPartOfProp(automatonName, loc.getName());
48 bool hasLoops = session.
hasLoops(automatonName, loc.getName());
50 bool hasNamedAction = restrictToUnnamedActions && session.
hasNamedActions(automatonName, loc.getName());
52 bool isUneliminable = possiblyInitial || partOfProp || hasLoops || isDeadlock || hasNamedAction;
53 uneliminable.insert(std::pair<std::string, bool>(loc.getName(), isUneliminable));
55 std::string eliminationStatus =
"";
57 eliminationStatus +=
"Uneliminable (";
59 eliminationStatus +=
"initial, ";
61 eliminationStatus +=
"part of prop, ";
63 eliminationStatus +=
"has loops, ";
65 eliminationStatus +=
"has no outgoing edges, ";
67 eliminationStatus +=
"has named action, ";
68 eliminationStatus = eliminationStatus.substr(0, eliminationStatus.size() - 2) +
")";
70 eliminationStatus +=
"Eliminable";
72 return eliminationStatus;
79 uint64_t minNewEdges = 18446744073709551615U;
80 int bestLocIndex = -1;
82 if (uneliminable[loc.getName()]) {
88 uint64_t incoming = 0;
89 for (
const auto& edge : automaton->
getEdges()) {
90 uint64_t addedTransitions = 1;
91 for (
const auto& dest : edge.getDestinations()) {
92 if (dest.getLocationIndex() == locIndex) {
93 addedTransitions *= outgoing;
96 if (addedTransitions > transitionCountThreshold) {
101 incoming += addedTransitions - 1;
103 uint64_t newEdges = incoming * outgoing;
105 if (newEdges <= minNewEdges) {
106 minNewEdges = newEdges;
107 bestLocIndex = locIndex;
111 if (bestLocIndex == -1) {
114 }
else if (minNewEdges > transitionCountThreshold) {
116 STORM_LOG_TRACE(
"Cannot eliminate more locations without creating too many new transitions (best: " + std::to_string(minNewEdges) +
117 " new transitions)");
120 STORM_LOG_TRACE(
"\tEliminating location " + locName +
" (" + std::to_string(minNewEdges) +
" new edges)");
124 uneliminable[locName] =
true;
128 if (!uneliminable[loc.getName()]) {
129 if (session.
hasLoops(automatonName, loc.getName())) {
130 uneliminable[loc.getName()] =
true;
133 if (restrictToUnnamedActions && session.
hasNamedActions(automatonName, loc.getName())) {
134 uneliminable[loc.getName()] =
true;
145 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"This elimination order is not yet implemented.");