| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -443,45 +443,6 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            storm::pars::verifyWithSparseEngine<ValueType>(model->as<storm::models::sparse::Model<ValueType>>(), input, regions, samples); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template <typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ValueType getProbability(uint_fast64_t state, uint_fast64_t successor, storm::storage::SparseMatrix<ValueType>  matrix) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            ValueType result = ValueType(1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // Iterate over all row groups.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            auto row = matrix.getRow(state); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            for (auto itr = row.begin(); itr < row.end() && result == ValueType(1); ++itr) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if ((*itr).getColumn() == successor) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    result = (*itr).getValue(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return result; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template <typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ValueType getProbability(storm::storage::BitVector state, uint_fast64_t successor, storm::storage::SparseMatrix<ValueType>  matrix) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            ValueType result = ValueType(1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            uint_fast64_t index = state.getNextSetIndex(0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            while (index < state.size() && result == ValueType(1)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                result = getProbability(index, successor, matrix); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                index = state.getNextSetIndex(index+1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return result; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template <typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ValueType getProbability(storm::storage::BitVector state, storm::storage::BitVector successor, storm::storage::SparseMatrix<ValueType>  matrix) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            ValueType result = ValueType(1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            uint_fast64_t index = successor.getNextSetIndex(0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            while (index < successor.size() && result == ValueType(1)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                result = getProbability(state, index, matrix); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                index = successor.getNextSetIndex(index+1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return result; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template <typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        storm::analysis::Lattice* toLattice(std::shared_ptr<storm::models::sparse::Model<ValueType>> model, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                                   storm::storage::BitVector topStates, | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -541,37 +502,12 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                successor1 = successor2; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                successor2 = temp; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            // Additional check, if states have the same probability of reaching a given next state,
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            // then they should be at the same node
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            // TODO: can this be removed, e.g. adding a step to preprocessing, making this superfluous
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            // TODO: 1 prob. and same probs to same states should be removed from matrix
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                            storm::analysis::Lattice::Node *above = lattice->getNode(successor1);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                            storm::analysis::Lattice::Node *below = lattice->getNode(successor2);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                            std::vector<storm::analysis::Lattice::Node *> states1 = above->below;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                            std::vector<storm::analysis::Lattice::Node *> states2 = below->above;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                            for (auto itr1 = states1.begin(); itr1 < states1.end(); ++itr1) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                for (auto itr2 = states2.begin(); itr2 < states2.end(); ++itr2) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                    if ((*itr1)->states == (*itr2)->states) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                        ValueType prob1 = getProbability(currentState->stateNumber, successor1, matrix);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                        ValueType prob2 = getProbability(currentState->stateNumber, successor2, matrix);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                        if (prob1 != ValueType(1)
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                            && prob2 != ValueType(1)
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                            && getProbability((*itr1)->states, above->states, matrix) == prob1
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                            && getProbability((*itr1)->states, below->states, matrix) == prob2) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                            lattice->addToNode(currentState->stateNumber, (*itr1));
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                            seenStates.set(currentState->stateNumber);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                        }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                    }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                                }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//                            }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            if (!seenStates.get(currentState->stateNumber)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                // successor 1 is closer to top than successor 2
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                lattice->addBetween(currentState->stateNumber, lattice->getNode(successor1), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                                    lattice->getNode(successor2)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                // Add stateNumber to the set with seen states.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                seenStates.set(currentState->stateNumber); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            // successor 1 is closer to top than successor 2
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            lattice->addBetween(currentState->stateNumber, lattice->getNode(successor1), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                                lattice->getNode(successor2)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            // Add stateNumber to the set with seen states.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            seenStates.set(currentState->stateNumber); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        } else if (compareResult == 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            // the successors are at the same level
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            lattice->addToNode(currentState->stateNumber, lattice->getNode(successor1)); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -651,7 +587,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 = storm::utility::graph::performProb01(sparseModel.get()->getBackwardTransitions(), phiStates, psiStates); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                storm::storage::BitVector topStates = statesWithProbability01.second; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                storm::storage::BitVector bottomStates = statesWithProbability01.first; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Transform to LatticeLattice
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                storm::analysis::Lattice* lattice = toLattice(sparseModel, topStates, bottomStates); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                lattice->toString(std::cout); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -690,7 +626,7 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    std::cout << "Monotone increasing in all parameters" << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // TODO: split into monotonicity in different parameters
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::cout << "Bye, Jip" << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::cout << "Bye, Jip2" << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |