ExecStatus Sequence<View,Val>::advise(Space& home, Advisor& _a, const Delta& d) { SupportAdvisor<View>& a = static_cast<SupportAdvisor<View>&>(_a); ExecStatus status = vvsamax.advise(home,x,s,q,a.i,d); if ( ES_NOFIX == vvsamin.advise(home,x,s,q,a.i,d) ) { status = ES_NOFIX; } if (!undecided(x[a.i],s)) { if (!x[a.i].assigned()) x[a.i].cancel(home,a); if ( ES_NOFIX == status ) { return home.ES_NOFIX_DISPOSE(ac,a); } else { return home.ES_FIX_DISPOSE(ac,a); } } return status; }
ExecStatus Incremental<View>::advise(Space& home, Advisor& _a, const Delta& d) { SupportAdvisor& a = static_cast<SupportAdvisor&>(_a); ModEvent me = View::modevent(d); bool scheduled = !w_support.empty() || !w_remove.empty(); if (x[a.i].any(d)) { ViewValues<View> vv(x[a.i]); for (int n = ts()->min; n <= ts()->max; n++) { if (vv() && (n == vv.val())) { ++vv; continue; } while (SupportEntry* s = support(a.i,n)) remove_support(home, s->t, a.i, n); } } else { for (int n = x[a.i].min(d); n <= x[a.i].max(d); n++) while (SupportEntry* s = support(a.i,n)) remove_support(home, s->t, a.i, n); } if (me == ME_INT_VAL) { --unassigned; // nothing to do or already scheduled // propagator is not subsumed since unassigned!=0 if (((w_support.empty() && w_remove.empty()) || scheduled) && (unassigned != 0)) return home.ES_FIX_DISPOSE(ac,a); else return home.ES_NOFIX_DISPOSE(ac,a); } else if ((w_support.empty() && w_remove.empty()) || scheduled) { // nothing to do or already scheduled return ES_FIX; } return ES_NOFIX; }