26 numberRows = T::getNumRows(),
27 numberColumns = T::getNumCols();
29 const double * columnUpper = T::getColUpper();
30 const double * columnLower = T::getColLower();
31 const double * rowUpper = T::getRowUpper();
32 const double * rowLower = T::getRowLower();
35 const double * element = T::getMatrixByCol()->getElements();
36 const int * row = T::getMatrixByCol()->getIndices();
37 const CoinBigIndex * columnStart = T::getMatrixByCol()->getVectorStarts();
38 const int * columnLength = T::getMatrixByCol()->getVectorLengths();
42 double * down =
new double [numberRows];
44 int * first =
new int[numberRows];
45 CoinZeroN(first,numberRows);
46 CoinZeroN(down,numberRows);
47 double * sum =
new double [numberRows];
48 CoinZeroN(sum,numberRows);
49 int numberTightened=0;
51 for (
int iColumn=0;iColumn<numberColumns;iColumn++) {
52 CoinBigIndex start = columnStart[iColumn];
53 CoinBigIndex
end = start + columnLength[iColumn];
54 double lower = columnLower[iColumn];
55 double upper = columnUpper[iColumn];
57 for (CoinBigIndex
j=start;
j<
end;
j++) {
59 double value = element[
j];
60 down[iRow] += value*lower;
61 sum[iRow] += fabs(value*lower);
64 for (CoinBigIndex
j=start;
j<
end;
j++) {
68 first[iRow]=-iColumn-1;
75 double tolerance = 1.0e-6;
77 std::vector <exprVar *> &vars = cutgen_ -> Problem () ->
Variables ();
79 for (
int iRow=0;iRow<numberRows;iRow++) {
81 int iColumn = first[iRow];
87 double lowerRow = rowLower[iRow];
89 lowerRow -= down[iRow];
90 double upperRow = rowUpper[iRow];
92 upperRow -= down[iRow];
93 double lower = columnLower[iColumn];
94 double upper = columnUpper[iColumn];
96 for (CoinBigIndex
j = columnStart[iColumn];
97 j<columnStart[iColumn]+columnLength[iColumn];
j++) {
109 newLower = -COIN_DBL_MAX,
110 newUpper = COIN_DBL_MAX;
113 if (lowerRow > -1.0e20) newLower = lowerRow / value;
114 if (upperRow < 1.0e20) newUpper = upperRow / value;
116 if (upperRow < 1.0e20) newLower = upperRow / value;
117 if (lowerRow > -1.0e20) newUpper = lowerRow / value;
120 double tolerance2 = 1.0e-6 + 1.0e-8 * sum [iRow];
124 newLower = (newLower-floor(newLower)<tolerance2) ?
128 newUpper = (ceil(newUpper)-newUpper<tolerance2) ?
133 if (newLower>lower+10.0*tolerance2||
134 newUpper<upper-10.0*tolerance2) {
136 newLower = CoinMax(lower,newLower);
137 newUpper = CoinMin(upper,newUpper);
138 if (newLower>newUpper+tolerance) {
143 T::setColLower(iColumn,newLower);
144 T::setColUpper(iColumn,CoinMax(newLower,newUpper));
152 return numberTightened;
virtual int tightenBoundsCLP_Light(int lightweight)
Copy of the Clp version — light version.
The in-memory representation of the variables element.
bool isInteger(CouNumber x)
is this number integer?