00001
00002
00003
00004
00005
00006
00007
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]);
00044 arglistMin [indexTerm + 1] = new exprStore (arglistMax [indexTerm]);
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 }