Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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);
}