/home/coin/SVN-release/OS-2.4.0/Couenne/src/cut/sdpcuts/rlt_cuts.cpp

Go to the documentation of this file.
00001 /* $Id: rlt_cuts.cpp 508 2011-02-15 21:52:44Z pbelotti $
00002  *
00003  * Name:    rlt_cuts.hpp
00004  * Author:  Andrea Qualizza
00005  * Purpose: 
00006  *
00007  * This file is licensed under the Eclipse Public License (EPL)
00008  */
00009 
00010 #include <stdio.h>
00011 #include <string.h>
00012 #include <OsiCuts.hpp>
00013 #include <OsiSolverInterface.hpp>
00014 #include <populate.hpp>
00015 #include <rlt_cuts.hpp>
00016 #include <tracer.hpp>
00017 
00018 #define indexQ(i,j,n) ((n) + (i) * (2*(n)-1-(i)) / 2 + (j))
00019 
00020 #define RLT_CUTS_TOL 0.00000001
00021 
00023 
00024 void rltCutsGen(const double *sol, int n, OsiCuts &cs, double *lb, double *ub, int m, Tracer *tracer) {
00025         int idx;
00026         double lhs = 0.0;
00027         //McKormick cuts 
00028         //for square terms
00029         for(int i=0;i<n;i++) {
00030                 idx = indexQ(i,i,n);
00031 
00032                 if (lb[i] != 0.0){
00033                         lhs = -1.0*sol[idx] + 2.0 * lb[i] * sol[i];
00034                         if (lhs - RLT_CUTS_TOL > lb[i]*lb[i])
00035                                 createCut(cs,lb[i]*lb[i], -1.0,idx,-1.0,i,2.0 * lb[i]); 
00036                 }
00037                         // -Xii <= - 2 li xi + li^2
00038                 // else bound -Xii <= 0 already present
00039                 if (ub[i] != 0.0) {
00040                         lhs = -1.0*sol[idx] + 2.0 * ub[i] * sol[i];
00041                         if (lhs - RLT_CUTS_TOL > ub[i]*ub[i])   
00042                                 createCut(cs,ub[i]*ub[i], -1.0,idx,-1.0,i,2.0 * ub[i]); 
00043                 }
00044                         // -Xii <= - 2 ui xi + ui^2
00045                 // else bound -Xii <= 0 already present
00046                 
00047                 lhs = 1.0*sol[idx] + (- lb[i]-ub[i]) * sol[i];
00048                 if (lhs - RLT_CUTS_TOL > -lb[i]*ub[i])  
00049                         createCut(cs,-lb[i]*ub[i],-1.0,idx, 1.0,i, - lb[i]-ub[i] );
00050                         //  Xii <= (li+ui) xi - li ui
00051         }
00052         //for i!=j
00053         for(int i=0;i<n;i++)
00054                 for(int j=i+1;j<n;j++) {
00055                         idx = indexQ(i,j,n);
00056                         lhs = -1.0*sol[idx] + lb[j] * sol[i] + lb[i] * sol[j];
00057                         if (lhs - RLT_CUTS_TOL > lb[i]*lb[j])
00058                                 createCut(cs,lb[i]*lb[j],-1,idx,-1.0,i,lb[j],j,lb[i]); 
00059                                 // -Xij <= - lj xi - li xj + li lj
00060 
00061                         lhs = -1.0*sol[idx] + ub[j] * sol[i] + ub[i] * sol[j];
00062                         if (lhs - RLT_CUTS_TOL > ub[i]*ub[j])
00063                                 createCut(cs,ub[i]*ub[j],-1,idx,-1.0,i,ub[j],j,ub[i]);
00064                                 // -Xij <= - uj xi - ui xj + ui uj
00065 
00066                         lhs = 1.0*sol[idx] - ub[j] * sol[i] - lb[i] * sol[j];
00067                         if (lhs - RLT_CUTS_TOL > -lb[i]*ub[j])
00068                                 createCut(cs,-lb[i]*ub[j],-1,idx,1.0,i,-ub[j],j,-lb[i]);
00069                                 //  Xij <=   uj xi + li xj - li uj
00070 
00071                         lhs = 1.0*sol[idx] - lb[j] * sol[i] - ub[i] * sol[j];
00072                         if (lhs - RLT_CUTS_TOL > -ub[i]*lb[j])
00073                                 createCut(cs,-ub[i]*lb[j],-1,idx,1.0,i,-lb[j],j,-ub[i]);
00074                                 //  Xij <=   lj xi + ui xj - ui lj
00075                 }
00076 }
00077 
00078 
00079 

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