// check only modifications on the objective variable void whenRange() { checkFailure(); wcsp->enforceUb(); // fail if lower bound >= upper bound and enforce NC* if (obj.getMax() + 1 < wcsp->getUb()) { wcsp->decreaseUb(obj.getMax() + 1); } push(); // global propagation done after local propagation }
// domain synchronization between obj&vars (Ilog) and wcsp (ToulBar2) void synchronize() { if (ToulBar2::verbose >= 2) cout << "Domain synchronization between IlogSolver and Toulbar2!" << endl; for (int i = 0; i < size; i++) { if (ToulBar2::verbose >= 2) cout << vars[i] << " (" << wcsp->getInf(i) << "," << wcsp->getSup(i) << ")" << endl; vars[i].setMin(wcsp->getInf(i)); vars[i].setMax(wcsp->getSup(i)); for (int d = wcsp->getInf(i); d <= wcsp->getSup(i); d++) { if (wcsp->cannotbe(i, d)) { vars[i].removeValue(d); } } wcsp->increase(i, vars[i].getMin()); wcsp->decrease(i, vars[i].getMax()); for (int d = vars[i].getMin(); d <= vars[i].getMax(); d++) { if (!vars[i].isInDomain(d)) { wcsp->remove(i, d); } } } obj.setMin(wcsp->getLb()); obj.setMax(wcsp->getUb() - 1); wcsp->decreaseUb(obj.getMax() + 1); UpperBound = wcsp->getUb(); }
// global propagation using WCSP propagation queues void propagate() { checkFailure(); if (synchronized) { synchronized.setValue(getSolver(), IlcFalse); synchronize(); } if (ToulBar2::verbose >= 2) cout << "ILOG: propagate wcsp index " << wcsp->getIndex() << endl; wcsp->decreaseUb(obj.getMax() + 1); wcsp->propagate(); }
IlcInt IlcIntSelectMaxI::select(IlcIntVar var){ return var.getMax(); }