Skip to main content

hypervolume

Function hypervolume 

pub fn hypervolume(
    points: &[Vec<f64>],
    reference: &[f64],
    directions: &[Direction],
) -> Result<f64>
Expand description

The hypervolume indicator: the volume of objective space that points dominate, bounded by reference.

The standard scalar quality measure for a Pareto front — it rewards a front for being both close to the true front (convergence) and spread along it (diversity), which no single-objective summary of a multi-objective study can do. Larger is always better, whatever the directions are.

§The reference point

The hypervolume is only defined relative to a point that every solution is better than in every objective; it is the far corner of the box being measured. A solution that ties or loses to the reference in any objective contributes zero and is silently skipped — it is outside the measured box, not an error.

nadir_point computes the usual choice (the componentwise worst observed value). Note what that implies: the worst solution in each objective sits on the reference and therefore contributes nothing, and a reference recomputed as the study grows makes the numbers from different moments incomparable. A hypervolume history must be computed against one fixed reference, chosen once — for instance the nadir of the final population, or a domain-knowledge bound such as “0 return, 1 second”. That choice is the caller’s, which is why this function does not make it.

§Complexity, and the dimension limit

ObjectivesAlgorithmCost
1the single best valueO(N)
2staircase sweep after a sortO(N log N)
3dimension sweep: slice along objective 3, 2-D sweep per slabO(N² log N)
≥ 4refused (MAX_EXACT_HYPERVOLUME_DIM)—

§Errors

Error::InvalidSpace if directions is empty, if it holds more than MAX_EXACT_HYPERVOLUME_DIM objectives, if reference does not have one entry per direction, or if reference carries a non-finite value (there is no finite volume to report against an infinite corner). A point that is malformed or non-finite is skipped rather than fatal, so one diverged trial cannot make a whole report unanswerable.

use atune_core::pareto::hypervolume;
use atune_core::study::Direction::Minimize;

// Three points of a minimisation front against the reference (4, 4).
let front = vec![vec![1.0, 3.0], vec![2.0, 2.0], vec![3.0, 1.0]];
let hv = hypervolume(&front, &[4.0, 4.0], &[Minimize, Minimize])?;
assert_eq!(hv, 6.0);