%Test whether \a x is solution
| 230 | srt(srt0), swapped(s) {} |
| 231 | /// %Test whether \a x is solution |
| 232 | virtual bool solution(const SetAssignment& x) const { |
| 233 | CountableSetRanges xr(x.lub, x[0]); |
| 234 | IntSet is(x.intval(), x.intval()); |
| 235 | IntSetRanges dr(is); |
| 236 | Gecode::SetRelType rsrt = srt; |
| 237 | if (swapped) { |
| 238 | switch (srt) { |
| 239 | case SRT_SUB: rsrt = SRT_SUP; break; |
| 240 | case SRT_SUP: rsrt = SRT_SUB; break; |
| 241 | default: break; |
| 242 | } |
| 243 | } |
| 244 | switch (rsrt) { |
| 245 | case SRT_EQ: return Iter::Ranges::equal(xr, dr); |
| 246 | case SRT_NQ: return !Iter::Ranges::equal(xr, dr); |
| 247 | case SRT_SUB: return Iter::Ranges::subset(xr, dr); |
| 248 | case SRT_SUP: return Iter::Ranges::subset(dr, xr); |
| 249 | case SRT_DISJ: |
| 250 | { |
| 251 | Gecode::Iter::Ranges::Inter<CountableSetRanges,IntSetRanges> |
| 252 | inter(xr, dr); |
| 253 | return !inter(); |
| 254 | } |
| 255 | case SRT_CMPL: |
| 256 | { |
| 257 | Gecode::Set::RangesCompl<IntSetRanges> drc(dr); |
| 258 | return Iter::Ranges::equal(xr,drc); |
| 259 | } |
| 260 | default: GECODE_NEVER; |
| 261 | } |
| 262 | return false; |
| 263 | } |
| 264 | /// Post constraint on \a x |
| 265 | virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { |
| 266 | if (!swapped) |