Source code for tryalgo.pareto
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""\
Pareto sets
jill-jenn vie et christoph durr - 2022
"""
from tryalgo.fenwick import FenwickMin
[docs]
def pareto2d(points):
""" Compute the Pareto set of a given set of points in 2 dimensions
:param points: list of tuples with the coordinates of the points. Can be floating point coordinates.
:modifies: points will be sorted
:returns: a list of non-dominated points
:complexity: $O(n\\log n)$
"""
pareto = []
points.sort()
for p in points:
x, y = p
if pareto == [] or y < pareto[-1][1] or p == pareto[-1]:
pareto.append(p)
return pareto
[docs]
def pareto3d(points):
""" Compute the Pareto set of a given set of points in 2 dimensions
:param points: list of tuples with the coordinates of the points. Can be floating point coordinates.
:modifies: points will be sorted
:returns: a list of non-dominated points
:complexity: $O(n\\log n)$
"""
# compute the ranks, it is ok to have multple y-values in the list
y_values = [y for x,y,z in points]
y_values.sort()
rank = {}
for i, yi in enumerate(y_values):
rank[yi] = i
n = len(points)
points.sort() # sort by rank in first competition
pareto = []
R = FenwickMin(n)
for p in points:
x, y, z = p
i = rank[y]
if pareto == [] or R.prefixMin(i) > z or p == pareto[-1]:
pareto.append(p)
R.update(i, z)
return pareto