Skip to content

Commit

Permalink
fixing regressor, fitness predictor tests
Browse files Browse the repository at this point in the history
  • Loading branch information
gbomarito committed Sep 23, 2024
1 parent 4851b55 commit 0e0f347
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 69 deletions.
21 changes: 12 additions & 9 deletions bingo/symbolic_regression/symbolic_regressor.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,9 @@ def __init__(
# TODO make private attribute,
# as well as other attributes not defined in __init__?
self.generator = None
self.component_generator = None
self.mutation = None
self.crossover = None
self.best_ind = None

self.random_state = random_state
Expand Down Expand Up @@ -190,16 +193,16 @@ def _force_diversity_in_island(self, island):

# pylint: disable=attribute-defined-outside-init
def _get_archipelago(self, X, y, n_processes):
component_generator = ComponentGenerator(X.shape[1])
self.component_generator = ComponentGenerator(X.shape[1])
for operator in self.operators:
component_generator.add_operator(operator)
self.component_generator.add_operator(operator)

crossover = AGraphCrossover()
mutation = AGraphMutation(component_generator)
self.crossover = AGraphCrossover()
self.mutation = AGraphMutation(self.component_generator)

self.generator = AGraphGenerator(
self.stack_size,
component_generator,
self.component_generator,
use_simplification=self.use_simplification,
use_python=True,
)
Expand All @@ -211,17 +214,17 @@ def _get_archipelago(self, X, y, n_processes):
evo_alg = self.evolutionary_algorithm(
evaluator,
self.generator,
crossover,
mutation,
self.crossover,
self.mutation,
self.crossover_prob,
self.mutation_prob,
self.population_size,
)
elif self.evolutionary_algorithm == GeneralizedCrowdingEA:
evo_alg = self.evolutionary_algorithm(
evaluator,
crossover,
mutation,
self.crossover,
self.mutation,
self.crossover_prob,
self.mutation_prob,
)
Expand Down
121 changes: 61 additions & 60 deletions tests/unit/evolutionary_optimizers/test_fitness_predictor.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
# pylint: disable=missing-docstring
import pytest
import numpy as np
from bingo.evolutionary_optimizers.fitness_predictor\
import FitnessPredictorFitnessFunction, FitnessPredictorIndexGenerator
from bingo.evolutionary_optimizers.fitness_predictor import (
FitnessPredictorFitnessFunction,
FitnessPredictorIndexGenerator,
)
from bingo.chromosomes.multiple_values import MultipleValueChromosome


Expand All @@ -24,63 +26,70 @@ def mocked_fitness_function(mocker):


@pytest.fixture
def predictor_fit_func(mocked_training_data, mocked_population,
mocked_fitness_function):
return FitnessPredictorFitnessFunction(mocked_training_data,
mocked_fitness_function,
mocked_population,
num_trainers=5)
def predictor_fit_func(
mocked_training_data, mocked_population, mocked_fitness_function
):
return FitnessPredictorFitnessFunction(
mocked_training_data, mocked_fitness_function, mocked_population, num_trainers=5
)


def test_raises_error_invalid_num_trainers(mocked_training_data,
mocked_population,
mocked_fitness_function):
def test_raises_error_invalid_num_trainers(
mocked_training_data, mocked_population, mocked_fitness_function
):
with pytest.raises(ValueError):
_ = FitnessPredictorFitnessFunction(mocked_training_data,
mocked_fitness_function,
mocked_population,
num_trainers=-1)
_ = FitnessPredictorFitnessFunction(
mocked_training_data,
mocked_fitness_function,
mocked_population,
num_trainers=-1,
)


def test_raises_error_not_enough_trainers(mocked_training_data,
mocked_population,
mocked_fitness_function):
def test_raises_error_not_enough_trainers(
mocked_training_data, mocked_population, mocked_fitness_function
):
with pytest.raises(RuntimeError):
_ = FitnessPredictorFitnessFunction(mocked_training_data,
mocked_fitness_function,
mocked_population,
num_trainers=11)
_ = FitnessPredictorFitnessFunction(
mocked_training_data,
mocked_fitness_function,
mocked_population,
num_trainers=11,
)


def test_raises_error_not_enough_valid_trainers(mocker, mocked_training_data,
mocked_population):
def test_raises_error_not_enough_valid_trainers(
mocker, mocked_training_data, mocked_population
):
mocked_nan_fitness_function = mocker.Mock(return_value=np.nan)
with pytest.raises(RuntimeError):
_ = FitnessPredictorFitnessFunction(mocked_training_data,
mocked_nan_fitness_function,
mocked_population,
num_trainers=5)


def test_deep_copy_of_full_fitness_fn(mocked_training_data,
mocked_fitness_function,
mocked_population):
predictor_fit_fn = FitnessPredictorFitnessFunction(mocked_training_data,
mocked_fitness_function,
mocked_population,
num_trainers=5)
_ = FitnessPredictorFitnessFunction(
mocked_training_data,
mocked_nan_fitness_function,
mocked_population,
num_trainers=5,
)


def test_deep_copy_of_full_fitness_fn(
mocked_training_data, mocked_fitness_function, mocked_population
):
predictor_fit_fn = FitnessPredictorFitnessFunction(
mocked_training_data, mocked_fitness_function, mocked_population, num_trainers=5
)
assert predictor_fit_fn._fitness_function is not mocked_fitness_function
assert predictor_fit_fn._fitness_function.training_data is not \
mocked_fitness_function.training_data
assert (
predictor_fit_fn._fitness_function.training_data
is not mocked_fitness_function.training_data
)


def test_adding_trainers_to_predictor_fitness_function(mocker,
predictor_fit_func):
def test_adding_trainers_to_predictor_fitness_function(mocker, predictor_fit_func):
for i in range(10):
trainer = mocker.Mock()
trainer.copy.return_value = i
predictor_fit_func.add_trainer(trainer)
for j in range(max(0, i-4), i + 1):
for j in range(max(0, i - 4), i + 1):
assert j in predictor_fit_func._trainers


Expand All @@ -97,15 +106,13 @@ def test_fitness_predictor_fitness_function_call(mocker):
train_fit = [2.0, 0.0]
mocked_fitness_function = mocker.Mock(side_effect=train_fit)
mocked_population = [mocker.Mock() for _ in range(5)]
predictor_fitness_function = \
FitnessPredictorFitnessFunction(mocked_training_data,
mocked_fitness_function,
mocked_population,
num_trainers=2)
predictor_fitness_function = FitnessPredictorFitnessFunction(
mocked_training_data, mocked_fitness_function, mocked_population, num_trainers=2
)
pred_fit = 1.5
mocker.patch.object(predictor_fitness_function,
"predict_fitness_for_trainer",
return_value=pred_fit)
mocker.patch.object(
predictor_fitness_function, "predict_fitness_for_trainer", return_value=pred_fit
)
predictor = mocker.Mock()
fitness = predictor_fitness_function(predictor)
assert fitness == pytest.approx(1.0)
Expand All @@ -116,18 +123,12 @@ def test_predicted_fitness_for_trainer(mocker, predictor_fit_func):
mocked_predictor.values = [1, 2, 3]
mocked_trainer = mocker.Mock()

predictor_fit_func.predict_fitness_for_trainer(mocked_predictor,
mocked_trainer)
predictor_fit_func.training_data.__getitem__.assert_called_once_with(
[1, 2, 3])
assert predictor_fit_func._fitness_function.call_args[0][0] ==\
mocked_trainer
predictor_fit_func.predict_fitness_for_trainer(mocked_predictor, mocked_trainer)
predictor_fit_func.training_data.__getitem__.assert_called_once_with([1, 2, 3])
assert predictor_fit_func._fitness_function.call_args[0][0] == mocked_trainer


def test_get_true_fitness_for_trainer(mocker, predictor_fit_func):
mocked_trainer = mocker.Mock()
predictor_fit_func.get_true_fitness_for_trainer(mocked_trainer)
assert predictor_fit_func._fitness_function.training_data == \
predictor_fit_func.training_data
assert predictor_fit_func._fitness_function.call_args[0][0] == \
mocked_trainer
assert predictor_fit_func._full_fitness_function.call_args[0][0] == mocked_trainer

0 comments on commit 0e0f347

Please sign in to comment.