EAGO Optimizer

EAGO Optimizer

The EAGO.Optimizer object holds all algorithm solution information. A description of all user-facing options has been provided in the docstring.

EAGO.Optimizer

EAGO.OptimizerType.
Optimizer

The main optimizer object used by EAGO to solve problems during the optimization routine. The following commonly used options are described below and can be set via keyword arguments in the JuMP/MOI model:

  • presolve_scrubber_flag::Bool: Replace code in user-defined functions which may prevent method overloading on Real subtypes (default = false).
  • presolve_to_JuMP_flag::Bool: Create and use DAG representations of user-defined function (default = false).
  • presolve_epigraph_flag::Bool: [FUTURE FEATURE, NOT CURRENTLY IMPLEMENTED] Apply the epigraph reformulation to the problem (default = false).
  • presolve_cse_flag::Bool: [FUTURE FEATURE, NOT CURRENTLY IMPLEMENTED] Enable common subexpression elimination for DAG (default = false).
  • presolve_flatten_flag::Bool: Rerranges the DAG using registered transformations (default = false)
  • cp_depth::Int64: Depth in B&B tree above which constraint propagation should be disabled (default = 1000).
  • cp_repetitions::Int64: Number of repetitions of forward-reverse passes to perform in constraint propagation (default = 3).
  • cp_tolerance::Float64: Disable constraint propagation if the ratio of new node volume to beginning node volume exceeds this number (default = 0.99).
  • cp_interval_only::Bool: Use only valid interval bounds during constraint propagation (default = false).
  • relaxed_optimizer::S: An instance of the optimizer used to solve the relaxed subproblems (default = GLPK.Optimizer()).
  • relaxed_optimizer_kwargs::Base.Iterators.Pairs: Keyword arguments for the relaxed optimizer.
  • obbt_depth::Int64: Depth in B&B tree above which OBBT should be disabled (default = 1000).
  • obbt_repetitions::Int64: Number of repetitions of OBBT to perform in preprocessing (default = 3).
  • obbt_aggressive_on::Bool: Turn aggresive OBBT on (default = false).
  • obbt_aggressive_max_iteration::Int64: Maximum iteration to perform aggresive OBBT (default = 2)
  • obbt_aggressive_min_dimension::Int64: Minimum dimension to perform aggresive OBBT (default = 2)
  • obbt_tolerance::Float64: Tolerance to consider bounds equal (default = 1E-9).
  • obbt_variable_values::Vector{Bool}: Variables to perform OBBT on (default: all variables in nonlinear expressions).
  • lp_depth::Int64: Depth in B&B tree above which linear FBBT should be disabled (default = 1000).
  • lp_repetitions::Int64: Number of repetitions of linear FBBT to perform in preprocessing (default = 3).
  • quad_uni_depth::Int64: Depth in B&B tree above which univariate quadratic FBBT should be disabled (default = -1).
  • quad_uni_repetitions::Int64: Number of repetitions of univariate quadratic FBBT to perform in preprocessing (default = 2).
  • quad_bi_depth::Int64: [FUTURE FEATURE, NOT CURRENTLY IMPLEMENTED] Depth in B&B tree above which bivariate quadratic FBBT should be disabled (default = -1).
  • quad_bi_repetitions::Int64: Number of repetitions of bivariate quadratic FBBT to perform in preprocessing (default = 2).
  • subgrad_tighten::Bool: Perform tightening of interval bounds using subgradients at each factor in each nonlinear tape during a forward-reverse pass (default = true).
  • subgrad_tighten_reverse::Bool: [FUTURE FEATURE, NOT CURRENTLY IMPLEMENTED] Used to enable/disable subgradient tightening of interval bounds on the reverse pass (default = true).
  • cut_max_iterations::Int64
  • cut_cvx::Float64: Convex coefficient used to select point for new added cuts. Branch point is given by (1-cut_cvx)*xmid + cut_cvx*xsol (default = 0.9).
  • cut_tolerance::Float64: Add cut if the L1 distance from the prior cutting point to the new cutting point normalized by the box volume is greater than the tolerance (default = 0.05).
  • objective_cut_on::Bool: Adds an objective cut to the relaxed problem (default = true).
  • upper_optimizer::T: Optimizer used to solve upper bounding problem (default = Ipopt.Optimizer())
  • upper_factory::JuMP.OptimizerFactory: OptimizerFactory used to build optimizer that solves the upper bounding problem (default = with_optimizer(Ipopt.Optimizer, kwargs), check Optimizer constructor for kwargs used).
  • upper_bounding_depth::Int64: Solve upper problem for every node with depth less than upper_bounding_depth and with a probability of (1/2)^(depth-upperboundingdepth) otherwise (default = 4).
  • dbbt_depth::Int64: Depth in B&B tree above which duality-based bound tightening should be disabled (default = 1E10).
  • dbbt_tolerance::Float64: New bound is considered equal to the prior bound if within dbbt_tolerance (default = 1E-9).
  • branch_cvx_factor::Float64: Convex coefficient used to select branch point. Branch point is given by branch_cvx_factor*xmid + (1-branch_cvx_factor)*xsol (default = 0.25)
  • branch_offset::Float64: Minimum distance from bound to have branch point normalized by width of dimension to branch on (default = 0.15)
  • branch_variable::Vector{Bool}: Variables to branch on (default is all nonlinear).
  • branch_max_repetitions::Int64: [FUTURE FEATURE, NOT CURRENTLY IMPLEMENTED] Number of times repeat node processing prior to branching (default = 4).
  • branch_repetition_tol::Float64: [FUTURE FEATURE, NOT CURRENTLY IMPLEMENTED] Volume ratio tolerance required to repeat processing the current node (default = 0.9).
  • rounding_mode::Symbol: Interval rounding mode to use (default = :accurate)
  • node_limit::Int64: Node limit (default = 10^7).
  • time_limit::Float64: Time limit in seconds (default = 3600).
  • iteration_limit::Int64: Iteration limit (default = 3000000).
  • absolute_tolerance::Float64: Absolute tolerance for terminatin (default = 1E-3).
  • relative_tolerance::Float64: Relative tolerance for terminatin (default = 1E-3).
  • local_solve_only::Bool: Perform only a local solve of the problem (default = false).
  • log_on::Bool: Turns logging on records global bounds, node count and run time. Additional options are available for recording information specific to subproblems (default = false).
  • log_subproblem_info::Bool: Turns on logging of times and feasibility of subproblems (default = false).
  • log_interval::Int64: Log data every log_interval iterations (default = 1).
  • verbosity::Int64: The amount of information that should be printed to console while solving values range from 0 - 4: 0 is silent, 1 shows iteration summary statistics only, 2-4 show varying degrees of details about calculations within each iteration (default = 1).
  • output_iterations::Int64: Display summary of iteration to console every output_iterations (default = 10).
  • header_iterations::Int64: Display header for summary to console every output_iterations (default = 100).
  • enable_optimize_hook::Bool: Specifies that the optimize_hook! function should be called rather than throw the problem to the standard B&B routine (default = false).
  • ext::Dict{Symbol, Any}: Holds additional storage needed for constructing extensions to EAGO (default = Dict{Symbol,Any}).
  • ext_type::ExtensionType: Holds an instance of a subtype of EAGO.ExtensionType used to define new custom subroutines (default = DefaultExt()).

Internal Storage Structures

VariableInfo

A structure used to store information related to the bounds assigned to each variable.

  • is_integer::Bool: Is the variable integer valued?
  • lower_bound::Float64: May be -Inf even if haslowerbound == true
  • has_lower_bound::Bool: Implies lower_bound == Inf
  • upper_bound::Float64: May be Inf even if hasupperbound == true
  • has_upper_bound::Bool: Implies upper_bound == Inf
  • is_fixed::Bool: Implies lowerbound == upperbound and !haslowerbound and !hasupperbound.
ExtensionType

An abstract type the subtypes of which are associated with functions method overloaded for for new extensions. An instance of the DefaultExt <:ExtensionType structure to the Optimizer in the ext_type field.

EAGO.LogType.
Log

A structure used to store information on the history of the solution procedure for generating convergence plots and other analysis.

  • current_lower_bound::Vector{Float64}: Storage for lower bound calculated for current node.
  • current_upper_bound::Vector{Float64}: Storage for upper bound calculated for current node.
  • preprocessing_time::Vector{Float64}: Storage for preprocessing time of each iteration.
  • lower_problem_time::Vector{Float64}: Storage for lower bounding time of each iteration.
  • upper_problem_time::Vector{Float64}: Storage for upper bounding time of each iteration.
  • postprocessing_time::Vector{Float64}: Storage for postprocessing time of each iteration.
  • preprocessing_feas::Vector{Bool}: Storage for preprocessing feasibility of each iteration.
  • lower_problem_feas::Vector{Bool}: Storage for lower bounding feasibility of each iteration.
  • upper_problem_feas::Vector{Bool}: Storage for upper bounding feasibility of each iteration.
  • postprocessing_feas::Vector{Bool}: Storage for postprocessing feasibility of each iteration.
  • global_lower_bound::Vector{Float64}: Storage for best (global) lower bound at each iteration.
  • global_upper_bound::Vector{Float64}: Storage for best (global) upper bound at each iteration.

Extending EAGO

Functionality has been included that allows for extension's to EAGO's optimizer to readily be defined. This can be done in two ways first defining a new structure which is a subtype of EAGO.ExtensionType and overloading methods associated with this new structure. An instance of this new structure is provided to the EAGO.Optimizer using the ext_type keyword. This results in EAGO now dispatch to the new methods rather than the generally defined methods for the parent type. For a complete example, the reader is directed to the interval bounding example and quasiconvex example. Alternatively, the user can overload the optimize_hook! for this subtype which will entirely circumvent the default global solution routine. Additional information can be stored in the ext field of EAGO. In order to allow for compatibility between packages the user is encouraged to append their extension name to the start of each variable name (e.g. newext_newdata).