Morbit

The package Morbit.jl provides a local derivative-free solver for multiobjective optimization problems with possibly expensive objectives. It is meant to find a single Pareto-critical point, not a good covering of the global Pareto Set.

“Morbit” stands for Multiobjective Optimization by Radial Basis Function Interpolation in Trust-regions. The name was chosen so as to pay honors to the single objective algorithm ORBIT by Wild et. al.

We have a paper explaining the algorithm!

This was my first project using Julia and there have been many messy rewrites. Nonetheless, the solver should now work sufficiently well to tackle most problems. I hope to rewrite the custom types soonish. At the moment they are weakly typed and the performance suffers.

**To get started, see the examples, e.g. Two Parabolas.

This project was founded by the European Region Development Fund.

Morbit.RbfConfigType
RbfConfig(; kwarg1 = val1, … )

Configuration type for local RBF surrogate models.

To choose a kernel, use the kwarg kernel and a value of either :cubic (default), :multiquadric, :exp or :thin_plate_spline. The kwarg shape_parameter takes a constant number or a string that defines a calculation on Δ, e.g, "Δ/10".

To see other configuration parameters use fieldnames(Morbit.RbfConfig). They have individual docstrings attached.

source
Morbit._add!Method

Add an objective function to MOP with specified output indices.

source
Morbit._backtrackMethod

Perform a backtracking loop starting at x with an initial step of step_size .* dir and return trial point x₊, the surrogate value-vector m_x₊ and the final step s = x₊ .- x.

source
Morbit._get_shape_paramMethod

Get real-valued shape parameter for RBF model from current iter data. cfg allows for a string expression which would be evaluated here.

source
Morbit._init_modelMethod

Return an ExactModel build from a VectorObjectiveFunction objf. Model is the same inside and outside of criticality round.

source
Morbit._intersect_boundsMethod

Return smallest positive and biggest negative and σ₊ and σ₋ so that x .+ σ± .* d stays within bounds.

source
Morbit.add_objective!Function
add_objective!( mop :: MixedMOP, func :: T where{T <: Function}, type :: Symbol = :expensive, n_out :: Int64 = 1, can_batch :: Bool = false )

Add scalar-valued objective function func to mop structure. func must take an RVec as its (first) argument, i.e. represent a function $f: ℝ^n → ℝ$. type must either be :expensive or :cheap to determine whether the function is replaced by a surrogate model or not.

If type is :cheap and func takes 1 argument only then its gradient is calculated by ForwardDiff. A cheap function func with custom gradient function grad (representing $∇f : ℝ^n → ℝ^n$) is added by

add_objective!(mop, func, grad)

The optional argument n_out allows for the specification of vector-valued objective functions. This is mainly meant to be used for expensive functions that are in some sense inter-dependent.

The flag can_batch defaults to false so that the objective function is simply looped over a bunch of arguments if required. If can_batch == true then the objective function must be able to return an array of results when provided an array of input vectors (whilst still returning a single result, not a singleton array containing the result, for a single input vector).

Examples

# Define 2 scalar objective functions and a MOP ℝ^2 → ℝ^2

f1(x) =  x[1]^2 + x[2]

f2(x) = exp(sum(x))
∇f2(x) = exp(sum(x)) .* ones(2);

mop = MixedMOP()
add_objective!(mop, f1, :cheap)     # gradient will be calculated using ForwardDiff
add_objective!(mop, f2, ∇f2 )       # gradient is provided
source
Morbit.add_objective!Method
add_objective!( mop :: MixedMOP, func :: T where{T <: Function}, grad :: T where{T <: Function})

Add scalar-valued objective function func and its vector-valued gradient grad to mop struture.

source
Morbit.combineMethod

Get a new function function handle stacking the output of func1 and func2.

source
Morbit.eval_all_objectivesMethod

(Internally) Evaluate all objectives at site x̂::RVec. Objective order might differ from order in which they were added.

source
Morbit.eval_modelsMethod

Return model value for output l of sc at . Index l is assumed to be an internal index in the range of 1,…,nobjfs, where nobjfs is the total number of (scalarized) objectives stored in sc.

source
Morbit.get_gradientMethod

Return a gradient for output l of sc at . Index 4 is assumed to be an internal index in the range of 1,…,nobjfs, where nobjfs is the total number of (scalarized) objectives stored in sc.

source
Morbit.get_optim_handleMethod

Return a function handle to be used with NLopt for output l of sc. Index l is assumed to be an internal index in the range of 1,…,nobjfs, where nobjfs is the total number of (scalarized) objectives stored in sc.

source
Morbit.get_optim_handleMethod

Return a function handle to be used with NLopt for output of model. That is, if model is a surrogate for two scalar objectives, then must be either 1 or 2.

source
Morbit.non_negative_solutionsMethod

Return array of solution vectors [x1, …, xlen] to the equation $x_1 + … + x_len = rhs$ where the variables must be non-negative integers.

source
Morbit.ps_polish_algoMethod

Specify local algorithm to polish Pascoletti-Serafini solution. Uses 1/4 of maximum allowed evals.

source
Morbit.save_configMethod
save_config(filename, ac :: AbstractConfig )

Save the configuration object ac at path filename. Ensures, that the file extension is .jld2. The fieldname to retrieve the database object is database.

Returns the save path if successful and nothing else.

source
Morbit.save_databaseMethod
save_database(filename, DB :: AbstractDB )

Save the database DB at path filename. Ensures, that the file extension is .jld2. The fieldname to retrieve the database object is database.

Returns the save path if successful and nothing else.

source
Morbit.save_databaseMethod
save_database(filename, id :: AbstractIterData )

Save the database that is referenced by db(id) at path filename. Ensures, that the file extension is .jld2. The fieldname to retrieve the database object is database.

Returns the save path if successful and nothing else.

source
Morbit.save_iter_dataMethod
save_iter_data(filename, id :: AbstractIterData )

Save the whole object id at path filename. Ensures, that the file extension is .jld2. The fieldname to retrieve the database object is database.

Returns the save path if successful and nothing else.

source
Morbit.scaleMethod

Scale variables fully constrained to a closed interval to [0,1] internally.

source
Morbit.strict_backtrackingMethod

Require a descent in all model objective components. Applies only to backtracking descent steps, i.e., :steepest_descent.

source
Morbit.unscaleMethod

Reverse scaling for fully constrained variables from [0,1] to their former domain.

source