MCPcopy Create free account
hub / github.com/ERGO-Code/HiGHS / refineBasis

Function refineBasis

highs/lp_data/HighsSolution.cpp:1423–1498  ·  view source on GitHub ↗

Refine any HighsBasisStatus::kNonbasic settings according to the LP and any solution values

Source from the content-addressed store, hash-verified

1421// Refine any HighsBasisStatus::kNonbasic settings according to the LP
1422// and any solution values
1423void refineBasis(const HighsLp& lp, const HighsSolution& solution,
1424 HighsBasis& basis) {
1425 assert(basis.useful);
1426 assert(isBasisRightSize(lp, basis));
1427 const bool have_highs_solution = solution.value_valid;
1428
1429 const HighsInt num_col = lp.num_col_;
1430 const HighsInt num_row = lp.num_row_;
1431 for (HighsInt iCol = 0; iCol < num_col; iCol++) {
1432 if (basis.col_status[iCol] != HighsBasisStatus::kNonbasic) continue;
1433 const double lower = lp.col_lower_[iCol];
1434 const double upper = lp.col_upper_[iCol];
1435 HighsBasisStatus status = HighsBasisStatus::kNonbasic;
1436 if (lower == upper) {
1437 status = HighsBasisStatus::kLower;
1438 } else if (!highs_isInfinity(-lower)) {
1439 if (!highs_isInfinity(upper)) {
1440 if (have_highs_solution) {
1441 if (solution.col_value[iCol] < 0.5 * (lower + upper)) {
1442 status = HighsBasisStatus::kLower;
1443 } else {
1444 status = HighsBasisStatus::kUpper;
1445 }
1446 } else {
1447 if (fabs(lower) < fabs(upper)) {
1448 status = HighsBasisStatus::kLower;
1449 } else {
1450 status = HighsBasisStatus::kUpper;
1451 }
1452 }
1453 } else {
1454 status = HighsBasisStatus::kLower;
1455 }
1456 } else if (!highs_isInfinity(upper)) {
1457 status = HighsBasisStatus::kUpper;
1458 } else {
1459 status = HighsBasisStatus::kZero;
1460 }
1461 assert(status != HighsBasisStatus::kNonbasic);
1462 basis.col_status[iCol] = status;
1463 }
1464
1465 for (HighsInt iRow = 0; iRow < num_row; iRow++) {
1466 if (basis.row_status[iRow] != HighsBasisStatus::kNonbasic) continue;
1467 const double lower = lp.row_lower_[iRow];
1468 const double upper = lp.row_upper_[iRow];
1469 HighsBasisStatus status = HighsBasisStatus::kNonbasic;
1470 if (lower == upper) {
1471 status = HighsBasisStatus::kLower;
1472 } else if (!highs_isInfinity(-lower)) {
1473 if (!highs_isInfinity(upper)) {
1474 if (have_highs_solution) {
1475 if (solution.row_value[iRow] < 0.5 * (lower + upper)) {
1476 status = HighsBasisStatus::kLower;
1477 } else {
1478 status = HighsBasisStatus::kUpper;
1479 }
1480 } else {

Callers 4

solveLpSimplexFunction · 0.85
debugMethod · 0.85
calledOptimizeModelMethod · 0.85
callRunPostsolveMethod · 0.85

Calls 2

highs_isInfinityFunction · 0.85
isBasisRightSizeFunction · 0.70

Tested by

no test coverage detected