15 using namespace Couenne;
21 ncols = si.getNumCols (), nNL = 0, nNU = 0,
22 *indNL =
new int [ncols],
23 *indNU =
new int [ncols];
26 *oldL =
couenneCG_ -> Problem () -> Lb (), *valNL =
new double [ncols],
27 *oldU =
couenneCG_ -> Problem () -> Ub (), *valNU =
new double [ncols];
30 *newL = si.getColLower (),
31 *newU = si.getColUpper ();
33 for (
int i=0; i<ncols; i++) {
34 if (newL [i] > oldL [i] +
COUENNE_EPS) {indNL [nNL] = i; valNL [nNL++] = newL [i];}
35 if (newU [i] < oldU [i] -
COUENNE_EPS) {indNU [nNU] = i; valNU [nNU++] = newU [i];}
40 cut. setLbs (nNL, indNL, valNL);
41 cut. setUbs (nNU, indNU, valNU);
43 OsiCuts *cuts =
new OsiCuts;
47 delete [] indNL;
delete [] valNL;
48 delete [] indNU;
delete [] valNU;
60 *lower = si.getColLower (),
61 *upper = si.getColUpper ();
65 for (
int i = cuts -> sizeColCuts (); i--;) {
69 const CoinPackedVector &lbs = cuts -> colCutPtr (i) -> lbs ();
70 const int *lindices = lbs.getIndices ();
71 const double *lvalues = lbs.getElements ();
73 for (
int j = lbs.getNumElements ();
j--;) {
74 register double lb = *lvalues++;
75 register int ind = *lindices++;
86 const CoinPackedVector &ubs = cuts -> colCutPtr (i) -> ubs ();
87 const int *uindices = ubs.getIndices ();
88 const double *uvalues = ubs.getElements ();
90 for (
int j = ubs.getNumElements ();
j--;) {
91 register double ub = *uvalues++;
92 register int ind = *uindices++;
108 OsiCuts *left, OsiCuts *right,
109 CoinPackedVector &lower, CoinPackedVector &upper)
const {
114 lowerLeft, upperLeft,
115 lowerRight, upperRight;
118 for (
int i = left -> sizeColCuts (); i--;) {
119 lowerLeft. append (left -> colCutPtr (i) -> lbs ());
120 upperLeft. append (left -> colCutPtr (i) -> ubs ());
124 for (
int i = right -> sizeColCuts (); i--;) {
125 lowerRight. append (right -> colCutPtr (i) -> lbs ());
126 upperRight. append (right -> colCutPtr (i) -> ubs ());
130 lowerLeft. sortIncrIndex (); upperLeft. sortIncrIndex ();
131 lowerRight. sortIncrIndex (); upperRight. sortIncrIndex ();
135 mergeBoxes (-1, lowerLeft, lowerRight, lower);
136 mergeBoxes (+1, upperLeft, upperRight, upper);
144 CoinPackedVector &left,
145 CoinPackedVector &right,
146 CoinPackedVector merged)
const {
148 Ln = left. getNumElements (),
149 Rn = right. getNumElements ();
155 *Li = left. getIndices (),
156 *Ri = right. getIndices ();
159 *Le = left. getElements (),
160 *Re = right. getElements ();
166 register int diff = *Li - *Ri;
168 if (diff < 0) {
if (!--Ln)
break; Li++; Le++;}
169 else if (diff > 0) {
if (!--Rn)
break; Ri++; Re++;}
173 if (!Ln || !Rn)
break;
174 if (dir < 0) merged. insert (*Li, *Le<*Re ? *Le : *Re);
175 else merged. insert (*Li, *Le>*Re ? *Le : *Re);
180 if (!--Ln || !--Rn)
break;
static Bigint * diff(Bigint *a, Bigint *b)
CouenneCutGenerator * couenneCG_
pointer to symbolic repr. of constraint, variables, and bounds
OsiCuts * getSingleDisjunction(OsiSolverInterface &si) const
create single osicolcut disjunction
int getBoxUnion(OsiSolverInterface &si, OsiCuts *left, OsiCuts *right, CoinPackedVector &lower, CoinPackedVector &upper) const
compute smallest box containing both left and right boxes.
int checkDisjSide(OsiSolverInterface &si, OsiCuts *cuts) const
check if (column!) cuts compatible with solver interface
void mergeBoxes(int dir, CoinPackedVector &left, CoinPackedVector &right, CoinPackedVector merged) const
utility to merge vectors into one