@Override public void propagate(int varIdx, int mask) throws ContradictionException { if (bothEnumerated) { idms[varIdx].freeze(); idms[varIdx].forEach(rem_proc.set(varIdx), EventType.REMOVE); idms[varIdx].unfreeze(); } else { setBounds(); } }
@Override public void propagate(int varIdx, int mask) throws ContradictionException { int idx2 = varIdx == 0 ? 1 : 0; switch (operator) { case EQ: if (IntEventType.isInstantiate(mask)) { filterOnInst(vars[idx2], vars[varIdx].getValue()); } else { if (IntEventType.isRemove(mask) && vars[varIdx].hasEnumeratedDomain()) { idms[varIdx].freeze(); idms[varIdx].forEachRemVal(remproc.set(varIdx)); idms[varIdx].unfreeze(); } if (IntEventType.isInclow(mask)) { filterOnInf(vars[varIdx], vars[idx2]); } if (IntEventType.isDecupp(mask)) { filterOnSup(vars[varIdx], vars[idx2]); } } break; case NQ: filterNeq(); break; case GT: if (IntEventType.isInstantiate(mask)) { filterGTonVar(vars[varIdx], vars[idx2]); } else if (IntEventType.isBound(mask)) { filterGTonVar(vars[varIdx], vars[idx2]); } break; case LT: if (IntEventType.isInstantiate(mask)) { filterLTonVar(vars[varIdx], vars[idx2]); } else if (IntEventType.isBound(mask)) { filterLTonVar(vars[varIdx], vars[idx2]); } break; default: throw new SolverException("Invalid PropDistanceXYC operator " + operator); } }