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

Method computeSimplexDualInfeasible

highs/simplex/HEkk.cpp:3296–3336  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3294}
3295
3296void HEkk::computeSimplexDualInfeasible() {
3297 analysis_.simplexTimerStart(ComputeDuIfsClock);
3298 // Computes num/max/sum of dual infeasibilities in phase 1 and phase
3299 // 2 according to nonbasicMove. The bounds are only used to identify
3300 // free variables. Fixed variables are assumed to have
3301 // nonbasicMove=0 so that no dual infeasibility is counted for them.
3302 const double scaled_dual_feasibility_tolerance =
3303 options_->dual_feasibility_tolerance;
3304 HighsInt& num_dual_infeasibility = info_.num_dual_infeasibilities;
3305 double& max_dual_infeasibility = info_.max_dual_infeasibility;
3306 double& sum_dual_infeasibility = info_.sum_dual_infeasibilities;
3307 num_dual_infeasibility = 0;
3308 max_dual_infeasibility = 0;
3309 sum_dual_infeasibility = 0;
3310
3311 for (HighsInt iCol = 0; iCol < lp_.num_col_ + lp_.num_row_; iCol++) {
3312 if (!basis_.nonbasicFlag_[iCol]) continue;
3313 // Nonbasic column
3314 const double dual = info_.workDual_[iCol];
3315 const double lower = info_.workLower_[iCol];
3316 const double upper = info_.workUpper_[iCol];
3317 double dual_infeasibility = 0;
3318 if (highs_isInfinity(-lower) && highs_isInfinity(upper)) {
3319 // Free: any nonzero dual value is infeasible
3320 dual_infeasibility = fabs(dual);
3321 } else {
3322 // Not free: any dual infeasibility is given by the dual value
3323 // signed by nonbasicMove
3324 dual_infeasibility = -basis_.nonbasicMove_[iCol] * dual;
3325 }
3326 if (dual_infeasibility > 0) {
3327 if (dual_infeasibility >= scaled_dual_feasibility_tolerance) {
3328 num_dual_infeasibility++;
3329 }
3330 max_dual_infeasibility =
3331 std::max(dual_infeasibility, max_dual_infeasibility);
3332 sum_dual_infeasibility += dual_infeasibility;
3333 }
3334 }
3335 analysis_.simplexTimerStop(ComputeDuIfsClock);
3336}
3337
3338void HEkk::computeSimplexLpDualInfeasible() {
3339 // Compute num/max/sum of dual infeasibilities according to the

Callers 5

solveMethod · 0.80
cleanupMethod · 0.80
cleanupMethod · 0.80
rebuildMethod · 0.80

Calls 3

highs_isInfinityFunction · 0.85
simplexTimerStartMethod · 0.80
simplexTimerStopMethod · 0.80

Tested by

no test coverage detected