17 auto row = matrix.
getRow(state);
21 std::vector<uint_fast64_t> succs;
22 std::vector<Monotonicity> succsMonUnsorted;
23 std::vector<uint_fast64_t> statesIncr;
24 std::vector<uint_fast64_t> statesDecr;
25 bool checkAllow =
true;
26 for (
auto entry : row) {
27 auto succState = entry.getColumn();
28 auto mon = checkTransitionMonRes(entry.getValue(), var, region);
29 succsMonUnsorted.push_back(mon);
30 succs.push_back(succState);
31 ignore &= entry.getValue().isConstant();
32 if (mon == Monotonicity::Incr) {
33 statesIncr.push_back(succState);
34 }
else if (mon == Monotonicity::Decr) {
35 statesDecr.push_back(succState);
36 }
else if (mon == Monotonicity::Not) {
41 return Monotonicity::Constant;
43 auto succsSorted = order->sortStates(&succs);
45 uint_fast64_t succSize = succs.size();
46 if (succsSorted[succSize - 1] == matrix.getColumnCount()) {
50 if (statesIncr.size() == 1 && statesDecr.size() > 1) {
51 auto comp = order->allAboveBelow(statesDecr, statesIncr.back());
54 return Monotonicity::Decr;
55 }
else if (comp.second) {
57 return Monotonicity::Incr;
59 }
else if (statesDecr.size() == 1 && statesIncr.size() > 1) {
60 auto comp = order->allAboveBelow(statesDecr, statesIncr.back());
63 return Monotonicity::Incr;
64 }
else if (comp.second) {
66 return Monotonicity::Decr;
71 return Monotonicity::Unknown;
80 bool allowedToSwap =
true;
82 uint_fast64_t index = 0;
83 while (index < succSize && localMonotonicity == Monotonicity::Constant) {
84 auto itr = std::find(succs.begin(), succs.end(), succsSorted[index]);
85 auto newIndex = std::distance(succs.begin(), itr);
86 auto transitionMon = succsMonUnsorted[newIndex];
87 localMonotonicity = transitionMon;
88 if (transitionMon == Monotonicity::Not && succSize != 1) {
89 localMonotonicity = Monotonicity::Unknown;
94 while (index < succSize && localMonotonicity != Monotonicity::Not && localMonotonicity != Monotonicity::Unknown) {
96 auto itr = std::find(succs.begin(), succs.end(), succsSorted[index]);
97 auto newIndex = std::distance(succs.begin(), itr);
98 auto transitionMon = succsMonUnsorted[newIndex];
100 if (transitionMon == Monotonicity::Not || transitionMon == Monotonicity::Unknown) {
101 return Monotonicity::Unknown;
105 if (transitionMon != Monotonicity::Constant && transitionMon != localMonotonicity) {
106 allowedToSwap =
false;
108 }
else if (!allowedToSwap) {
110 if (transitionMon == localMonotonicity || transitionMon == Monotonicity::Not || transitionMon == Monotonicity::Unknown) {
111 localMonotonicity = Monotonicity::Unknown;
116 return localMonotonicity;
121 if (derivative.isZero()) {
122 return std::pair<bool, bool>(
true,
true);
124 if (derivative.isConstant()) {
125 bool monIncr = derivative.constantPart() >= 0;
126 bool monDecr = derivative.constantPart() <= 0;
127 return std::pair<bool, bool>(monIncr, monDecr);
129 bool monIncr =
false;
130 bool monDecr =
false;
132 std::shared_ptr<utility::solver::SmtSolverFactory> smtSolverFactory = std::make_shared<utility::solver::MathsatSmtSolverFactory>();
135 std::set<VariableType> variables = derivative.gatherVariables();
138 for (
auto const& variable : variables) {
139 auto managerVariable = manager->declareRationalVariable(variable.name());
140 auto lb = utility::convertNumber<RationalNumber>(reg.
getLowerBoundary(variable));
141 auto ub = utility::convertNumber<RationalNumber>(reg.
getUpperBoundary(variable));
142 exprBounds = exprBounds && manager->rational(lb) <= managerVariable && managerVariable <= manager->rational(ub);
154 exprToCheck = converter.toExpression(derivative) > manager->rational(0);
162 return std::pair<bool, bool>(monIncr, monDecr);