28 numberRows = T::getNumRows(),
29 numberColumns = T::getNumCols(),
32 const double * columnUpper = T::getColUpper();
33 const double * columnLower = T::getColLower();
34 const double * rowUpper = T::getRowUpper();
35 const double * rowLower = T::getRowLower();
38 const double * element = T::getMatrixByCol()->getElements();
39 const int * row = T::getMatrixByCol()->getIndices();
40 const CoinBigIndex * columnStart = T::getMatrixByCol()->getVectorStarts();
41 const int * columnLength = T::getMatrixByCol()->getVectorLengths();
42 const double *objective = T::getObjCoefficients() ;
44 double direction = T::getObjSense();
45 double * down =
new double [numberRows];
48 return tightenBoundsCLP_Light (lightweight);
52 double *
up =
new double [numberRows];
53 double * sum =
new double [numberRows];
54 int * type =
new int [numberRows];
55 CoinZeroN(down,numberRows);
56 CoinZeroN(up,numberRows);
57 CoinZeroN(sum,numberRows);
58 CoinZeroN(type,numberRows);
59 double infinity = T::getInfinity();
61 for (iColumn=0;iColumn<numberColumns;iColumn++) {
62 CoinBigIndex start = columnStart[iColumn];
63 CoinBigIndex
end = start + columnLength[iColumn];
64 double lower = columnLower[iColumn];
65 double upper = columnUpper[iColumn];
67 for (CoinBigIndex
j=start;
j<
end;
j++) {
69 double value = element[
j];
70 sum[iRow]+=2.0*fabs(value*lower);
71 if ((type[iRow]&1)==0)
72 down[iRow] += value*lower;
73 if ((type[iRow]&2)==0)
74 up[iRow] += value*lower;
77 for (CoinBigIndex
j=start;
j<
end;
j++) {
79 double value = element[
j];
81 if ((type[iRow]&1)==0) {
82 if (lower!=-infinity) {
83 down[iRow] += value*lower;
84 sum[iRow]+=fabs(value*lower);
89 if ((type[iRow]&2)==0) {
90 if (upper!=infinity) {
91 up[iRow] += value*upper;
92 sum[iRow]+=fabs(value*upper);
98 if ((type[iRow]&1)==0) {
99 if (upper!=infinity) {
100 down[iRow] += value*upper;
101 sum[iRow]+=fabs(value*upper);
106 if ((type[iRow]&2)==0) {
107 if (lower!=-infinity) {
108 up[iRow] += value*lower;
109 sum[iRow]+=fabs(value*lower);
120 double tolerance = 1.0e-6;
122 for (iRow=0;iRow<numberRows;iRow++) {
123 if ((type[iRow]&1)!=0)
124 down[iRow]=-infinity;
125 if (down[iRow]>rowUpper[iRow]) {
126 if (down[iRow]>rowUpper[iRow]+tolerance+1.0
e-8*sum[iRow]) {
129 printf(
"infeasible on row %d\n",iRow);
134 down[iRow]=rowUpper[iRow];
137 if ((type[iRow]&2)!=0)
139 if (up[iRow]<rowLower[iRow]) {
140 if (up[iRow]<rowLower[iRow]-tolerance-1.0
e-8*sum[iRow]) {
143 printf(
"infeasible on row %d\n",iRow);
148 up[iRow]=rowLower[iRow];
156 for (iColumn=0;iColumn<numberColumns;iColumn++) {
157 double lower = columnLower[iColumn];
158 double upper = columnUpper[iColumn];
159 double gap = upper-lower;
167 start = columnStart [iColumn],
168 end = start + columnLength [iColumn];
170 if (lower < -1.0e8 && upper > 1.0e8)
178 std::vector <exprVar *> &vars = cutgen_ -> Problem () ->
Variables ();
185 printf(
"increasing lower bound on %d from %e to %e\n",iColumn,
190 T::setColLower(iColumn,lower);
195 printf(
"decreasing upper bound on %d from %e to %e\n",iColumn,
200 T::setColUpper(iColumn,upper);
204 double newLower=lower;
205 double newUpper=upper;
207 for (CoinBigIndex
j=start;
j<
end;
j++) {
209 double value = element[
j];
211 if ((type[iRow]&1)==0) {
213 if (down[iRow] + value*gap > rowUpper[iRow]+tolerance) {
214 double newGap = (rowUpper[iRow]-down[iRow])/value;
216 newGap += 1.0e-10*sum[iRow];
218 newGap = floor(newGap);
219 if (lower+newGap<newUpper)
220 newUpper=lower+newGap;
223 if (down[iRow]<rowLower[iRow])
225 if ((type[iRow]&2)==0) {
227 if (up[iRow] - value*gap < rowLower[iRow]-tolerance) {
228 double newGap = (up[iRow]-rowLower[iRow])/value;
230 newGap += 1.0e-10*sum[iRow];
232 newGap = floor(newGap);
233 if (upper-newGap>newLower)
234 newLower=upper-newGap;
237 if (up[iRow]>rowUpper[iRow])
240 if ((type[iRow]&1)==0) {
242 if (down[iRow] - value*gap > rowUpper[iRow]+tolerance) {
243 double newGap = -(rowUpper[iRow]-down[iRow])/value;
245 newGap += 1.0e-10*sum[iRow];
247 newGap = floor(newGap);
248 if (upper-newGap>newLower)
249 newLower=upper-newGap;
252 if (up[iRow]>rowUpper[iRow])
254 if ((type[iRow]&2)==0) {
256 if (up[iRow] + value*gap < rowLower[iRow]-tolerance) {
257 double newGap = -(up[iRow]-rowLower[iRow])/value;
259 newGap += 1.0e-10*sum[iRow];
261 newGap = floor(newGap);
262 if (lower+newGap<newUpper)
263 newUpper=lower+newGap;
266 if (down[iRow]<rowLower[iRow])
271 if (newUpper<upper || newLower>lower) {
273 if (newLower>newUpper) {
276 printf(
"infeasible on column %d\n",iColumn);
281 T::setColLower(iColumn,newLower);
282 T::setColUpper(iColumn,newUpper);
284 for (CoinBigIndex
j=start;
j<
end;
j++) {
286 double value = element[
j];
288 if ((type[iRow]&1)==0) down [iRow] += value*(newLower-lower);
289 if ((type[iRow]&2)==0) up [iRow] += value*(newUpper-upper);
291 if ((type[iRow]&1)==0) down [iRow] += value*(newUpper-upper);
292 if ((type[iRow]&2)==0) up [iRow] += value*(newLower-lower);
299 double objValue = direction*objective[iColumn];
301 if (objValue>=0.0&&(canGo&1)==0) {
303 printf(
"dual fix down on column %d\n",iColumn);
306 T::setColUpper(iColumn,lower);
307 }
else if (objValue<=0.0 && (canGo&2)==0) {
309 printf(
"dual fix up on column %d\n",iColumn);
312 T::setColLower(iColumn,upper);
virtual int tightenBoundsCLP(int lightweight)
Copy of the Clp version — not light version.
void fint fint fint real fint real real real real real real real real real * e
The in-memory representation of the variables element.
bool isInteger(CouNumber x)
is this number integer?