API Reference

The indicators are documented on their pages: purity, gamma_spread, delta_spread, covering, hypervolume, normalize_points and normalized_hypervolume.

Package

MultiObjectiveMetrics — Module

Performance indicators for multiobjective optimization: dominance with tolerance, non-dominated filtering, Purity, Γ-spread, Δ-spread, Covering and exact hypervolume. All objectives are minimized.

A point set is any AbstractVector of objective vectors, for example a Vector{Vector{Float64}}, eachcol(M) or eachrow(M). See purity, gamma_spread, delta_spread, covering and hypervolume.

source

Tolerance and dominance

MultiObjectiveMetrics.Tolerance — Type
Tolerance(atol, rtol)
Tolerance(tol)
Tolerance()

Componentwise tolerance used to compare objective values. For components a and b, the tolerance is

ε = max(atol, rtol * max(|a|, |b|))

Tolerance(tol) sets atol = rtol = tol, which gives ε = tol * max(1, |a|, |b|), the rule of [8]. Tolerance() uses tol = √eps(Float64) ≈ 1.49e-8, and Tolerance(0) compares exactly. Both values must be finite and nonnegative.

Examples

julia> isequivalent([1.0, 2.0], [1.0 + 1e-10, 2.0])
true

julia> isequivalent([1.0, 2.0], [1.0 + 1e-10, 2.0]; tol = Tolerance(0))
false
source
MultiObjectiveMetrics.compare — Function
compare(u, v; tol = Tolerance()) -> DominanceRelation

Compare objective vectors u and v (minimization) under the componentwise tolerance ε_i of Tolerance:

  • Dominates: u_i ≤ v_i + ε_i for all i and u_j < v_j - ε_j for some j;
  • DominatedBy: the same with u and v swapped;
  • Equivalent: |u_i - v_i| ≤ ε_i for all i;
  • Incomparable: otherwise.

This is the rule of [8]; Tolerance(0) gives Pareto dominance.

Examples

julia> compare([1.0, 2.0], [2.0, 3.0])
Dominates::DominanceRelation = 1

julia> compare([1.0, 3.0], [2.0, 2.0])
Incomparable::DominanceRelation = 3
source
MultiObjectiveMetrics.weakly_dominates — Function
weakly_dominates(u, v; tol = Tolerance()) -> Bool

Whether u weakly dominates v: u_i ≤ v_i + ε_i for every component, that is, u dominates v or is equivalent to it. This is the "covers" relation of [4] and [5] (Def. 4).

Examples

julia> weakly_dominates([1.0, 2.0], [1.0, 2.0])
true

julia> dominates([1.0, 2.0], [1.0, 2.0])
false
source

Point sets

MultiObjectiveMetrics.nondominated_indices — Function
nondominated_indices(F; tol = Tolerance()) -> Vector{Int}

Indices, in increasing order, of the points of F that no other point of F dominates under compare. Equivalent points are all kept; use unique_points to keep one representative. The result does not depend on the order of F.

Examples

julia> nondominated_indices([[1.0, 3.0], [2.0, 2.0], [2.0, 4.0], [1.0, 3.0]])
3-element Vector{Int64}:
 1
 2
 4
source
MultiObjectiveMetrics.unique_points — Function
unique_points(F; tol = Tolerance())

The points of F selected by unique_indices, in their original order.

Examples

julia> unique_points([[1.0, 2.0], [1.0 + 1e-12, 2.0], [0.0, 3.0]])
2-element Vector{Vector{Float64}}:
 [1.0, 2.0]
 [0.0, 3.0]
source
MultiObjectiveMetrics.ideal_point — Function
ideal_point(F) -> Vector

Componentwise minimum of the points of F. Throws an ArgumentError if F is empty.

Examples

julia> ideal_point([[1.0, 3.0], [2.0, 2.0]])
2-element Vector{Float64}:
 1.0
 2.0
source
MultiObjectiveMetrics.nadir_point — Function
nadir_point(F) -> Vector

Componentwise maximum of the points of F. Applied to the non-dominated points of a reference set, this is the nadir point of that set. Throws an ArgumentError if F is empty.

source