Nondominated points and sorting#

Identifying nondominated points#

The following plots compare the speed of finding nondominated solutions, equivalent to moocore.is_nondominated(). We test both keep_weakly=False (the default) and keep_weakly=True. The former is only supported by BoTorch and paretoset. Thus, for the purpose of benchmarking the other packages with keep_weakly=False, we remove duplicated points from the data and exclude this time from the results. This makes all packages, except moocore, BoTorch and paretoset, seem faster than they actually are, because the user is forced to remove duplicated points when using them.

For 2D and 3D, the plots show that moocore is 10 times faster than DESDEO and paretoset and 100-1000 times faster than the other packages. fast-pareto claims to implement a \(O(n\log n)\) algorithm for 3D, but the benchmarks below indicate a \(O(n^2)\) complexity, similar to other packages and significantly slower than moocore.

ndom_bench-test2D-200k ndom_bench-ran3d-40k

wndom_bench-test2D-200k wndom_bench-ran3d-40k

For dimensions larger than 3, moocore.is_nondominated() uses the best-known \(O(n\log^{m-2} n)\) algorithm. fast-pareto claims to be using a \(O(n\log^{m-2} n)\) algorithm, but the benchmarks suggest that it uses a \(O(m n^2)\) algorithm, although slower than most other packages and almost 100 times slower than moocore. The following plots with keep_weakly=True show that moocore is at least 10 times faster than the other packages, even for 10D.

wndom_bench-sphere-4d wndom_bench-convex-4d

wndom_bench-sphere-5d wndom_bench-rmnk-10d

Similar results are obtained with keep_weakly=False, however, this setting is only supported by moocore, BoTorch and paretoset, thus the other packages are actually slower to use than reported here, because the user is forced to remove duplicated points when using them.

ndom_bench-sphere-4d ndom_bench-convex-4d

ndom_bench-sphere-5d ndom_bench-rmnk-10d

Nondominated Sorting (Pareto ranking)#

Nondominated sorting (or Pareto ranking) assigns a rank to each point according to Pareto-optimality. It can be used to split a set of points into layers of nondominated fronts. For more details, see moocore.pareto_rank(). This function in moocore uses a \(O(n \log n)\) algorithm for 2 dimensions and a \(O(n^2\log n)\) algorithm for 3 dimensions. As the plots show, this makes moocore significantly faster than paretoset, pymoo and DESDEO. With higher dimensions, moocore uses a \(O(n^2\log^{m-2}n)\) algorithm instead of the \(O(n^3)\) algorithm in paretoset and DESDEO (latter is compiled with Numba). In these benchmarks points are sampled uniformly at random within the hypercube.

ndsort_bench-ran-2d ndsort_bench-ran-3d

ndsort_bench-ran-4d ndsort_bench-ran-5d

ndsort_bench-ran-9d ndsort_bench-ran-10d