From 0e0f34785fab90ff865a030ca5d169ef5eb7bfa8 Mon Sep 17 00:00:00 2001 From: "G. Bomarito" Date: Mon, 23 Sep 2024 14:00:00 -0400 Subject: [PATCH] fixing regressor, fitness predictor tests --- .../symbolic_regression/symbolic_regressor.py | 21 +-- .../test_fitness_predictor.py | 121 +++++++++--------- 2 files changed, 73 insertions(+), 69 deletions(-) diff --git a/bingo/symbolic_regression/symbolic_regressor.py b/bingo/symbolic_regression/symbolic_regressor.py index 15758f39..713b238a 100644 --- a/bingo/symbolic_regression/symbolic_regressor.py +++ b/bingo/symbolic_regression/symbolic_regressor.py @@ -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 @@ -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, ) @@ -211,8 +214,8 @@ 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, @@ -220,8 +223,8 @@ def _get_archipelago(self, X, y, n_processes): elif self.evolutionary_algorithm == GeneralizedCrowdingEA: evo_alg = self.evolutionary_algorithm( evaluator, - crossover, - mutation, + self.crossover, + self.mutation, self.crossover_prob, self.mutation_prob, ) diff --git a/tests/unit/evolutionary_optimizers/test_fitness_predictor.py b/tests/unit/evolutionary_optimizers/test_fitness_predictor.py index 91ab7308..e021f355 100644 --- a/tests/unit/evolutionary_optimizers/test_fitness_predictor.py +++ b/tests/unit/evolutionary_optimizers/test_fitness_predictor.py @@ -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 @@ -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 @@ -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) @@ -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