|
|
@ -533,9 +533,8 @@ 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; |
|
|
|
// Map with for each variable bool pair whether it is monotone increasing (first) or monotone decreasing (second)
|
|
|
|
std::map<carl::Variable, std::pair<bool, bool>> varsMonotone; |
|
|
|
|
|
|
|
for (uint_fast64_t i = 0; i < sparseModel.get()->getNumberOfStates(); ++i) { |
|
|
|
// go over all rows
|
|
|
@ -552,21 +551,22 @@ namespace storm { |
|
|
|
auto derivative = val.derivative(*itr); |
|
|
|
STORM_LOG_THROW(derivative.isConstant(), storm::exceptions::NotSupportedException, "Expecting probability to have at most degree 1"); |
|
|
|
|
|
|
|
if (varsMonotoneIncr.find(*itr) == varsMonotoneIncr.end()) { |
|
|
|
varsMonotoneIncr[*itr] = true; |
|
|
|
varsMonotoneDecr[*itr] = true; |
|
|
|
if (varsMonotone.find(*itr) == varsMonotone.end()) { |
|
|
|
varsMonotone[*itr].first = true; |
|
|
|
varsMonotone[*itr].second = true; |
|
|
|
} |
|
|
|
|
|
|
|
auto compare = lattice->compare(first.getColumn(), second.getColumn()); |
|
|
|
std::pair<bool, bool>* value = &varsMonotone.find(*itr)->second; |
|
|
|
if (compare == 1) { |
|
|
|
varsMonotoneIncr.find(*itr)->second &=derivative.constantPart() >= 0; |
|
|
|
varsMonotoneDecr.find(*itr)->second &=derivative.constantPart() <= 0; |
|
|
|
value->first &=derivative.constantPart() >= 0; |
|
|
|
value->second &=derivative.constantPart() <= 0; |
|
|
|
} else if (compare == 2) { |
|
|
|
varsMonotoneIncr.find(*itr)->second &= derivative.constantPart() <= 0; |
|
|
|
varsMonotoneDecr.find(*itr)->second &= derivative.constantPart() >= 0; |
|
|
|
value->first &=derivative.constantPart() <= 0; |
|
|
|
value->second &=derivative.constantPart() >= 0; |
|
|
|
} else { |
|
|
|
varsMonotoneIncr.find(*itr)->second = false; |
|
|
|
varsMonotoneDecr.find(*itr)->second = false; |
|
|
|
value->first = false; |
|
|
|
value->second = false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -575,16 +575,13 @@ namespace storm { |
|
|
|
} |
|
|
|
monotonicityWatch.stop(); |
|
|
|
STORM_PRINT(std::endl << "Time for monotonicity: " << monotonicityWatch << "." << std::endl << std::endl); |
|
|
|
|
|
|
|
for (auto itr = varsMonotoneIncr.begin(); itr != varsMonotoneIncr.end(); ++itr) { |
|
|
|
if (itr->second) { |
|
|
|
for (auto itr = varsMonotone.begin(); itr != varsMonotone.end(); ++itr) { |
|
|
|
if (itr->second.first) { |
|
|
|
std::cout << "Monotone increasing in: " << itr->first << std::endl; |
|
|
|
} else { |
|
|
|
std::cout << "Do not know if monotone increasing in: " << itr->first << std::endl; |
|
|
|
} |
|
|
|
} |
|
|
|
for (auto itr = varsMonotoneDecr.begin(); itr != varsMonotoneDecr.end(); ++itr) { |
|
|
|
if (itr->second) { |
|
|
|
if (itr->second.second) { |
|
|
|
std::cout << "Monotone decreasing in: " << itr->first << std::endl; |
|
|
|
} else { |
|
|
|
std::cout << "Do not know if monotone decreasing in: " << itr->first << std::endl; |
|
|
|