void DPGlobalConstraint::propagateAC(){ bool changed = true; clear(); //Cost thisUb; //thisUb = wcsp->getUb(); for(int i = 0; i < arity(); i++){ EnumeratedVariable * x = scope[i]; bool first = true; for(EnumeratedVariable::iterator it = x->begin(); it != x->end(); ++it){ if(zero[i][x->toIndex(*it)]) continue; Result r = minCost(i, *it, changed && first); if(changed && first) changed = false; first = false; Cost cost = r.first; /*if(cost >= thisUb || cost + wcsp->getLb() + scope[i]->getCost(*it) >= thisUb){ x->remove(*it); changed = true; }else */ if(cost > 0){ project(i, *it, cost); changed = true; } else if(cost < 0) { /* Should not happen*/ printf("Warning: AC propagation get negative cost\n"); extend(i, *it, -cost); changed = true; } if(x->canbe(*it)) record(r.second); } x->findSupport(); } }
void DPGlobalConstraint::findSupport(int var, bool &changed){ EnumeratedVariable * x = scope[var]; bool first = true; vector<Value> remove; for(EnumeratedVariable::iterator it = x->begin(); it != x->end(); ++it){ Cost cost; Result r = pair<Cost, Value*>(0, NULL); if(zero[var][x->toIndex(*it)]){ cost = 0; }else{ r = minCost(var, *it, changed && first); if(changed && first) changed = false; first = false; cost = r.first; } //deltaCost[var][x->toIndex(*it)] += x->getCost(*it); deltaCost[var][x->toIndex(*it)] += preUnaryCosts[var][x->toIndex(*it)]; //Cost delta = cost - x->getCost(*it); Cost delta = cost - preUnaryCosts[var][x->toIndex(*it)]; if(delta > 0){ project(var, *it, delta, true); // NC will be delayed (avoid forward checking on binary/ternay cost functions) assert(x->canbe(*it)); } else if (delta < 0) { extend(var, *it, -delta); } if (!zero[var][x->toIndex(*it)] && x->getCost(*it) + wcsp->getLb() < wcsp->getUb()) record(r.second); } x->findSupport(); changed = true; //Detect any change in variable domain or unary costs }