Skip to content

Commit fb14c23

Browse files
committed
Updated FEATURES.md and added HighsModel to getIis in highspy
1 parent 8908815 commit fb14c23

File tree

4 files changed

+55
-28
lines changed

4 files changed

+55
-28
lines changed

FEATURES.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,28 @@ Only for LPs is there a choice of solver. Previously, when setting the `solver`
1818

1919
As per [#2487](https://github.com/ERGO-Code/HiGHS/issues/2487), trivial heuristics now run before feasibility jump (FJ), and FJ will use any existing incumbent. FJ will clip any finite variable values in the incumbent to lower and upper bounds, and falls back to the existing logic (lower bound if finite, else upper bound if finite, else 0) for any infinite values in the incumbent.
2020

21+
Prompted by [#2460](https://github.com/ERGO-Code/HiGHS/issues/2460), the options `user_cost_scale` and `user_bound_scale` apply uniform (power-of-two) scaling to the objective and bounds of a model, and now respect the following restrictions
22+
- For a MIP, column bounds cannot be scaled, so the scaling is achieved by scaling the cost and constraint matrix column
23+
- For a QP, Hessian entries must be scaled down (up) when bounds are scaled up (down) so that all terms in the objective are scaled by a constant.
24+
25+
After HiGHS determines and logs the coefficient ranges and warns about extreme values, it recommends values of `user_cost_scale` and `user_bound_scale` if
26+
- All the objective coefficients (bound values) are smaller than the "excessively small constant" `kExcessivelySmallObjectiveCoefficient` (`kExcessivelySmallBoundValue`) - both of which are 1e-4 - suggesting that they are scaled up so that the largest value becomes (just over) the excessively small constant. Since the smallest value can be arbitrarily small, scaling so that this becomes (just over) the small constant is inadvisable, as the largest value could then be scaled up to an extremely large value.
27+
- All the objective coefficients (bound values) are larger than the "excessively large constant" `kExcessivelyLargeObjectiveCoefficient` (`kExcessivelyLargeBoundValue`) - both of which are 1e6 - suggesting that they are scaled down so that the largest value becomes (just over) the excessively large constant.
28+
29+
The recommended objective scaling is determined with respect to the recommended bound scaling
30+
Users can obtain the recommended values of user_cost_scale and user_bound_scale by calling `Highs::getObjectiveBoundScaling`
31+
32+
The irreducible infeasibility system (IIS) facility now detects infeasibility due to bounds on constraint activity values being incompatible with constraint bounds. A `kIisStrategyLight` mode for the `iis_strategy` option has been introduced so that only infeasibility due to incompatible variable/constraint bounds and constraint activity values is checked for. The model corresponding to any known IIS is now formed and held as a data member of the `HighsIis` class. The `HighsIis` class is available via `highspy`, and its data members are available via the C API.
33+
34+
Prompted by [#2463](https://github.com/ERGO-Code/HiGHS/issues/2463), when HiGHS writes out a solution or basis for a model without column or row names, it creates names. This avoids a mis-match between the ordering of variables when such a model is written out as a .lp file, and then this and a solution or a basis is read in.
35+
36+
Prompted by [#2487](https://github.com/ERGO-Code/HiGHS/issues/2487), the feasibility jump MIP heuristic starts from any incumbent solution, allowing it to improve on an existing feasible solution.
37+
38+
Prompted by [#2528](https://github.com/ERGO-Code/HiGHS/issues/2528), the logging for the HiGHS interior point method (IPM) solvers and PDLP solver has been standardised, and logging has been added to the IPM solver during time-consuming computational phases.
39+
40+
Prompted by [#2557](https://github.com/ERGO-Code/HiGHS/issues/2557), `Highs::getFixedLp` has been added so that, after solving a MIP, the LP with discrete variables fixed at their optimal values can be formed, allowing it to be passed to HiGHS and solved as an LP.
41+
42+
Prompted by [#2581](https://github.com/ERGO-Code/HiGHS/issues/2581), the QP example in `call_highs_from_csharp.cs` has been corrected
43+
44+
Prompted by [#2582](https://github.com/ERGO-Code/HiGHS/issues/2582), the C API constants are declared `static const` to prevent multiple definition linker errors
45+

docs/src/options/definitions.md

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
- Default: "choose"
77

88
## [solver](@id option-solver)
9-
- Solver option: "simplex", "choose", "ipm", "hipo" or "pdlp". If "simplex"/"ipm"/"hipo"/"pdlp" is chosen then, for a MIP (QP) the integrality constraint (quadratic term) will be ignored
9+
- LP solver option: "choose", "simplex", "ipm", "ipx", "hipo" or "pdlp"
1010
- Type: string
1111
- Default: "choose"
1212

@@ -241,6 +241,11 @@
241241
- Type: boolean
242242
- Default: "false"
243243

244+
## write\_iis\_model\_file
245+
- Write IIS model file
246+
- Type: string
247+
- Default: ""
248+
244249
## mip\_detect\_symmetry
245250
- Whether MIP symmetry should be detected
246251
- Type: boolean
@@ -397,6 +402,16 @@
397402
- Range: [0, inf]
398403
- Default: 5
399404

405+
## mip\_lp\_solver
406+
- MIP LP solver option: "choose", "simplex", "ipm", "ipx" or "hipo"
407+
- Type: string
408+
- Default: "choose"
409+
410+
## mip\_ipm\_solver
411+
- MIP IPM solver option: "choose", "ipx" or "hipo"
412+
- Type: string
413+
- Default: "choose"
414+
400415
## [ipm\_optimality\_tolerance](@id option-ipm-optimality-tolerance)
401416
- IPM optimality tolerance
402417
- Type: double
@@ -410,12 +425,12 @@
410425
- Default: 2147483647
411426

412427
## [hipo\_system](@id option-hipo-system)
413-
- Type of Newton system for HiPO: "augmented", "normaleq" or "choose"
428+
- HiPO Newton system option: "augmented", "normaleq" or "choose"
414429
- Type: string
415430
- Default: "choose"
416431

417432
## [hipo\_parallel\_type](@id option-hipo-parallel)
418-
- Type of parallelism for HiPO: "tree", "node", "both"
433+
- HiPO parallel option: "tree", "node" or "both"
419434
- Type: string
420435
- Default: "both"
421436

@@ -425,11 +440,6 @@
425440
- Range: {0, 2147483647}
426441
- Default: 128
427442

428-
## pdlp\_native\_termination
429-
- Use native termination for PDLP solver: Default = false
430-
- Type: boolean
431-
- Default: "false"
432-
433443
## pdlp\_scaling
434444
- Scaling option for PDLP solver: Default = true
435445
- Type: boolean
@@ -471,8 +481,14 @@
471481
- Range: [0, inf]
472482
- Default: 1e-07
473483

484+
## iis\_strategy
485+
- Strategy for IIS calculation: Light test / Full and prioritise rows / Full and prioritise columns (0/1/2)
486+
- Type: integer
487+
- Range: {0, 2}
488+
- Default: 0
489+
474490
## blend\_multi\_objectives
475-
- Blend multiple objectives or apply lexicographically: Default = true
491+
- Blend multiple objectives or apply lexicographically
476492
- Type: boolean
477493
- Default: "true"
478494

highs/highs_bindings.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1505,7 +1505,8 @@ PYBIND11_MODULE(_core, m, py::mod_gil_not_used()) {
15051505
.def_readwrite("row_index", &HighsIis::row_index_)
15061506
.def_readwrite("col_bound", &HighsIis::col_bound_)
15071507
.def_readwrite("row_bound", &HighsIis::row_bound_)
1508-
.def_readwrite("info", &HighsIis::info_);
1508+
.def_readwrite("info", &HighsIis::info_)
1509+
.def_readwrite("model", &HighsModel::model_);
15091510
// structs
15101511
py::class_<HighsSolution>(m, "HighsSolution", py::module_local())
15111512
.def(py::init<>())

highs/lp_data/HighsOptions.h

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -706,12 +706,7 @@ class HighsOptions : public HighsOptionsStruct {
706706

707707
record_string = new OptionRecordString(
708708
kSolverString,
709-
"LP solver option: \"choose\", \"simplex\", \"ipm\", \"ipx\""
710-
#ifdef HIPO
711-
", \"hipo\" or \"pdlp\"",
712-
#else
713-
" or \"pdlp\"",
714-
#endif
709+
"LP solver option: \"choose\", \"simplex\", \"ipm\", \"ipx\", \"hipo\" or \"pdlp\"",
715710
advanced, &solver, kHighsChooseString);
716711
records.push_back(record_string);
717712

@@ -1228,23 +1223,13 @@ class HighsOptions : public HighsOptionsStruct {
12281223

12291224
record_string = new OptionRecordString(
12301225
kMipLpSolverString,
1231-
"MIP LP solver option: \"choose\", \"simplex\", \"ipm\""
1232-
#ifdef HIPO
1233-
", \"ipx\" or \"hipo\"",
1234-
#else
1235-
"or \"ipx\"",
1236-
#endif
1226+
"MIP LP solver option: \"choose\", \"simplex\", \"ipm\", \"ipx\" or \"hipo\"",
12371227
advanced, &mip_lp_solver, kHighsChooseString);
12381228
records.push_back(record_string);
12391229

12401230
record_string =
12411231
new OptionRecordString(kMipIpmSolverString,
1242-
"MIP IPM solver option: \"choose\""
1243-
#ifdef HIPO
1244-
", \"ipx\" or \"hipo\"",
1245-
#else
1246-
"or \"ipx\"",
1247-
#endif
1232+
"MIP IPM solver option: \"choose\", \"ipx\" or \"hipo\"",
12481233
advanced, &mip_ipm_solver, kHighsChooseString);
12491234
records.push_back(record_string);
12501235

0 commit comments

Comments
 (0)