|
2 | 2 |
|
3 | 3 | Further to documentation in https://ergo-code.github.io/HiGHS/stable/guide/advanced/ |
4 | 4 |
|
| 5 | +The IIS search is rooted in `Highs::getIisInterface()`, which first |
| 6 | +checks whether the `Highs::model_status_` is |
| 7 | +`HighsModelStatus::kOptimal` or `HighsModelStatus::kUnbounded`, in |
| 8 | +which case the model is feasible so no IIS exists. Otherwise, the |
| 9 | +trivial check (for inconsistent bounds or empty infeasible rows) - |
| 10 | +performed by `HighsIis::trivial()` - and infeasible rows based on row |
| 11 | +value bounds - performed by `HighsIis::rowValueBounds()` - are |
| 12 | +performed. If `Highs::options_.iis_strategy` is `kIisStrategyLight` |
| 13 | +then `Highs::getIisInterface()` returns. |
5 | 14 |
|
| 15 | +The "full" IIS calculation operates in two phases: after a set of |
| 16 | +mutually infeasible rows has been identified, this is reduced to an |
| 17 | +IIS. The set of mutually infeasible rows can be found in two ways. |
6 | 18 |
|
| 19 | +Firstly, if it is known that the model is infeasible, then the simplex |
| 20 | +solver may have identified a dual ray. If there is a dual ray then its |
| 21 | +nonzeros correspond to a set of mutually infeasible constraints. If |
| 22 | +there is no dual ray - as might happen if the model's infeasibility |
| 23 | +has been identified in presolve - then the incumbent model is solved |
| 24 | +with `Highs::options_.presolve` = "off". Unfortunately the "ray route" |
| 25 | +is not robust, so currently switched off. |
| 26 | + |
| 27 | +Secondly - and the only route at the moment - an elasticity filter |
| 28 | +calculation is done to identify an infeasible subset of rows. This is |
| 29 | +calculation performed in `HighsIis::elasticityFilter`. This method is |
| 30 | +more general than is necessary for finding the set of mutually |
| 31 | +infeasible rows for an IIS calculation, and can be called directly |
| 32 | +using `Highs::feasibilityRelaxation`. |
| 33 | + |
| 34 | +The essence of the `HighsIis::elasticityFilter` is that it allows |
| 35 | +lower bounds, upper bounds and RHS values to be violated. There are |
| 36 | +penalties for doing so that can be global for each of these three |
| 37 | +cases, or local to each column lower bound, upper bound and row |
| 38 | +bound. The "elasticity LP" is constructed by adding elastic variables |
| 39 | +to transform the constraints from |
| 40 | +$$ |
| 41 | +L <= Ax <= U;\qquad l <= x <= u |
| 42 | +$$ |
| 43 | +to |
| 44 | +$$ |
| 45 | +L <= Ax + e_L - e_U <= U;\qquad l <= x + e_l - e_u <= u, |
| 46 | +$$ |
| 47 | +where the elastic variables are not used if the corresponding bound is |
| 48 | +infinite or the local/global penalty is negative. The original bounds |
| 49 | +on the variables $x$ are removed, and the objective is the linear |
| 50 | +function of the elastic variables given by the local/global |
| 51 | +penalties. Note that the model modifications required to achieve this |
| 52 | +formulation, are made by calls to methods in the `Highs` class so that |
| 53 | +the value of any initial basis is maintained. |
| 54 | + |
| 55 | +For the purposes of IIS calculation, each elastic variable has a |
| 56 | + |
| 57 | +If the original constraints cannot be satisfied, then some |
| 58 | + |
| 59 | +After the elasticity LP has been solved, each elasticity variable whose optimal value is positive is fixed at zero is |
7 | 60 |
|
0 commit comments