// 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();
 }
Beispiel #4
0
IlcInt IlcIntSelectMaxI::select(IlcIntVar var){
    return var.getMax();
}