diff --git a/src/brush/deap_api/utils.py b/src/brush/deap_api/utils.py index 70a11f6a..8106dce7 100644 --- a/src/brush/deap_api/utils.py +++ b/src/brush/deap_api/utils.py @@ -25,10 +25,14 @@ def e_lexicase(individuals, k): while len(cases) > 0 and len(candidates) > 1: errors_on_case = np.array([x.errors[cases[0]] for x in candidates]) - + MAD = np.median(np.abs(errors_on_case - np.median(errors_on_case))) - best_on_case = np.min(errors_on_case) + + # Skip if this case is np.inf for all individuals + if not np.isfinite(best_on_case+MAD): + continue + candidates = [x for x in candidates if x.errors[cases[0]] <= best_on_case + MAD] diff --git a/src/brush/estimator.py b/src/brush/estimator.py index ad8d7932..9ef80b3a 100644 --- a/src/brush/estimator.py +++ b/src/brush/estimator.py @@ -172,15 +172,18 @@ def _fitness_validation(self, ind, data: _brush.Dataset): "complexity": ind.prg.complexity() } - # Setting individual errors for lexicase - ind.errors = np.power( data.y - ind.prg.predict(data), 2 ) - return [ ind_objectives[obj] for obj in self.objectives ] def _fitness_function(self, ind, data: _brush.Dataset): + # fit the expression, then evaluate. + ind.prg.fit(data) + # Setting individual errors for lexicase + ind.errors = np.nan_to_num( + np.abs( data.y - ind.prg.predict(data) ), nan=np.inf) + return self._fitness_validation(ind, data)