Quick Start
Rel’s Mathematical Optimization Library contains tools for expressing optimization models and calling external solvers.
The Mathematical Optimization Library consists of two main components. First it contains a domain specific language (DSL) that is used for overriding base Rel mathematical and logical operators. The operators from this DSL are used to express and define the optimization model’s constraints and objective functions. The second component is a user-friendly application programming interface (API) used for calling external solvers and extracting results returned by the solvers. Currently, the Mathematical Optimization Library supports linear programs (LPs), mixed-integer linear programs (MIPs), quadratic programs (QPs), and mixed-integer quadratic programs (MIQPs).
The basic workflow for working with the Mathematical Optimization Library is outlined below.
Define the Model
Define the model model:variables
using rel:mathopt:variables
(or rel:mathopt:named_variables
).
Define the Objective Function
Use the mathematical operators from mathopt:Solver:Solver
to define the model’s objective function — naming it either model:maximize
or model:minimize
.
Define the Constraints
Use the mathematical operators from mathopt:Solver:Solver
to define the model’s constraints — naming them model:constraints:your_constraint_name
.
Optimize the Model
Optimize the model using rel:mathopt:optimize[model, options]
.
Extract the Results
Extract the results using rel:mathopt:extract_result[result, model:variables]
.
Note that it is necessary to use @inline
in many instances. It’s advisable to use @inline
when you encounter arity errors.
As a quick example, consider the following Rel code:
// read query
// Bring the rel:mathopt:Solver:Solve DSL into scope.
with mathopt:Solver:Solve use sum, foreach, +, *, ≼, ≽, ∧, ∨, =, -, /
@inline
module model
// Create an integer variable x with domain {1; 2}.
def variables = rel:mathopt:variables[{
:x, "integer", range[1, 2, 1]
}]
// Import x from variables.
with variables use x
// Define the objective function.
// Note that naming the objective "maximize" sets the sense of the solver to a maximization problem.
// To set the sense to minimization, name the relation "minimize."
def maximize = sum[x]
// Define the constraints.
module constraints
def artificial = foreach[d in range[1, 2, 1] : d * x[d] ≼ 20]
end
end
// Optimize the model.
// Note that the empty relation {} is used to specify that no options are used.
def result = rel:mathopt:optimize[model, {}]
// Extract and display the optimization results.
def output = rel:mathopt:extract_result[result, model:variables]