Skip to content

Commit d0744ed

Browse files
committed
Gets e226 right
1 parent b32cfd0 commit d0744ed

File tree

3 files changed

+48
-28
lines changed

3 files changed

+48
-28
lines changed

src/presolve/HPresolve.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4429,6 +4429,8 @@ HPresolve::Result HPresolve::removeSlacks(
44294429
}
44304430
//
44314431
postsolve_stack.slackColSubstitution(iRow, iCol, rhs, cost,
4432+
lower,
4433+
upper,
44324434
getRowVector(iRow));
44334435

44344436
markColDeleted(iCol);

src/presolve/HighsPostsolveStack.cpp

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <numeric>
1414

1515
#include "lp_data/HConst.h"
16+
#include "lp_data/HighsModelUtils.h" // For debugging
1617
#include "lp_data/HighsOptions.h"
1718
#include "util/HighsCDouble.h"
1819
#include "util/HighsUtils.h"
@@ -1381,42 +1382,54 @@ void HighsPostsolveStack::SlackColSubstitution::undo(
13811382
double(rowValue + colCoef * solution.col_value[col]);
13821383

13831384
solution.col_value[col] = double((rhs - rowValue) / colCoef);
1385+
double rowLower = colCoef > 0 ? rhs - colCoef * slackUpper : rhs - colCoef * slackLower;
1386+
double rowUpper = colCoef > 0 ? rhs - colCoef * slackLower : rhs - colCoef * slackUpper;
1387+
13841388
printf(
1385-
"\nHighsPostsolveStack::SlackColSubstitution::undo rowValue = %g; "
1386-
"colValue = %g\n",
1387-
double(rowValue), solution.col_value[col]);
1389+
"\nHighsPostsolveStack::SlackColSubstitution::undo rowValue = %11.5g; "
1390+
"bounds [%11.5g, %11.5g] colCoef = %11.6g\n",
1391+
double(rowValue), rowLower, rowUpper, colCoef);
1392+
printf(
1393+
"HighsPostsolveStack::SlackColSubstitution::undo colValue = %11.5g, bounds [%11.5g, %11.5g]\n",
1394+
solution.col_value[col], slackLower, slackUpper);
13881395

1389-
// if no dual values requested, return here
1396+
// If no dual values requested, return here
13901397
if (!solution.dual_valid) return;
13911398

1392-
// compute the row dual value such that reduced cost of basic column is 0
1393-
double save_row_dual = solution.row_dual[row];
1399+
// Row retains its dual value, and column has this dual value scaled by coeff
13941400
if (isModelRow) {
1395-
solution.row_dual[row] = 0;
1396-
HighsCDouble dualval = HighsCDouble(colCost);
1397-
dualval = -colCoef * solution.row_dual[row];
1398-
solution.row_dual[row] = double(dualval / colCoef);
1401+
solution.col_dual[col] = - solution.row_dual[row] / colCoef;
1402+
printf(
1403+
"HighsPostsolveStack::SlackColSubstitution::undo rowDual = %11.5g; colDual = %11.5g\n",
1404+
solution.row_dual[row], solution.col_dual[col]);
13991405
}
14001406

1401-
solution.col_dual[col] = 0;
1402-
printf(
1403-
"HighsPostsolveStack::SlackColSubstitution::undo OgRowDual = %g; rowDual "
1404-
"= %g; colDual = %g\n",
1405-
save_row_dual, solution.row_dual[row], solution.col_dual[col]);
1406-
1407-
// set basis status if necessary
1407+
// Set basis status if necessary
14081408
if (!basis.valid) return;
14091409

1410-
basis.col_status[col] = HighsBasisStatus::kBasic;
1411-
HighsBasisStatus save_row_basis_status = basis.row_status[row];
1412-
if (isModelRow)
1413-
basis.row_status[row] =
1414-
computeRowStatus(solution.row_dual[row], RowType::kEq);
1415-
printf(
1416-
"HighsPostsolveStack::SlackColSubstitution::undo OgRowStatus = %d; "
1417-
"RowStatus = %d; ColStatus = %d\n",
1418-
int(save_row_basis_status), int(basis.row_status[row]),
1419-
int(basis.col_status[col]));
1410+
// If row is basic, then slack is basic, otherwise row retains its status
1411+
if (isModelRow) {
1412+
HighsBasisStatus save_row_basis_status = basis.row_status[row];
1413+
if (basis.row_status[row] == HighsBasisStatus::kBasic) {
1414+
basis.col_status[col] = HighsBasisStatus::kBasic;
1415+
basis.row_status[row] = computeRowStatus(solution.row_dual[row], RowType::kEq);
1416+
} else if (basis.row_status[row] == HighsBasisStatus::kLower) {
1417+
basis.col_status[col] = colCoef > 0 ? HighsBasisStatus::kUpper : HighsBasisStatus::kLower;
1418+
} else {
1419+
basis.col_status[col] = colCoef > 0 ? HighsBasisStatus::kLower : HighsBasisStatus::kUpper;
1420+
}
1421+
printf("HighsPostsolveStack::SlackColSubstitution::undo OgRowStatus = %s; "
1422+
"RowStatus = %s; ColStatus = %s\n",
1423+
utilBasisStatusToString(save_row_basis_status).c_str(), utilBasisStatusToString(basis.row_status[row]).c_str(),
1424+
utilBasisStatusToString(basis.col_status[col]).c_str());
1425+
if (basis.col_status[col] == HighsBasisStatus::kLower) {
1426+
assert(solution.col_dual[col] > 0);
1427+
} else if (basis.col_status[col] == HighsBasisStatus::kUpper) {
1428+
assert(solution.col_dual[col] < 0);
1429+
}
1430+
} else {
1431+
basis.col_status[col] = HighsBasisStatus::kNonbasic;
1432+
}
14201433
}
14211434

14221435
} // namespace presolve

src/presolve/HighsPostsolveStack.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ class HighsPostsolveStack {
222222
struct SlackColSubstitution {
223223
double rhs;
224224
double colCost;
225+
double slackLower;
226+
double slackUpper;
225227
HighsInt row;
226228
HighsInt col;
227229

@@ -338,12 +340,15 @@ class HighsPostsolveStack {
338340
template <typename RowStorageFormat>
339341
void slackColSubstitution(HighsInt row, HighsInt col, double rhs,
340342
double colCost,
343+
double slackLower, double slackUpper,
341344
const HighsMatrixSlice<RowStorageFormat>& rowVec) {
342345
rowValues.clear();
343346
for (const HighsSliceNonzero& rowVal : rowVec)
344347
rowValues.emplace_back(origColIndex[rowVal.index()], rowVal.value());
345348

346-
reductionValues.push(SlackColSubstitution{rhs, colCost, origRowIndex[row],
349+
reductionValues.push(SlackColSubstitution{rhs, colCost,
350+
slackLower, slackUpper,
351+
origRowIndex[row],
347352
origColIndex[col]});
348353
reductionValues.push(rowValues);
349354
reductionAdded(ReductionType::kSlackColSubstitution);

0 commit comments

Comments
 (0)