/* Defines a target function F for bbopt2.c */ /* Last edited on 2003-09-21 16:47:58 by stolfi */ #include #include int F_dim = 2; char *F_name = "F1-IA"; char *F_descr = "(IA) u = x - 2/7; v = y - 3/7; u^2 + v^2 + u*v + 1"; #define F_XMINN (2.0) #define F_XMIND (7.0) #define F_XMIN (F_XMINN/F_XMIND) #define F_YMINN (3.0) #define F_YMIND (7.0) #define F_YMIN (F_YMINN/F_YMIND) Float F(Float *x) { Float dx = x[0] - F_XMIN; Float dy = x[0] - F_YMIN; Float xx = dx*dx, xy = dx*dy, yy = dy*dy; return xx+xy+yy + 1.0; } Interval F_ia(Interval *xr) { Interval x = xr[0]; Interval y = xr[1]; Interval dx = ia_shift(x, -2.0/7.0); Interval dy = ia_shift(y, -3.0/7.0); Interval xx = ia_sqr(dx); Interval yy = ia_sqr(dy); Interval xy = ia_mul(dx, dy); Interval f = ia_shift(ia_add(ia_add(xx, yy), xy), +1.0); return f; } void F_sol(Interval *xr, Interval *sr) { /* Should take `xr' into account... */ Interval mr[2]; mr[0] = ia_scale(ia_const(One, Zero), F_XMINN, F_XMIND); mr[1] = ia_scale(ia_const(One, Zero), F_YMINN, F_YMIND); int i; for (i = 0; i < F_dim; i++) { Float mlo = mr[i].lo, mhi = mr[i].hi; Float xlo = xr[i].lo, xhi = xr[i].hi; Float slo, shi; if (mhi <= xlo) { slo = shi = xlo; } else if (mlo >= xhi) { slo = shi = xhi; } else { slo = (mlo < xlo ? xlo : mlo); shi = (mhi > xhi ? xhi : mhi); } sr[i] = (Interval) { slo, shi }; } }