Skip to content

Commit f582527

Browse files
committed
Merge branch 'hipo-dev-latest' into hipo-dev
2 parents 1e62be5 + cefa4ac commit f582527

File tree

4 files changed

+72
-41
lines changed

4 files changed

+72
-41
lines changed

FEATURES.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,30 @@ 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_objective_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+
Formerly the options `user_cost_scale` and `user_bound_scale` allowed uniform (power-of-two) scaling to the costs and bounds of an LP. The option `user_cost_scale` is now replaced by `user_objective_scale`.
26+
27+
After HiGHS determines and logs the coefficient ranges and warns about extreme values, it recommends values of `user_objective_scale` and `user_bound_scale` if
28+
- 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.
29+
- 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.
30+
31+
The recommended objective scaling is determined with respect to the recommended bound scaling
32+
Users can obtain the recommended values of `user_objective_scale` and `user_bound_scale` by calling `Highs::getObjectiveBoundScaling`
33+
34+
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.
35+
36+
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.
37+
38+
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.
39+
40+
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.
41+
42+
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.
43+
44+
Prompted by [#2581](https://github.com/ERGO-Code/HiGHS/issues/2581), the QP example in `call_highs_from_csharp.cs` has been corrected
45+
46+
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
47+

docs/src/options/definitions.md

Lines changed: 29 additions & 13 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

@@ -115,14 +115,14 @@
115115
- Range: {0, 2147483647}
116116
- Default: 0
117117

118-
## user\_bound\_scale
119-
- Exponent of power-of-two bound scaling for model
118+
## user\_objective\_scale
119+
- Exponent of power-of-two objective scaling for model
120120
- Type: integer
121121
- Range: {-2147483647, 2147483647}
122122
- Default: 0
123123

124-
## user\_cost\_scale
125-
- Exponent of power-of-two cost scaling for model
124+
## user\_bound\_scale
125+
- Exponent of power-of-two bound scaling for model
126126
- Type: integer
127127
- Range: {-2147483647, 2147483647}
128128
- Default: 0
@@ -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", &HighsIis::model_);
15091510
// structs
15101511
py::class_<HighsSolution>(m, "HighsSolution", py::module_local())
15111512
.def(py::init<>())

highs/lp_data/HighsOptions.h

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -704,15 +704,11 @@ class HighsOptions : public HighsOptionsStruct {
704704
advanced, &presolve, kHighsChooseString);
705705
records.push_back(record_string);
706706

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

718714
record_string = new OptionRecordString(
@@ -1226,26 +1222,17 @@ class HighsOptions : public HighsOptionsStruct {
12261222
&mip_min_logging_interval, 0, 5, kHighsInf);
12271223
records.push_back(record_double);
12281224

1229-
record_string = new OptionRecordString(
1230-
kMipLpSolverString,
1231-
"MIP LP solver option: \"choose\", \"simplex\", \"ipm\""
1232-
#ifdef HIPO
1233-
", \"ipx\" or \"hipo\"",
1234-
#else
1235-
"or \"ipx\"",
1236-
#endif
1237-
advanced, &mip_lp_solver, kHighsChooseString);
1225+
record_string =
1226+
new OptionRecordString(kMipLpSolverString,
1227+
"MIP LP solver option: \"choose\", \"simplex\", "
1228+
"\"ipm\", \"ipx\" or \"hipo\"",
1229+
advanced, &mip_lp_solver, kHighsChooseString);
12381230
records.push_back(record_string);
12391231

1240-
record_string =
1241-
new OptionRecordString(kMipIpmSolverString,
1242-
"MIP IPM solver option: \"choose\""
1243-
#ifdef HIPO
1244-
", \"ipx\" or \"hipo\"",
1245-
#else
1246-
"or \"ipx\"",
1247-
#endif
1248-
advanced, &mip_ipm_solver, kHighsChooseString);
1232+
record_string = new OptionRecordString(
1233+
kMipIpmSolverString,
1234+
"MIP IPM solver option: \"choose\", \"ipx\" or \"hipo\"", advanced,
1235+
&mip_ipm_solver, kHighsChooseString);
12491236
records.push_back(record_string);
12501237

12511238
record_double = new OptionRecordDouble(

0 commit comments

Comments
 (0)