00001
00002
00003
00004
00005
00006
00007
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
00028
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
00038
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
00045
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
00051 }
00052
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
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
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
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
00075 }
00076 }
00077
00078
00079