High-Performance Configuration

LP Solver Selection

By default, EAGO uses GLPK for solving linear subproblems introduced. Using a commercial linear solver is highly recommended such as Gurobi, CPLEX, or XPRESS is highly recommended. Both Gurobi and CPLEX are free for academics and installation information can be found through http://www.gurobi.com/academia/academia-center and https://www.ibm.com/developerworks/community/blogs/jfp/entry/CPLEXIsFreeForStudents?lang=en, respectively.


EAGO assumes that the MOI wrapper for any sub-solver exhibits the expected behavior. Any deviation for the expected may lead to an error. We currently recommend using either the default GLPK solver or Gurobi rather than CPLEX. Our experience has been that the GLPK and Gurobi MathOptInterface wrappers are better maintained and less prone to unexpected behavior than CPLEX currently is (though this is continuously improving) and in particular GLPK is quite stable.

A non-default LP solver can then be selected by the user via a series of keyword argument inputs as illustrated in the code snippet below. The relaxed_optimizer contains an instance optimizer with valid relaxations that are made at the root node and is updated with affine relaxations in place.

# Create opt EAGO Optimizer with Gurobi as a lower subsolver
m = Model(optimizer_with_attributes(EAGO.Optimizer, "relaxed_optimizer" => Gurobi.Optimizer(OutputFlag=0))

Rounding Mode

The IntervalArithmetic.jl package supports a number of different directed rounding modes. The default directed rounding mode is :tight. It is recommended that the user specify that :accurate directed rounding mode be used as it may results in a significant performance improvement. Setting a rounding mode can requires the redefinition of a number of functions. As a result, this should only be done at the top-level by the user (rather than by using keyword arguments). To set the rounding mode to :accurate using the following syntax when loading the EAGO package initially:

using IntervalArithmetic; setrounding(Interval, :accurate)
using EAGO

Ipopt Build

Ipopt is the recommended solver for upper bounding problems. Ipopt's performance is highly dependent on the linear algebra package used (up to 30x). By default MUMPS is used. It's recommended that you either compile Ipopt with HSL MA57 or the Pardiso linear algebra packages with a machine specific Blas library (for Intel users the JuliaPro MKL version is recommended). For information on this, see the below links:

  • Compiling Ipopt: https://www.coin-or.org/Ipopt/documentation/node13.html
  • Julia Specifics:
    • Pointing Ipopt to a compiled version:
      • Ipopt Package Info: https://github.com/JuliaOpt/Ipopt.jl
      • Discourse discussion: https://discourse.julialang.org/t/use-ipopt-with-custom-version/9176
    • Issues using Pardiso:
      • Ubuntu: https://github.com/JuliaOpt/Ipopt.jl/issues/106
      • Windows: https://github.com/JuliaOpt/Ipopt.jl/issues/83
  • HSL Website: http://www.hsl.rl.ac.uk/ipopt/
  • Pardiso Website: https://pardiso-project.org/