linear (in-)equations */
| 195 | |
| 196 | /* linear (in-)equations */ |
| 197 | void p_int_lin_CMP(FlatZincSpace& s, IntRelType irt, const ConExpr& ce, |
| 198 | AST::Node* ann) { |
| 199 | IntArgs ia = s.arg2intargs(ce[0]); |
| 200 | int singleIntVar; |
| 201 | if (s.isBoolArray(ce[1],singleIntVar)) { |
| 202 | if (singleIntVar != -1) { |
| 203 | if (std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) { |
| 204 | IntVar siv = s.arg2IntVar(ce[1]->getArray()->a[singleIntVar]); |
| 205 | BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar); |
| 206 | IntArgs ia_tmp(ia.size()-1); |
| 207 | int count = 0; |
| 208 | for (int i=0; i<ia.size(); i++) { |
| 209 | if (i != singleIntVar) |
| 210 | ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[i] : -ia[i]; |
| 211 | } |
| 212 | IntRelType t = (ia[singleIntVar] == -1 ? irt : swap(irt)); |
| 213 | linear(s, ia_tmp, iv, t, siv, s.ann2ipl(ann)); |
| 214 | } else { |
| 215 | IntVarArgs iv = s.arg2intvarargs(ce[1]); |
| 216 | linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann)); |
| 217 | } |
| 218 | } else { |
| 219 | BoolVarArgs iv = s.arg2boolvarargs(ce[1]); |
| 220 | linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann)); |
| 221 | } |
| 222 | } else { |
| 223 | IntVarArgs iv = s.arg2intvarargs(ce[1]); |
| 224 | linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann)); |
| 225 | } |
| 226 | } |
| 227 | void p_int_lin_CMP_reif(FlatZincSpace& s, IntRelType irt, ReifyMode rm, |
| 228 | const ConExpr& ce, AST::Node* ann) { |
| 229 | if (rm == RM_EQV && ce[2]->isBool()) { |
no test coverage detected