Source code for paref.pareto_reflections.restrict_by_point

import numpy as np

from paref.interfaces.pareto_reflections.pareto_reflection import ParetoReflection


[docs] class RestrictByPoint(ParetoReflection): """Restrict the Pareto points in the target space by demanding each component to be lower than some value When to use ----------- This Pareto reflection should be used if Pareto points are desired which dominate a certain point, i.e. when every component of a found Pareto points :math:`x` must satisfy :math:`x_i\\le r_i` for some :math:`r_i \\in \\mathbb{R}`. What it does ------------ The Pareto points of this map are all the Pareto points which dominate that point. Mathematical formula -------------------- Denote by d the point which should be dominated and n some nadir (i.e. n dominated by all points). Then, .. math:: p(x) = x if x dominates or is equal to d and .. math:: p(x) = n else. Examples -------- Define the nadir and the point which should be dominated >>> import numpy as np >>> nadir, restricting_point = np.array([3,7]),np.zeros(2) Initialize the Restricting >>> pareto_reflection = RestrictByPoint(nadir=nadir,restricting_point=restricting_point) Calling it to (1,1), i.e. calculating .. math:: p(1,1)=(3,7) yields: >>> pareto_reflection(np.ones(2)) array([3, 7]) """ def __init__(self, nadir: np.ndarray, restricting_point: np.ndarray, ): """Specify the nadir and the to be dominated point Parameters ---------- nadir : np.ndarray nadir (dominated by all points) stored in 1 dimensional array of length n restricting_point : np.ndarray point to be dominated stored in 1 dimensional array of length n """ self.nadir = nadir self.restricting_point = restricting_point
[docs] def __call__(self, x: np.ndarray) -> np.ndarray: """Calculate the RestrictByPoint function Parameters ---------- x : np.ndarray input vector stored in 1 dimensional array of length n Returns ------- float value of the restricting function """ if len(x.shape) != 1: raise ValueError(f'Input x must be of dimension 1! Shape of x is {x.shape}.') if x.shape != self.restricting_point.shape: raise ValueError( f'Shapes don\'t match! Shape of x is {x.shape}, shape of restricting point is ' f'{self.restricting_point.shape}!') if np.any(self.restricting_point < x): return self.nadir else: return x
@property def dimension_codomain(self) -> int: return len(self.nadir) @property def dimension_domain(self) -> int: return self.dimension_codomain