/home/coin/SVN-release/OS-2.4.0/Couenne/src/convex/operators/conv-exprTrilinear.cpp

Go to the documentation of this file.
00001 /* $Id: conv-exprTrilinear.cpp 490 2011-01-14 16:07:12Z pbelotti $
00002  *
00003  * Name:    conv-exprTrilinear.cpp
00004  * Author:  Pietro Belotti
00005  * Purpose: convexify trilinear terms
00006  *
00007  * This file is licensed under the Eclipse Public License (EPL)
00008  */
00009 
00010 #include "CouenneTypes.hpp"
00011 #include "CouenneExprTrilinear.hpp"
00012 #include "CouenneExprMin.hpp"
00013 #include "CouenneExprMax.hpp"
00014 #include "CouenneExprClone.hpp"
00015 #include "CouenneProblem.hpp"
00016 
00017 using namespace Couenne;
00018 
00020 void exprTrilinear::getBounds (expression *&lb, expression *&ub) {
00021 
00022   expression
00023     **arglistMax = new expression* [16],
00024     **arglistMin = new expression* [16],
00025     **lbA        = new expression* [3],
00026     **ubA        = new expression* [3];
00027 
00028   for (int i=0; i<3; i++)
00029     arglist_ [i] -> getBounds (lbA [i], ubA [i]);
00030 
00031   for     (int i0 = 0; i0 < 2; i0++)
00032     for   (int i1 = 0; i1 < 2; i1++)
00033       for (int i2 = 0; i2 < 2; i2++) {
00034 
00035         int indexTerm = i0*8 + i1*4 + i2*2;
00036 
00037         arglistMax [indexTerm] = new exprTrilinear (new exprClone (i0 ? ubA [0] : lbA [0]),
00038                                                     new exprClone (i1 ? ubA [1] : lbA [1]),
00039                                                     new exprClone (i2 ? ubA [2] : lbA [2]));
00040 
00041         arglistMin [indexTerm] = new exprClone (arglistMax [indexTerm]);
00042 
00043         arglistMax [indexTerm + 1] = new exprStore (arglistMax [indexTerm]); // evaluated at the end, safe to just copy
00044         arglistMin [indexTerm + 1] = new exprStore (arglistMax [indexTerm]); // evaluated at the end, safe to just copy 
00045       }
00046 
00047   lb = new exprMin (arglistMin, 16);
00048   ub = new exprMax (arglistMax, 16);
00049 }
00050 
00051 
00053 
00054 void exprTrilinear::getBounds (CouNumber &lb, CouNumber &ub) {
00055 
00056   CouNumber 
00057     *lbA = new CouNumber [3],
00058     *ubA = new CouNumber [3];
00059 
00060   for (int i=0; i<3; i++)
00061     arglist_ [i] -> getBounds (lbA [i], ubA [i]);
00062 
00063   lb =  COUENNE_INFINITY;
00064   ub = -COUENNE_INFINITY;
00065 
00066   for     (int i0 = 0; i0 < 2; i0++)
00067     for   (int i1 = 0; i1 < 2; i1++)
00068       for (int i2 = 0; i2 < 2; i2++) {
00069 
00070         double curbound = 
00071           (i0 ? ubA [0] : lbA [0]) * 
00072           (i1 ? ubA [1] : lbA [1]) *
00073           (i2 ? ubA [2] : lbA [2]);
00074 
00075         if (curbound < lb) lb = curbound;
00076         if (curbound > ub) ub = curbound;
00077       }
00078 
00079   delete [] lbA;
00080   delete [] ubA;
00081 }

Generated on Thu Sep 22 03:05:56 2011 by  doxygen 1.4.7