33 inline void invertInterval (
register double &l,
register double &u,
register double x) {
35 register double tmp = l;
55 printf (
"entering points: ===================================================\n");
56 printf (
"x [%d]: %9g\t[%9g\t%9g]\n", xi, x0, xl, xu);
57 printf (
"y [%d]: %9g\t[%9g\t%9g]\n", yi, y0, yl, yu);
58 printf (
"w [%d]: %9g\t[%9g\t%9g]\n", wi, w0, wl, wu);
63 if ((wl < 0 && wu > 0))
67 if (x0 < xl) x0 = xl;
if (x0 > xu) x0 = xu;
68 if (y0 < yl) y0 = yl;
if (y0 > yu) y0 = yu;
72 if ((xl >= 0) || (yl >= 0) || (xl * yl < wl -
COUENNE_EPS)) {
75 }
else if ((xu <= 0) || (yu <= 0) || (xu * yu < wl -
COUENNE_EPS)) {
80 if ((xl >= 0) || (yu <= 0) || (xl * yu > wu +
COUENNE_EPS)) {
83 }
else if ((xu <= 0) || (yl >= 0) || (xu * yl > wu +
COUENNE_EPS)) {
117 printf (
"reduced points:\n");
118 printf (
"x: %9g\t[%9g\t%9g]\n", x0, xl, xu);
119 printf (
"y: %9g\t[%9g\t%9g]\n", y0, yl, yu);
120 printf (
"w: %9g\t[%9g\t%9g]\n", w0, wl, wu);
126 if (((xl*yl >= wl) &&
134 if (
findIntersection (0., 0., x0, y0, &wl, &wu, &xLow, &yLow, &xUpp, &yUpp))
138 printf (
"intersections:\n");
139 printf (
"lower: %9g\t%9g\tprod %9g\n", xLow, yLow, xLow*yLow);
140 printf (
"upper: %9g\t%9g\tprod %9g\n", xUpp, yUpp, xUpp*yUpp);
145 if ((xLow <= xl && yUpp >= yu) ||
146 (yLow <= yl && xUpp >= xu))
153 cX, cY, cW, c0, c0X, c0Y, c0W;
155 if (xLow >= xl && xUpp <= xu &&
156 yLow >= yl && yUpp <= yu) {
159 printf (
"easy lifting:\n");
163 if (
genMulCoeff (xLow, yLow, xUpp, yUpp, 0, cX, cY, cW))
170 }
else if (xLow >= xl && yLow >= yl &&
171 (xUpp > xu || yUpp > yu)) {
174 printf (
"through lower, not upper:\n");
181 xUpp = CoinMin (xu, wu / yu);
184 yUpp = CoinMin (yu, wu / xu);
188 if ((
findIntersection (xUpp, yUpp, x0, y0, &wl, NULL, &xLow, &yLow, NULL, NULL)) ||
189 (xLow < xl || yLow < yl) ||
190 (
genMulCoeff (xLow, yLow, xUpp, yUpp, 0, cX, cY, cW)))
197 }
else if (xUpp <= xu && yUpp <= yu &&
198 (xLow < xl || yLow < yl)) {
201 printf (
"through upper, not lower:\n");
208 xLow = CoinMax (xl, wl / yl);
211 yLow = CoinMax (yl, wl / xl);
215 if ((
findIntersection (xLow, yLow, x0, y0, NULL, &wu, NULL, NULL, &xUpp, &yUpp)) ||
216 (xUpp > xu || yUpp > yu) ||
217 (
genMulCoeff (xLow, yLow, xUpp, yUpp, 1, cX, cY, cW)))
224 }
else if ((xLow < xl && xUpp > xu) ||
225 (yLow < yl && yUpp > yu)) {
228 printf (
"between lower and upper:\n");
235 yLow = yl; xLow = CoinMax (xl, wl / yl);
236 yUpp = yu; xUpp = CoinMin (xu, wu / yu);
238 xLow = xl; yLow = CoinMax (yl, wl / xl);
239 xUpp = xu; yUpp = CoinMax (yu, wu / xu);
243 printf (
"New intersections:\n");
244 printf (
"lower: %9g\t%9g\tprod %9g\n", xLow, yLow, xLow*yLow);
245 printf (
"upper: %9g\t%9g\tprod %9g\n", xUpp, yUpp, xUpp*yUpp);
259 CouNumber xLow2 = xLow, yLow2 = yLow, xUpp2, yUpp2;
261 if ((
findIntersection (xLow, yLow, x0, y0, NULL, &wu, NULL, NULL, &xUpp2, &yUpp2) ||
genMulCoeff (xLow, yLow, xUpp2, yUpp2, 0, cX, cY, cW)) &&
262 (
findIntersection (xUpp, yUpp, x0, y0, &wl, NULL, &xLow2, &yLow2, NULL, NULL) ||
genMulCoeff (xLow2, yLow2, xUpp, yUpp, 1, cX, cY, cW)))
266 printf (
"coeffs: (%g,%g,%g)\n",
279 printf (
"points are in a weird position:\n");
280 printf (
"lower: %9g\t%9g\tprod %9g\n", xLow, yLow, xLow*yLow);
281 printf (
"upper: %9g\t%9g\tprod %9g\n", xUpp, yUpp, xUpp*yUpp);
289 if (flipX) {cX = -cX; c0X = -c0X;}
290 if (flipY) {cY = -cY; c0Y = -c0Y;}
291 if (flipW) {cW = -cW; c0W = -c0W;}
293 c0 = c0X + c0Y + c0W;
296 printf (
"there are cuts\n");
300 cg -> createCut (cs, c0, 1, wi, cW, yi, cY, xi, cX);
330 a = (x1-
x0) * (y1-y0),
332 b = x0*y1 + y0*x1 - 2*
c;
339 CouNumber tL1, tL2, tU1, tU2, tL=0., tU=0.;
342 tL1 = (- b - sqrt (b*b - 4*a*(c-*wl))) / (2*a);
343 tL2 = (- b + sqrt (b*b - 4*a*(c-*wl))) / (2*a);
345 tL = (tL1 < 0) ? tL2 : tL1;
349 tU1 = (- b - sqrt (b*b - 4*a*(c-*wu))) / (2*a);
350 tU2 = (- b + sqrt (b*b - 4*a*(c-*wu))) / (2*a);
352 tU = (tU1 < 0) ? tU2 : tU1;
355 if (xA) *xA = x0 + tL * (x1-
x0);
if (yA) *yA = y0 + tL * (y1-y0);
356 if (xB) *xB = x0 + tU * (x1-
x0);
if (yB) *yB = y0 + tU * (y1-y0);
390 printf (
"points: (%g,%g) (%g,%g), cW = (%g - %g) / %g = %g\n",
391 xD,yD, xO,yO, 2*xD*yD, (cX*xO + cY*yO), (xO*yO - xD*yD),
392 (2*xD*yD - (cX*xO + cY*yO)) / (xO*yO - xD*yD));
401 cW = (2*xD*yD - (cX*xO + cY*yO)) / (xO*yO - xD*yD);
Cut Generator for linear convexifications.
int genMulCoeff(CouNumber x1, CouNumber y1, CouNumber x2, CouNumber y2, char whichUse, CouNumber &cX, CouNumber &cY, CouNumber &cW)
void fint fint fint real * a
void invertInterval(register double &l, register double &u, register double x)
void upperEnvHull(const CouenneCutGenerator *cg, OsiCuts &cs, int xi, CouNumber x0, CouNumber xl, CouNumber xu, int yi, CouNumber y0, CouNumber yl, CouNumber yu, int wi, CouNumber w0, CouNumber wl, CouNumber wu)
better cuts than those from unifiedProdCuts
int findIntersection(CouNumber x0, CouNumber y0, CouNumber x1, CouNumber y1, CouNumber *wl, CouNumber *wu, CouNumber *xA, CouNumber *yA, CouNumber *xB, CouNumber *yB)
double CouNumber
main number type in Couenne
void fint fint fint real fint real * x