Source code for desdeo_emo.utilities.non_dominated

from typing import Tuple

import numpy as np
from desdeo_tools.utilities import dominates
from numba import njit


@njit()
[docs]def check_domination( new: np.ndarray, archive: np.ndarray ) -> Tuple[np.ndarray, np.ndarray]: """Checks if newly evaluated and archived solutions are non_dominated. Args: new (np.ndarray): Newly evaluated solution's fitness values (should be a 2D array). archive (np.ndarray): Archive of non-dominated solutions (also a 2D array, must be mutually non-dominated). Raises: ValueError: If the new array is not a 2D array. Returns: Tuple[np.ndarray, np.ndarray]: Two arrays of indices that are non-dominated in the new and archive arrays respectively. """ if new.ndim != 2: raise ValueError("New array should have 2 dimensions.") non_dominated_in_new = np.ones(len(new), dtype=np.bool_) non_dominated_in_archive = np.ones(len(archive), dtype=np.bool_) for i in range(len(new)): for j in range(len(archive)): if not non_dominated_in_archive[j]: continue if dominates(archive[j], new[i]): non_dominated_in_new[i] = False break # No need to check with the rest of the archive if dominates(new[i], archive[j]): non_dominated_in_archive[j] = False return (non_dominated_in_new, non_dominated_in_archive)