HiGHS is an optimization package for solving continuous and mixed-integer linear programming problems (LPs and MIPs) using simplex, interior-point, and branch-and-cut algorithms. HiGHS is developed by the Edinburgh Research Group in Optimization.

For more detailed information on the implemented simplex method, we refer to [97].

HiGHS also includes the first-order LP solver cuPDLP-C. However, note that feasibility and optimality tolerances may not be satisfied, as cuPDLP-C applies these to the scaled problem only. Further, log output is always passed to standard output, the solve cannot be interrupted (e.g., Ctrl+C), and a timelimit is not obeyed.

# Usage

The following statement can be used inside your GAMS program to specify using HiGHS

Option MIP = HIGHS; { or LP or RMIP }

The above statement should appear before the Solve statement. If HiGHS was specified as the default solver during GAMS installation, the above statement is not necessary.

## Specification of HiGHS Options

GAMS/HiGHS supports the GAMS parameters reslim, iterlim, nodlim. optca, optcr, cutoff, and threads.

Options can be specified by a HiGHS options file. A HiGHS options file consists of one option or comment per line. A pound sign (`#`

) at the beginning of a line causes the entire line to be ignored. Otherwise, the line will be interpreted as an option name and value separated by an equal sign (`=`

) and any amount of white space (blanks or tabs).

A small example for a highs.opt file is:

solver = ipm ipm_optimality_tolerance = 1e-6 run_crossover = off

It causes HiGHS to use an interior point solver for an LP solve, increases the optimality tolerance to \(10^{-6}\), and turns off crossover to a basis solution.

# List of HiGHS Options

In the following, we give a detailed list of all HiGHS options.

Option | Description | Default |
---|---|---|

dual_feasibility_tolerance | Dual feasibility tolerance Range: [1e-10, ∞] | 1e-07 |

infinite_bound | Limit on |constraint bound|: values greater than or equal to this will be treated as infinite Range: [1e+15, ∞] | 1e+20 |

infinite_cost | Limit on |cost coefficient|: values greater than or equal to this will be treated as infinite Range: [1e+15, ∞] | 1e+20 |

ipm_iteration_limit | Iteration limit for IPM solver Range: {0, ..., ∞} | GAMS iterlim |

ipm_optimality_tolerance | IPM optimality tolerance Range: [1e-12, ∞] | 1e-08 |

large_matrix_value | Upper limit on |matrix entries|: values greater than or equal to this will be treated as infinite Range: [1, ∞] | 1e+15 |

mip_abs_gap | Tolerance on absolute gap of MIP, |ub-lb|, to determine whether optimality has been reached for a MIP instance Range: [0, ∞] | GAMS optca |

mip_allow_restart | Whether MIP restart is permitted Range: boolean | 1 |

mip_detect_symmetry | Whether MIP symmetry should be detected Range: boolean | 1 |

mip_feasibility_tolerance | MIP feasibility tolerance Range: [1e-10, ∞] | 1e-06 |

mip_heuristic_effort | Effort spent for MIP heuristics Range: [0, 1] | 0.05 |

mip_lp_age_limit | Maximal age of dynamic LP rows before they are removed from the LP relaxation in the MIP solver Range: {0, ..., 32767} | 10 |

mip_max_improving_sols | Limit on the number of improving solutions found to stop the MIP solver prematurely Range: {1, ..., ∞} | ∞ |

mip_max_leaves | MIP solver max number of leave nodes Range: {0, ..., ∞} | ∞ |

mip_max_nodes | MIP solver max number of nodes Range: {0, ..., ∞} | GAMS nodlim, if > 0, ∞ otherwise |

mip_max_stall_nodes | MIP solver max number of nodes where estimate is above cutoff bound Range: {0, ..., ∞} | ∞ |

mip_min_cliquetable_entries_for_parallelism | Minimal number of entries in the MIP solver cliquetable before neighbourhood queries of the conflict graph use parallel processing Range: {0, ..., ∞} | 100000 |

mip_min_logging_interval | MIP minimum logging interval Range: [0, ∞] | 5 |

mip_pool_age_limit | Maximal age of rows in the MIP solver cutpool before they are deleted Range: {0, ..., 1000} | 30 |

mip_pool_soft_limit | Soft limit on the number of rows in the MIP solver cutpool for dynamic age adjustment Range: {1, ..., ∞} | 10000 |

mip_pscost_minreliable | Minimal number of observations before MIP solver pseudo costs are considered reliable Range: {0, ..., ∞} | 8 |

mip_rel_gap | Tolerance on relative gap, |ub-lb|/|ub|, to determine whether optimality has been reached for a MIP instance Range: [0, ∞] | GAMS optcr |

mipstart | Whether to pass initial level values as starting point to MIP solver If the solution is not feasible, HiGHS will solve the LP obtained from fixing all discrete variables to their initial level values. Range: boolean | 0 |

objective_bound | Objective bound for termination of the dual simplex solver Range: real | GAMS cutoff |

objective_target | Objective target for termination of the MIP solver Range: real | -∞ |

output_flag | Enables or disables solver output Range: boolean | 0, if GAMS logoption = 0, otherwise 1 |

parallel | Parallel option: "off", "choose" or "on" Range: string | choose |

pdlp_d_gap_tol | Duality gap tolerance for PDLP solver: Default = 1e-4 Range: [1e-12, ∞] | 0.0001 |

pdlp_iteration_limit | Iteration limit for PDLP solver Range: {0, ..., ∞} | GAMS iterlim |

pdlp_native_termination | Use native termination for PDLP solver: Default = false Range: boolean | 0 |

pdlp_scaling | Scaling option for PDLP solver: Default = true Range: boolean | 1 |

presolve | Presolve option: "off", "choose" or "on" Range: string | choose |

primal_feasibility_tolerance | Primal feasibility tolerance Range: [1e-10, ∞] | 1e-07 |

random_seed | Random seed used in HiGHS Range: {0, ..., ∞} | 0 |

run_crossover | Run IPM crossover: "off", "choose" or "on" Range: string | on |

sensitivity | Whether to run sensitivity analysis after solving an LP with a simplex method Range: boolean | 0 |

simplex_dual_edge_weight_strategy | Strategy for simplex dual edge weights: Choose / Dantzig / Devex / Steepest Edge (-1/0/1/2) Range: {-1, ..., 2} | -1 |

simplex_iteration_limit | Iteration limit for simplex solver when solving LPs, but not subproblems in the MIP solver Range: {0, ..., ∞} | GAMS iterlim |

simplex_max_concurrency | Maximum level of concurrency in parallel simplex Range: {1, ..., 8} | 8 |

simplex_primal_edge_weight_strategy | Strategy for simplex primal edge weights: Choose / Dantzig / Devex / Steepest Edge (-1/0/1/2) Range: {-1, ..., 2} | -1 |

simplex_scale_strategy | Simplex scaling strategy: off / choose / equilibration / forced equilibration / max value 0 / max value 1 (0/1/2/3/4/5) Range: {0, ..., 5} | 1 |

simplex_strategy | Strategy for simplex solver 0 => Choose; 1 => Dual (serial); 2 => Dual (PAMI); 3 => Dual (SIP); 4 => Primal Range: {0, ..., 4} | 1 |

simplex_update_limit | Limit on the number of simplex UPDATE operations Range: {0, ..., ∞} | 5000 |

small_matrix_value | Lower limit on |matrix entries|: values less than or equal to this will be treated as zero Range: [1e-12, ∞] | 1e-09 |

solution_file | Solution file Range: string | <inputname>.sol |

solver | LP algorithm to run: "simplex", "choose", "ipm", or "pdlp"; ignored for MIP Range: string | choose |

solvetrace | Name of file for writing solving progress information during MIP solve Range: string | |

solvetracenodefreq | Frequency in number of nodes for writing to solve trace file Range: {0, ..., ∞} | 100 |

solvetracetimefreq | Frequency in seconds for writing to solve trace file Range: [0, ∞] | 5 |

threads | Number of threads used by HiGHS (0: automatic) Range: {0, ..., ∞} | GAMS threads |

time_limit | Time limit (seconds) Range: [0, ∞] | GAMS reslim |

write_model_file | Write model file Range: string | <inputname>.lp |

write_model_to_file | Write the model to a file Range: boolean | 0 |

write_solution_style | Style of solution file (raw = computer-readable, pretty = human-readable): -1 => HiGHS old raw (deprecated); 0 => HiGHS raw; 1 => HiGHS pretty; 2 => Glpsol raw; 3 => Glpsol pretty; 4 => HiGHS sparse raw Range: {-1, ..., 4} | 0 |

write_solution_to_file | Write the primal and dual solution to a file Range: boolean | 0 |

Options for expert users | ||

allow_unbounded_or_infeasible | whether to spend extra effort to distinguish unboundedness and infeasibility if necessary Range: boolean | 0 |

allowed_cost_scale_factor | Largest power-of-two factor permitted when scaling the costs Range: {0, ..., 20} | 0 |

allowed_matrix_scale_factor | Largest power-of-two factor permitted when scaling the constraint matrix Range: {0, ..., 30} | 20 |

centring_ratio_tolerance | Centring stops when the ratio max(x_j*s_j) / min(x_j*s_j) is below this tolerance (default = 100) Range: [0, ∞] | 100 |

cost_scale_factor | Scaling factor for costs Range: {-20, ..., 20} | 0 |

dual_simplex_cost_perturbation_multiplier | Dual simplex cost perturbation multiplier: 0 => no perturbation Range: [0, ∞] | 1 |

dual_simplex_pivot_growth_tolerance | Dual simplex pivot growth tolerance Range: [1e-12, ∞] | 1e-09 |

dual_steepest_edge_weight_error_tolerance | Tolerance on dual steepest edge weight errors Range: [0, ∞] | ∞ |

dual_steepest_edge_weight_log_error_threshold | Threshold on dual steepest edge weight errors for Devex switch Range: [1, ∞] | 10 |

factor_pivot_threshold | Matrix factorization pivot threshold Range: [0.0008, 0.5] | 0.1 |

factor_pivot_tolerance | Matrix factorization pivot tolerance Range: [0, 1] | 1e-10 |

highs_analysis_level | Analysis level in HiGHS Range: {0, ..., 63} | 0 |

highs_debug_level | Debugging level in HiGHS Range: {0, ..., 3} | 0 |

icrash | Run iCrash Range: boolean | 0 |

icrash_approx_iter | iCrash approximate minimization iterations Range: {0, ..., 100} | 50 |

icrash_breakpoints | Exact subproblem solution for iCrash Range: boolean | 0 |

icrash_dualize | Dualize strategy for iCrash Range: boolean | 0 |

icrash_exact | Exact subproblem solution for iCrash Range: boolean | 0 |

icrash_iterations | iCrash iterations Range: {0, ..., 200} | 30 |

icrash_starting_weight | iCrash starting weight Range: [1e-10, 1e+50] | 0.001 |

icrash_strategy | Strategy for iCrash Range: string | ICA |

ipx_dualize_strategy | Strategy for dualizing before IPX Range: {-1, ..., 3} | 2 |

less_infeasible_DSE_check | Check whether LP is candidate for LiDSE Range: boolean | 1 |

less_infeasible_DSE_choose_row | Use LiDSE if LP has right properties Range: boolean | 1 |

log_dev_level | Output development messages: 0 => none; 1 => info; 2 => verbose Range: {0, ..., 3} | 0 |

lp_presolve_requires_basis_postsolve | Prevents LP presolve steps for which postsolve cannot maintain a basis Range: boolean | 1 |

max_centring_steps | Maximum number of steps to use (default = 5) when computing the analytic centre Range: {0, ..., ∞} | 5 |

max_dual_simplex_cleanup_level | Max level of dual simplex cleanup Range: {0, ..., ∞} | 1 |

max_dual_simplex_phase1_cleanup_level | Max level of dual simplex phase 1 cleanup Range: {0, ..., ∞} | 2 |

mip_report_level | MIP solver reporting level Range: {0, ..., 2} | 1 |

no_unnecessary_rebuild_refactor | No unnecessary refactorization on simplex rebuild Range: boolean | 1 |

presolve_pivot_threshold | Matrix factorization pivot threshold for substitutions in presolve Range: [0.0008, 0.5] | 0.01 |

presolve_reduction_limit | Limit on number of presolve reductions -1 => no limit Range: {-1, ..., ∞} | -1 |

presolve_rule_logging | Log effectiveness of presolve rules for LP Range: boolean | 0 |

presolve_rule_off | Bit mask of presolve rules that are not allowed Range: {0, ..., ∞} | 0 |

presolve_substitution_maxfillin | Maximal fillin allowed for substitutions in presolve Range: {0, ..., ∞} | 10 |

primal_simplex_bound_perturbation_multiplier | Primal simplex bound perturbation multiplier: 0 => no perturbation Range: [0, ∞] | 1 |

rebuild_refactor_solution_error_tolerance | Tolerance on solution error when considering refactorization on simplex rebuild Range: real | 1e-08 |

restart_presolve_reduction_limit | Limit on number of further presolve reductions on restart in MIP solver -1 => no limit, otherwise, must be positive Range: {-1, ..., ∞} | -1 |

run_centring | Perform centring steps or not Range: boolean | 0 |

simplex_crash_strategy | Strategy for simplex crash: off / LTSSF / Bixby (0/1/2) Range: {0, ..., 9} | 0 |

simplex_dualize_strategy | Strategy for dualizing before simplex Range: {-1, ..., 1} | -1 |

simplex_initial_condition_check | Perform initial basis condition check in simplex Range: boolean | 1 |

simplex_initial_condition_tolerance | Tolerance on initial basis condition in simplex Range: [1, ∞] | 1e+14 |

simplex_min_concurrency | Minimum level of concurrency in parallel simplex Range: {1, ..., 8} | 1 |

simplex_permute_strategy | Strategy for permuting before simplex Range: {-1, ..., 1} | -1 |

simplex_price_strategy | Strategy for PRICE in simplex Range: {0, ..., 3} | 3 |

simplex_unscaled_solution_strategy | Strategy for solving unscaled LP in simplex Range: {0, ..., 2} | 1 |

start_crossover_tolerance | Tolerance to be satisfied before IPM crossover will start Range: [1e-12, ∞] | 1e-08 |

use_implied_bounds_from_presolve | Use relaxed implied bounds from presolve Range: boolean | 0 |

use_original_HFactor_logic | Use original HFactor logic for sparse vs hyper-sparse TRANs Range: boolean | 1 |