16 auto row = matrix.
getRow(state);
20 std::vector<uint_fast64_t> succs;
21 std::vector<Monotonicity> succsMonUnsorted;
22 std::vector<uint_fast64_t> statesIncr;
23 std::vector<uint_fast64_t> statesDecr;
24 bool checkAllow =
true;
25 for (
auto entry : row) {
26 auto succState = entry.getColumn();
27 auto mon = checkTransitionMonRes(entry.getValue(), var, region);
28 succsMonUnsorted.push_back(mon);
29 succs.push_back(succState);
30 ignore &= entry.getValue().isConstant();
31 if (mon == Monotonicity::Incr) {
32 statesIncr.push_back(succState);
33 }
else if (mon == Monotonicity::Decr) {
34 statesDecr.push_back(succState);
35 }
else if (mon == Monotonicity::Not) {
40 return Monotonicity::Constant;
42 auto succsSorted = order->sortStates(&succs);
44 uint_fast64_t succSize = succs.size();
45 if (succsSorted[succSize - 1] == matrix.getColumnCount()) {
49 if (statesIncr.size() == 1 && statesDecr.size() > 1) {
50 auto comp = order->allAboveBelow(statesDecr, statesIncr.back());
53 return Monotonicity::Decr;
54 }
else if (comp.second) {
56 return Monotonicity::Incr;
58 }
else if (statesDecr.size() == 1 && statesIncr.size() > 1) {
59 auto comp = order->allAboveBelow(statesDecr, statesIncr.back());
62 return Monotonicity::Incr;
63 }
else if (comp.second) {
65 return Monotonicity::Decr;
70 return Monotonicity::Unknown;
79 bool allowedToSwap =
true;
81 uint_fast64_t index = 0;
82 while (index < succSize && localMonotonicity == Monotonicity::Constant) {
83 auto itr = std::find(succs.begin(), succs.end(), succsSorted[index]);
84 auto newIndex = std::distance(succs.begin(), itr);
85 auto transitionMon = succsMonUnsorted[newIndex];
86 localMonotonicity = transitionMon;
87 if (transitionMon == Monotonicity::Not && succSize != 1) {
88 localMonotonicity = Monotonicity::Unknown;
93 while (index < succSize && localMonotonicity != Monotonicity::Not && localMonotonicity != Monotonicity::Unknown) {
95 auto itr = std::find(succs.begin(), succs.end(), succsSorted[index]);
96 auto newIndex = std::distance(succs.begin(), itr);
97 auto transitionMon = succsMonUnsorted[newIndex];
99 if (transitionMon == Monotonicity::Not || transitionMon == Monotonicity::Unknown) {
100 return Monotonicity::Unknown;
104 if (transitionMon != Monotonicity::Constant && transitionMon != localMonotonicity) {
105 allowedToSwap =
false;
107 }
else if (!allowedToSwap) {
109 if (transitionMon == localMonotonicity || transitionMon == Monotonicity::Not || transitionMon == Monotonicity::Unknown) {
110 localMonotonicity = Monotonicity::Unknown;
115 return localMonotonicity;
120 if (derivative.isZero()) {
121 return std::pair<bool, bool>(
true,
true);
123 if (derivative.isConstant()) {
124 bool monIncr = derivative.constantPart() >= 0;
125 bool monDecr = derivative.constantPart() <= 0;
126 return std::pair<bool, bool>(monIncr, monDecr);
128 bool monIncr =
false;
129 bool monDecr =
false;
131 std::shared_ptr<utility::solver::SmtSolverFactory> smtSolverFactory = std::make_shared<utility::solver::MathsatSmtSolverFactory>();
134 std::set<VariableType> variables = derivative.gatherVariables();
137 for (
auto const& variable : variables) {
138 auto managerVariable = manager->declareRationalVariable(variable.name());
139 auto lb = utility::convertNumber<RationalNumber>(reg.
getLowerBoundary(variable));
140 auto ub = utility::convertNumber<RationalNumber>(reg.
getUpperBoundary(variable));
141 exprBounds = exprBounds && manager->rational(lb) <= managerVariable && managerVariable <= manager->rational(ub);
153 exprToCheck = converter.toExpression(derivative) > manager->rational(0);
161 return std::pair<bool, bool>(monIncr, monDecr);