| 3294 | } |
| 3295 | |
| 3296 | void 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 | |
| 3338 | void HEkk::computeSimplexLpDualInfeasible() { |
| 3339 | // Compute num/max/sum of dual infeasibilities according to the |
no test coverage detected