ExprLabel& Affine2Eval::eval_label(const Function& f, ExprLabel** args) const { assert(f.expr().deco.af2); assert(f.expr().deco.d); Array<const Affine2Domain> argDAF2(f.nb_arg()); Array<const Domain> argD(f.nb_arg()); for (int i=0; i<f.nb_arg(); i++) { argDAF2.set_ref(i,*(args[i]->af2)); } for (int i=0; i<f.nb_arg(); i++) { argD.set_ref(i,*(args[i]->d)); } f.write_arg_domains(argD); f.write_arg_af2_domains(argDAF2); //------------- for debug // std::cout << "Function " << f.name << ", domains before eval:" << std::endl; // for (int i=0; i<f.nb_arg(); i++) { // std::cout << "arg[" << i << "]=" << f.arg_domains[i] << std::endl; // } return f.forward<Affine2Eval>(*this); }
void HC4Revise::proj(const Function& f, const Domain& y, ExprLabel** x) { Eval().eval(f,x); *f.expr().deco.d &= y; f.backward<HC4Revise>(*this); Array<Domain> argD(f.nb_arg()); for (int i=0; i<f.nb_arg(); i++) { argD.set_ref(i,*(x[i]->d)); } load(argD,f.arg_domains,f.nb_used_vars,f.used_var); }
bool InHC4Revise::ibwd(const Function& f, const Domain& y, ExprLabel** x) { Eval e; // the box to be inflated is found // in the "p" field of the x labels: Array<Domain> argP(f.nb_arg()); for (int i=0; i<f.nb_arg(); i++) { argP.set_ref(i,*x[i]->p); } if (!argP[0].is_empty()) { // if the first domain is empty, so they all are e.eval(f,argP); assert(!f.expr().deco.d->is_empty()); for (int i=0; i<f.nb_nodes(); i++) *f.node(i).deco.p = *f.node(i).deco.d; } else { for (int i=0; i<f.nb_nodes(); i++) f.node(i).deco.p->set_empty(); } e.eval(f,x); assert(!f.expr().deco.d->is_empty()); *f.expr().deco.d = y; Array<Domain> argD(f.nb_arg()); for (int i=0; i<f.nb_arg(); i++) { argD.set_ref(i,*(x[i]->d)); } try { f.backward<InHC4Revise>(*this); f.read_arg_domains(argD); } catch(EmptyBoxException&) { // should we force argD to be the empty set here? // (probably no, as long as this function is called // inside InHC4Revise) return false; } return true; }