|  |  | @ -69,10 +69,8 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                         auto currLabels = ma->getLabelsOfState(currState); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                         // 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(); | 
			
		
	
		
			
				
					|  |  |  |                             if (!ma->isMarkovianState(predecessor) && !statesToKeep.count(predecessor)) { | 
			
		
	
		
			
				
					|  |  |  |                                 if (labelBehavior == EliminationLabelBehavior::DeleteLabels || labelBehavior == EliminationLabelBehavior::MergeLabels || | 
			
		
	
	
		
			
				
					|  |  | @ -112,10 +110,8 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                     auto currLabels = ma->getLabelsOfState(currState); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     // 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(); | 
			
		
	
		
			
				
					|  |  |  |                         if (!ma->isMarkovianState(predecessor) && !statesToKeep.count(predecessor)) { | 
			
		
	
		
			
				
					|  |  |  |                             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
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             STORM_LOG_TRACE("Elimination Mapping" << std::endl); | 
			
		
	
		
			
				
					|  |  |  |             STORM_LOG_TRACE("Elimination Mapping:"); | 
			
		
	
		
			
				
					|  |  |  |             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); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -171,6 +167,10 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                     } else { | 
			
		
	
		
			
				
					|  |  |  |                         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) { | 
			
		
	
		
			
				
					|  |  |  |                         //add all labels to the label set for the representative
 | 
			
		
	
		
			
				
					|  |  |  |                         for (auto const &label : ma->getLabelsOfState(state)) { | 
			
		
	
	
		
			
				
					|  |  | @ -183,6 +183,10 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                         queue.push(state); | 
			
		
	
		
			
				
					|  |  |  |                         ++currentNewState; | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     if (labelBehavior == EliminationLabelBehavior::DeleteLabels && ma->getInitialStates().get(state)) { | 
			
		
	
		
			
				
					|  |  |  |                         // Keep initial label for 'delete' behavior
 | 
			
		
	
		
			
				
					|  |  |  |                         labelMap[stateRemapping[state]].insert("init"); | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     if (labelBehavior == EliminationLabelBehavior::MergeLabels) { | 
			
		
	
		
			
				
					|  |  |  |                         for (auto const &label : ma->getLabelsOfState(state)) { | 
			
		
	
		
			
				
					|  |  |  |                             labelMap[stateRemapping[state]].insert(label); | 
			
		
	
	
		
			
				
					|  |  | @ -193,10 +197,8 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Build the new MA
 | 
			
		
	
		
			
				
					|  |  |  |             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; | 
			
		
	
		
			
				
					|  |  |  |             //TODO choice labeling
 | 
			
		
	
		
			
				
					|  |  |  |             boost::optional<storm::models::sparse::ChoiceLabeling> newChoiceLabeling; | 
			
		
	
	
		
			
				
					|  |  | @ -217,6 +219,9 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                 queue.pop(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 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) { | 
			
		
	
		
			
				
					|  |  |  |                     labelSet = labelMap[stateRemapping[state]]; | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
	
		
			
				
					|  |  | 
 |