Source code for paref.pareto_reflections.minimize_g

from abc import abstractmethod
from typing import Callable, Union

import numpy as np

from paref.interfaces.moo_algorithms.blackbox_function import BlackboxFunction
from paref.interfaces.pareto_reflections.pareto_reflection import ParetoReflection


[docs] class MinGParetoReflection(ParetoReflection): """Find a Pareto point among all points minimizing some function g When to use ----------- This Pareto reflection should be used if a Pareto point is desired which is Pareto optimal among all points minimizing some function g. .. warning:: This Reflection is not necessarily Pareto reflecting. It is only if the points which are Pareto optimal among all points that minimize g are in fact Pareto optimal. Mathematical formula -------------------- .. math:: p(x) = \sum_{i=1,...,n}\\epsilon scaling_x(x)_{i}+scaling_g(g(x)) """ def __init__(self, blackbox_function: BlackboxFunction, epsilon: Union[float, np.ndarray] = 1e-2, scaling_g: Callable[[np.ndarray], np.ndarray] = lambda x: x, scaling_x: Callable[[np.ndarray], np.ndarray] = lambda x: x, ): """ Parameters ---------- blackbox_function : BlackboxFunction blackbox function to which Pareto reflection is applied epsilon : Union[float, np.ndarray] default 1e-3 epsilon determining weight of components scaling_g : Callable[[np.ndarray], np.ndarray] default lambda x: x scaling function for g scaling_x : Callable[[np.ndarray], np.ndarray] default lambda x: x scaling function for x """ self.bbf = blackbox_function self._epsilon = epsilon self._counter = 0 self.scaling_g = scaling_g self.scaling_x = scaling_x
[docs] def __call__(self, x: np.ndarray) -> np.ndarray: return self.scaling_g(self.g(x)) + np.sum(self._epsilon * self.scaling_x(x))
@property def dimension_domain(self) -> int: return self.bbf.dimension_target_space @property def dimension_codomain(self) -> int: return 1 @property @abstractmethod def g(self) -> Callable[[np.ndarray], np.ndarray]: raise NotImplementedError