void Gradient::gradient(const Array<Domain>& d2, IntervalVector& gbox) { assert(f.expr().dim.is_scalar()); _eval.eval(d2); // outside definition domain -> empty gradient if (d.top->is_empty()) { gbox.set_empty(); return; } gbox.clear(); g.write_arg_domains(gbox); f.forward<Gradient>(*this); g.top->i()=1.0; f.backward<Gradient>(*this); g.read_arg_domains(gbox); }
void Gradient::gradient(const IntervalVector& box, IntervalVector& gbox) { if (!f.expr().dim.is_scalar()) { ibex_error("Cannot called \"gradient\" on a vector-valued function"); } if (_eval.eval(box).is_empty()) { // outside definition domain -> empty gradient gbox.set_empty(); return; } gbox.clear(); g.write_arg_domains(gbox); f.forward<Gradient>(*this); g.top->i()=1.0; f.backward<Gradient>(*this); g.read_arg_domains(gbox); }
void Gradient::gradient(const Function& f, const IntervalVector& box, IntervalVector& g) const { assert(f.expr().dim.is_scalar()); assert(f.expr().deco.d); assert(f.expr().deco.g); f.eval_domain(box); g.clear(); f.write_arg_domains(g,true); try { f.forward<Gradient>(*this); } catch(EmptyBoxException&) { g.set_empty(); return; } f.expr().deco.g->i()=1.0; f.backward<Gradient>(*this); f.read_arg_domains(g,true); }