Source code for paref.interfaces.pareto_reflections.pareto_reflection
from abc import abstractmethod
import numpy as np
[docs]
class ParetoReflection:
"""Interface for Pareto reflections
Implement a Pareto reflection
.. math::
p: \mathbb{R}^n \\to \mathbb{R}^m
with this interface.
"""
[docs]
@abstractmethod
def __call__(self, x: np.ndarray) -> np.ndarray:
"""Call Pareto reflection to input
Parameters
----------
x : np.ndarray
input to witch Pareto reflection is applied
Returns
-------
np.ndarray
output of Pareto reflection applied to input
"""
raise NotImplementedError
@property
@abstractmethod
def dimension_codomain(self) -> int:
"""Dimension of codomain of Pareto reflection
Returns
-------
int
dimension of codomain of Pareto reflection
"""
raise NotImplementedError
@property
@abstractmethod
def dimension_domain(self) -> int:
"""Dimension of domain of Pareto reflection
Returns
-------
int
dimension of domain of Pareto reflection
"""
raise NotImplementedError
[docs]
def best_fits(self, points: np.ndarray) -> np.ndarray:
"""Return the Pareto points of Pareto reflection with respect to the variable points
Parameters
----------
points : np.ndarray
Points to which the Pareto reflection is restricted
Returns
-------
np.ndarray
(Pareto) points of Pareto reflection restricted to points array
"""
array = [self(point) for point in points]
pareto_points_indices = []
for i, point in enumerate(array):
is_pareto = True
for j, other in enumerate(array):
if i == j:
continue
if np.all(point >= other) and np.any(point > other):
is_pareto = False
break
if is_pareto:
pareto_points_indices.append(i)
return np.unique(np.array([points[i] for i in pareto_points_indices]), axis=0)