diff --git a/golem/core/optimisers/common_optimizer/common_optimizer.py b/golem/core/optimisers/common_optimizer/common_optimizer.py index b7131654..d3fb39b2 100644 --- a/golem/core/optimisers/common_optimizer/common_optimizer.py +++ b/golem/core/optimisers/common_optimizer/common_optimizer.py @@ -52,7 +52,7 @@ class CommonOptimizer(PopulationalOptimizer): 'graph_optimizer_params', 'history', 'stages', '_run', 'generations', 'population', 'evaluator') __parameters_allowed_to_change = ('requirements', 'graph_generation_params', - 'graph_optimizer_params', 'stages', '_run') + 'graph_optimizer_params', 'stages', '_run', 'new_population') def __init__(self, objective: Objective, @@ -85,7 +85,8 @@ def parameters(self, parameters: CommonOptimizerParameters): if not isinstance(parameters, CommonOptimizerParameters): raise TypeError(f"parameters should be `CommonOptimizerParameters`, got {type(parameters)} instead") for attr in self.__parameters_allowed_to_change: - setattr(self, attr, getattr(parameters, attr)) + if hasattr(parameters, attr): + setattr(self, attr, getattr(parameters, attr)) # def optimise(self, objective: ObjectiveFunction): # while self._run: @@ -98,9 +99,10 @@ def _initial_population(self, evaluator: EvaluationOperator): def _evolve_population(self, evaluator: EvaluationOperator) -> PopulationT: """ Method realizing full evolution cycle """ + # TODO rebuild population self.evaluator = evaluator for i_stage in range(len(self.stages)): self.parameters = self.stages[i_stage].run(self.parameters) - print(1) + return self.new_population diff --git a/golem/core/optimisers/common_optimizer/nodes/evaluator.py b/golem/core/optimisers/common_optimizer/nodes/evaluator.py index 895f3f71..f6a115cf 100644 --- a/golem/core/optimisers/common_optimizer/nodes/evaluator.py +++ b/golem/core/optimisers/common_optimizer/nodes/evaluator.py @@ -7,6 +7,7 @@ class EvaluatorTask(TaskMixin): def __init__(self, parameters: 'CommonOptimizerParameters'): super().__init__(parameters) self.evaluator = parameters.evaluator + self.generation = parameters.population def update_parameters(self, parameters: 'CommonOptimizerParameters'): return super().update_parameters(parameters) diff --git a/golem/core/optimisers/common_optimizer/old_config.py b/golem/core/optimisers/common_optimizer/old_config.py index b38e600a..f26c870b 100644 --- a/golem/core/optimisers/common_optimizer/old_config.py +++ b/golem/core/optimisers/common_optimizer/old_config.py @@ -2,6 +2,7 @@ that reproduces behavior of default GOLEM genetic optimization """ from collections import defaultdict +from itertools import chain from golem.core.optimisers.common_optimizer.nodes.evaluator import Evaluator from golem.core.optimisers.common_optimizer.nodes.old_crossover import Crossover, CrossoverTask @@ -43,10 +44,10 @@ def update_parameters(self, parameters: 'CommonOptimizerParameters'): stop_fun = lambda f, a: a and len(f) >= a[0].graph_optimizer_params.pop_size def parameter_updater(finished_tasks, parameters): - parameters.new_population = [task.generation for task in finished_tasks] + parameters.new_population = list(chain(*[task.generation for task in finished_tasks])) return parameters runner = OneThreadRunner() -# runner = ParallelRunner() +runner = ParallelRunner() default_stages.append(Stage(runner=runner, nodes=nodes, task_builder=EvolvePopulationTask, scheme=scheme, stop_fun=stop_fun, parameter_updater=parameter_updater)) diff --git a/golem/core/optimisers/common_optimizer/runner.py b/golem/core/optimisers/common_optimizer/runner.py index 407981f3..416907ac 100644 --- a/golem/core/optimisers/common_optimizer/runner.py +++ b/golem/core/optimisers/common_optimizer/runner.py @@ -1,6 +1,7 @@ import time from abc import abstractmethod from collections import deque +from copy import copy from dataclasses import dataclass from multiprocessing import Manager from queue import Empty @@ -82,7 +83,7 @@ def __init__(self, worker_cycle_sleep_seconds: float = 0.02, **kwargs): super().__init__(*args, **kwargs) - self.n_jobs = n_jobs + self.n_jobs = determine_n_jobs(n_jobs) self.main_cycle_sleep_seconds = main_cycle_sleep_seconds self.worker_cycle_sleep_seconds = worker_cycle_sleep_seconds @@ -93,7 +94,7 @@ def run(self, scheme: Scheme, task: Task, nodes: List[Node], stop_fun: Callable) queued_tasks=queued_tasks, processed_tasks=processed_tasks, sleep_time=self.worker_cycle_sleep_seconds) with Parallel(n_jobs=self.n_jobs, prefer='processes', return_as='generator') as parallel: - _ = parallel(delayed(worker)(randint(0, int(2 ** 32 - 1))) for _ in range(self.n_jobs)) + gen = parallel(delayed(worker)(randint(0, int(2 ** 32 - 1))) for _ in range(self.n_jobs)) finished_tasks, all_tasks = list(), list() while not stop_fun(finished_tasks, all_tasks): time.sleep(self.main_cycle_sleep_seconds)