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