Source code for paref.interfaces.sequences_pareto_reflections.sequence_pareto_reflections

from abc import abstractmethod
from typing import Optional, List

import numpy as np

from paref.interfaces.decorators import initialize_empty_list_of_pareto_reflections, store_pareto_reflections
from paref.interfaces.moo_algorithms.blackbox_function import BlackboxFunction
from paref.interfaces.pareto_reflections.pareto_reflection import ParetoReflection


[docs] class SequenceParetoReflections: """Interface for pareto_reflections of Pareto reflections A sequence of Pareto reflections is a mathematical sequence .. math:: (p_i)_{i \\in \mathbb{N}} of Pareto reflections. """ def __init_subclass__(cls): """Ensure storing of Pareto reflections in every subclass """ super().__init_subclass__() cls.__init__ = initialize_empty_list_of_pareto_reflections(cls.__init__) cls.next = store_pareto_reflections(cls.next)
[docs] @abstractmethod def next(self, blackbox_function: BlackboxFunction) -> Optional[ParetoReflection]: """ Parameters ---------- blackbox_function : BlackboxFunction The blackbox function to which the algorithm is applied Returns ------- Optional[ParetoReflection] Either the next Pareto reflection or None if the end of the sequence is reached """ pass
@property def used_pareto_reflections(self) -> List[ParetoReflection]: """Used Pareto reflections in the sequence in the respective order Returns ------- List[ParetoReflection] List of Pareto reflections used in the sequence in the respective order """ return self._used_pareto_reflections
[docs] def best_fits(self, points: np.ndarray) -> np.ndarray: """Return the Pareto points of Pareto reflections with respect to the variable points Parameters ---------- points : np.ndarray Points to which the Pareto reflections are restricted Returns ------- np.ndarray (Pareto) points of Pareto reflections restricted to points array """ best_fits = [] for pareto_reflection in self.used_pareto_reflections: if pareto_reflection is not None: best_fits += pareto_reflection.best_fits(points).tolist() return np.unique(best_fits, axis=0)