|  |  | @ -117,7 +117,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                         STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException, "The uniformization rate must be positive."); | 
			
		
	
		
			
				
					|  |  |  |                          | 
			
		
	
		
			
				
					|  |  |  |                         // Compute the uniformized matrix.
 | 
			
		
	
		
			
				
					|  |  |  |                         storm::storage::SparseMatrix<ValueType> uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), statesWithProbabilityGreater0NonPsi, storm::storage::BitVector(this->getModel().getNumberOfStates()), uniformizationRate, exitRates); | 
			
		
	
		
			
				
					|  |  |  |                         storm::storage::SparseMatrix<ValueType> uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), statesWithProbabilityGreater0NonPsi, uniformizationRate, exitRates); | 
			
		
	
		
			
				
					|  |  |  |                          | 
			
		
	
		
			
				
					|  |  |  |                         // Compute the vector that is to be added as a compensation for removing the absorbing states.
 | 
			
		
	
		
			
				
					|  |  |  |                         std::vector<ValueType> b = this->getModel().getTransitionMatrix().getConstrainedRowSumVector(statesWithProbabilityGreater0NonPsi, psiStates); | 
			
		
	
	
		
			
				
					|  |  | @ -153,7 +153,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                         STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException, "The uniformization rate must be positive."); | 
			
		
	
		
			
				
					|  |  |  |                          | 
			
		
	
		
			
				
					|  |  |  |                         // Compute the uniformized matrix.
 | 
			
		
	
		
			
				
					|  |  |  |                         storm::storage::SparseMatrix<ValueType> uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), relevantStates, storm::storage::BitVector(result.size()), uniformizationRate, exitRates); | 
			
		
	
		
			
				
					|  |  |  |                         storm::storage::SparseMatrix<ValueType> uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), relevantStates, uniformizationRate, exitRates); | 
			
		
	
		
			
				
					|  |  |  |                          | 
			
		
	
		
			
				
					|  |  |  |                         // Compute the transient probabilities.
 | 
			
		
	
		
			
				
					|  |  |  |                         subResult = this->computeTransientProbabilities(uniformizedMatrix, nullptr, lowerBound, uniformizationRate, subResult, *this->linearEquationSolverFactory); | 
			
		
	
	
		
			
				
					|  |  | @ -171,7 +171,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                         std::vector<ValueType> newSubresult; | 
			
		
	
		
			
				
					|  |  |  |                          | 
			
		
	
		
			
				
					|  |  |  |                         if (lowerBound == upperBound) { | 
			
		
	
		
			
				
					|  |  |  |                             relevantStates = statesWithProbabilityGreater0NonPsi; | 
			
		
	
		
			
				
					|  |  |  |                             relevantStates = statesWithProbabilityGreater0; | 
			
		
	
		
			
				
					|  |  |  |                         } else { | 
			
		
	
		
			
				
					|  |  |  |                             // Find the maximal rate of all 'maybe' states to take it as the uniformization rate.
 | 
			
		
	
		
			
				
					|  |  |  |                             uniformizationRate = 0; | 
			
		
	
	
		
			
				
					|  |  | @ -182,7 +182,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                             STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException, "The uniformization rate must be positive."); | 
			
		
	
		
			
				
					|  |  |  |                              | 
			
		
	
		
			
				
					|  |  |  |                             // Compute the (first) uniformized matrix.
 | 
			
		
	
		
			
				
					|  |  |  |                             uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), statesWithProbabilityGreater0NonPsi, storm::storage::BitVector(this->getModel().getNumberOfStates()), uniformizationRate, exitRates); | 
			
		
	
		
			
				
					|  |  |  |                             uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), statesWithProbabilityGreater0NonPsi, uniformizationRate, exitRates); | 
			
		
	
		
			
				
					|  |  |  |                              | 
			
		
	
		
			
				
					|  |  |  |                             // Compute the vector that is to be added as a compensation for removing the absorbing states.
 | 
			
		
	
		
			
				
					|  |  |  |                             std::vector<ValueType> b = this->getModel().getTransitionMatrix().getConstrainedRowSumVector(statesWithProbabilityGreater0NonPsi, psiStates); | 
			
		
	
	
		
			
				
					|  |  | @ -194,11 +194,6 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                             std::vector<ValueType> values(statesWithProbabilityGreater0NonPsi.getNumberOfSetBits(), storm::utility::zero<ValueType>()); | 
			
		
	
		
			
				
					|  |  |  |                             std::vector<ValueType> subresult = this->computeTransientProbabilities(uniformizedMatrix, &b, upperBound - lowerBound, uniformizationRate, values, *this->linearEquationSolverFactory); | 
			
		
	
		
			
				
					|  |  |  |                              | 
			
		
	
		
			
				
					|  |  |  |                             std::cout << "subresult" << std::endl; | 
			
		
	
		
			
				
					|  |  |  |                             for (auto const& element : subresult) { | 
			
		
	
		
			
				
					|  |  |  |                                 std::cout << element << std::endl; | 
			
		
	
		
			
				
					|  |  |  |                             } | 
			
		
	
		
			
				
					|  |  |  |                              | 
			
		
	
		
			
				
					|  |  |  |                             // Determine the set of states that must be considered further.
 | 
			
		
	
		
			
				
					|  |  |  |                             relevantStates = storm::utility::vector::filterGreaterZero(subresult); | 
			
		
	
		
			
				
					|  |  |  |                             relevantStates = storm::utility::graph::performProbGreater0(uniformizedMatrix.transpose(), phiStates % statesWithProbabilityGreater0NonPsi, relevantStates & (phiStates % statesWithProbabilityGreater0NonPsi)); | 
			
		
	
	
		
			
				
					|  |  | @ -217,18 +212,14 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                         STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException, "The uniformization rate must be positive."); | 
			
		
	
		
			
				
					|  |  |  |                          | 
			
		
	
		
			
				
					|  |  |  |                         // If the lower and upper bounds coincide, we have only determined the relevant states at this
 | 
			
		
	
		
			
				
					|  |  |  |                         // point, but we still need to construct the starting vector that needs to be scaled with the
 | 
			
		
	
		
			
				
					|  |  |  |                         // (just recently) determined uniformization rate.
 | 
			
		
	
		
			
				
					|  |  |  |                         // point, but we still need to construct the starting vector.
 | 
			
		
	
		
			
				
					|  |  |  |                         if (lowerBound == upperBound) { | 
			
		
	
		
			
				
					|  |  |  |                             newSubresult = this->getModel().getTransitionMatrix().getConstrainedRowSumVector(relevantStates, psiStates); | 
			
		
	
		
			
				
					|  |  |  |                             for (auto& element : newSubresult) { | 
			
		
	
		
			
				
					|  |  |  |                                 element /= uniformizationRate; | 
			
		
	
		
			
				
					|  |  |  |                                 std::cout << "new element: " << element << std::endl; | 
			
		
	
		
			
				
					|  |  |  |                             } | 
			
		
	
		
			
				
					|  |  |  |                             newSubresult = std::vector<ValueType>(relevantStates.getNumberOfSetBits()); | 
			
		
	
		
			
				
					|  |  |  |                             storm::utility::vector::setVectorValues(newSubresult, psiStates % statesWithProbabilityGreater0, storm::utility::one<ValueType>()); | 
			
		
	
		
			
				
					|  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |                          | 
			
		
	
		
			
				
					|  |  |  |                         // Finally, we compute the second set of transient probabilities.
 | 
			
		
	
		
			
				
					|  |  |  |                         uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), relevantStates, storm::storage::BitVector(this->getModel().getNumberOfStates()), uniformizationRate, exitRates); | 
			
		
	
		
			
				
					|  |  |  |                         uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), relevantStates, uniformizationRate, exitRates); | 
			
		
	
		
			
				
					|  |  |  |                         newSubresult = this->computeTransientProbabilities(uniformizedMatrix, nullptr, lowerBound, uniformizationRate, newSubresult, *this->linearEquationSolverFactory); | 
			
		
	
		
			
				
					|  |  |  |                          | 
			
		
	
		
			
				
					|  |  |  |                         // Fill in the correct values.
 | 
			
		
	
	
		
			
				
					|  |  | @ -243,7 +234,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |          | 
			
		
	
		
			
				
					|  |  |  |         template<class ValueType> | 
			
		
	
		
			
				
					|  |  |  |         storm::storage::SparseMatrix<ValueType> SparseCtmcCslModelChecker<ValueType>::computeUniformizedMatrix(storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::BitVector const& maybeStates, storm::storage::BitVector const& absorbingStates, ValueType uniformizationRate, std::vector<ValueType> const& exitRates) { | 
			
		
	
		
			
				
					|  |  |  |         storm::storage::SparseMatrix<ValueType> SparseCtmcCslModelChecker<ValueType>::computeUniformizedMatrix(storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::BitVector const& maybeStates, ValueType uniformizationRate, std::vector<ValueType> const& exitRates) { | 
			
		
	
		
			
				
					|  |  |  |             STORM_LOG_DEBUG("Computing uniformized matrix using uniformization rate " << uniformizationRate << "."); | 
			
		
	
		
			
				
					|  |  |  |             STORM_LOG_DEBUG("Keeping " << maybeStates.getNumberOfSetBits() << " rows."); | 
			
		
	
		
			
				
					|  |  |  |              | 
			
		
	
	
		
			
				
					|  |  | @ -251,11 +242,6 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |             // psi states) and reserve space for elements on the diagonal.
 | 
			
		
	
		
			
				
					|  |  |  |             storm::storage::SparseMatrix<ValueType> uniformizedMatrix = transitionMatrix.getSubmatrix(false, maybeStates, maybeStates, true); | 
			
		
	
		
			
				
					|  |  |  |              | 
			
		
	
		
			
				
					|  |  |  |             if (!absorbingStates.empty()) { | 
			
		
	
		
			
				
					|  |  |  |                 // Make the appropriate states absorbing.
 | 
			
		
	
		
			
				
					|  |  |  |                 uniformizedMatrix.makeRowsAbsorbing(absorbingStates % maybeStates); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |              | 
			
		
	
		
			
				
					|  |  |  |             // Now we need to perform the actual uniformization. That is, all entries need to be divided by
 | 
			
		
	
		
			
				
					|  |  |  |             // the uniformization rate, and the diagonal needs to be set to the negative exit rate of the
 | 
			
		
	
		
			
				
					|  |  |  |             // state plus the self-loop rate and then increased by one.
 | 
			
		
	
	
		
			
				
					|  |  | @ -263,11 +249,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |             for (auto const& state : maybeStates) { | 
			
		
	
		
			
				
					|  |  |  |                 for (auto& element : uniformizedMatrix.getRow(currentRow)) { | 
			
		
	
		
			
				
					|  |  |  |                     if (element.getColumn() == currentRow) { | 
			
		
	
		
			
				
					|  |  |  |                         if (absorbingStates.get(state)) { | 
			
		
	
		
			
				
					|  |  |  |                             // Nothing to do here, since the state has already been made absorbing.
 | 
			
		
	
		
			
				
					|  |  |  |                         } else { | 
			
		
	
		
			
				
					|  |  |  |                             element.setValue(-(exitRates[state] - element.getValue()) / uniformizationRate + storm::utility::one<ValueType>()); | 
			
		
	
		
			
				
					|  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |                         element.setValue(-(exitRates[state] - element.getValue()) / uniformizationRate + storm::utility::one<ValueType>()); | 
			
		
	
		
			
				
					|  |  |  |                     } else { | 
			
		
	
		
			
				
					|  |  |  |                         element.setValue(element.getValue() / uniformizationRate); | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
	
		
			
				
					|  |  | @ -388,7 +370,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                 uniformizationRate *= 1.02; | 
			
		
	
		
			
				
					|  |  |  |                 STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException, "The uniformization rate must be positive."); | 
			
		
	
		
			
				
					|  |  |  |                  | 
			
		
	
		
			
				
					|  |  |  |                 storm::storage::SparseMatrix<ValueType> uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), storm::storage::BitVector(this->getModel().getNumberOfStates(), true), storm::storage::BitVector(this->getModel().getNumberOfStates()), uniformizationRate, this->getModel().getExitRateVector()); | 
			
		
	
		
			
				
					|  |  |  |                 storm::storage::SparseMatrix<ValueType> uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), storm::storage::BitVector(this->getModel().getNumberOfStates(), true), uniformizationRate, this->getModel().getExitRateVector()); | 
			
		
	
		
			
				
					|  |  |  |                 result = this->computeTransientProbabilities(uniformizedMatrix, nullptr, timeBound, uniformizationRate, result, *this->linearEquationSolverFactory); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |              | 
			
		
	
	
		
			
				
					|  |  | @ -420,7 +402,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |             uniformizationRate *= 1.02; | 
			
		
	
		
			
				
					|  |  |  |             STORM_LOG_THROW(uniformizationRate > 0, storm::exceptions::InvalidStateException, "The uniformization rate must be positive."); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             storm::storage::SparseMatrix<ValueType> uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), storm::storage::BitVector(this->getModel().getNumberOfStates(), true), storm::storage::BitVector(this->getModel().getNumberOfStates()), uniformizationRate, this->getModel().getExitRateVector()); | 
			
		
	
		
			
				
					|  |  |  |             storm::storage::SparseMatrix<ValueType> uniformizedMatrix = this->computeUniformizedMatrix(this->getModel().getTransitionMatrix(), storm::storage::BitVector(this->getModel().getNumberOfStates(), true), uniformizationRate, this->getModel().getExitRateVector()); | 
			
		
	
		
			
				
					|  |  |  |              | 
			
		
	
		
			
				
					|  |  |  |             // Compute the total state reward vector.
 | 
			
		
	
		
			
				
					|  |  |  |             std::vector<ValueType> totalRewardVector; | 
			
		
	
	
		
			
				
					|  |  | 
 |