Optimization
A technical manual for optimizing (solving) InfiniteOpt models. See the respective guide for more information.
Optimize
JuMP.optimize! — MethodJuMP.optimize!(model::InfiniteModel; [kwargs...])Extend JuMP.optimize! to optimize infinite models using the internal optimizer model. Will call build_optimizer_model! if the optimizer model isn't up to date. The kwargs correspond to keyword arguments passed to build_optimizer_model! if any are defined.
Example
julia> optimize!(model)
julia> has_values(model)
trueOptimizer Settings
JuMP.set_optimizer — MethodJuMP.set_optimizer(model::InfiniteModel,
[optimizer_constructor;
add_bridges::Bool = true])Extend JuMP.set_optimizer to set optimizer of infinite models. Specifically, the optimizer of the optimizer model is modified.
Example
julia> set_optimizer(model, Clp.Optimizer)
julia> optimizer_model(model)
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: EMPTY_OPTIMIZER
Solver name: SolverName() attribute not implemented by the optimizer.JuMP.set_silent — MethodJuMP.set_silent(model::InfiniteModel)Extend JuMP.set_silent for infinite models to take precedence over any other attribute controlling verbosity and requires the solver to produce no output.
Example
julia> set_silent(model)
trueJuMP.unset_silent — MethodJuMP.unset_silent(model::InfiniteModel)Extend JuMP.unset_silent for infinite models to neutralize the effect of the set_silent function and let the solver attributes control the verbosity.
Example
julia> unset_silent(model)
falseJuMP.set_time_limit_sec — MethodJuMP.set_time_limit_sec(model::InfiniteModel, limit)Extend set_time_limit_sec to set the time limit (in seconds) of the solver. Can be unset using unset_time_limit_sec or with limit set to nothing.
Example
julia> set_time_limit_sec(model, 100)
100JuMP.unset_time_limit_sec — MethodJuMP.unset_time_limit_sec(model::InfiniteModel)Extend unset_time_limit_sec to unset the time limit of the solver. Can be set using set_time_limit_sec.
Example
julia> unset_time_limit_sec(model)JuMP.time_limit_sec — MethodJuMP.time_limit_sec(model::InfiniteModel)Extend time_limit_sec to get the time limit (in seconds) of the solve used by the optimizer model (nothing if unset). Can be set using set_time_limit_sec.
Example
julia> time_limit_sec(model)
100JuMP.set_optimizer_attribute — MethodJuMP.set_optimizer_attribute(model::InfiniteModel, name::String, value)Extend set_optimizer_attribute to specify a solver-specific attribute identified by name to value.
Example
julia> set_optimizer_attribute(model, "SolverSpecificAttributeName", true)
trueJuMP.set_optimizer_attribute — MethodJuMP.set_optimizer_attribute(model::InfiniteModel,
attr::MOI.AbstractOptimizerAttribute,
value)Extend set_optimizer_attribute to set the solver-specific attribute attr in model to value.
Example
julia> set_optimizer_attribute(model, MOI.Silent(), true)
trueJuMP.set_optimizer_attributes — MethodJuMP.set_optimizer_attributes(model::InfiniteModel, pairs::Pair...)Extend set_optimizer_attributes to set multiple solver attributes given a list of attribute => value pairs. Calls set_optimizer_attribute(model, attribute, value) for each pair.
Example
julia> model = Model(Ipopt.Optimizer);
julia> set_optimizer_attributes(model, "tol" => 1e-4, "max_iter" => 100)is equivalent to:
julia> set_optimizer_attribute(model, "tol", 1e-4);
julia> set_optimizer_attribute(model, "max_iter", 100);JuMP.get_optimizer_attribute — MethodJuMP.get_optimizer_attribute(model::InfiniteModel, name::String)Extend get_optimizer_attribute to return the value associated with the solver-specific attribute named name.
Example julia-repl julia> get_optimizer_attribute(model, "tol") 0.0001`
JuMP.get_optimizer_attribute — MethodJuMP.get_optimizer_attribute(model::InfiniteModel,
attr::MOI.AbstractOptimizerAttribute)Extend get_optimizer_attribute to return the value of the solver-specific attribute attr in model.
Example julia-repl julia> get_optimizer_attribute(model, MOI.Silent()) true`
JuMP.add_bridge — MethodJuMP.add_bridge(model::InfiniteModel,
BridgeType::Type{<:MOI.Bridges.AbstractBridge})Extend JuMP.add_bridge to add BridgeType to the list of bridges that can be used by the optimizer model to transform unsupported constraints into an equivalent formulation using only constraints supported by the optimizer.
Optimizer Queries
JuMP.solver_name — MethodJuMP.solver_name(model::InfiniteModel)Extend solver_name to return the name of the solver being used if there is an optimizer selected and it has a name attribute. Otherwise, an error is thrown.
Example
julia> solver_name(model)
"Gurobi"JuMP.backend — MethodJuMP.backend(model::InfiniteModel)Extend backend to return the MathOptInterface backend associated with the optimizer model. Note this will be empty if the optimizer model has not been build yet.
Example
julia> moi_model = backend(model);JuMP.mode — MethodJuMP.mode(model::InfiniteModel)Extend mode to return the MathOptInterface mode the optimizer model is in.
Example
julia> mode(model)
AUTOMATIC::ModelMode = 0JuMP.bridge_constraints — MethodJuMP.bridge_constraints(model::InfiniteModel)::BoolExtend JuMP.bridge_constraints to return if an infinite model model has an optimizer model where the optimizer is set and unsupported constraints are automatically bridged to equivalent supported constraints when an appropriate transformation is available.
Example
julia> bridge_constraints(model)
falseOptimizer Model API
InfiniteOpt.optimizer_model — Functionoptimizer_model(model::InfiniteModel)::JuMP.ModelReturn the JuMP model stored in model that is used to solve it.
Example
julia> opt_model = optimizer_model(model)
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: NO_OPTIMIZER
Solver name: No optimizer attached.InfiniteOpt.set_optimizer_model — Functionset_optimizer_model(inf_model::InfiniteModel, opt_model::JuMP.Model;
inherit_optimizer::Bool = true)Specify the JuMP model that is used to solve inf_model. This is intended for internal use and extensions. Note that opt_model should contain extension data to allow it to map to inf_model in a manner similar to TranscriptionModel. inherit_optimizer indicates whether add_infinite_model_optimizer should be invoked on the new optimizer mode to inherit the optimizer constuctor and attributes currently stored in inf_model.
Example
julia> set_optimizer_model(model, TranscriptionModel())
julia> optimizer_model(model)
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: NO_OPTIMIZER
Solver name: No optimizer attached.InfiniteOpt.optimizer_model_key — Methodoptimizer_model_key(model::InfiniteModel)::AnyReturn the extension key used in the optimizer model of model. Errors if optimizer_model.ext contains more than one key. This is intended for internal use and extensions. For extensions this is used to dispatch to the appropriate optmizer model functions such as extensions to build_optimizer_model!.
Example
julia> optimizer_model_key(model)
:TransDataInfiniteOpt.optimizer_model_key — Methodoptimizer_model_key(model::JuMP.Model)::AnyReturn the extension key used in the optimizer model model. Errors if model.ext contains more than one key. This is intended for internal use and extensions. For extensions this is used to dispatch to the appropriate optmizer model functions such as extensions to build_optimizer_model!. This is intended as an internal method. See optimizer_model_key for the public method
InfiniteOpt.build_optimizer_model! — Methodbuild_optimizer_model!(model::InfiniteModel; [kwargs...])Build the optimizer model stored in model such that it can be treated as a normal JuMP model. Specifically, translate the variables and constraints stored in model into ones that are stored in the optimizer model and can be solved. This is provided generally to accomodate extensions that use custom optimizer model types in accordance with optimizer_model_key. However, it may be useful in certain applications when the user desires to force a build without calling optimize!. Extensions will need to implement their own version of the function build_optimizer_model!(model::InfiniteModel, key::Val{ext_key_name}; kwargs...).
Example
julia> build_optimizer_model!(model)
julia> optimizer_model_ready(model)
trueInfiniteOpt.build_optimizer_model! — Functionbuild_optimizer_model!(model::InfiniteModel, key::Val{ext_key_name};
[kwargs...])Build the optimizer model stored in model such that it can be treated as a normal JuMP model, where the Model.ext field contains a key that points to a datastructure that appropriately maps the data between the two models. The key argument should be be typed to Val{ext_key_name}. This should also use clear_optimizer_model_build! to empty the out the current optimizer model. Ultimately, set_optimizer_model should be called to insert the build optimizer model into model and set_optimizer_model_ready should be used to update the optimizer model's status.
InfiniteOpt.clear_optimizer_model_build! — Methodclear_optimizer_model_build!(model::InfiniteModel)::JuMP.ModelEmpty the optimizer model using appropriate calls of Base.empty!. This effectively resets model.optimizer_model except the optimizer, its attributes, and an an emptied optimizer model data struct are maintained. This is intended as an internal method for use by build_optimizer_model!.
InfiniteOpt.clear_optimizer_model_build! — Methodclear_optimizer_model_build!(model::JuMP.Model)::JuMP.ModelEmpty the optimizer model using appropriate calls of Base.empty!. This effectively resets model except the optimizer, its attributes, and an an emptied optimizer model data struct are maintained. This is intended as an internal method for use by build_optimizer_model!.
InfiniteOpt.add_infinite_model_optimizer — Functionadd_infinite_model_optimizer(opt_model::JuMP.Model, inf_model::InfiniteModel)Parse the current optimizer and its attributes associated with inf_model and load them into opt_model. This is intended to be used as an internal method for set_optimizer_model.
InfiniteOpt.optimizer_model_variable — Methodoptimizer_model_variable(vref::GeneralVariableRef;
[label::Type{<:AbstractSupportLabel} = PublicLabel,
ndarray::Bool = false,
kwargs...])Return the reformulation variable(s) stored in the optimizer model that correspond to vref. Also errors if no such variable can be found in the optimizer model.
The keyword arugments label and ndarray are what TranscriptionOpt employ and kwargs denote extra ones that user extensions may employ in accordance with their implementation of optimizer_model_variable. Errors if such an extension has not been written.
By default only the variables associated with public supports are returned, the full set can be accessed via label = All. Moreover, infinite variables are returned as a list corresponding to their supports. However, a n-dimensional array can be obtained via ndarray = true which is handy when the variable has multiple infinite parameter dependencies. The corresponding supports are obtained via supports using the same keyword arguments.
Example
julia> optimizer_model_variable(x) # infinite variable
2-element Array{VariableRef,1}:
x(support: 1)
x(support: 2)
julia> optimizer_model_variable(z) # finite variable
zInfiniteOpt.optimizer_model_variable — Functionoptimizer_model_variable(vref::GeneralVariableRef, key::Val{ext_key_name};
[kwargs...])Return the reformulation variable(s) stored in the optimizer model that correspond to vref. This needs to be defined for extensions that implement a custom optimizer model type. Principally, this is accomplished by typed the key argument to Val{ext_key_name}. Keyword arguments can be added as needed.
InfiniteOpt.supports — Methodsupports(vref::DecisionVariableRef;
[label::Type{<:AbstractSupportLabel} = PublicLabel,
ndarray::Bool = false,
kwargs...])Return the supports associated with vref in the optimizer model. Errors if InfiniteOpt.variable_supports has not been extended for the optimizer model type or if vref is not be reformulated in the optimizer model.
The keyword arugments label and ndarray are what TranscriptionOpt employ and kwargs denote extra ones that user extensions may employ in accordance with their implementation of variable_supports. Errors if such an extension has not been written.
By default only the public supports are returned, the full set can be accessed via label = All. Moreover, the supports of infinite variables are returned as a list. However, a n-dimensional array can be obtained via ndarray = true which is handy when the variable has multiple infinite parameter dependencies.
Example
julia> supports(vref)
2-element Array{Tuple{Float64},1}:
(0.0,)
(1.0,)supports(expr::JuMP.AbstractJuMPScalar;
[label::Type{<:AbstractSupportLabel} = PublicLabel,
ndarray::Bool = false,
kwargs...])Return the support associated with expr. Errors if expr is not associated with the constraint mappings stored in optimizer_model.
The keyword arugments label and ndarray are what TranscriptionOpt employ and kwargs denote extra ones that user extensions may employ in accordance with their implementation of expression_supports. Errors if such an extension has not been written.
By default only the public supports are returned, the full set can be accessed via label = All. Moreover, the supports of infinite expressions are returned as a list. However, a n-dimensional array can be obtained via ndarray = true which is handy when the expression has multiple infinite parameter dependencies.
Example
julia> supports(cref)
2-element Array{Tuple{Float64},1}:
(0.0,)
(1.0,)InfiniteOpt.variable_supports — Functionvariable_supports(optimizer_model::JuMP.Model, vref,
key::Val{ext_key_name};
[kwargs...])::VectorReturn the supports associated with the mappings of vref in optimizer_model. This dispatches off of key which permits optimizer model extensions. This should throw an error if vref is not associated with the variable mappings stored in optimizer_model. Keyword arguments can be added as needed. Note that no extension is necessary for point or finite variables.
InfiniteOpt.optimizer_model_expression — Methodoptimizer_model_expression(expr::JuMP.AbstractJuMPScalar;
[label::Type{<:AbstractSupportLabel} = PublicLabel,
ndarray::Bool = false,
kwargs...])Return the reformulation expression(s) stored in the optimizer model that correspond to expr. Also errors if no such expression can be found in the optimizer model (meaning one or more of the underlying variables have not been transcribed).
The keyword arugments label and ndarray are what TranscriptionOpt employ and kwargs denote extra ones that user extensions may employ in accordance with their implementation of optimizer_model_expression. Errors if such an extension has not been written.
By default only the expressions associated with public supports are returned, the full set can be accessed via label = All. Moreover, infinite expressions are returned as a list corresponding to their supports. However, a n-dimensional array can be obtained via ndarray = true which is handy when the expression has multiple infinite parameter dependencies. The corresponding supports are obtained via supports using the same keyword arguments.
Example
julia> optimizer_model_expression(my_expr) # finite expression
x(support: 1) - yInfiniteOpt.optimizer_model_expression — Functionoptimizer_model_expression(expr, key::Val{ext_key_name}; [kwargs...])Return the reformulation expression(s) stored in the optimizer model that correspond to expr. This needs to be defined for extensions that implement a custom optimizer model type. Principally, this is accomplished by typed the key argument to Val{ext_key_name}. Keyword arguments can be added as needed. Note that if expr is a GeneralVariableRef this just dispatches to optimizer_model_variable.
InfiniteOpt.supports — Methodsupports(expr::JuMP.AbstractJuMPScalar;
[label::Type{<:AbstractSupportLabel} = PublicLabel,
ndarray::Bool = false,
kwargs...])Return the support associated with expr. Errors if expr is not associated with the constraint mappings stored in optimizer_model.
The keyword arugments label and ndarray are what TranscriptionOpt employ and kwargs denote extra ones that user extensions may employ in accordance with their implementation of expression_supports. Errors if such an extension has not been written.
By default only the public supports are returned, the full set can be accessed via label = All. Moreover, the supports of infinite expressions are returned as a list. However, a n-dimensional array can be obtained via ndarray = true which is handy when the expression has multiple infinite parameter dependencies.
Example
julia> supports(cref)
2-element Array{Tuple{Float64},1}:
(0.0,)
(1.0,)InfiniteOpt.expression_supports — Functionexpression_supports(optimizer_model::JuMP.Model, expr,
key::Val{ext_key_name}; [kwargs...])Return the supports associated with the mappings of expr in optimizer_model. This dispatches off of key which permits optimizer model extensions. This should throw an error if expr is not associated with the variable mappings stored in optimizer_model. Keyword arguments can be added as needed. Note that if expr is a GeneralVariableRef this just dispatches to variable_supports.
InfiniteOpt.optimizer_model_constraint — Methodoptimizer_model_constraint(cref::InfOptConstraintRef;
[label::Type{<:AbstractSupportLabel} = PublicLabel,
ndarray::Bool = false,
kwargs...])Return the reformulation constraint(s) stored in the optimizer model that correspond to cref. Errors if no such constraint can be found in the optimizer model.
The keyword arugments label and ndarray are what TranscriptionOpt employ and kwargs denote extra ones that user extensions may employ in accordance with their implementation of optimizer_model_constraint. Errors if such an extension has not been written.
By default only the constraints associated with public supports are returned, the full set can be accessed via label = All. Moreover, infinite constraints are returned as a list corresponding to their supports. However, a n-dimensional array can be obtained via ndarray = true which is handy when the constraint has multiple infinite parameter dependencies. The corresponding supports are obtained via supports using the same keyword arguments.
Example
julia> optimizer_model_constraint(c1) # finite constraint
c1 : x(support: 1) - y <= 3.0InfiniteOpt.optimizer_model_constraint — Functionoptimizer_model_constraint(cref::InfOptConstraintRef,
key::Val{ext_key_name}; [kwargs...])Return the reformulation constraint(s) stored in the optimizer model that correspond to cref. This needs to be defined for extensions that implement a custom optimizer model type. Principally, this is accomplished by typed the key argument to Val{ext_key_name}. Keyword arguments can be added as needed.
InfiniteOpt.supports — Methodsupports(cref::InfOptConstraintRef;
[label::Type{<:AbstractSupportLabel} = PublicLabel,
ndarray::Bool = false,
kwargs...])Return the support associated with cref. Errors if cref is not associated with the constraint mappings stored in optimizer_model.
The keyword arugments label and ndarray are what TranscriptionOpt employ and kwargs denote extra ones that user extensions may employ in accordance with their implementation of constraint_supports. Errors if such an extension has not been written.
By default only the public supports are returned, the full set can be accessed via label = All. Moreover, the supports of infinite constraints are returned as a list. However, a n-dimensional array can be obtained via ndarray = true which is handy when the constraint has multiple infinite parameter dependencies.
Example
julia> supports(cref)
2-element Array{Tuple{Float64},1}:
(0.0,)
(1.0,)InfiniteOpt.constraint_supports — Functionconstraint_supports(optimizer_model::JuMP.Model,
cref::InfOptConstraintRef,
key::Val{ext_key_name}; [kwargs...])Return the supports associated with the mappings of cref in optimizer_model. This dispatches off of key which permits optimizer model extensions. This should throw an error if cref is not associated with the variable mappings stored in optimizer_model. Keyword arguments can be added as needed.
InfiniteOpt.optimizer_model_ready — Functionoptimizer_model_ready(model::InfiniteModel)::BoolReturn Bool if the optimizer model is up to date with model.
Example
julia> optimizer_model_ready(model)
falseInfiniteOpt.set_optimizer_model_ready — Functionset_optimizer_model_ready(model::InfiniteModel, status::Bool)Set the status of the optimizer model to whether it is up to date or not. Note is more intended as an internal function, but is useful for extensions.
Example
julia> set_optimizer_model_ready(model, true)
julia> optimizer_model_ready(model)
true