Refine any HighsBasisStatus::kNonbasic settings according to the LP and any solution values
| 1421 | // Refine any HighsBasisStatus::kNonbasic settings according to the LP |
| 1422 | // and any solution values |
| 1423 | void 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 { |
no test coverage detected