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()])
87 uint64_t incoming = 0;
88 for (
const auto& edge : automaton->
getEdges()) {
89 uint64_t addedTransitions = 1;
90 for (
const auto& dest : edge.getDestinations()) {
91 if (dest.getLocationIndex() == locIndex) {
92 addedTransitions *= outgoing;
95 if (addedTransitions > transitionCountThreshold) {
100 incoming += addedTransitions - 1;
102 uint64_t newEdges = incoming * outgoing;
104 if (newEdges <= minNewEdges) {
105 minNewEdges = newEdges;
106 bestLocIndex = locIndex;
110 if (bestLocIndex == -1) {
113 }
else if (minNewEdges > transitionCountThreshold) {
115 STORM_LOG_TRACE(
"Cannot eliminate more locations without creating too many new transitions (best: " + std::to_string(minNewEdges) +
116 " new transitions)");
119 STORM_LOG_TRACE(
"\tEliminating location " + locName +
" (" + std::to_string(minNewEdges) +
" new edges)");
123 uneliminable[locName] =
true;
127 if (!uneliminable[loc.getName()]) {
128 if (session.
hasLoops(automatonName, loc.getName())) {
129 uneliminable[loc.getName()] =
true;
132 if (restrictToUnnamedActions && session.
hasNamedActions(automatonName, loc.getName())) {
133 uneliminable[loc.getName()] =
true;
144 STORM_LOG_THROW(
true, storm::exceptions::NotImplementedException,
"This elimination order is not yet implemented");