void BinaryConstraint::extend(EnumeratedVariable* x, Value value, Cost cost, vector<StoreCost>& deltaCostsX) { assert(ToulBar2::verbose < 4 || ((cout << "extend(C" << getVar(0)->getName() << "," << getVar(1)->getName() << ", (" << x->getName() << "," << value << "), " << cost << ")" << endl), true)); TreeDecomposition* td = wcsp->getTreeDec(); if (td) td->addDelta(cluster, x, value, -cost); deltaCostsX[x->toIndex(value)] -= cost; // Warning! Possible overflow??? x->extend(value, cost); }
void VACBinaryConstraint::VACextend(VACVariable* x, Value v, Cost c) { assert(ToulBar2::verbose < 4 || ((cout << "extend(C" << getVar(0)->getName() << "," << getVar(1)->getName() << ", (" << x->getName() << "," << v << "), " << c << ")" << endl), true)); TreeDecomposition* td = wcsp->getTreeDec(); if(td) td->addDelta(cluster,x,v,-c); int index = x->toIndex(v); // TO BE REPLACED BY A LOOP ON THE DOMAIN IN ORDER TO AVOID SUBTRACTING TOP??? if(!getIndex(x)) deltaCostsX[index] -= c; else deltaCostsY[index] -= c; x->VACextend(v, c); }
void VACBinaryConstraint::VACproject(VACVariable* x, Value v, Cost c) { assert(ToulBar2::verbose < 4 || ((cout << "project(C" << getVar(0)->getName() << "," << getVar(1)->getName() << ", (" << x->getName() << "," << v << "), " << c << ")" << endl), true)); wcsp->revise(this); TreeDecomposition* td = wcsp->getTreeDec(); if (td) td->addDelta(cluster, x, v, c); int index = x->toIndex(v); // TO BE REPLACED BY A LOOP ON THE DOMAIN IN ORDER TO AVOID SUBTRACTING TOP??? if (!getIndex(x)) deltaCostsX[index] += c; else deltaCostsY[index] += c; assert(getCost((EnumeratedVariable*)x, (EnumeratedVariable*)getVarDiffFrom(x), v, getVarDiffFrom(x)->getInf()) >= MIN_COST); assert(getCost((EnumeratedVariable*)x, (EnumeratedVariable*)getVarDiffFrom(x), v, getVarDiffFrom(x)->getSup()) >= MIN_COST); x->VACproject(v, c); }
/* * Propagation methods * */ bool BinaryConstraint::project(EnumeratedVariable* x, Value value, Cost cost, vector<StoreCost>& deltaCostsX) { assert(ToulBar2::verbose < 4 || ((cout << "project(C" << getVar(0)->getName() << "," << getVar(1)->getName() << ", (" << x->getName() << "," << value << "), " << cost << ")" << endl), true)); // hard binary constraint costs are not changed if (!CUT(cost + wcsp->getLb(), wcsp->getUb())) { TreeDecomposition* td = wcsp->getTreeDec(); if (td) td->addDelta(cluster, x, value, cost); deltaCostsX[x->toIndex(value)] += cost; // Warning! Possible overflow??? assert(getCost(x, (EnumeratedVariable*)getVarDiffFrom(x), value, getVarDiffFrom(x)->getInf()) >= MIN_COST); assert(getCost(x, (EnumeratedVariable*)getVarDiffFrom(x), value, getVarDiffFrom(x)->getSup()) >= MIN_COST); } Cost oldcost = x->getCost(value); x->project(value, cost); #ifdef DEECOMPLETE getVarDiffFrom(x)->queueDEE(); #endif return (x->getSupport() == value || SUPPORTTEST(oldcost, cost)); }