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 [98].

# 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 = false

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 |

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

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

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

infinite_cost | Limit on cost coefficient: values larger than 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 larger than 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_detect_symmetry | Whether 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 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 cliquetable before neighborhood queries of the conflict graph use parallel processing Range: {0, ..., ∞} | 100000 |

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

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

mip_pscost_minreliable | minimal number of observations before 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 |

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

objective_bound | Objective bound for termination Range: real | GAMS cutoff |

objective_target | Objective target for termination 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 |

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 |

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

simplex_crash_strategy | Strategy for simplex crash: off / LTSSF / Bixby (0/1/2) Range: {0, ..., 9} | 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 Range: {0, ..., ∞} | GAMS iterlim |

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

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

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 smaller than this will be treated as zero Range: [1e-12, ∞] | 1e-09 |

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

solver | Solver option: "simplex", "choose" or "ipm", ignored for MIP Range: string | choose |

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 | Write the solution in style: 0=>Raw (computer-readable); 1=>Pretty (human-readable); 2=>OldRaw (deprecated) Range: {0, ..., 2} | 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 |

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 |

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_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 |

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_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 |

run_crossover | Run the crossover routine for IPX Range: boolean | 1 |

simplex_dualise_strategy | Strategy for dualising 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_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 |