Conventions

The sources define the metrics for non-empty fronts in general position and do not discuss tolerances or degenerate cases. Where they are silent, this package follows the conventions of MetricsRel.jl from MAMBO-paper [8], except in the two cases marked below, where a literal reading of the source gives a defined value.

Edge cases

CaseΓ, ΔPurityCoveringNormalized HVReason
empty front A (or B for covering)NaNNaNNaNNaNno information; a failure in profiles
one point in AInfdefineddefineddefinedΔ needs at least two points (the mean gap is over $N-1$ gaps); Γ follows Δ
ideal[j] ≈ nadir[j]objective j skipped——guarded by epsa constant objective has no spread
ideal ≈ nadir in every objectiveNaN——NaNno range to measure
points of A outside [ideal, nadir]clipped——contribute zero if beyond the reference pointsee below
all points of A equal in objective jΔ: $Δ_j = 1$———see below

Equivalence (≈) is the tolerance of Tolerance. For Purity and Covering, equivalent points count once, and Covering first reduces both sets to their non-dominated points (the source assumes non-dominated sets). For Γ and Δ the front is used as given, so repeated points lower the spread score, as clustering should.

Points beyond the extremes (Γ and Δ)

Γ and Δ measure the front of one solver between extreme values taken from the reference front R, the non-dominated points of all solvers [2]. Formulas (5.1) and (5.2) of that paper sort the values of each objective with the extremes at both ends, so they assume that the front lies between the extremes. A point of A that R dominates can violate this: its value may exceed the nadir of R.

Used literally, the last gap $δ_{N,j} = \mathrm{nadir}_j - \max_i f_{i,j}$ becomes negative and is subtracted from the numerator of Δ. A front made entirely of dominated points can then score Δ = 0, the best possible value, or a negative Δ. Example: with R = [[0, 1], [0.5, 0.5], [1, 0]], the front A = [[0.6, 1.2], [1.2, 0.6], [3.0, 0.1]] (all three points dominated by R) gets Δ = 0 with the literal formula, the same value as R itself.

This package clips each value of A to $[\mathrm{ideal}_j, \mathrm{nadir}_j]$ before computing Γ and Δ. Inside the box nothing changes; outside it, a point beyond the nadir is treated as sitting on the nadir. Then Δ ≥ 0 and $Γ \le \max_j (\mathrm{nadir}_j - \mathrm{ideal}_j)$ always hold. In the example, Δ(A) = 1.

julia> using MultiObjectiveMetrics

julia> R = [[0.0, 1.0], [0.5, 0.5], [1.0, 0.0]];

julia> A = [[0.6, 1.2], [1.2, 0.6], [3.0, 0.1]];

julia> delta_spread(A, R), delta_spread(R, R)
(1.0, 0.0)

Collapsed objective (Δ)

If all points of A have the same value in objective j, every inner gap is zero and formula (5.2) gives $Δ_j = 1$: the numerator and the denominator both equal $\mathrm{nadir}_j - \mathrm{ideal}_j$. This agrees with [3], where Δ equals one when all solutions coincide. The package uses this value. MetricsRel.jl skips such an objective instead.

Differences from other implementations

TopicThis packageMetricsRel.jl (MAMBO)
Coveringweak dominance by default, as in [5] (Def. 9); StrictDominance() availablestrict dominance
Γ, Δ outside [ideal, nadir]clippedliteral formula (Δ can be negative)
Δ with a collapsed objective$Δ_j = 1$objective skipped
Non-dominated filter with tolerancea point is kept when no other point dominates itsequential archive
Hypervolumeexact, own implementationMetaheuristics.jl

The covering of Metaheuristics.jl also counts strict dominance, without tolerance.

The test suite checks every metric against values computed with MetricsRel.jl and asserts each of these differences explicitly. The parity cases include fronts inside and outside the box, duplicates, a single point, degenerate and collapsed objectives, and two to four objectives. With relation = StrictDominance() and with the front clipped, the values agree to rounding.