| 
					
					
						
							
						
					
					
				 | 
				@ -521,8 +521,6 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                    myfile << "\t" << i << " -> " << first.getColumn() << "[label=\"" << first.getValue() << "\"];" | 
				 | 
				 | 
				                    myfile << "\t" << i << " -> " << first.getColumn() << "[label=\"" << first.getValue() << "\"];" | 
			
		
		
	
		
			
				 | 
				 | 
				                           << std::endl; | 
				 | 
				 | 
				                           << std::endl; | 
			
		
		
	
		
			
				 | 
				 | 
				                } | 
				 | 
				 | 
				                } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				            myfile << "\tsubgraph legend {" << std::endl; | 
				 | 
				 | 
				            myfile << "\tsubgraph legend {" << std::endl; | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -615,129 +613,11 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                latticeWatch.stop(); | 
				 | 
				 | 
				                latticeWatch.stop(); | 
			
		
		
	
		
			
				 | 
				 | 
				                STORM_PRINT(std::endl << "Time for lattice creation: " << latticeWatch << "." << std::endl << std::endl); | 
				 | 
				 | 
				                STORM_PRINT(std::endl << "Time for lattice creation: " << latticeWatch << "." << std::endl << std::endl); | 
			
		
		
	
		
			
				 | 
				 | 
				                ofstream myfile; | 
				 | 
				 | 
				                ofstream myfile; | 
			
		
		
	
		
			
				 | 
				 | 
				                myfile.open ("lattice.dot"); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                lattice->toDotFile(myfile); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                myfile.close(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                // CriticalStates
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                //TODO: what if states not found in lattice/cyclic thingie
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                storm::storage::SparseMatrix<ValueType> matrix = sparseModel.get()->getTransitionMatrix(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                //TODO: separate class
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                storm::utility::Stopwatch criticalStatesWatch(true); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                storm::storage::BitVector criticalStates = storm::storage::BitVector(sparseModel.get()->getNumberOfStates()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                for (uint_fast64_t i = 0; i < sparseModel.get()->getNumberOfStates(); ++i) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    auto row = matrix.getRow(i); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    auto first = (*row.begin()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    if (first.getValue() != ValueType(1)) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        auto second = (*(++row.begin())); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        string color = ""; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        auto val = first.getValue(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        auto vars = val.gatherVariables(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        for (auto itr = vars.begin(); itr != vars.end(); ++itr) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            auto compare = lattice->compare(first.getColumn(), second.getColumn()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            if (compare != 1 && compare != 2 && compare !=0) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                if (storm::utility::parameterlifting::validateParameterLiftingSound(*(sparseModel.get()), *((formulas[0]).get()))) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    //TODO: parameterlifting gebruiken om te kijken op kans op =) vanuit first.getCOlumn() en second.getColumn()
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    // als vanuit first.getColumn() >= second.getColumn() voor =) dan  lattice->addRelation(lattice->getNode(first.getColumn()),
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    //                                                                     lattice->getNode(i),
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    //                                                                     lattice->getNode(second.getColumn()));
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    // als vanuit second.getColumn() >= first.getColumn() voor =) dan  lattice->addRelation(lattice->getNode(second.getColumn()),
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    //                                                                     lattice->getNode(i),
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    //                                                                     lattice->getNode(first.getColumn()));
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    auto modelParameters = storm::models::sparse::getProbabilityParameters(*sparseModel); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    auto rewParameters = storm::models::sparse::getRewardParameters(*sparseModel); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    modelParameters.insert(rewParameters.begin(), rewParameters.end()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				//                                    auto regionChecker = storm::api::initializeParameterLiftingRegionModelChecker<ValueType, storm::RationalNumber>(Environment(), sparseModel, storm::api::createTask<storm::RationalFunction>(formulas[0], true));
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				//
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				//                                    //start testing
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				//                                    auto allSatRegion=storm::api::parseRegion<storm::RationalFunction>("0.7<=pL<=0.9,0.75<=pK<=0.95", modelParameters);
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				//                                    auto exBothRegion=storm::api::parseRegion<storm::RationalFunction>("0.4<=pL<=0.65,0.75<=pK<=0.95", modelParameters);
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				//                                    auto allVioRegion=storm::api::parseRegion<storm::RationalFunction>("0.1<=pL<=0.73,0.2<=pK<=0.715", modelParameters);
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				//                                    if (storm::modelchecker::RegionResult::AllSat == regionChecker->analyzeRegion(Environment(), allSatRegion, storm::modelchecker::RegionResultHypothesis::Unknown, storm::modelchecker::RegionResult::Unknown, true)) {
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				//                                        std::cout << "Tralalala" << std::endl;
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				//                                    }
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                auto rowFirst = matrix.getRow(first.getColumn()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                while ((*rowFirst.begin()).getValue() == ValueType(1)) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    rowFirst = matrix.getRow((*rowFirst.begin()).getColumn()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                auto rowSecond = matrix.getRow(second.getColumn()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                while ((*rowSecond.begin()).getValue() == ValueType(1)) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    rowSecond = matrix.getRow((*rowSecond.begin()).getColumn()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                auto succF1 = *rowFirst.begin(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                auto succF2 = *(++rowFirst.begin()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                auto compareF = lattice->compare(succF1.getColumn(), succF2.getColumn()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                ValueType valF; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                ValueType valS; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                if (compareF == 1) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    valF = succF1.getValue(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                } else if (compareF == 2) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    valF = succF2.getValue(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                } else { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    continue; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                auto succS1 = *rowSecond.begin(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                auto succS2 = *(++rowSecond.begin()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                auto compareS = lattice->compare(succS1.getColumn(), succS2.getColumn()); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                if (compareS == 1) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    valS = succS1.getValue(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                } else if (compareS == 2) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    valS = succS2.getValue(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                } else { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    continue; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                storm::RationalFunction diff = valF-valS; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                auto vars = diff.gatherVariables(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                if (vars.size() == 1) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    for (auto varsItr = vars.begin(); varsItr != vars.end(); ++varsItr) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                        ValueType derivative = diff.derivative(*varsItr); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                        if (derivative.isConstant()) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                            std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> sub0; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                            sub0.emplace(*varsItr, | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                                         storm::utility::convertNumber<storm::RationalFunctionCoefficient>( | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                                                 std::string("0"))); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                            std::map<storm::RationalFunctionVariable, storm::RationalFunctionCoefficient> sub1; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                            sub1.emplace(*varsItr, | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                                         storm::utility::convertNumber<storm::RationalFunctionCoefficient>( | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                                                 std::string("1"))); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                            if (diff.evaluate(sub0) >= 0 && diff.evaluate(sub1) >= 0) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                                lattice->addRelation(lattice->getNode(first.getColumn()), | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                                                     lattice->getNode(i), | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                                                     lattice->getNode(second.getColumn())); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                            } else if (diff.evaluate(sub0) <= 0 && diff.evaluate(sub1) <= 0) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                                lattice->addRelation(lattice->getNode(second.getColumn()), | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                                                     lattice->getNode(i), | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                                                     lattice->getNode(first.getColumn())); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                            } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                        } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                    } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                criticalStatesWatch.stop(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                STORM_PRINT(std::endl << "Time for critical states checking: " << criticalStatesWatch << "." << std::endl << std::endl); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                myfile.open ("lattice.dot"); | 
				 | 
				 | 
				                myfile.open ("lattice.dot"); | 
			
		
		
	
		
			
				 | 
				 | 
				                lattice->toDotFile(myfile); | 
				 | 
				 | 
				                lattice->toDotFile(myfile); | 
			
		
		
	
		
			
				 | 
				 | 
				                myfile.close(); | 
				 | 
				 | 
				                myfile.close(); | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                // Monotonicity?
 | 
				 | 
				 | 
				                // Monotonicity?
 | 
			
		
		
	
		
			
				 | 
				 | 
				                storm::utility::Stopwatch monotonicityWatch(true); | 
				 | 
				 | 
				                storm::utility::Stopwatch monotonicityWatch(true); | 
			
		
		
	
		
			
				 | 
				 | 
				                std::map<carl::Variable, std::pair<bool, bool>> varsMonotone = analyseMonotonicity<ValueType>(lattice, matrix); | 
				 | 
				 | 
				                std::map<carl::Variable, std::pair<bool, bool>> varsMonotone = analyseMonotonicity<ValueType>(lattice, matrix); | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -746,14 +626,14 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				                for (auto itr = varsMonotone.begin(); itr != varsMonotone.end(); ++itr) { | 
				 | 
				 | 
				                for (auto itr = varsMonotone.begin(); itr != varsMonotone.end(); ++itr) { | 
			
		
		
	
		
			
				 | 
				 | 
				                    if (itr->second.first) { | 
				 | 
				 | 
				                    if (itr->second.first) { | 
			
		
		
	
		
			
				 | 
				 | 
				                        std::cout << "Monotone increasing in: " << itr->first << std::endl; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        STORM_PRINT("Monotone increasing in: " << itr->first << std::endl); | 
			
		
		
	
		
			
				 | 
				 | 
				                    } else { | 
				 | 
				 | 
				                    } else { | 
			
		
		
	
		
			
				 | 
				 | 
				                        std::cout << "Do not know if monotone increasing in: " << itr->first << std::endl; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        STORM_PRINT("Do not know if monotone increasing in: " << itr->first << std::endl); | 
			
		
		
	
		
			
				 | 
				 | 
				                    } | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				                    if (itr->second.second) { | 
				 | 
				 | 
				                    if (itr->second.second) { | 
			
		
		
	
		
			
				 | 
				 | 
				                        std::cout << "Monotone decreasing in: " << itr->first << std::endl; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        STORM_PRINT("Monotone decreasing in: " << itr->first << std::endl); | 
			
		
		
	
		
			
				 | 
				 | 
				                    } else { | 
				 | 
				 | 
				                    } else { | 
			
		
		
	
		
			
				 | 
				 | 
				                        std::cout << "Do not know if monotone decreasing in: " << itr->first << std::endl; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        STORM_PRINT("Do not know if monotone decreasing in: " << itr->first << std::endl); | 
			
		
		
	
		
			
				 | 
				 | 
				                    } | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				                } | 
				 | 
				 | 
				                } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |