diff --git a/FEATURES.md b/FEATURES.md index e3c62da2c9..bc7bf6d82c 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -10,4 +10,9 @@ Added basis solve methods to highspy Added methods to get primal/dual ray and dual unboundedness direction to highspy +When a presolved LP has model status kUnknown, rather than returning this to the user, it performs postsolve and then uses the basis to solve the original LP + +Fixed bug in presolve when pointers stored in HighsMatrixSlice get invalidated when the coefficient matrix is reallocated (e.g. when non-zeros are added in HPresolve::addToMatrix) + +Primal and dual residual tolerances - applied following IPM or PDLP solution - now documented as options diff --git a/app/RunHighs.cpp b/app/RunHighs.cpp index 8813755b4c..f238bc1adc 100644 --- a/app/RunHighs.cpp +++ b/app/RunHighs.cpp @@ -46,7 +46,7 @@ int main(int argc, char** argv) { // call this first so that printHighsVersionCopyright uses reporting // settings defined in any options file. highs.passOptions(loaded_options); - // highs.writeOptions("Options.md"); + highs.writeOptions("Options.md"); // Load the model from model_file HighsStatus read_status = highs.readModel(model_file); diff --git a/docs/src/options/definitions.md b/docs/src/options/definitions.md index f4e932523c..92ac80c889 100644 --- a/docs/src/options/definitions.md +++ b/docs/src/options/definitions.md @@ -73,6 +73,18 @@ - Range: [1e-12, inf] - Default: 1e-08 +## primal\_residual\_tolerance +- Primal residual tolerance +- Type: double +- Range: [1e-10, inf] +- Default: 1e-07 + +## dual\_residual\_tolerance +- Dual residual tolerance +- Type: double +- Range: [1e-10, inf] +- Default: 1e-07 + ## objective\_bound - Objective bound for termination of the dual simplex solver - Type: double @@ -198,6 +210,16 @@ - Type: boolean - Default: "false" +## write\_presolved\_model\_file +- Write presolved model file +- Type: string +- Default: "" + +## write\_presolved\_model\_to\_file +- Write the presolved model to a file +- Type: boolean +- Default: "false" + ## mip\_detect\_symmetry - Whether MIP symmetry should be detected - Type: boolean @@ -220,6 +242,12 @@ - Range: {0, 2147483647} - Default: 2147483647 +## mip\_max\_start\_nodes +- MIP solver max number of nodes when completing a partial MIP start +- Type: integer +- Range: {0, 2147483647} +- Default: 500 + ## mip\_improving\_solution\_save - Whether improving MIP solutions should be saved - Type: boolean @@ -354,7 +382,7 @@ - Default: 4000 ## blend\_multi\_objectives -- Blend multiple objectives or apply lexicographically +- Blend multiple objectives or apply lexicographically: Default = true - Type: boolean - Default: "true" diff --git a/src/lp_data/HighsOptions.h b/src/lp_data/HighsOptions.h index eb315b8bcd..842f432b00 100644 --- a/src/lp_data/HighsOptions.h +++ b/src/lp_data/HighsOptions.h @@ -299,6 +299,8 @@ struct HighsOptionsStruct { double primal_feasibility_tolerance; double dual_feasibility_tolerance; double ipm_optimality_tolerance; + double primal_residual_tolerance; + double dual_residual_tolerance; double objective_bound; double objective_target; HighsInt threads; @@ -390,8 +392,6 @@ struct HighsOptionsStruct { bool less_infeasible_DSE_choose_row; bool use_original_HFactor_logic; bool run_centring; - double primal_residual_tolerance; - double dual_residual_tolerance; HighsInt max_centring_steps; double centring_ratio_tolerance; @@ -452,6 +452,8 @@ struct HighsOptionsStruct { primal_feasibility_tolerance(0.0), dual_feasibility_tolerance(0.0), ipm_optimality_tolerance(0.0), + primal_residual_tolerance(0.0), + dual_residual_tolerance(0.0), objective_bound(0.0), objective_target(0.0), threads(0), @@ -528,8 +530,6 @@ struct HighsOptionsStruct { less_infeasible_DSE_choose_row(false), use_original_HFactor_logic(false), run_centring(false), - primal_residual_tolerance(0.0), - dual_residual_tolerance(0.0), max_centring_steps(0), centring_ratio_tolerance(0.0), icrash(false), @@ -707,6 +707,16 @@ class HighsOptions : public HighsOptionsStruct { &ipm_optimality_tolerance, 1e-12, 1e-8, kHighsInf); records.push_back(record_double); + record_double = new OptionRecordDouble( + "primal_residual_tolerance", "Primal residual tolerance", advanced, + &primal_residual_tolerance, 1e-10, 1e-7, kHighsInf); + records.push_back(record_double); + + record_double = new OptionRecordDouble( + "dual_residual_tolerance", "Dual residual tolerance", advanced, + &dual_residual_tolerance, 1e-10, 1e-7, kHighsInf); + records.push_back(record_double); + record_double = new OptionRecordDouble( "objective_bound", "Objective bound for termination of the dual simplex solver", advanced, @@ -1399,16 +1409,6 @@ class HighsOptions : public HighsOptionsStruct { advanced, ¢ring_ratio_tolerance, 0, 100, kHighsInf); records.push_back(record_double); - record_double = new OptionRecordDouble( - "primal_residual_tolerance", "Primal residual tolerance", advanced, - &primal_residual_tolerance, 1e-10, 1e-7, kHighsInf); - records.push_back(record_double); - - record_double = new OptionRecordDouble( - "dual_residual_tolerance", "Dual residual tolerance", advanced, - &dual_residual_tolerance, 1e-10, 1e-7, kHighsInf); - records.push_back(record_double); - // Set up the log_options aliases log_options.clear(); log_options.log_stream =