| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -49,8 +49,6 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            bool exact; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					         | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        template <typename ValueType> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        std::vector<storm::storage::ParameterRegion<ValueType>> parseRegions(std::shared_ptr<storm::models::ModelBase> const& model) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            std::vector<storm::storage::ParameterRegion<ValueType>> result; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -519,8 +517,10 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Monotonicity?
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                storm::utility::Stopwatch monotonicityWatch(true); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Map with for each variable bool whether it is monotonic or not (assume montone increasing)
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::map<carl::Variable, bool> varsMonotoneIncr; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::map<carl::Variable, bool> varsMonotoneDecr; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                bool monotoneInAll = true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                for (uint_fast64_t i = 0; i < sparseModel.get()->getNumberOfStates(); ++i) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    // go over all rows
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    auto row = matrix.getRow(i); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -536,12 +536,19 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            auto derivative = val.derivative(*itr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            STORM_LOG_THROW(derivative.isConstant(), storm::exceptions::NotSupportedException, "Expecting probability to have at most degree 1"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            auto compare = lattice->compare(first.getColumn(), second.getColumn()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            if (varsMonotoneIncr.find(*itr) == varsMonotoneIncr.end()) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                varsMonotoneIncr[*itr] = true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                varsMonotoneDecr[*itr] = true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            if (compare == 1) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                monotoneInAll &=derivative.constantPart() >= 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                varsMonotoneIncr.find(*itr)->second &=derivative.constantPart() >= 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                varsMonotoneDecr.find(*itr)->second &=derivative.constantPart() <= 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            } else if (compare == 2) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                monotoneInAll &=derivative.constantPart() <= 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                varsMonotoneIncr.find(*itr)->second &= derivative.constantPart() <= 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                varsMonotoneDecr.find(*itr)->second &= derivative.constantPart() >= 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                monotoneInAll = false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                varsMonotoneIncr.find(*itr)->second = false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                varsMonotoneDecr.find(*itr)->second = false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -550,10 +557,22 @@ namespace storm { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                monotonicityWatch.stop(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                STORM_PRINT(std::endl << "Time for monotonicity: " << monotonicityWatch << "." << std::endl << std::endl); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if (monotoneInAll) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    std::cout << "Monotone increasing in all parameters" << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                for (auto itr = varsMonotoneIncr.begin(); itr != varsMonotoneIncr.end(); ++itr) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (itr->second) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        std::cout << "Monotone increasing in: " << itr->first << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        std::cout << "Not monotone increasing in: " << itr->first << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // TODO: split into monotonicity in different parameters
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                for (auto itr = varsMonotoneDecr.begin(); itr != varsMonotoneDecr.end(); ++itr) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (itr->second) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        std::cout << "Monotone decreasing in: " << itr->first << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        std::cout << "Not monotone decreasing in: " << itr->first << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                std::cout << "Bye, Jip2" << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |