|  |  | @ -369,6 +369,45 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                 return finish[node]; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             template<typename ValueType, typename std::enable_if<storm::NumberTraits<ValueType>::SupportsExponential, int>::type= 0> | 
			
		
	
		
			
				
					|  |  |  |             void SparseMarkovAutomatonCslHelper::identify( | 
			
		
	
		
			
				
					|  |  |  |                     storm::storage::SparseMatrix<ValueType> const &fullTransitionMatrix, | 
			
		
	
		
			
				
					|  |  |  |                     storm::storage::BitVector const &markovianStates, storm::storage::BitVector const& psiStates) { | 
			
		
	
		
			
				
					|  |  |  |                 auto indices = fullTransitionMatrix.getRowGroupIndices(); | 
			
		
	
		
			
				
					|  |  |  |                 bool realProb = false; | 
			
		
	
		
			
				
					|  |  |  |                 bool NDM = false; | 
			
		
	
		
			
				
					|  |  |  |                 bool Alternating = true; | 
			
		
	
		
			
				
					|  |  |  |                 bool probStates = false; | 
			
		
	
		
			
				
					|  |  |  |                 bool markStates = false; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 for (uint64_t i=0; i<fullTransitionMatrix.getRowGroupCount(); i++){ | 
			
		
	
		
			
				
					|  |  |  |                     auto from = indices[i]; | 
			
		
	
		
			
				
					|  |  |  |                     auto to = indices[i+1]; | 
			
		
	
		
			
				
					|  |  |  |                     if (from+1!=to){ | 
			
		
	
		
			
				
					|  |  |  |                         NDM = true; | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     if (!psiStates[i]){ | 
			
		
	
		
			
				
					|  |  |  |                         if (markovianStates[i]){ | 
			
		
	
		
			
				
					|  |  |  |                                 markStates=true; | 
			
		
	
		
			
				
					|  |  |  |                         } else { | 
			
		
	
		
			
				
					|  |  |  |                                probStates=true; | 
			
		
	
		
			
				
					|  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     for (uint64_t j =from; j<to ; j++){ | 
			
		
	
		
			
				
					|  |  |  |                         for (auto& element: fullTransitionMatrix.getRow(j)){ | 
			
		
	
		
			
				
					|  |  |  |                             if (markovianStates[i]==markovianStates[element.getColumn()] && !psiStates[element.getColumn()]){ | 
			
		
	
		
			
				
					|  |  |  |                                 Alternating = false; | 
			
		
	
		
			
				
					|  |  |  |                             } | 
			
		
	
		
			
				
					|  |  |  |                             if (!markovianStates[i] && element.getValue()!=1){ | 
			
		
	
		
			
				
					|  |  |  |                                 realProb = true; | 
			
		
	
		
			
				
					|  |  |  |                             } | 
			
		
	
		
			
				
					|  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 std:: cout << "prob States :" << probStates <<" markovian States: " << markStates << " realProb: "<< realProb << " NDM: " << NDM << " Alternating: " << Alternating << "\n"; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             template <typename ValueType, typename std::enable_if<storm::NumberTraits<ValueType>::SupportsExponential, int>::type=0> | 
			
		
	
		
			
				
					|  |  |  |             storm::storage::BitVector SparseMarkovAutomatonCslHelper::identifyProbCyclesGoalStates(storm::storage::SparseMatrix<ValueType> const& transitionMatrix,  storm::storage::BitVector const& cycleStates) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -465,6 +504,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |             std::vector<ValueType> SparseMarkovAutomatonCslHelper::unifPlus(OptimizationDirection dir, std::pair<double, double> const& boundsPair, std::vector<ValueType> const& exitRateVector, storm::storage::SparseMatrix<ValueType> const& transitionMatrix, storm::storage::BitVector const& markovStates, storm::storage::BitVector const& psiStates, storm::solver::MinMaxLinearEquationSolverFactory<ValueType> const& minMaxLinearEquationSolverFactory){ | 
			
		
	
		
			
				
					|  |  |  |                     STORM_LOG_TRACE("Using UnifPlus to compute bounded until probabilities."); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     std::ofstream logfile("U+logfile.txt", std::ios::app); | 
			
		
	
		
			
				
					|  |  |  |                     ValueType maxNorm = storm::utility::zero<ValueType>(); | 
			
		
	
		
			
				
					|  |  |  |                     ValueType oldDiff = -storm::utility::zero<ValueType>(); | 
			
		
	
	
		
			
				
					|  |  | @ -516,6 +556,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                                     //calculate relative ReachabilityVectors
 | 
			
		
	
		
			
				
					|  |  |  |                                     std::vector<ValueType> in(numberOfStates, 0); | 
			
		
	
		
			
				
					|  |  |  |                                     std::vector<std::vector<ValueType>> relReachability(fullTransitionMatrix.getRowCount(),in); | 
			
		
	
	
		
			
				
					|  |  | @ -588,8 +629,12 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                                         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                                         // calculate poisson distribution
 | 
			
		
	
		
			
				
					|  |  |  |                     std::vector<double> poisson = foxGlynnProb(lambda*T, N, epsilon*kappa); | 
			
		
	
		
			
				
					|  |  |  |                                         std::tuple<uint_fast64_t, uint_fast64_t, ValueType, std::vector<ValueType>> foxGlynnResult = storm::utility::numerical::getFoxGlynnCutoff(T*lambda, 1e+300, epsilon*kappa/ 8.0); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                                         // Scale the weights so they add up to one.
 | 
			
		
	
		
			
				
					|  |  |  |                                         for (auto& element : std::get<3>(foxGlynnResult)) { | 
			
		
	
		
			
				
					|  |  |  |                                             element /= std::get<2>(foxGlynnResult); | 
			
		
	
		
			
				
					|  |  |  |                                         } | 
			
		
	
		
			
				
					|  |  |  |                                         // (4) define vectors/matrices
 | 
			
		
	
		
			
				
					|  |  |  |                                         std::vector<ValueType> init(numberOfStates, -1); | 
			
		
	
		
			
				
					|  |  |  |                                         vd = std::vector<std::vector<ValueType>> (N + 1, init); | 
			
		
	
	
		
			
				
					|  |  | @ -605,9 +650,9 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                                         // (5) calculate vectors and maxNorm
 | 
			
		
	
		
			
				
					|  |  |  |                                         for (uint64_t i = 0; i < numberOfStates; i++) { | 
			
		
	
		
			
				
					|  |  |  |                                             for (uint64_t k = N; k <= N; k--) { | 
			
		
	
		
			
				
					|  |  |  |                                 calculateUnifPlusVector(k,i,0,lambda,probSize,relReachability,dir,unifVectors,fullTransitionMatrix,markovianStates,psiStates,solver, logfile, poisson); | 
			
		
	
		
			
				
					|  |  |  |                                 calculateUnifPlusVector(k,i,2,lambda,probSize,relReachability,dir,unifVectors,fullTransitionMatrix,markovianStates,psiStates,solver, logfile, poisson); | 
			
		
	
		
			
				
					|  |  |  |                                 calculateVu(relReachability,dir,k,i,1,lambda,probSize,unifVectors,fullTransitionMatrix,markovianStates,psiStates,solver, logfile, poisson); | 
			
		
	
		
			
				
					|  |  |  |                                                     calculateUnifPlusVector(k,i,0,lambda,probSize,relReachability,dir,unifVectors,fullTransitionMatrix,markovianStates,psiStates,solver, logfile, std::get<3>(foxGlynnResult)); | 
			
		
	
		
			
				
					|  |  |  |                                                     calculateUnifPlusVector(k,i,2,lambda,probSize,relReachability,dir,unifVectors,fullTransitionMatrix,markovianStates,psiStates,solver, logfile, std::get<3>(foxGlynnResult)); | 
			
		
	
		
			
				
					|  |  |  |                                                     calculateVu(relReachability,dir,k,i,1,lambda,probSize,unifVectors,fullTransitionMatrix,markovianStates,psiStates,solver, logfile, std::get<3>(foxGlynnResult)); | 
			
		
	
		
			
				
					|  |  |  |                                                     //also use iteration to keep maxNorm of vd and vup to date, so the loop-condition is easy to prove
 | 
			
		
	
		
			
				
					|  |  |  |                                                     ValueType diff = std::abs(unifVectors[0][k][i]-unifVectors[1][k][i]); | 
			
		
	
		
			
				
					|  |  |  |                                                     maxNorm  = std::max(maxNorm, diff); | 
			
		
	
	
		
			
				
					|  |  | @ -631,6 +676,7 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                                     logfile.close(); | 
			
		
	
		
			
				
					|  |  |  |                                     return unifVectors[0][0]; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             template <typename ValueType, typename std::enable_if<storm::NumberTraits<ValueType>::SupportsExponential, int>::type> | 
			
		
	
	
		
			
				
					|  |  | 
 |