Covering

The covering (C-metric) of a front $B$ by a front $A$ is the fraction of $B$ weakly dominated by $A$ [5] (Def. 9), [4]:

\[C(A, B) = \frac{|\{\, b \in B : \exists\, a \in A,\ a \preceq b \,\}|}{|B|} \in [0, 1],\]

where $a \preceq b$ ($a$ covers $b$) means that $a$ dominates $b$ or equals it (Def. 4 of [5]). $C(A, B) = 1$ means that every point of $B$ is covered. The metric is not symmetric and $C(A, B) \ne 1 - C(B, A)$ in general, so report both directions.

Some implementations count only strict dominance, so a point shared by both fronts is not covered. covering uses weak dominance by default and strict dominance with relation = StrictDominance():

julia> using MultiObjectiveMetrics

julia> A = [[0.0, 1.0], [1.0, 0.0]]; B = [[0.0, 1.0], [2.0, 0.5]];

julia> covering(A, B), covering(A, B; relation = StrictDominance())
(1.0, 0.5)
MultiObjectiveMetrics.covering — Function
covering(A, B; relation = WeakDominance(), tol = Tolerance())

Covering (C-metric) of B by A [4], [5] (Def. 9): the fraction of the points of B covered by at least one point of A,

C(A, B) = |{b ∈ B : ∃ a ∈ A, a ⪰ b}| / |B|.

With the default WeakDominance, a ⪰ b means that a dominates or equals b, as in the source. StrictDominance does not count equal points; it reproduces the covering of [8] and of Metaheuristics.jl. Before counting, both sets are reduced to their non-dominated points and equivalent points are counted once.

C(A, B) = 1 means that A covers all of B. The metric is not symmetric; report both C(A, B) and C(B, A). Returns NaN when B is empty.

Examples

julia> A = [[0.0, 1.0], [1.0, 0.0]]; B = [[0.0, 1.0], [2.0, 0.5]];

julia> covering(A, B)
1.0

julia> covering(A, B; relation = StrictDominance())
0.5
source