|  | @ -49,8 +49,6 @@ namespace storm { | 
		
	
		
			
				|  |  |             bool exact; |  |  |             bool exact; | 
		
	
		
			
				|  |  |         }; |  |  |         }; | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  |          |  |  |  | 
		
	
		
			
				|  |  |         template <typename ValueType> |  |  |         template <typename ValueType> | 
		
	
		
			
				|  |  |         std::vector<storm::storage::ParameterRegion<ValueType>> parseRegions(std::shared_ptr<storm::models::ModelBase> const& model) { |  |  |         std::vector<storm::storage::ParameterRegion<ValueType>> parseRegions(std::shared_ptr<storm::models::ModelBase> const& model) { | 
		
	
		
			
				|  |  |             std::vector<storm::storage::ParameterRegion<ValueType>> result; |  |  |             std::vector<storm::storage::ParameterRegion<ValueType>> result; | 
		
	
	
		
			
				|  | @ -519,8 +517,10 @@ namespace storm { | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |                 // Monotonicity?
 |  |  |                 // Monotonicity?
 | 
		
	
		
			
				|  |  |                 storm::utility::Stopwatch monotonicityWatch(true); |  |  |                 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) { |  |  |                 for (uint_fast64_t i = 0; i < sparseModel.get()->getNumberOfStates(); ++i) { | 
		
	
		
			
				|  |  |                     // go over all rows
 |  |  |                     // go over all rows
 | 
		
	
		
			
				|  |  |                     auto row = matrix.getRow(i); |  |  |                     auto row = matrix.getRow(i); | 
		
	
	
		
			
				|  | @ -536,12 +536,19 @@ namespace storm { | 
		
	
		
			
				|  |  |                             auto derivative = val.derivative(*itr); |  |  |                             auto derivative = val.derivative(*itr); | 
		
	
		
			
				|  |  |                             STORM_LOG_THROW(derivative.isConstant(), storm::exceptions::NotSupportedException, "Expecting probability to have at most degree 1"); |  |  |                             STORM_LOG_THROW(derivative.isConstant(), storm::exceptions::NotSupportedException, "Expecting probability to have at most degree 1"); | 
		
	
		
			
				|  |  |                             auto compare = lattice->compare(first.getColumn(), second.getColumn()); |  |  |                             auto compare = lattice->compare(first.getColumn(), second.getColumn()); | 
		
	
		
			
				|  |  |  |  |  |                             if (varsMonotoneIncr.find(*itr) == varsMonotoneIncr.end()) { | 
		
	
		
			
				|  |  |  |  |  |                                 varsMonotoneIncr[*itr] = true; | 
		
	
		
			
				|  |  |  |  |  |                                 varsMonotoneDecr[*itr] = true; | 
		
	
		
			
				|  |  |  |  |  |                             } | 
		
	
		
			
				|  |  |                             if (compare == 1) { |  |  |                             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) { |  |  |                             } else if (compare == 2) { | 
		
	
		
			
				|  |  |                                 monotoneInAll &=derivative.constantPart() <= 0; |  |  |  | 
		
	
		
			
				|  |  |  |  |  |                                 varsMonotoneIncr.find(*itr)->second &= derivative.constantPart() <= 0; | 
		
	
		
			
				|  |  |  |  |  |                                 varsMonotoneDecr.find(*itr)->second &= derivative.constantPart() >= 0; | 
		
	
		
			
				|  |  |                             } else { |  |  |                             } else { | 
		
	
		
			
				|  |  |                                 monotoneInAll = false; |  |  |  | 
		
	
		
			
				|  |  |  |  |  |                                 varsMonotoneIncr.find(*itr)->second = false; | 
		
	
		
			
				|  |  |  |  |  |                                 varsMonotoneDecr.find(*itr)->second = false; | 
		
	
		
			
				|  |  |                             } |  |  |                             } | 
		
	
		
			
				|  |  |                         } |  |  |                         } | 
		
	
		
			
				|  |  |                     } |  |  |                     } | 
		
	
	
		
			
				|  | @ -550,10 +557,22 @@ namespace storm { | 
		
	
		
			
				|  |  |                 } |  |  |                 } | 
		
	
		
			
				|  |  |                 monotonicityWatch.stop(); |  |  |                 monotonicityWatch.stop(); | 
		
	
		
			
				|  |  |                 STORM_PRINT(std::endl << "Time for monotonicity: " << monotonicityWatch << "." << std::endl << std::endl); |  |  |                 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; |  |  |                 std::cout << "Bye, Jip2" << std::endl; | 
		
	
		
			
				|  |  |                 return; |  |  |                 return; | 
		
	
		
			
				|  |  |             } |  |  |             } | 
		
	
	
		
			
				|  | 
 |