| 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()) { |
| 230 | if (ce[2]->getBool()) { |
| 231 | p_int_lin_CMP(s, irt, ce, ann); |
| 232 | } else { |
| 233 | p_int_lin_CMP(s, neg(irt), ce, ann); |
| 234 | } |
| 235 | return; |
| 236 | } |
| 237 | IntArgs ia = s.arg2intargs(ce[0]); |
| 238 | int singleIntVar; |
| 239 | if (s.isBoolArray(ce[1],singleIntVar)) { |
| 240 | if (singleIntVar != -1) { |
| 241 | if (std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) { |
| 242 | IntVar siv = s.arg2IntVar(ce[1]->getArray()->a[singleIntVar]); |
| 243 | BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar); |
| 244 | IntArgs ia_tmp(ia.size()-1); |
| 245 | int count = 0; |
| 246 | for (int i=0; i<ia.size(); i++) { |
| 247 | if (i != singleIntVar) |
| 248 | ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[i] : -ia[i]; |
| 249 | } |
| 250 | IntRelType t = (ia[singleIntVar] == -1 ? irt : swap(irt)); |
| 251 | linear(s, ia_tmp, iv, t, siv, Reify(s.arg2BoolVar(ce[3]), rm), |
| 252 | s.ann2ipl(ann)); |
| 253 | } else { |
| 254 | IntVarArgs iv = s.arg2intvarargs(ce[1]); |
| 255 | linear(s, ia, iv, irt, ce[2]->getInt(), |
| 256 | Reify(s.arg2BoolVar(ce[3]), rm), s.ann2ipl(ann)); |
| 257 | } |
| 258 | } else { |
| 259 | BoolVarArgs iv = s.arg2boolvarargs(ce[1]); |
| 260 | linear(s, ia, iv, irt, ce[2]->getInt(), |
| 261 | Reify(s.arg2BoolVar(ce[3]), rm), s.ann2ipl(ann)); |
| 262 | } |
| 263 | } else { |
| 264 | IntVarArgs iv = s.arg2intvarargs(ce[1]); |
| 265 | linear(s, ia, iv, irt, ce[2]->getInt(), |
| 266 | Reify(s.arg2BoolVar(ce[3]), rm), |
| 267 | s.ann2ipl(ann)); |
| 268 | } |
| 269 | } |
| 270 | void p_int_lin_eq(FlatZincSpace& s, const ConExpr& ce, AST::Node* ann) { |
| 271 | p_int_lin_CMP(s, IRT_EQ, ce, ann); |
| 272 | } |
no test coverage detected