|
@ -69,10 +69,8 @@ namespace storm { |
|
|
auto currLabels = ma->getLabelsOfState(currState); |
|
|
auto currLabels = ma->getLabelsOfState(currState); |
|
|
|
|
|
|
|
|
// Get predecessors from matrix
|
|
|
// Get predecessors from matrix
|
|
|
typename storm::storage::SparseMatrix<ValueType>::rows entriesInRow = backwards.getRow( |
|
|
|
|
|
currState); |
|
|
|
|
|
for (auto entryIt = entriesInRow.begin(), entryIte = entriesInRow.end(); |
|
|
|
|
|
entryIt != entryIte; ++entryIt) { |
|
|
|
|
|
|
|
|
typename storm::storage::SparseMatrix<ValueType>::rows entriesInRow = backwards.getRow(currState); |
|
|
|
|
|
for (auto entryIt = entriesInRow.begin(); entryIt != entriesInRow.end(); ++entryIt) { |
|
|
uint_fast64_t predecessor = entryIt->getColumn(); |
|
|
uint_fast64_t predecessor = entryIt->getColumn(); |
|
|
if (!ma->isMarkovianState(predecessor) && !statesToKeep.count(predecessor)) { |
|
|
if (!ma->isMarkovianState(predecessor) && !statesToKeep.count(predecessor)) { |
|
|
if (labelBehavior == EliminationLabelBehavior::DeleteLabels || labelBehavior == EliminationLabelBehavior::MergeLabels || |
|
|
if (labelBehavior == EliminationLabelBehavior::DeleteLabels || labelBehavior == EliminationLabelBehavior::MergeLabels || |
|
@ -112,10 +110,8 @@ namespace storm { |
|
|
auto currLabels = ma->getLabelsOfState(currState); |
|
|
auto currLabels = ma->getLabelsOfState(currState); |
|
|
|
|
|
|
|
|
// Get predecessors from matrix
|
|
|
// Get predecessors from matrix
|
|
|
typename storm::storage::SparseMatrix<ValueType>::rows entriesInRow = backwards.getRow( |
|
|
|
|
|
currState); |
|
|
|
|
|
for (auto entryIt = entriesInRow.begin(), entryIte = entriesInRow.end(); |
|
|
|
|
|
entryIt != entryIte; ++entryIt) { |
|
|
|
|
|
|
|
|
typename storm::storage::SparseMatrix<ValueType>::rows entriesInRow = backwards.getRow(currState); |
|
|
|
|
|
for (auto entryIt = entriesInRow.begin(); entryIt != entriesInRow.end(); ++entryIt) { |
|
|
uint_fast64_t predecessor = entryIt->getColumn(); |
|
|
uint_fast64_t predecessor = entryIt->getColumn(); |
|
|
if (!ma->isMarkovianState(predecessor) && !statesToKeep.count(predecessor)) { |
|
|
if (!ma->isMarkovianState(predecessor) && !statesToKeep.count(predecessor)) { |
|
|
if (labelBehavior == EliminationLabelBehavior::DeleteLabels || labelBehavior == EliminationLabelBehavior::MergeLabels || |
|
|
if (labelBehavior == EliminationLabelBehavior::DeleteLabels || labelBehavior == EliminationLabelBehavior::MergeLabels || |
|
@ -146,9 +142,9 @@ namespace storm { |
|
|
|
|
|
|
|
|
// At this point, we hopefully have a valid mapping which eliminates a lot of states
|
|
|
// At this point, we hopefully have a valid mapping which eliminates a lot of states
|
|
|
|
|
|
|
|
|
STORM_LOG_TRACE("Elimination Mapping" << std::endl); |
|
|
|
|
|
|
|
|
STORM_LOG_TRACE("Elimination Mapping:"); |
|
|
for (auto entry : eliminationMapping) { |
|
|
for (auto entry : eliminationMapping) { |
|
|
STORM_LOG_TRACE(std::to_string(entry.first) << " -> " << std::to_string(entry.second) << std::endl); |
|
|
|
|
|
|
|
|
STORM_LOG_TRACE(std::to_string(entry.first) << " -> " << std::to_string(entry.second)); |
|
|
} |
|
|
} |
|
|
STORM_LOG_INFO("Eliminating " << eliminationMapping.size() << " states" << std::endl); |
|
|
STORM_LOG_INFO("Eliminating " << eliminationMapping.size() << " states" << std::endl); |
|
|
|
|
|
|
|
@ -171,6 +167,10 @@ namespace storm { |
|
|
} else { |
|
|
} else { |
|
|
stateRemapping[state] = stateRemapping[eliminationMapping[state]]; |
|
|
stateRemapping[state] = stateRemapping[eliminationMapping[state]]; |
|
|
} |
|
|
} |
|
|
|
|
|
if (labelBehavior == EliminationLabelBehavior::DeleteLabels && ma->getInitialStates().get(state)) { |
|
|
|
|
|
// Keep initial label for 'delete' behavior
|
|
|
|
|
|
labelMap[stateRemapping[eliminationMapping[state]]].insert("init"); |
|
|
|
|
|
} |
|
|
if (labelBehavior == EliminationLabelBehavior::MergeLabels) { |
|
|
if (labelBehavior == EliminationLabelBehavior::MergeLabels) { |
|
|
//add all labels to the label set for the representative
|
|
|
//add all labels to the label set for the representative
|
|
|
for (auto const &label : ma->getLabelsOfState(state)) { |
|
|
for (auto const &label : ma->getLabelsOfState(state)) { |
|
@ -183,6 +183,10 @@ namespace storm { |
|
|
queue.push(state); |
|
|
queue.push(state); |
|
|
++currentNewState; |
|
|
++currentNewState; |
|
|
} |
|
|
} |
|
|
|
|
|
if (labelBehavior == EliminationLabelBehavior::DeleteLabels && ma->getInitialStates().get(state)) { |
|
|
|
|
|
// Keep initial label for 'delete' behavior
|
|
|
|
|
|
labelMap[stateRemapping[state]].insert("init"); |
|
|
|
|
|
} |
|
|
if (labelBehavior == EliminationLabelBehavior::MergeLabels) { |
|
|
if (labelBehavior == EliminationLabelBehavior::MergeLabels) { |
|
|
for (auto const &label : ma->getLabelsOfState(state)) { |
|
|
for (auto const &label : ma->getLabelsOfState(state)) { |
|
|
labelMap[stateRemapping[state]].insert(label); |
|
|
labelMap[stateRemapping[state]].insert(label); |
|
@ -193,10 +197,8 @@ namespace storm { |
|
|
|
|
|
|
|
|
// Build the new MA
|
|
|
// Build the new MA
|
|
|
storm::storage::SparseMatrix<ValueType> newTransitionMatrix; |
|
|
storm::storage::SparseMatrix<ValueType> newTransitionMatrix; |
|
|
storm::models::sparse::StateLabeling newStateLabeling( |
|
|
|
|
|
newStateCount); |
|
|
|
|
|
storm::storage::BitVector newMarkovianStates(ma->getNumberOfStates() - eliminationMapping.size(), |
|
|
|
|
|
false); |
|
|
|
|
|
|
|
|
storm::models::sparse::StateLabeling newStateLabeling(newStateCount); |
|
|
|
|
|
storm::storage::BitVector newMarkovianStates(ma->getNumberOfStates() - eliminationMapping.size(),false); |
|
|
std::vector<ValueType> newExitRates; |
|
|
std::vector<ValueType> newExitRates; |
|
|
//TODO choice labeling
|
|
|
//TODO choice labeling
|
|
|
boost::optional<storm::models::sparse::ChoiceLabeling> newChoiceLabeling; |
|
|
boost::optional<storm::models::sparse::ChoiceLabeling> newChoiceLabeling; |
|
@ -217,6 +219,9 @@ namespace storm { |
|
|
queue.pop(); |
|
|
queue.pop(); |
|
|
|
|
|
|
|
|
std::set<std::string> labelSet = ma->getLabelsOfState(state); |
|
|
std::set<std::string> labelSet = ma->getLabelsOfState(state); |
|
|
|
|
|
if (labelBehavior == EliminationLabelBehavior::DeleteLabels) { |
|
|
|
|
|
labelSet.insert(labelMap[stateRemapping[state]].begin(), labelMap[stateRemapping[state]].end()); |
|
|
|
|
|
} |
|
|
if (labelBehavior == EliminationLabelBehavior::MergeLabels) { |
|
|
if (labelBehavior == EliminationLabelBehavior::MergeLabels) { |
|
|
labelSet = labelMap[stateRemapping[state]]; |
|
|
labelSet = labelMap[stateRemapping[state]]; |
|
|
} |
|
|
} |
|
|