Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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;
}