From e69fc2a17ad63e1fa17e25df7e838252f4543d61 Mon Sep 17 00:00:00 2001 From: Sergey Kasyanov Date: Mon, 11 Dec 2023 16:56:40 +0300 Subject: [PATCH] fix and add adaptive parameters to common_optimizer --- .../common_optimizer/common_optimizer.py | 1 + .../optimisers/common_optimizer/old_config.py | 21 ++++++++++++++++-- .../common_optimizer/temp/adaptive.py | 22 +++++++------------ 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/golem/core/optimisers/common_optimizer/common_optimizer.py b/golem/core/optimisers/common_optimizer/common_optimizer.py index d3fb39b2..c772ce7e 100644 --- a/golem/core/optimisers/common_optimizer/common_optimizer.py +++ b/golem/core/optimisers/common_optimizer/common_optimizer.py @@ -100,6 +100,7 @@ def _initial_population(self, evaluator: EvaluationOperator): def _evolve_population(self, evaluator: EvaluationOperator) -> PopulationT: """ Method realizing full evolution cycle """ # TODO rebuild population + # TODO add iterations limit self.evaluator = evaluator diff --git a/golem/core/optimisers/common_optimizer/old_config.py b/golem/core/optimisers/common_optimizer/old_config.py index f26c870b..ff922b8d 100644 --- a/golem/core/optimisers/common_optimizer/old_config.py +++ b/golem/core/optimisers/common_optimizer/old_config.py @@ -12,14 +12,24 @@ from golem.core.optimisers.common_optimizer.nodes.old_regularization import Regularization, RegularizationTask from golem.core.optimisers.common_optimizer.nodes.old_selection import Selection, SelectionTask from golem.core.optimisers.common_optimizer.runner import ParallelRunner, OneThreadRunner -from golem.core.optimisers.common_optimizer.scheme import Scheme +from golem.core.optimisers.common_optimizer.scheme import Scheme, SequentialScheme from golem.core.optimisers.common_optimizer.stage import Stage from golem.core.optimisers.common_optimizer.task import Task, TaskStatusEnum +from golem.core.optimisers.common_optimizer.temp.adaptive import AdaptivePopulationSize, AdaptiveParametersTask default_stages = list() # adaptive parameters +nodes = [AdaptivePopulationSize()] +scheme = SequentialScheme(nodes=nodes) +def adaptive_parameter_updater(finished_tasks, parameters): + parameters = finished_tasks[0].update_parameters(parameters) + return parameters + +default_stages.append(Stage(runner=OneThreadRunner(), nodes=nodes, task_builder=AdaptiveParametersTask, + scheme=scheme, stop_fun=lambda f, a: bool(f), + parameter_updater=adaptive_parameter_updater)) # main evolution process class EvolvePopulationTask(ElitismTask, MutationTask, @@ -41,7 +51,14 @@ def update_parameters(self, parameters: 'CommonOptimizerParameters'): nodes = [Elitism(), Mutation(), Crossover(), Regularization(), Selection(), Inheritance(), Evaluator()] -stop_fun = lambda f, a: a and len(f) >= a[0].graph_optimizer_params.pop_size +def stop_fun(finished_tasks, all_tasks): + if all_tasks: + pop_size = all_tasks[0].graph_generation_params.pop_size + if len(finished_tasks) >= pop_size: + return True + return False + + def parameter_updater(finished_tasks, parameters): parameters.new_population = list(chain(*[task.generation for task in finished_tasks])) diff --git a/golem/core/optimisers/common_optimizer/temp/adaptive.py b/golem/core/optimisers/common_optimizer/temp/adaptive.py index b71f1cbe..725997ce 100644 --- a/golem/core/optimisers/common_optimizer/temp/adaptive.py +++ b/golem/core/optimisers/common_optimizer/temp/adaptive.py @@ -16,11 +16,9 @@ class AdaptiveParametersTask(Task): def __init__(self, parameters: 'CommonOptimizerParameters'): super().__init__() - self.parameters = {} - for attribute, values in parameters.__dict__.items(): - if isinstance(values, (OptimizationParameters, GraphGenerationParams, AlgorithmParameters)): - self.parameters[attribute] = dict(values.__dict__.items()) - self.parameters['population'] = parameters.population + self.graph_optimizer_params = parameters.graph_optimizer_params + self.graph_generation_params = parameters.graph_generation_params + self.population = parameters.population def update_parameters(self, parameters: 'CommonOptimizerParameters') -> 'CommonOptimizerParameters': """ @@ -29,11 +27,7 @@ def update_parameters(self, parameters: 'CommonOptimizerParameters') -> 'CommonO :param parameters: instance of CommonOptimizerParameters to update :return: updated parameters object """ - for attribute, values in self.parameters.items(): - parameters_obj = getattr(parameters, attribute, None) - if parameters_obj: - for subattribute, subvalues in values.items(): - setattr(parameters_obj, subattribute, subvalues) + parameters.graph_generation_params = self.graph_generation_params return parameters @@ -75,10 +69,10 @@ def __call__(self, task: AdaptiveParametersTask) -> List[AdaptiveParametersTask] raise TypeError(f"task should be `AdaptiveParametersTask`, got {type(task)} instead") if self._pop_size is None: self._pop_size: OldAdaptivePopulationSize = init_adaptive_pop_size( - task.parameters['graph_optimizer_params'], - task.parameters['population'] + task.graph_optimizer_params, + task.population ) - pop_size = self._pop_size.next(task.parameters['population']) + pop_size = self._pop_size.next(task.population) - task.parameters['graph_generation_params']['pop_size'] = pop_size + task.graph_generation_params.pop_size = pop_size return [task]